Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/spreed.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md18
-rw-r--r--appinfo/info.xml2
-rw-r--r--docs/capabilities.md3
-rw-r--r--docs/constants.md1
-rw-r--r--docs/conversation.md2
-rw-r--r--l10n/af.js33
-rw-r--r--l10n/af.json33
-rw-r--r--l10n/ar.js18
-rw-r--r--l10n/ar.json18
-rw-r--r--l10n/ast.js17
-rw-r--r--l10n/ast.json17
-rw-r--r--l10n/bg.js37
-rw-r--r--l10n/bg.json37
-rw-r--r--l10n/br.js18
-rw-r--r--l10n/br.json18
-rw-r--r--l10n/ca.js27
-rw-r--r--l10n/ca.json27
-rw-r--r--l10n/cs.js18
-rw-r--r--l10n/cs.json18
-rw-r--r--l10n/da.js31
-rw-r--r--l10n/da.json31
-rw-r--r--l10n/de.js22
-rw-r--r--l10n/de.json22
-rw-r--r--l10n/de_DE.js18
-rw-r--r--l10n/de_DE.json18
-rw-r--r--l10n/el.js18
-rw-r--r--l10n/el.json18
-rw-r--r--l10n/en_GB.js262
-rw-r--r--l10n/en_GB.json262
-rw-r--r--l10n/eo.js18
-rw-r--r--l10n/eo.json18
-rw-r--r--l10n/es.js12
-rw-r--r--l10n/es.json12
-rw-r--r--l10n/es_419.js19
-rw-r--r--l10n/es_419.json19
-rw-r--r--l10n/es_AR.js21
-rw-r--r--l10n/es_AR.json21
-rw-r--r--l10n/es_CL.js19
-rw-r--r--l10n/es_CL.json19
-rw-r--r--l10n/es_CO.js20
-rw-r--r--l10n/es_CO.json20
-rw-r--r--l10n/es_CR.js19
-rw-r--r--l10n/es_CR.json19
-rw-r--r--l10n/es_DO.js20
-rw-r--r--l10n/es_DO.json20
-rw-r--r--l10n/es_EC.js19
-rw-r--r--l10n/es_EC.json19
-rw-r--r--l10n/es_GT.js19
-rw-r--r--l10n/es_GT.json19
-rw-r--r--l10n/es_HN.js19
-rw-r--r--l10n/es_HN.json19
-rw-r--r--l10n/es_MX.js23
-rw-r--r--l10n/es_MX.json23
-rw-r--r--l10n/es_NI.js19
-rw-r--r--l10n/es_NI.json19
-rw-r--r--l10n/es_PA.js19
-rw-r--r--l10n/es_PA.json19
-rw-r--r--l10n/es_PE.js19
-rw-r--r--l10n/es_PE.json19
-rw-r--r--l10n/es_PR.js19
-rw-r--r--l10n/es_PR.json19
-rw-r--r--l10n/es_PY.js20
-rw-r--r--l10n/es_PY.json20
-rw-r--r--l10n/es_SV.js19
-rw-r--r--l10n/es_SV.json19
-rw-r--r--l10n/es_UY.js20
-rw-r--r--l10n/es_UY.json20
-rw-r--r--l10n/et_EE.js17
-rw-r--r--l10n/et_EE.json17
-rw-r--r--l10n/eu.js11
-rw-r--r--l10n/eu.json11
-rw-r--r--l10n/fa.js35
-rw-r--r--l10n/fa.json35
-rw-r--r--l10n/fi.js415
-rw-r--r--l10n/fi.json415
-rw-r--r--l10n/fr.js10
-rw-r--r--l10n/fr.json10
-rw-r--r--l10n/gl.js22
-rw-r--r--l10n/gl.json22
-rw-r--r--l10n/he.js35
-rw-r--r--l10n/he.json35
-rw-r--r--l10n/hr.js12
-rw-r--r--l10n/hr.json12
-rw-r--r--l10n/hu.js18
-rw-r--r--l10n/hu.json18
-rw-r--r--l10n/id.js78
-rw-r--r--l10n/id.json76
-rw-r--r--l10n/is.js40
-rw-r--r--l10n/is.json40
-rw-r--r--l10n/it.js8
-rw-r--r--l10n/it.json8
-rw-r--r--l10n/ja.js12
-rw-r--r--l10n/ja.json12
-rw-r--r--l10n/ka_GE.js22
-rw-r--r--l10n/ka_GE.json22
-rw-r--r--l10n/ko.js29
-rw-r--r--l10n/ko.json29
-rw-r--r--l10n/lt_LT.js14
-rw-r--r--l10n/lt_LT.json14
-rw-r--r--l10n/lv.js19
-rw-r--r--l10n/lv.json19
-rw-r--r--l10n/mk.js22
-rw-r--r--l10n/mk.json22
-rw-r--r--l10n/nb.js89
-rw-r--r--l10n/nb.json89
-rw-r--r--l10n/nl.js12
-rw-r--r--l10n/nl.json12
-rw-r--r--l10n/nn_NO.js85
-rw-r--r--l10n/nn_NO.json83
-rw-r--r--l10n/oc.js14
-rw-r--r--l10n/oc.json14
-rw-r--r--l10n/pl.js18
-rw-r--r--l10n/pl.json18
-rw-r--r--l10n/pt_BR.js16
-rw-r--r--l10n/pt_BR.json16
-rw-r--r--l10n/pt_PT.js175
-rw-r--r--l10n/pt_PT.json175
-rw-r--r--l10n/ro.js26
-rw-r--r--l10n/ro.json26
-rw-r--r--l10n/ru.js8
-rw-r--r--l10n/ru.json8
-rw-r--r--l10n/sc.js15
-rw-r--r--l10n/sc.json15
-rw-r--r--l10n/sk.js8
-rw-r--r--l10n/sk.json8
-rw-r--r--l10n/sl.js11
-rw-r--r--l10n/sl.json11
-rw-r--r--l10n/sq.js23
-rw-r--r--l10n/sq.json23
-rw-r--r--l10n/sr.js30
-rw-r--r--l10n/sr.json30
-rw-r--r--l10n/sv.js34
-rw-r--r--l10n/sv.json34
-rw-r--r--l10n/th.js84
-rw-r--r--l10n/th.json82
-rw-r--r--l10n/tr.js18
-rw-r--r--l10n/tr.json18
-rw-r--r--l10n/uk.js24
-rw-r--r--l10n/uk.json24
-rw-r--r--l10n/vi.js16
-rw-r--r--l10n/vi.json16
-rw-r--r--l10n/zh_CN.js8
-rw-r--r--l10n/zh_CN.json8
-rw-r--r--l10n/zh_HK.js18
-rw-r--r--l10n/zh_HK.json18
-rw-r--r--l10n/zh_TW.js75
-rw-r--r--l10n/zh_TW.json75
-rw-r--r--lib/Capabilities.php1
-rw-r--r--lib/Chat/SystemMessage/Listener.php480
-rw-r--r--lib/Collaboration/Collaborators/RoomPlugin.php8
-rw-r--r--lib/Command/ActiveCalls.php19
-rw-r--r--lib/Controller/ChatController.php10
-rw-r--r--lib/Controller/ReactionController.php9
-rw-r--r--lib/Events/AlreadySharedEvent.php45
-rw-r--r--lib/Exceptions/PermissionsException.php28
-rw-r--r--lib/Listener/RestrictStartingCalls.php12
-rw-r--r--lib/Middleware/InjectionMiddleware.php27
-rw-r--r--lib/Migration/Version14000Date20220330141647.php (renamed from lib/Migration/Version14000Date20220330141646.php)44
-rw-r--r--lib/Migration/Version15000Date20220427183026.php113
-rw-r--r--lib/Model/Attendee.php2
-rw-r--r--lib/Share/RoomShareProvider.php20
-rw-r--r--lib/Signaling/Listener.php511
-rw-r--r--lib/Status/Listener.php36
-rw-r--r--package-lock.json129
-rw-r--r--package.json4
-rw-r--r--src/__mocks__/attachmediastream.js17
-rw-r--r--src/components/AvatarWrapper/AvatarWrapper.vue9
-rw-r--r--src/components/CallView/CallView.vue12
-rw-r--r--src/components/CallView/Grid/Grid.vue6
-rw-r--r--src/components/CallView/shared/Video.spec.js1147
-rw-r--r--src/components/CallView/shared/Video.vue22
-rw-r--r--src/components/CallView/shared/VideoBottomBar.vue11
-rw-r--r--src/components/ConversationSettings/Matterbridge/BridgePart.vue6
-rw-r--r--src/components/ConversationSettings/Matterbridge/MatterbridgeSettings.vue6
-rw-r--r--src/components/MessagesList/MessagesGroup/Message/Message.spec.js35
-rw-r--r--src/components/MessagesList/MessagesGroup/Message/Message.vue34
-rw-r--r--src/components/MessagesList/MessagesGroup/Message/MessageButtonsBar/MessageButtonsBar.vue2
-rw-r--r--src/components/MessagesList/MessagesGroup/Message/MessagePart/Contact.vue6
-rw-r--r--src/components/MessagesList/MessagesGroup/Message/MessagePart/DeckCard.vue5
-rw-r--r--src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue4
-rw-r--r--src/components/NewMessageForm/NewMessageForm.vue10
-rw-r--r--src/components/PermissionsEditor/PermissionsEditor.vue10
-rw-r--r--src/components/RightSidebar/RightSidebar.vue12
-rw-r--r--src/components/RightSidebar/SharedItems/SharedItems.vue107
-rw-r--r--src/components/RightSidebar/SharedItems/SharedItemsBrowser/SharedItemsBrowser.vue173
-rw-r--r--src/components/RightSidebar/SharedItems/SharedItemsTab.vue85
-rw-r--r--src/components/SettingsDialog/SettingsDialog.vue12
-rw-r--r--src/constants.js5
-rw-r--r--src/mixins/sharedItems.js57
-rw-r--r--src/services/sharedItemsService.js (renamed from src/services/conversationSharedItemsService.js)0
-rw-r--r--src/store/guestNameStore.js8
-rw-r--r--src/store/sharedItemsStore.js (renamed from src/store/conversationSharedItemsStore.js)8
-rw-r--r--src/store/storeConfig.js4
-rw-r--r--src/utils/signaling.js5
-rw-r--r--src/utils/webrtc/RemoteVideoBlocker.js131
-rw-r--r--src/utils/webrtc/RemoteVideoBlocker.spec.js336
-rw-r--r--src/utils/webrtc/models/CallParticipantModel.js44
-rw-r--r--src/utils/webrtc/simplewebrtc/peer.js68
-rw-r--r--src/utils/webrtc/webrtc.js41
-rw-r--r--tests/integration/features/bootstrap/FeatureContext.php2
-rw-r--r--tests/integration/features/chat/delete.feature16
-rw-r--r--tests/integration/features/chat/file-share.feature29
-rw-r--r--tests/integration/features/chat/group.feature12
-rw-r--r--tests/integration/features/chat/public.feature13
-rw-r--r--tests/integration/features/chat/rich-object-share.feature25
-rw-r--r--tests/integration/features/conversation-2/set-participant-permissions.feature214
-rw-r--r--tests/integration/features/conversation-2/set-permissions.feature48
-rw-r--r--tests/integration/features/reaction/react.feature40
-rw-r--r--tests/php/CapabilitiesTest.php1
-rw-r--r--tests/php/Collaboration/Collaborators/RoomPluginTest.php18
-rw-r--r--tests/php/Listener/RestrictStartingCallsTest.php2
-rw-r--r--tests/psalm-baseline.xml36
212 files changed, 8363 insertions, 1065 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d5a09621e..aec23554c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,24 @@
# Changelog
All notable changes to this project will be documented in this file.
+## 14.0.0-rc.3 – 2022-04-22
+### Fixed
+- Move message.reactions.self to message.reactionsSelf to not merge different data structures
+ [7182](https://github.com/nextcloud/spreed/pull/7182)
+- Use actor and time information from the reaction not the message author
+ [7190](https://github.com/nextcloud/spreed/pull/7190)
+- Fix migration of attachment types for media
+ [7196](https://github.com/nextcloud/spreed/pull/7196)
+- Open chat tab by default in sidebar while in a call
+ [7201](https://github.com/nextcloud/spreed/pull/7201)
+- Fix access to undefined key
+ [7195](https://github.com/nextcloud/spreed/pull/7195)
+- Only set header when the value changed and the status is not 304
+ [7200](https://github.com/nextcloud/spreed/pull/7200)
+
+### Still in progress
+- Media tab showing all shared items of the conversation
+
## 14.0.0-rc.2 – 2022-04-19
### Fixed
- Remove event to delete shares when user leave of room
diff --git a/appinfo/info.xml b/appinfo/info.xml
index f6ab0bd46..b5a25ea37 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -16,7 +16,7 @@ And in the works for the [coming versions](https://github.com/nextcloud/spreed/m
]]></description>
- <version>15.0.0-dev.1</version>
+ <version>15.0.0-dev.3</version>
<licence>agpl</licence>
<author>Aleksandra Lazarević</author>
diff --git a/docs/capabilities.md b/docs/capabilities.md
index f9e989427..3c029b860 100644
--- a/docs/capabilities.md
+++ b/docs/capabilities.md
@@ -92,3 +92,6 @@ title: Capabilities
* `reactions` - Api reactions to chat message
* `rich-object-list-media` - When the API to get the chat messages for shared media is available
* `rich-object-delete` - When the API allows to delete chat messages which are file or rich object shares
+
+## 15
+* `chat-permission` - When permission 128 is required to post chat messages, reaction or share items to the conversation
diff --git a/docs/constants.md b/docs/constants.md
index 108bfb668..f170118c8 100644
--- a/docs/constants.md
+++ b/docs/constants.md
@@ -70,6 +70,7 @@ title: Constants
* `16` Can publish audio stream
* `32` Can publish video stream
* `64` Can publish screen sharing stream
+* `128` Can post chat message, share items and do reactions
### Attendee permission modifications
* `set` - Setting this permission set.
diff --git a/docs/conversation.md b/docs/conversation.md
index b8cb0e813..ddeadc72d 100644
--- a/docs/conversation.md
+++ b/docs/conversation.md
@@ -73,7 +73,7 @@
`unreadMentionDirect` | bool | v4 | | Flag if the user was mentioned directly (ignoring @all mentions) since their last visit (only available with `direct-mention-flag` capability)
`lastReadMessage` | int | v1 | | ID of the last read message in a room (only available with `chat-read-marker` capability)
`lastCommonReadMessage` | int | v3 | | ID of the last message read by every user that has read privacy set to public in a room. When the user themself has it set to private the value is `0` (only available with `chat-read-status` capability)
- `lastMessage` | message | v1 | | Last message in a conversation if available, otherwise empty
+ `lastMessage` | message | v1 | | Last message in a conversation if available, otherwise empty. **Note:** Even when given the message will not contain the `parent` or `reactionsSelf` attribute due to performance reasons
`objectType` | string | v1 | | The type of object that the conversation is associated with; "share:password" if the conversation is used to request a password for a share, otherwise empty
`objectId` | string | v1 | | Share token if "objectType" is "share:password", otherwise empty
`status` | string | v4 | | Optional: Only available for one-to-one conversations and when `includeStatus=true` is set
diff --git a/l10n/af.js b/l10n/af.js
index 5cee8bf02..1dd6ef9f8 100644
--- a/l10n/af.js
+++ b/l10n/af.js
@@ -1,6 +1,13 @@
OC.L10N.register(
"spreed",
{
+ "Guest" : "Gas",
+ "File is too big" : "Lêer is te groot",
+ "Invalid file provided" : "Ongeldige lêer verskaf",
+ "Invalid image" : "Ongeldige beeld",
+ "Unknown filetype" : "Onbekende lêertipe",
+ "An error occurred. Please contact your admin." : "'n Fout het voorgekom. Kontak asseblief u administrateur.",
+ "Open settings" : "Open instellings",
"Andorra" : "Andorra",
"United Arab Emirates" : "Verenigde Arabiese Emirate",
"Afghanistan" : "Afghanistan",
@@ -245,19 +252,31 @@ OC.L10N.register(
"User" : "Gebruiker",
"Users" : "Gebruikers",
"Name" : "Naam",
+ "All messages" : "Alle boodskappe",
+ "Off" : "Af",
"Language" : "Taal",
"Country" : "Land",
+ "Status" : "Status",
"Created at" : "Geskep om",
"Pending" : "Hangend",
"Error" : "Fout",
"Saved" : "Bewaar",
+ "OK" : "Goed",
+ "Checking …" : "Gaan tans na …",
"Copy link" : "Kopieer skakel",
"Dismiss" : "Ontslaan",
"Back" : "Terug",
+ "You" : "U",
+ "This conversation is read-only" : "Hierdie gesprek is leesalleen",
"Favorite" : "Gunsteling",
+ "Description" : "Beskrywing",
+ "Notifications" : "Kennisgewings",
+ "Leave conversation" : "verlaat gesprek",
+ "Delete conversation" : "Skrap gesprek",
"Enter a password" : "Gee ’n wagwoord",
"Save" : "Stoor",
"Edit" : "Wysig",
+ "Delete" : "Skrap",
"Password" : "Wagwoord",
"Login" : "Teken aan",
"Nickname" : "Bynaam",
@@ -267,21 +286,35 @@ OC.L10N.register(
"Loading" : "Laai tans..",
"Groups" : "Groepe",
"Password protect" : "Beskerm met 'n wagwoord",
+ "Add participants" : "Voeg deelnemers toe",
"Close" : "Sluit",
+ "You are currently waiting in the lobby" : "U wag tans in die voorportaal",
"Reply" : "Antwoord",
+ "Contact" : "Kontak",
"Today" : "Vandag",
"Yesterday" : "Gister",
+ "guest" : "gas",
+ "Promote to moderator" : "Bevorder na moderator",
+ "Remove participant" : "Verwyder deelnemer",
"Chat" : "Klets",
+ "Details" : "Besonderhede",
"Settings" : "Instellings",
+ "Privacy" : "Privaatheid",
"Keyboard shortcuts" : "Sneltoetse",
"Search" : "Soek",
"Send" : "Stuur",
+ "Media" : "Media",
+ "Files" : " Lêers",
+ "Audio" : "Oudio",
+ "Other" : "Ander",
"Do not disturb" : "Moenie pla nie",
"Away" : "Weg",
"Default" : "Verstek",
"The password is wrong. Try again." : "Die wagwoord is verkeerd. Probeer weer.",
"Android app" : "Android-toep",
"iOS app" : "iOS-toep",
+ "Microphone" : "Mikrofoon",
+ "Camera" : "Kamera",
"Remove" : "Verwyder"
},
"nplurals=2; plural=(n != 1);");
diff --git a/l10n/af.json b/l10n/af.json
index dd0cdf71f..e9db551d5 100644
--- a/l10n/af.json
+++ b/l10n/af.json
@@ -1,4 +1,11 @@
{ "translations": {
+ "Guest" : "Gas",
+ "File is too big" : "Lêer is te groot",
+ "Invalid file provided" : "Ongeldige lêer verskaf",
+ "Invalid image" : "Ongeldige beeld",
+ "Unknown filetype" : "Onbekende lêertipe",
+ "An error occurred. Please contact your admin." : "'n Fout het voorgekom. Kontak asseblief u administrateur.",
+ "Open settings" : "Open instellings",
"Andorra" : "Andorra",
"United Arab Emirates" : "Verenigde Arabiese Emirate",
"Afghanistan" : "Afghanistan",
@@ -243,19 +250,31 @@
"User" : "Gebruiker",
"Users" : "Gebruikers",
"Name" : "Naam",
+ "All messages" : "Alle boodskappe",
+ "Off" : "Af",
"Language" : "Taal",
"Country" : "Land",
+ "Status" : "Status",
"Created at" : "Geskep om",
"Pending" : "Hangend",
"Error" : "Fout",
"Saved" : "Bewaar",
+ "OK" : "Goed",
+ "Checking …" : "Gaan tans na …",
"Copy link" : "Kopieer skakel",
"Dismiss" : "Ontslaan",
"Back" : "Terug",
+ "You" : "U",
+ "This conversation is read-only" : "Hierdie gesprek is leesalleen",
"Favorite" : "Gunsteling",
+ "Description" : "Beskrywing",
+ "Notifications" : "Kennisgewings",
+ "Leave conversation" : "verlaat gesprek",
+ "Delete conversation" : "Skrap gesprek",
"Enter a password" : "Gee ’n wagwoord",
"Save" : "Stoor",
"Edit" : "Wysig",
+ "Delete" : "Skrap",
"Password" : "Wagwoord",
"Login" : "Teken aan",
"Nickname" : "Bynaam",
@@ -265,21 +284,35 @@
"Loading" : "Laai tans..",
"Groups" : "Groepe",
"Password protect" : "Beskerm met 'n wagwoord",
+ "Add participants" : "Voeg deelnemers toe",
"Close" : "Sluit",
+ "You are currently waiting in the lobby" : "U wag tans in die voorportaal",
"Reply" : "Antwoord",
+ "Contact" : "Kontak",
"Today" : "Vandag",
"Yesterday" : "Gister",
+ "guest" : "gas",
+ "Promote to moderator" : "Bevorder na moderator",
+ "Remove participant" : "Verwyder deelnemer",
"Chat" : "Klets",
+ "Details" : "Besonderhede",
"Settings" : "Instellings",
+ "Privacy" : "Privaatheid",
"Keyboard shortcuts" : "Sneltoetse",
"Search" : "Soek",
"Send" : "Stuur",
+ "Media" : "Media",
+ "Files" : " Lêers",
+ "Audio" : "Oudio",
+ "Other" : "Ander",
"Do not disturb" : "Moenie pla nie",
"Away" : "Weg",
"Default" : "Verstek",
"The password is wrong. Try again." : "Die wagwoord is verkeerd. Probeer weer.",
"Android app" : "Android-toep",
"iOS app" : "iOS-toep",
+ "Microphone" : "Mikrofoon",
+ "Camera" : "Kamera",
"Remove" : "Verwyder"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/l10n/ar.js b/l10n/ar.js
index dadb44df8..a38273918 100644
--- a/l10n/ar.js
+++ b/l10n/ar.js
@@ -609,6 +609,7 @@ OC.L10N.register(
"Test this server" : "جرّب هذا الخادم",
"TURN servers" : "خوادم TURN",
"A TURN server is used to proxy the traffic from participants behind a firewall. If individual participants cannot connect to others a TURN server is most likely required. See {linkstart}this documentation{linkend} for setup instructions." : "يتم استخدام خادم TURN لتوكيل مرور المشاركين خلف جدار الحماية. إذا لم يتمكن المشاركون الأفراد من الاتصال بالآخرين، فمن المرجح أن يكون خادم TURN مطلوبًا. راجع {linkstart} هذه الوثائق {linkend} للحصول على إرشادات الإعداد.",
+ "OK" : "موافق",
"{nickName} raised their hand." : "{nickName} رفع يده ",
"A participant raised their hand." : "رفع مشارك يده. ",
"Previous page of videos" : "الصفحة السابقة للفيديوهات ",
@@ -680,9 +681,11 @@ OC.L10N.register(
"Drop your files to upload" : "افلت الملفات لرفعها",
"Call in progress" : "محادثة جارية",
"Favorite" : "المفضلة",
+ "Restricted" : "مقيدة",
"Conversation settings" : "اعدادات المحادثة",
"Description" : "الوصف",
"Enter a description for this conversation" : "ادخل وصفًا لهذه المحادثة ",
+ "Notifications" : "التنبيهات",
"Guests access" : "الوصول للضيوف ",
"Meeting settings" : "إعدادات الإجتماع ",
"Matterbridge" : "Matterbridge",
@@ -784,6 +787,7 @@ OC.L10N.register(
"not running, check Matterbridge log" : "لا يعمل، تحقق من سجل Matterbridge",
"not running" : "غير فعال",
"Bridge saved" : "تم الحفظ ",
+ "Calls" : "مكالمات",
"Allow participants to join from a phone." : "السماح للمشاركين بالانضمام عبر الجوال ",
"Enable SIP dial-in" : "تفعيل الاتصال عبر SIP",
"SIP dial-in is now enabled" : "تم تمكين اتصال SIP الآن",
@@ -808,6 +812,7 @@ OC.L10N.register(
"No search results" : "لا توجد نتائج",
"Groups" : "المجموعات",
"Circles" : "جماعة",
+ "Unread mentions" : "إشارات غير مقروءة",
"Talk settings" : "إعدادات التحدث",
"Users, groups and circles" : "الاعضاء، المجموعات و الجماعات",
"Users and groups" : "الاعضاء والمجموعات",
@@ -830,6 +835,7 @@ OC.L10N.register(
"Allow guests to join via link" : "السماح بالضيوف بالانضمام عن طريق الرابط",
"Search conversations or users" : "البحث عن المحادثات او الاعضاء",
"You are currently waiting in the lobby" : "أنت حاليا في انتظار الاستقبال",
+ "The meeting will start soon" : "هذا الاجتماع سيبدأ قريباً",
"No microphone available" : "لا يوجد مايكرفون متاح",
"Select microphone" : "اختر مايك",
"No camera available" : "لا توجد كاميرا متاحة",
@@ -854,12 +860,14 @@ OC.L10N.register(
"Mark as unread" : "تحديد كغير مقروء ",
"Go to file" : "الذهاب إلى ملف",
"Message link copied to clipboard." : "تم نسخ الرسالة إلى الحافظة ",
+ "Contact" : "التواصل",
"{stack} in {board}" : "{stack} في {board}",
"Deck Card" : "بطاقة Deck",
"Scroll to bottom" : "انتقل للاسفل",
"Today" : "اليوم",
"Yesterday" : "امس",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
+ "Record voice message" : "تسجيل رسالة صوتية",
"Share files to the conversation" : "مشاركة ملفات في المحادثة",
"Upload new files" : "رفع ملفات جديدة",
"Share from Files" : "مشاركة من الملفات",
@@ -906,6 +914,8 @@ OC.L10N.register(
"Chat" : "الدردشة",
"Details" : "التفاصيل",
"Settings" : "الإعدادات",
+ "Projects" : "المشاريع",
+ "Show all files" : "أظهر جميع الملفات",
"Meeting ID: {meetingId}" : "معرف الاجتماع: {meetingId}",
"Your PIN: {attendeePin}" : "رقمك السري: {attendeePin}",
"Attachments folder" : "مجلد المرفقات",
@@ -969,6 +979,11 @@ OC.L10N.register(
"Error while accessing microphone" : "حدث خطأ اثناء الوصول إلى المايكرفون",
"Access to camera is only possible with HTTPS" : "الوصول للكاميرا مسموح فقط في HTTPS",
"An error occurred while fetching the participants" : "حدث خطأ اثناء اضافة مشاركيين",
+ "Media" : "وسائط",
+ "Files" : "الملفات",
+ "Locations" : "المواقع",
+ "Audio" : "الصوت",
+ "Other" : "آخر",
"Nextcloud Talk was updated, please reload the page" : "تم تحديث نكست كلاود التحدث، يرجى تحديث الصفحة.",
"Do not disturb" : "عدم الازعاج",
"Away" : "بالخارج",
@@ -1059,6 +1074,7 @@ OC.L10N.register(
"Video on and off" : "تفعيل او تعطيل الفيديو",
"Choose in which folder attachments should be saved." : "اختر مجلد ليتم حفظ المرفقات.",
"Exit fullscreen (f)" : "الخروج من ملء الشاشة (f)",
- "Fullscreen (f)" : "ملء الشاشة (f)"
+ "Fullscreen (f)" : "ملء الشاشة (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "قم بتعيين مستوى الإشعارات للمحادثة الحالية. سيؤثر هذا فقط على الإشعارات التي تتلقاها."
},
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/l10n/ar.json b/l10n/ar.json
index 31794f64a..318652b09 100644
--- a/l10n/ar.json
+++ b/l10n/ar.json
@@ -607,6 +607,7 @@
"Test this server" : "جرّب هذا الخادم",
"TURN servers" : "خوادم TURN",
"A TURN server is used to proxy the traffic from participants behind a firewall. If individual participants cannot connect to others a TURN server is most likely required. See {linkstart}this documentation{linkend} for setup instructions." : "يتم استخدام خادم TURN لتوكيل مرور المشاركين خلف جدار الحماية. إذا لم يتمكن المشاركون الأفراد من الاتصال بالآخرين، فمن المرجح أن يكون خادم TURN مطلوبًا. راجع {linkstart} هذه الوثائق {linkend} للحصول على إرشادات الإعداد.",
+ "OK" : "موافق",
"{nickName} raised their hand." : "{nickName} رفع يده ",
"A participant raised their hand." : "رفع مشارك يده. ",
"Previous page of videos" : "الصفحة السابقة للفيديوهات ",
@@ -678,9 +679,11 @@
"Drop your files to upload" : "افلت الملفات لرفعها",
"Call in progress" : "محادثة جارية",
"Favorite" : "المفضلة",
+ "Restricted" : "مقيدة",
"Conversation settings" : "اعدادات المحادثة",
"Description" : "الوصف",
"Enter a description for this conversation" : "ادخل وصفًا لهذه المحادثة ",
+ "Notifications" : "التنبيهات",
"Guests access" : "الوصول للضيوف ",
"Meeting settings" : "إعدادات الإجتماع ",
"Matterbridge" : "Matterbridge",
@@ -782,6 +785,7 @@
"not running, check Matterbridge log" : "لا يعمل، تحقق من سجل Matterbridge",
"not running" : "غير فعال",
"Bridge saved" : "تم الحفظ ",
+ "Calls" : "مكالمات",
"Allow participants to join from a phone." : "السماح للمشاركين بالانضمام عبر الجوال ",
"Enable SIP dial-in" : "تفعيل الاتصال عبر SIP",
"SIP dial-in is now enabled" : "تم تمكين اتصال SIP الآن",
@@ -806,6 +810,7 @@
"No search results" : "لا توجد نتائج",
"Groups" : "المجموعات",
"Circles" : "جماعة",
+ "Unread mentions" : "إشارات غير مقروءة",
"Talk settings" : "إعدادات التحدث",
"Users, groups and circles" : "الاعضاء، المجموعات و الجماعات",
"Users and groups" : "الاعضاء والمجموعات",
@@ -828,6 +833,7 @@
"Allow guests to join via link" : "السماح بالضيوف بالانضمام عن طريق الرابط",
"Search conversations or users" : "البحث عن المحادثات او الاعضاء",
"You are currently waiting in the lobby" : "أنت حاليا في انتظار الاستقبال",
+ "The meeting will start soon" : "هذا الاجتماع سيبدأ قريباً",
"No microphone available" : "لا يوجد مايكرفون متاح",
"Select microphone" : "اختر مايك",
"No camera available" : "لا توجد كاميرا متاحة",
@@ -852,12 +858,14 @@
"Mark as unread" : "تحديد كغير مقروء ",
"Go to file" : "الذهاب إلى ملف",
"Message link copied to clipboard." : "تم نسخ الرسالة إلى الحافظة ",
+ "Contact" : "التواصل",
"{stack} in {board}" : "{stack} في {board}",
"Deck Card" : "بطاقة Deck",
"Scroll to bottom" : "انتقل للاسفل",
"Today" : "اليوم",
"Yesterday" : "امس",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
+ "Record voice message" : "تسجيل رسالة صوتية",
"Share files to the conversation" : "مشاركة ملفات في المحادثة",
"Upload new files" : "رفع ملفات جديدة",
"Share from Files" : "مشاركة من الملفات",
@@ -904,6 +912,8 @@
"Chat" : "الدردشة",
"Details" : "التفاصيل",
"Settings" : "الإعدادات",
+ "Projects" : "المشاريع",
+ "Show all files" : "أظهر جميع الملفات",
"Meeting ID: {meetingId}" : "معرف الاجتماع: {meetingId}",
"Your PIN: {attendeePin}" : "رقمك السري: {attendeePin}",
"Attachments folder" : "مجلد المرفقات",
@@ -967,6 +977,11 @@
"Error while accessing microphone" : "حدث خطأ اثناء الوصول إلى المايكرفون",
"Access to camera is only possible with HTTPS" : "الوصول للكاميرا مسموح فقط في HTTPS",
"An error occurred while fetching the participants" : "حدث خطأ اثناء اضافة مشاركيين",
+ "Media" : "وسائط",
+ "Files" : "الملفات",
+ "Locations" : "المواقع",
+ "Audio" : "الصوت",
+ "Other" : "آخر",
"Nextcloud Talk was updated, please reload the page" : "تم تحديث نكست كلاود التحدث، يرجى تحديث الصفحة.",
"Do not disturb" : "عدم الازعاج",
"Away" : "بالخارج",
@@ -1057,6 +1072,7 @@
"Video on and off" : "تفعيل او تعطيل الفيديو",
"Choose in which folder attachments should be saved." : "اختر مجلد ليتم حفظ المرفقات.",
"Exit fullscreen (f)" : "الخروج من ملء الشاشة (f)",
- "Fullscreen (f)" : "ملء الشاشة (f)"
+ "Fullscreen (f)" : "ملء الشاشة (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "قم بتعيين مستوى الإشعارات للمحادثة الحالية. سيؤثر هذا فقط على الإشعارات التي تتلقاها."
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
} \ No newline at end of file
diff --git a/l10n/ast.js b/l10n/ast.js
index decc76637..699c32109 100644
--- a/l10n/ast.js
+++ b/l10n/ast.js
@@ -3,6 +3,11 @@ OC.L10N.register(
{
"_%n guest_::_%n guests_" : ["%n convidáu/ada","%n convidaos/es"],
"Guest" : "Convidáu/ada",
+ "File is too big" : "El ficheru ye pergrande",
+ "Invalid file provided" : "Apurrióse un ficheru non válidu",
+ "Invalid image" : "Imaxe non válida",
+ "Unknown filetype" : "Triba desconocida de ficheru",
+ "An error occurred. Please contact your admin." : "Asocedió un fallu. Contauta col to alministrador, por favor.",
"Andorra" : "Andorra",
"Anguilla" : "Anguilla",
"Albania" : "Albania",
@@ -32,11 +37,14 @@ OC.L10N.register(
"Error" : "Fallu",
"Saved" : "Guardóse",
"TURN server protocols" : "Protocolos del sirvidor TURN",
+ "OK" : "Aceutar",
+ "Checking …" : "Comprobando...",
"Copy link" : "Copiar enllaz",
"Waiting for others to join the call …" : "Esperando que los otros se xunan a la llamada...",
"Dismiss" : "Escartar",
"Show your screen" : "Amosar la to pantalla",
"Stop screensharing" : "Parar compartición de pantalla",
+ "More actions" : "Más aiciones",
"Mute audio" : "Silenciar audiu",
"Disable video" : "Deshabilitar videu",
"Enable screensharing" : "Activar compartición de pantalla",
@@ -49,15 +57,19 @@ OC.L10N.register(
"Back" : "Atrás",
"You" : "Tu",
"Favorite" : "Marcar como favoritu",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Password protection",
"Enter a password" : "Introduz una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Desaniciar",
"Password" : "Password",
"API token" : "Pase d'API",
"Login" : "Aniciu de sesión",
"Nickname" : "Nomatu",
"Client ID" : "ID de veceru",
+ "Calls" : "Llamaes",
"Remove from favorites" : "Remove from favorites",
"Add to favorites" : "Add to favorites",
"Loading" : "Cargando",
@@ -66,15 +78,20 @@ OC.L10N.register(
"Password protect" : "Protexer con contraseña",
"Close" : "Zarrar",
"Reply" : "Rempuesta",
+ "Contact" : "Contautu",
"Today" : "Güei",
"Yesterday" : "Ayeri",
"guest" : "invitáu",
"No results" : "Ensin resultaos",
"Add users or groups" : "Add users or groups",
+ "Details" : "Detalles",
"Settings" : "Settings",
"Keyboard shortcuts" : "Atayos de tecláu",
"Search" : "Search",
"Send" : "Unviar",
+ "Files" : "Ficheros",
+ "Audio" : "Audiu",
+ "Other" : "Otru",
"Default" : "Predetermináu",
"Access to microphone & camera is only possible with HTTPS" : "L'accesu a la cámara y micrófonu namái ye posible con HTTPS",
"Access to microphone & camera was denied" : "Ñegóse l'accesu a la cámara y micrófonu",
diff --git a/l10n/ast.json b/l10n/ast.json
index 0d89a2788..5fa906e5a 100644
--- a/l10n/ast.json
+++ b/l10n/ast.json
@@ -1,6 +1,11 @@
{ "translations": {
"_%n guest_::_%n guests_" : ["%n convidáu/ada","%n convidaos/es"],
"Guest" : "Convidáu/ada",
+ "File is too big" : "El ficheru ye pergrande",
+ "Invalid file provided" : "Apurrióse un ficheru non válidu",
+ "Invalid image" : "Imaxe non válida",
+ "Unknown filetype" : "Triba desconocida de ficheru",
+ "An error occurred. Please contact your admin." : "Asocedió un fallu. Contauta col to alministrador, por favor.",
"Andorra" : "Andorra",
"Anguilla" : "Anguilla",
"Albania" : "Albania",
@@ -30,11 +35,14 @@
"Error" : "Fallu",
"Saved" : "Guardóse",
"TURN server protocols" : "Protocolos del sirvidor TURN",
+ "OK" : "Aceutar",
+ "Checking …" : "Comprobando...",
"Copy link" : "Copiar enllaz",
"Waiting for others to join the call …" : "Esperando que los otros se xunan a la llamada...",
"Dismiss" : "Escartar",
"Show your screen" : "Amosar la to pantalla",
"Stop screensharing" : "Parar compartición de pantalla",
+ "More actions" : "Más aiciones",
"Mute audio" : "Silenciar audiu",
"Disable video" : "Deshabilitar videu",
"Enable screensharing" : "Activar compartición de pantalla",
@@ -47,15 +55,19 @@
"Back" : "Atrás",
"You" : "Tu",
"Favorite" : "Marcar como favoritu",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Password protection",
"Enter a password" : "Introduz una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Desaniciar",
"Password" : "Password",
"API token" : "Pase d'API",
"Login" : "Aniciu de sesión",
"Nickname" : "Nomatu",
"Client ID" : "ID de veceru",
+ "Calls" : "Llamaes",
"Remove from favorites" : "Remove from favorites",
"Add to favorites" : "Add to favorites",
"Loading" : "Cargando",
@@ -64,15 +76,20 @@
"Password protect" : "Protexer con contraseña",
"Close" : "Zarrar",
"Reply" : "Rempuesta",
+ "Contact" : "Contautu",
"Today" : "Güei",
"Yesterday" : "Ayeri",
"guest" : "invitáu",
"No results" : "Ensin resultaos",
"Add users or groups" : "Add users or groups",
+ "Details" : "Detalles",
"Settings" : "Settings",
"Keyboard shortcuts" : "Atayos de tecláu",
"Search" : "Search",
"Send" : "Unviar",
+ "Files" : "Ficheros",
+ "Audio" : "Audiu",
+ "Other" : "Otru",
"Default" : "Predetermináu",
"Access to microphone & camera is only possible with HTTPS" : "L'accesu a la cámara y micrófonu namái ye posible con HTTPS",
"Access to microphone & camera was denied" : "Ñegóse l'accesu a la cámara y micrófonu",
diff --git a/l10n/bg.js b/l10n/bg.js
index 83310708f..8525aea75 100644
--- a/l10n/bg.js
+++ b/l10n/bg.js
@@ -47,6 +47,7 @@ OC.L10N.register(
"The command does not exist" : "Командата не съществува",
"An error occurred while running the command. Please ask an administrator to check the logs." : "Възникна грешка при изпълнение на командата. Моля, помолете администратор да провери регистрационните /журнали/ файлове.",
"Talk updates ✅" : "Актуализации на Talk ✅",
+ "Reaction deleted by author" : "Реакцията е изтрита от автор",
"{actor} created the conversation" : "{actor} създаде разговора",
"You created the conversation" : "Вие създадохте разговор",
"An administrator created the conversation" : "Администратор създаде разговора",
@@ -148,6 +149,8 @@ OC.L10N.register(
"You stopped Matterbridge" : "Спряхте Matterbridge",
"{actor} deleted a message" : "{actor} изтри съобщение",
"You deleted a message" : "Изтрихте съобщение",
+ "{actor} deleted a reaction" : "{actor} изтри реакция",
+ "You deleted a reaction" : "Изтрихте реакция",
"{actor} cleared the history of the conversation" : "{actor} изчисти историята на разговора",
"You cleared the history of the conversation" : "Изчистихте историята на разговора",
"Message deleted by author" : "Съобщението е изтрито от автора",
@@ -207,6 +210,11 @@ OC.L10N.register(
"A deleted user replied to your message in conversation {call}" : "Изтрит потребител отговори на съобщението ви в разговор {call}",
"{guest} (guest) replied to your message in conversation {call}" : "{guest} (гост) отговори на съобщението ви в разговор {call}",
"A guest replied to your message in conversation {call}" : "Гост отговори на съобщението ви в разговор {call}",
+ "{user} reacted with {reaction} to your private message" : "{user} реагира с {reaction} на вашето лично съобщение",
+ "{user} reacted with {reaction} to your message in conversation {call}" : "{user} реагира с {reaction} на вашето съобщение в разговор {call}",
+ "A deleted user reacted with {reaction} to your message in conversation {call}" : "Изтрит потребител реагира с {reaction} на вашето съобщение в разговор {call}",
+ "{guest} (guest) reacted with {reaction} to your message in conversation {call}" : "{guest} (гост) реагира с {reaction} на вашето съобщение в разговор {call}",
+ "A guest reacted with {reaction} to your message in conversation {call}" : "Гост реагира с {reaction} на вашето съобщение в разговор {call}",
"{user} mentioned you in a private conversation" : "{user} ви спомена в личен разговор",
"{user} mentioned you in conversation {call}" : "{user} ви спомена в разговор {call}",
"A deleted user mentioned you in conversation {call}" : "Изтрит потребител ви спомена в разговор {call}",
@@ -616,6 +624,8 @@ OC.L10N.register(
"OK: Running version: {version}" : "ОК: Работна версия: {version}",
"Error: Cannot connect to server" : "Грешка: Невъзможно свързване със сървъра",
"Error: Server did not respond with proper JSON" : "Грешка: Сървърът не отговори с правилен JSON",
+ "Could not get version" : "Не можа да се получи версията",
+ "Error: Running version: {version}; Server needs to be updated to be compatible with this version of Talk" : "Грешка: Използвана версия: {version}; Сървърът трябва да бъде актуализиран, за да бъде съвместим с тази версия на приложението Talk",
"Error: Server responded with: {error}" : "Грешка: Сървърът отговори с: {error}",
"Error: Unknown error occurred" : "Грешка: Възникна неизвестна грешка",
"High-performance backend" : "Високопроизводителен сървър",
@@ -648,6 +658,7 @@ OC.L10N.register(
"Checking …" : "Проверка ...",
"Failed: WebAssembly is disabled or not supported in this browser. Please enable WebAssembly or use a browser with support for it to do the check." : "Неуспешно: WebAssembly е деактивиран или не се поддържа в този браузър. Моля, активирайте WebAssembly или използвайте браузър с поддръжка за него, за да направите проверката.",
"Failed: \".wasm\" and \".tflite\" files were not properly returned by the web server. Please check \"System requirements\" section in Talk documentation." : "Неуспех: файловете „wasm“ и „.tflite“ не са върнати правилно от уеб сървъра. Моля, проверете раздела „Системни изисквания“ в документацията на Talk.",
+ "OK: \".wasm\" and \".tflite\" files were properly returned by the web server." : "OK: файловете „wasm“ и „.tflite“ са върнати правилно от уеб сървъра.",
"{nickName} raised their hand." : "{nickName} вдигна ръка.",
"A participant raised their hand." : "Един участник вдигна ръка.",
"Previous page of videos" : "Предишна страница с видеоклипове",
@@ -718,6 +729,7 @@ OC.L10N.register(
"An error occurred while starting screensharing." : "Възникна грешка при стартиране на споделянето на екрана.",
"Back" : "Назад",
"Access to camera was denied" : "Беше отказан достъп до камера",
+ "Error while accessing camera: It is likely in use by another program" : "Грешка при достъп до камера: възможно е тя се използва от друга програма",
"Error while accessing camera" : "Грешка при достъп до камера",
"You have been muted by a moderator" : "Бяхте заглушен от модератор",
"You" : "Ти",
@@ -890,6 +902,7 @@ OC.L10N.register(
"No search results" : "Няма резултати от търсенето",
"Groups" : "Групи",
"Circles" : "Обкръжения",
+ "Unread mentions" : "Непрочетени споменавания",
"Talk settings" : "Настройки на Talk ",
"Users, groups and circles" : "Потребители, групи и кръгове",
"Users and groups" : "Потребители и групи",
@@ -1024,9 +1037,19 @@ OC.L10N.register(
"Chat" : "Съобщения",
"Details" : "Подробности",
"Settings" : "Настройки",
+ "Shared items" : "Споделени елементи",
"Participants ({count})" : "Участници ({count})",
+ "Projects" : "Проекти",
+ "Show all media" : "Показване на всички медии",
+ "Show all files" : "Показване на всички файлове",
+ "Show all deck cards" : "Показване на всички deck карти",
+ "Show all voice messages" : "Показване на всички гласови съобщения",
+ "Show all locations" : "Показване на всички местоположения",
+ "Show all audio" : "Показване на всички аудиозаписи",
+ "Show all other" : "Показване на всичко останало",
"Meeting ID: {meetingId}" : "Идентификатор на срещата: {meetingId}",
"Your PIN: {attendeePin}" : "Вашият ПИН: {attendeePin}",
+ "Display name: <strong>{name}</strong>" : "Име за визуализация: <strong>{name}</strong>",
"Attachments folder" : "Папка с прикачени файлове",
"Privacy" : "Поверителност",
"Share my read-status and show the read-status of others" : "Споделяне на моето състояние на четене и показване на състоянието на четене и на другите",
@@ -1040,6 +1063,7 @@ OC.L10N.register(
"Fullscreen the chat or call" : "Чат на цял екран или обаждане",
"Search" : "Търсене",
"Shortcuts while in a call" : "Преки пътища по време на обаждане",
+ "Camera on and off" : "Включване и изключване на камера",
"Microphone on and off" : "Включване и изключване на микрофон",
"Space bar" : "Интервал",
"Push to talk or push to mute" : "Натиснете за разговор или натиснете за заглушаване",
@@ -1092,6 +1116,13 @@ OC.L10N.register(
"Error while accessing microphone" : "Грешка при достъп до микрофон",
"Access to camera is only possible with HTTPS" : "Достъп до камера е възможен само с HTTPS",
"An error occurred while fetching the participants" : "Възникна грешка при извличане на участниците",
+ "Media" : "Медия",
+ "Files" : "Файлове",
+ "Deck cards" : "Deck карти",
+ "Voice messages" : "Гласови съобщения",
+ "Locations" : "Местоположения",
+ "Audio" : "Аудио",
+ "Other" : "Други",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk беше актуализиран, моля, презаредете страницата",
"Do not disturb" : "Не безпокойте",
"Away" : "Отсъстващ",
@@ -1101,6 +1132,8 @@ OC.L10N.register(
"Error while uploading file \"{fileName}\"" : "Грешка при качването на файл „{fileName}“",
"An error happened when trying to share your file" : "Възникна грешка при опит за споделяне на вашия файл",
"Could not post message: {errorMessage}" : "Не можа да се публикува съобщение: {errorMessage}",
+ "Failed to add reaction" : "Неуспешно добавяне на реакция",
+ "Failed to remove reaction" : "Неуспешно премахване на реакция",
"Failed to join the conversation. Try to reload the page." : "Присъединяването към разговора не беше успешно. Опитайте да презаредите страницата.",
"You are trying to join a conversation while having an active session in another window or device. This is currently not supported by Nextcloud Talk. What do you want to do?" : "Опитвате се да се присъедините към разговор, докато имате активна сесия в друг прозорец или устройство. Това в момента не се поддържа от Nextcloud Talk. Какво искате да направите?",
"Join here" : "Присъединяване тук",
@@ -1184,6 +1217,8 @@ OC.L10N.register(
"Video on and off" : "Включване и изключване на видео",
"Choose in which folder attachments should be saved." : "Избор в коя папка да се записват прикачените файлове.",
"Exit fullscreen (f)" : "Изход от цял ​​екран (f)",
- "Fullscreen (f)" : "Цял ​​екран (f)"
+ "Fullscreen (f)" : "Цял ​​екран (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Задаване на ниво на известяване за текущия разговор. Това ще засегне само вашите известия.",
+ "OK: \".wasm\" and \".tflite\" files were properly returned by the web server" : "OK: Файловете „wasm“ и „.tflite“ са върнати правилно от уеб сървъра"
},
"nplurals=2; plural=(n != 1);");
diff --git a/l10n/bg.json b/l10n/bg.json
index 5c232fe84..e699db0a3 100644
--- a/l10n/bg.json
+++ b/l10n/bg.json
@@ -45,6 +45,7 @@
"The command does not exist" : "Командата не съществува",
"An error occurred while running the command. Please ask an administrator to check the logs." : "Възникна грешка при изпълнение на командата. Моля, помолете администратор да провери регистрационните /журнали/ файлове.",
"Talk updates ✅" : "Актуализации на Talk ✅",
+ "Reaction deleted by author" : "Реакцията е изтрита от автор",
"{actor} created the conversation" : "{actor} създаде разговора",
"You created the conversation" : "Вие създадохте разговор",
"An administrator created the conversation" : "Администратор създаде разговора",
@@ -146,6 +147,8 @@
"You stopped Matterbridge" : "Спряхте Matterbridge",
"{actor} deleted a message" : "{actor} изтри съобщение",
"You deleted a message" : "Изтрихте съобщение",
+ "{actor} deleted a reaction" : "{actor} изтри реакция",
+ "You deleted a reaction" : "Изтрихте реакция",
"{actor} cleared the history of the conversation" : "{actor} изчисти историята на разговора",
"You cleared the history of the conversation" : "Изчистихте историята на разговора",
"Message deleted by author" : "Съобщението е изтрито от автора",
@@ -205,6 +208,11 @@
"A deleted user replied to your message in conversation {call}" : "Изтрит потребител отговори на съобщението ви в разговор {call}",
"{guest} (guest) replied to your message in conversation {call}" : "{guest} (гост) отговори на съобщението ви в разговор {call}",
"A guest replied to your message in conversation {call}" : "Гост отговори на съобщението ви в разговор {call}",
+ "{user} reacted with {reaction} to your private message" : "{user} реагира с {reaction} на вашето лично съобщение",
+ "{user} reacted with {reaction} to your message in conversation {call}" : "{user} реагира с {reaction} на вашето съобщение в разговор {call}",
+ "A deleted user reacted with {reaction} to your message in conversation {call}" : "Изтрит потребител реагира с {reaction} на вашето съобщение в разговор {call}",
+ "{guest} (guest) reacted with {reaction} to your message in conversation {call}" : "{guest} (гост) реагира с {reaction} на вашето съобщение в разговор {call}",
+ "A guest reacted with {reaction} to your message in conversation {call}" : "Гост реагира с {reaction} на вашето съобщение в разговор {call}",
"{user} mentioned you in a private conversation" : "{user} ви спомена в личен разговор",
"{user} mentioned you in conversation {call}" : "{user} ви спомена в разговор {call}",
"A deleted user mentioned you in conversation {call}" : "Изтрит потребител ви спомена в разговор {call}",
@@ -614,6 +622,8 @@
"OK: Running version: {version}" : "ОК: Работна версия: {version}",
"Error: Cannot connect to server" : "Грешка: Невъзможно свързване със сървъра",
"Error: Server did not respond with proper JSON" : "Грешка: Сървърът не отговори с правилен JSON",
+ "Could not get version" : "Не можа да се получи версията",
+ "Error: Running version: {version}; Server needs to be updated to be compatible with this version of Talk" : "Грешка: Използвана версия: {version}; Сървърът трябва да бъде актуализиран, за да бъде съвместим с тази версия на приложението Talk",
"Error: Server responded with: {error}" : "Грешка: Сървърът отговори с: {error}",
"Error: Unknown error occurred" : "Грешка: Възникна неизвестна грешка",
"High-performance backend" : "Високопроизводителен сървър",
@@ -646,6 +656,7 @@
"Checking …" : "Проверка ...",
"Failed: WebAssembly is disabled or not supported in this browser. Please enable WebAssembly or use a browser with support for it to do the check." : "Неуспешно: WebAssembly е деактивиран или не се поддържа в този браузър. Моля, активирайте WebAssembly или използвайте браузър с поддръжка за него, за да направите проверката.",
"Failed: \".wasm\" and \".tflite\" files were not properly returned by the web server. Please check \"System requirements\" section in Talk documentation." : "Неуспех: файловете „wasm“ и „.tflite“ не са върнати правилно от уеб сървъра. Моля, проверете раздела „Системни изисквания“ в документацията на Talk.",
+ "OK: \".wasm\" and \".tflite\" files were properly returned by the web server." : "OK: файловете „wasm“ и „.tflite“ са върнати правилно от уеб сървъра.",
"{nickName} raised their hand." : "{nickName} вдигна ръка.",
"A participant raised their hand." : "Един участник вдигна ръка.",
"Previous page of videos" : "Предишна страница с видеоклипове",
@@ -716,6 +727,7 @@
"An error occurred while starting screensharing." : "Възникна грешка при стартиране на споделянето на екрана.",
"Back" : "Назад",
"Access to camera was denied" : "Беше отказан достъп до камера",
+ "Error while accessing camera: It is likely in use by another program" : "Грешка при достъп до камера: възможно е тя се използва от друга програма",
"Error while accessing camera" : "Грешка при достъп до камера",
"You have been muted by a moderator" : "Бяхте заглушен от модератор",
"You" : "Ти",
@@ -888,6 +900,7 @@
"No search results" : "Няма резултати от търсенето",
"Groups" : "Групи",
"Circles" : "Обкръжения",
+ "Unread mentions" : "Непрочетени споменавания",
"Talk settings" : "Настройки на Talk ",
"Users, groups and circles" : "Потребители, групи и кръгове",
"Users and groups" : "Потребители и групи",
@@ -1022,9 +1035,19 @@
"Chat" : "Съобщения",
"Details" : "Подробности",
"Settings" : "Настройки",
+ "Shared items" : "Споделени елементи",
"Participants ({count})" : "Участници ({count})",
+ "Projects" : "Проекти",
+ "Show all media" : "Показване на всички медии",
+ "Show all files" : "Показване на всички файлове",
+ "Show all deck cards" : "Показване на всички deck карти",
+ "Show all voice messages" : "Показване на всички гласови съобщения",
+ "Show all locations" : "Показване на всички местоположения",
+ "Show all audio" : "Показване на всички аудиозаписи",
+ "Show all other" : "Показване на всичко останало",
"Meeting ID: {meetingId}" : "Идентификатор на срещата: {meetingId}",
"Your PIN: {attendeePin}" : "Вашият ПИН: {attendeePin}",
+ "Display name: <strong>{name}</strong>" : "Име за визуализация: <strong>{name}</strong>",
"Attachments folder" : "Папка с прикачени файлове",
"Privacy" : "Поверителност",
"Share my read-status and show the read-status of others" : "Споделяне на моето състояние на четене и показване на състоянието на четене и на другите",
@@ -1038,6 +1061,7 @@
"Fullscreen the chat or call" : "Чат на цял екран или обаждане",
"Search" : "Търсене",
"Shortcuts while in a call" : "Преки пътища по време на обаждане",
+ "Camera on and off" : "Включване и изключване на камера",
"Microphone on and off" : "Включване и изключване на микрофон",
"Space bar" : "Интервал",
"Push to talk or push to mute" : "Натиснете за разговор или натиснете за заглушаване",
@@ -1090,6 +1114,13 @@
"Error while accessing microphone" : "Грешка при достъп до микрофон",
"Access to camera is only possible with HTTPS" : "Достъп до камера е възможен само с HTTPS",
"An error occurred while fetching the participants" : "Възникна грешка при извличане на участниците",
+ "Media" : "Медия",
+ "Files" : "Файлове",
+ "Deck cards" : "Deck карти",
+ "Voice messages" : "Гласови съобщения",
+ "Locations" : "Местоположения",
+ "Audio" : "Аудио",
+ "Other" : "Други",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk беше актуализиран, моля, презаредете страницата",
"Do not disturb" : "Не безпокойте",
"Away" : "Отсъстващ",
@@ -1099,6 +1130,8 @@
"Error while uploading file \"{fileName}\"" : "Грешка при качването на файл „{fileName}“",
"An error happened when trying to share your file" : "Възникна грешка при опит за споделяне на вашия файл",
"Could not post message: {errorMessage}" : "Не можа да се публикува съобщение: {errorMessage}",
+ "Failed to add reaction" : "Неуспешно добавяне на реакция",
+ "Failed to remove reaction" : "Неуспешно премахване на реакция",
"Failed to join the conversation. Try to reload the page." : "Присъединяването към разговора не беше успешно. Опитайте да презаредите страницата.",
"You are trying to join a conversation while having an active session in another window or device. This is currently not supported by Nextcloud Talk. What do you want to do?" : "Опитвате се да се присъедините към разговор, докато имате активна сесия в друг прозорец или устройство. Това в момента не се поддържа от Nextcloud Talk. Какво искате да направите?",
"Join here" : "Присъединяване тук",
@@ -1182,6 +1215,8 @@
"Video on and off" : "Включване и изключване на видео",
"Choose in which folder attachments should be saved." : "Избор в коя папка да се записват прикачените файлове.",
"Exit fullscreen (f)" : "Изход от цял ​​екран (f)",
- "Fullscreen (f)" : "Цял ​​екран (f)"
+ "Fullscreen (f)" : "Цял ​​екран (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Задаване на ниво на известяване за текущия разговор. Това ще засегне само вашите известия.",
+ "OK: \".wasm\" and \".tflite\" files were properly returned by the web server" : "OK: Файловете „wasm“ и „.tflite“ са върнати правилно от уеб сървъра"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/l10n/br.js b/l10n/br.js
index 04755660d..3ce25ecb3 100644
--- a/l10n/br.js
+++ b/l10n/br.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["%n all","%n all","%n all","%n all","%n all"],
"{actor} invited you to {call}" : "Kouviet oc'h da {call} gant {actor}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Kouviet oc'h d'un <strong>diviz</strong> pe ouzhpennet d'ur <strong>galvadenn</strong>",
+ "Other activities" : "Oberiantizoù all",
"Talk" : "Komz",
"Guest" : "Kouviad",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Donemat war Nextcloud Talk !\nEn diviz-mañ e voc'h kemenet diwar-benn perzhioù nevez a kavoc'h e Nextcloud Talk.",
@@ -103,6 +104,11 @@ OC.L10N.register(
"Talk to %s" : "Komz da %s",
"File is not shared, or shared but not with the user" : "N'eo ket rannet ar restr, pe n'eo ket rannet gan an implijour",
"No account available to delete." : "N'ez eus kont ebet da lemel",
+ "File is too big" : "Re vras eo ar restr",
+ "Invalid file provided" : "Ar restr roet n'eo ket unan aotreet",
+ "Invalid image" : "N'eo ket aotreet ar skeudenn",
+ "Unknown filetype" : "N'eo ket anavezet stumm ar restr",
+ "An error occurred. Please contact your admin." : "Ur fazi a zo bet. Galvit o merour mar-plij.",
"Talk mentions" : "Menegoù Talk",
"Write to conversation" : "Skrivañ d'an diviz",
"Writes event information into a conversation of your choice" : "Skriva titouroù an darvout en diviz o peus c'hoant",
@@ -529,6 +535,7 @@ OC.L10N.register(
"Testing whether the TURN server returns ICE candidates" : "Amprouiñ adkasadenn emstriver ICE at servijour TURN",
"Test this server" : "Arnodañ ar servijour-mañ",
"TURN servers" : "Servijour TURN",
+ "OK" : "OK",
"Copy link" : "Kopiañ al liamm",
"Waiting for others to join the call …" : "O c'hortoz ma teuio ar re all er gemenadenn ...",
"You can invite others in the participant tab of the sidebar" : "Galout a rit kouviañ tud gant an daolenn lodek er verenn gostez",
@@ -582,6 +589,8 @@ OC.L10N.register(
"Call in progress" : "Kemenadenn en dro",
"Favorite" : "Pennroll",
"Conversation settings" : "Stummoù diviz",
+ "Description" : "Deskrivadur",
+ "Notifications" : "Kemennadennoù",
"Leave conversation" : "Kuitaat an diviz",
"Delete conversation" : "Lemel an diviz",
"You need to promote a new moderator before you can leave the conversation." : "Ret eo deoc'h lakaat unan bennak da moderatour a-rao kuitaat an diviz.",
@@ -593,6 +602,8 @@ OC.L10N.register(
"Start time (optional)" : "Amzer kregiñ (dibab)",
"Save" : "Enrollañ",
"Edit" : "Cheñch",
+ "More information" : "Muioc'h a ditouroù",
+ "Delete" : "Lemel",
"Password" : "Ger-tremen",
"Login" : "Anv arveriad",
"Client ID" : "ID kliant",
@@ -662,8 +673,11 @@ OC.L10N.register(
"Add other sources" : "Ouzhpennañ dre un orin all",
"Participants" : "Tud",
"Chat" : "Chat",
+ "Details" : "Munudoù",
"Settings" : "Arventennoù",
+ "Projects" : "Raktres",
"Attachments folder" : "Teuliad stag",
+ "Privacy" : "Prevezder",
"Search" : "Klask",
"Select location for attachments" : "Choazit ul lec'h evit stagañ",
"Error while setting attachment folder" : "Ur fazi a zo bet en ur lakaat an teuliad stagañ",
@@ -694,6 +708,10 @@ OC.L10N.register(
"Error while accessing microphone" : "Ur fazi a zo bet en ur tizhout ar mikro",
"Access to camera is only possible with HTTPS" : "Tizhout ar c'hamera n'eo posupl nemet gant HTTPS",
"An error occurred while fetching the participants" : "Ur fazi a zo bet en ur pakañ an tud",
+ "Media" : "Media",
+ "Files" : "Restroù",
+ "Audio" : "Audio",
+ "Other" : "All",
"Nextcloud Talk was updated, please reload the page" : "Adnevesaet eo bet Nextcloud Talk , adkargit ar bajenn",
"Do not disturb" : "Na rannit ket",
"Away" : "Pell",
diff --git a/l10n/br.json b/l10n/br.json
index 9c4f1760a..2a0098870 100644
--- a/l10n/br.json
+++ b/l10n/br.json
@@ -10,6 +10,7 @@
"_%n other_::_%n others_" : ["%n all","%n all","%n all","%n all","%n all"],
"{actor} invited you to {call}" : "Kouviet oc'h da {call} gant {actor}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Kouviet oc'h d'un <strong>diviz</strong> pe ouzhpennet d'ur <strong>galvadenn</strong>",
+ "Other activities" : "Oberiantizoù all",
"Talk" : "Komz",
"Guest" : "Kouviad",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Donemat war Nextcloud Talk !\nEn diviz-mañ e voc'h kemenet diwar-benn perzhioù nevez a kavoc'h e Nextcloud Talk.",
@@ -101,6 +102,11 @@
"Talk to %s" : "Komz da %s",
"File is not shared, or shared but not with the user" : "N'eo ket rannet ar restr, pe n'eo ket rannet gan an implijour",
"No account available to delete." : "N'ez eus kont ebet da lemel",
+ "File is too big" : "Re vras eo ar restr",
+ "Invalid file provided" : "Ar restr roet n'eo ket unan aotreet",
+ "Invalid image" : "N'eo ket aotreet ar skeudenn",
+ "Unknown filetype" : "N'eo ket anavezet stumm ar restr",
+ "An error occurred. Please contact your admin." : "Ur fazi a zo bet. Galvit o merour mar-plij.",
"Talk mentions" : "Menegoù Talk",
"Write to conversation" : "Skrivañ d'an diviz",
"Writes event information into a conversation of your choice" : "Skriva titouroù an darvout en diviz o peus c'hoant",
@@ -527,6 +533,7 @@
"Testing whether the TURN server returns ICE candidates" : "Amprouiñ adkasadenn emstriver ICE at servijour TURN",
"Test this server" : "Arnodañ ar servijour-mañ",
"TURN servers" : "Servijour TURN",
+ "OK" : "OK",
"Copy link" : "Kopiañ al liamm",
"Waiting for others to join the call …" : "O c'hortoz ma teuio ar re all er gemenadenn ...",
"You can invite others in the participant tab of the sidebar" : "Galout a rit kouviañ tud gant an daolenn lodek er verenn gostez",
@@ -580,6 +587,8 @@
"Call in progress" : "Kemenadenn en dro",
"Favorite" : "Pennroll",
"Conversation settings" : "Stummoù diviz",
+ "Description" : "Deskrivadur",
+ "Notifications" : "Kemennadennoù",
"Leave conversation" : "Kuitaat an diviz",
"Delete conversation" : "Lemel an diviz",
"You need to promote a new moderator before you can leave the conversation." : "Ret eo deoc'h lakaat unan bennak da moderatour a-rao kuitaat an diviz.",
@@ -591,6 +600,8 @@
"Start time (optional)" : "Amzer kregiñ (dibab)",
"Save" : "Enrollañ",
"Edit" : "Cheñch",
+ "More information" : "Muioc'h a ditouroù",
+ "Delete" : "Lemel",
"Password" : "Ger-tremen",
"Login" : "Anv arveriad",
"Client ID" : "ID kliant",
@@ -660,8 +671,11 @@
"Add other sources" : "Ouzhpennañ dre un orin all",
"Participants" : "Tud",
"Chat" : "Chat",
+ "Details" : "Munudoù",
"Settings" : "Arventennoù",
+ "Projects" : "Raktres",
"Attachments folder" : "Teuliad stag",
+ "Privacy" : "Prevezder",
"Search" : "Klask",
"Select location for attachments" : "Choazit ul lec'h evit stagañ",
"Error while setting attachment folder" : "Ur fazi a zo bet en ur lakaat an teuliad stagañ",
@@ -692,6 +706,10 @@
"Error while accessing microphone" : "Ur fazi a zo bet en ur tizhout ar mikro",
"Access to camera is only possible with HTTPS" : "Tizhout ar c'hamera n'eo posupl nemet gant HTTPS",
"An error occurred while fetching the participants" : "Ur fazi a zo bet en ur pakañ an tud",
+ "Media" : "Media",
+ "Files" : "Restroù",
+ "Audio" : "Audio",
+ "Other" : "All",
"Nextcloud Talk was updated, please reload the page" : "Adnevesaet eo bet Nextcloud Talk , adkargit ar bajenn",
"Do not disturb" : "Na rannit ket",
"Away" : "Pell",
diff --git a/l10n/ca.js b/l10n/ca.js
index a0d6e9012..e2933ca21 100644
--- a/l10n/ca.js
+++ b/l10n/ca.js
@@ -111,6 +111,11 @@ OC.L10N.register(
"Talk to %s" : "Trucada a %s",
"File is not shared, or shared but not with the user" : "El fitxer no és compartit, o ho és però no amb l'usuari",
"No account available to delete." : "No hi ha cap compte disponible per suprimir.",
+ "File is too big" : "El fitxer és massa gran",
+ "Invalid file provided" : "El fitxer proporcionat no és vàlid",
+ "Invalid image" : "La imatge no és vàlida",
+ "Unknown filetype" : "Tipus de fitxer desconegut",
+ "An error occurred. Please contact your admin." : "Hi ha hagut un error. Contacteu amb l'administrador.",
"Talk mentions" : "Mencions de Talk",
"Write to conversation" : "Escriu a la conversa",
"Writes event information into a conversation of your choice" : "Escriu informació de l'esdeveniment en una conversa de la vostra elecció",
@@ -550,6 +555,8 @@ OC.L10N.register(
"Testing whether the TURN server returns ICE candidates" : "S'està provant si el servidor TURN retorna els candidats de l'ICE",
"Test this server" : "Prova aquest servidor",
"TURN servers" : "Servidors TURN",
+ "OK" : "D'acord",
+ "Checking …" : "Comprovant ...",
"Copy link" : "Copia l'enllaç",
"Waiting for others to join the call …" : "Esperant a la resta per realitzar la trucada …",
"You can invite others in the participant tab of the sidebar" : "Podeu convidar més gent des de la pestanya Participants al panell lateral",
@@ -560,6 +567,7 @@ OC.L10N.register(
"Dismiss" : "Descarta",
"Show your screen" : "Mostra la teva pantalla",
"Stop screensharing" : "Deixar de compartir",
+ "More actions" : "Més accions",
"No audio" : "Sense àudio",
"Mute audio" : "Silencia l'àudio",
"Unmute audio" : "Activa l'àudio",
@@ -603,11 +611,15 @@ OC.L10N.register(
"Drop your files to upload" : "Deixeu anar els fitxers per penjar-los",
"Call in progress" : "S'està fent una trucada",
"Favorite" : "Preferit",
+ "Restricted" : "Restringit",
"Conversation settings" : "Configuració de la conversa",
+ "Description" : "Descripció",
+ "Notifications" : "Notificacions",
"Leave conversation" : "Surt de la conversa",
"Delete conversation" : "Suprimeix la conversa",
"You need to promote a new moderator before you can leave the conversation." : "Heu de designar un nou moderador abans de deixar la conversa.",
"Do you really want to delete \"{displayName}\"?" : "De debò que voleu suprimir \"{displayName}\"?",
+ "Allow guests" : "Permet visitants",
"Password protection" : "Protecció amb contrasenya",
"Enter a password" : "Introduïu una contrasenya",
"Copy conversation link" : "Copia l'enllaç de la conversa",
@@ -615,6 +627,8 @@ OC.L10N.register(
"Start time (optional)" : "Hora d'inici (opcional)",
"Save" : "Desa",
"Edit" : "Edita",
+ "More information" : "Més informació",
+ "Delete" : "Eliminar",
"You can bridge channels from various instant messaging systems with Matterbridge." : "Podeu fer ponts des de diversos sistemes de missatgeria instantània amb Matterbridge.",
"Nextcloud URL" : "Nextcloud URL",
"Nextcloud user" : "Usuari Nextcloud",
@@ -660,7 +674,9 @@ OC.L10N.register(
"running" : "en execució",
"not running" : "no s'està executant",
"Bridge saved" : "Pont desat",
+ "Calls" : "Trucades",
"Choose devices" : "Tria dispositius",
+ "Mark as read" : "Marca com a llegit",
"Remove from favorites" : "Suprimeix dels favorits",
"Add to favorites" : "Afegeix a favorits",
"You: {lastMessage}" : "Vostè: {lastMessage}",
@@ -694,8 +710,10 @@ OC.L10N.register(
"Select microphone" : "Seleccioneu el micròfon",
"No camera available" : "No hi ha cap càmera disponible",
"Select camera" : "Seleccioni la càmera",
+ "Unread messages" : "Missatges sense llegir",
"Reply" : "Respon",
"Go to file" : "Vés al fitxer",
+ "Contact" : "Contacte",
"Scroll to bottom" : "Desplaça al final",
"Today" : "Avui",
"Yesterday" : "Ahir",
@@ -727,8 +745,12 @@ OC.L10N.register(
"Add other sources" : "Afegir altres fonts",
"Participants" : "Participants",
"Chat" : "Xat",
+ "Details" : "Detalls",
"Settings" : "Paràmetres",
+ "Projects" : "Projectes",
+ "Show all files" : "Mostra tots els fitxers",
"Attachments folder" : "Carpeta fitxers adjunts",
+ "Privacy" : "Privadesa",
"Keyboard shortcuts" : "Dreceres de teclat",
"Speed up your Talk experience with these quick shortcuts." : "Accelereu l'experiència Talk amb aquestes dreceres ràpides.",
"Focus the chat input" : "Posar focus a l'entrada del xat",
@@ -766,6 +788,11 @@ OC.L10N.register(
"Error while accessing microphone" : "S'ha produït un error en accedir al micròfon",
"Access to camera is only possible with HTTPS" : "L'accés a la càmera només és possible amb HTTPS",
"An error occurred while fetching the participants" : "S'ha produït un error en recuperar els participants",
+ "Media" : "Multimèdia",
+ "Files" : "Fitxers",
+ "Locations" : "Ubicacions",
+ "Audio" : "Àudio",
+ "Other" : "Altres",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk s'ha actualitzat, si us plau, torneu a carregar la pàgina",
"Do not disturb" : "No molesteu",
"Away" : "Absent",
diff --git a/l10n/ca.json b/l10n/ca.json
index aaf8fa088..3907b982c 100644
--- a/l10n/ca.json
+++ b/l10n/ca.json
@@ -109,6 +109,11 @@
"Talk to %s" : "Trucada a %s",
"File is not shared, or shared but not with the user" : "El fitxer no és compartit, o ho és però no amb l'usuari",
"No account available to delete." : "No hi ha cap compte disponible per suprimir.",
+ "File is too big" : "El fitxer és massa gran",
+ "Invalid file provided" : "El fitxer proporcionat no és vàlid",
+ "Invalid image" : "La imatge no és vàlida",
+ "Unknown filetype" : "Tipus de fitxer desconegut",
+ "An error occurred. Please contact your admin." : "Hi ha hagut un error. Contacteu amb l'administrador.",
"Talk mentions" : "Mencions de Talk",
"Write to conversation" : "Escriu a la conversa",
"Writes event information into a conversation of your choice" : "Escriu informació de l'esdeveniment en una conversa de la vostra elecció",
@@ -548,6 +553,8 @@
"Testing whether the TURN server returns ICE candidates" : "S'està provant si el servidor TURN retorna els candidats de l'ICE",
"Test this server" : "Prova aquest servidor",
"TURN servers" : "Servidors TURN",
+ "OK" : "D'acord",
+ "Checking …" : "Comprovant ...",
"Copy link" : "Copia l'enllaç",
"Waiting for others to join the call …" : "Esperant a la resta per realitzar la trucada …",
"You can invite others in the participant tab of the sidebar" : "Podeu convidar més gent des de la pestanya Participants al panell lateral",
@@ -558,6 +565,7 @@
"Dismiss" : "Descarta",
"Show your screen" : "Mostra la teva pantalla",
"Stop screensharing" : "Deixar de compartir",
+ "More actions" : "Més accions",
"No audio" : "Sense àudio",
"Mute audio" : "Silencia l'àudio",
"Unmute audio" : "Activa l'àudio",
@@ -601,11 +609,15 @@
"Drop your files to upload" : "Deixeu anar els fitxers per penjar-los",
"Call in progress" : "S'està fent una trucada",
"Favorite" : "Preferit",
+ "Restricted" : "Restringit",
"Conversation settings" : "Configuració de la conversa",
+ "Description" : "Descripció",
+ "Notifications" : "Notificacions",
"Leave conversation" : "Surt de la conversa",
"Delete conversation" : "Suprimeix la conversa",
"You need to promote a new moderator before you can leave the conversation." : "Heu de designar un nou moderador abans de deixar la conversa.",
"Do you really want to delete \"{displayName}\"?" : "De debò que voleu suprimir \"{displayName}\"?",
+ "Allow guests" : "Permet visitants",
"Password protection" : "Protecció amb contrasenya",
"Enter a password" : "Introduïu una contrasenya",
"Copy conversation link" : "Copia l'enllaç de la conversa",
@@ -613,6 +625,8 @@
"Start time (optional)" : "Hora d'inici (opcional)",
"Save" : "Desa",
"Edit" : "Edita",
+ "More information" : "Més informació",
+ "Delete" : "Eliminar",
"You can bridge channels from various instant messaging systems with Matterbridge." : "Podeu fer ponts des de diversos sistemes de missatgeria instantània amb Matterbridge.",
"Nextcloud URL" : "Nextcloud URL",
"Nextcloud user" : "Usuari Nextcloud",
@@ -658,7 +672,9 @@
"running" : "en execució",
"not running" : "no s'està executant",
"Bridge saved" : "Pont desat",
+ "Calls" : "Trucades",
"Choose devices" : "Tria dispositius",
+ "Mark as read" : "Marca com a llegit",
"Remove from favorites" : "Suprimeix dels favorits",
"Add to favorites" : "Afegeix a favorits",
"You: {lastMessage}" : "Vostè: {lastMessage}",
@@ -692,8 +708,10 @@
"Select microphone" : "Seleccioneu el micròfon",
"No camera available" : "No hi ha cap càmera disponible",
"Select camera" : "Seleccioni la càmera",
+ "Unread messages" : "Missatges sense llegir",
"Reply" : "Respon",
"Go to file" : "Vés al fitxer",
+ "Contact" : "Contacte",
"Scroll to bottom" : "Desplaça al final",
"Today" : "Avui",
"Yesterday" : "Ahir",
@@ -725,8 +743,12 @@
"Add other sources" : "Afegir altres fonts",
"Participants" : "Participants",
"Chat" : "Xat",
+ "Details" : "Detalls",
"Settings" : "Paràmetres",
+ "Projects" : "Projectes",
+ "Show all files" : "Mostra tots els fitxers",
"Attachments folder" : "Carpeta fitxers adjunts",
+ "Privacy" : "Privadesa",
"Keyboard shortcuts" : "Dreceres de teclat",
"Speed up your Talk experience with these quick shortcuts." : "Accelereu l'experiència Talk amb aquestes dreceres ràpides.",
"Focus the chat input" : "Posar focus a l'entrada del xat",
@@ -764,6 +786,11 @@
"Error while accessing microphone" : "S'ha produït un error en accedir al micròfon",
"Access to camera is only possible with HTTPS" : "L'accés a la càmera només és possible amb HTTPS",
"An error occurred while fetching the participants" : "S'ha produït un error en recuperar els participants",
+ "Media" : "Multimèdia",
+ "Files" : "Fitxers",
+ "Locations" : "Ubicacions",
+ "Audio" : "Àudio",
+ "Other" : "Altres",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk s'ha actualitzat, si us plau, torneu a carregar la pàgina",
"Do not disturb" : "No molesteu",
"Away" : "Absent",
diff --git a/l10n/cs.js b/l10n/cs.js
index fe08edcdb..e74999a0a 100644
--- a/l10n/cs.js
+++ b/l10n/cs.js
@@ -1039,13 +1039,7 @@ OC.L10N.register(
"Settings" : "Nastavení",
"Shared items" : "Sdílené položky",
"Participants ({count})" : "Účastníků ({count})",
- "Media" : "Média",
- "Files" : "Soubory",
- "Deck cards" : "Karty aplikace Deck",
- "Voice messages" : "Hlasové zprávy",
- "Locations" : "Polohy",
- "Audio" : "Zvuk",
- "Other" : "Ostatní",
+ "Projects" : "Projekty",
"Show all media" : "Zobrazit veškerá média",
"Show all files" : "Zobrazit všechny soubory",
"Show all deck cards" : "Zobrazit všechny karty aplikace Deck",
@@ -1053,7 +1047,6 @@ OC.L10N.register(
"Show all locations" : "Zobrazit všechny polohy",
"Show all audio" : "Zobrazit všechno audio",
"Show all other" : "Zobrazit všechno ostatní",
- "Projects" : "Projekty",
"Meeting ID: {meetingId}" : "Identif. schůzky: {meetingId}",
"Your PIN: {attendeePin}" : "Váš PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Zobrazované jméno: <strong>{name}</strong>",
@@ -1063,6 +1056,7 @@ OC.L10N.register(
"Sounds" : "Zvuky",
"Play sounds when participants join or leave a call" : "Přehrát zvuky oznámení když se účastníci připojí nebo odpojí",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "Z důvodu stávajících technických omezení, zavedených jeho výrobcem, nemohou být v prohlížeči Safari na zařízeních iPad a iPhone přehrávány zvuky.",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "Zvuky pro upozorňování na chat a volání je možné si přizpůsobit v osobních nastaveních.",
"Keyboard shortcuts" : "Klávesové zkratky",
"Speed up your Talk experience with these quick shortcuts." : "Pohybujte se po Talk rychleji pomocí těchto pohotových klávesových zkratek",
"Focus the chat input" : "Zaměřit okno psaní chatu",
@@ -1123,6 +1117,13 @@ OC.L10N.register(
"Error while accessing microphone" : "Chyba při přístupu k mikrofonu",
"Access to camera is only possible with HTTPS" : "Přístup ke kameře je možný pouze přes HTTPS",
"An error occurred while fetching the participants" : "Došlo k chybě při získávání seznamu účastníků",
+ "Media" : "Média",
+ "Files" : "Soubory",
+ "Deck cards" : "Karty aplikace Deck",
+ "Voice messages" : "Hlasové zprávy",
+ "Locations" : "Polohy",
+ "Audio" : "Zvuk",
+ "Other" : "Ostatní",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk bylo aktualizováno – načtěte stránku znovu",
"Do not disturb" : "Nerušit",
"Away" : "Pryč",
@@ -1131,6 +1132,7 @@ OC.L10N.register(
"Not enough free space to upload file \"{fileName}\"" : "Nedostatek místa pro nahrání souboru „{fileName}“",
"Error while uploading file \"{fileName}\"" : "Chyba při nahrávání „{fileName}“",
"An error happened when trying to share your file" : "Při pokusu o sdílení vašeho souboru došlo k chybě",
+ "{guest} (guest)" : "{guest} (host)",
"Could not post message: {errorMessage}" : "Zprávu se nedaří odeslat: {errorMessage}",
"Failed to add reaction" : "Nepodařilo se přidat reakci",
"Failed to remove reaction" : "Nepodařilo se odebrat reakci",
diff --git a/l10n/cs.json b/l10n/cs.json
index c4295284c..1a027f955 100644
--- a/l10n/cs.json
+++ b/l10n/cs.json
@@ -1037,13 +1037,7 @@
"Settings" : "Nastavení",
"Shared items" : "Sdílené položky",
"Participants ({count})" : "Účastníků ({count})",
- "Media" : "Média",
- "Files" : "Soubory",
- "Deck cards" : "Karty aplikace Deck",
- "Voice messages" : "Hlasové zprávy",
- "Locations" : "Polohy",
- "Audio" : "Zvuk",
- "Other" : "Ostatní",
+ "Projects" : "Projekty",
"Show all media" : "Zobrazit veškerá média",
"Show all files" : "Zobrazit všechny soubory",
"Show all deck cards" : "Zobrazit všechny karty aplikace Deck",
@@ -1051,7 +1045,6 @@
"Show all locations" : "Zobrazit všechny polohy",
"Show all audio" : "Zobrazit všechno audio",
"Show all other" : "Zobrazit všechno ostatní",
- "Projects" : "Projekty",
"Meeting ID: {meetingId}" : "Identif. schůzky: {meetingId}",
"Your PIN: {attendeePin}" : "Váš PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Zobrazované jméno: <strong>{name}</strong>",
@@ -1061,6 +1054,7 @@
"Sounds" : "Zvuky",
"Play sounds when participants join or leave a call" : "Přehrát zvuky oznámení když se účastníci připojí nebo odpojí",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "Z důvodu stávajících technických omezení, zavedených jeho výrobcem, nemohou být v prohlížeči Safari na zařízeních iPad a iPhone přehrávány zvuky.",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "Zvuky pro upozorňování na chat a volání je možné si přizpůsobit v osobních nastaveních.",
"Keyboard shortcuts" : "Klávesové zkratky",
"Speed up your Talk experience with these quick shortcuts." : "Pohybujte se po Talk rychleji pomocí těchto pohotových klávesových zkratek",
"Focus the chat input" : "Zaměřit okno psaní chatu",
@@ -1121,6 +1115,13 @@
"Error while accessing microphone" : "Chyba při přístupu k mikrofonu",
"Access to camera is only possible with HTTPS" : "Přístup ke kameře je možný pouze přes HTTPS",
"An error occurred while fetching the participants" : "Došlo k chybě při získávání seznamu účastníků",
+ "Media" : "Média",
+ "Files" : "Soubory",
+ "Deck cards" : "Karty aplikace Deck",
+ "Voice messages" : "Hlasové zprávy",
+ "Locations" : "Polohy",
+ "Audio" : "Zvuk",
+ "Other" : "Ostatní",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk bylo aktualizováno – načtěte stránku znovu",
"Do not disturb" : "Nerušit",
"Away" : "Pryč",
@@ -1129,6 +1130,7 @@
"Not enough free space to upload file \"{fileName}\"" : "Nedostatek místa pro nahrání souboru „{fileName}“",
"Error while uploading file \"{fileName}\"" : "Chyba při nahrávání „{fileName}“",
"An error happened when trying to share your file" : "Při pokusu o sdílení vašeho souboru došlo k chybě",
+ "{guest} (guest)" : "{guest} (host)",
"Could not post message: {errorMessage}" : "Zprávu se nedaří odeslat: {errorMessage}",
"Failed to add reaction" : "Nepodařilo se přidat reakci",
"Failed to remove reaction" : "Nepodařilo se odebrat reakci",
diff --git a/l10n/da.js b/l10n/da.js
index 4fc31620c..8c454bbc3 100644
--- a/l10n/da.js
+++ b/l10n/da.js
@@ -83,6 +83,11 @@ OC.L10N.register(
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Opkald med {user1}, {user2}, {user3}, {user4} og {user5} (Varighed {duration})",
"Talk to %s" : "Tal med %s",
"File is not shared, or shared but not with the user" : "Filen er ikke delt, eller den er delt men ikke med brugeren",
+ "File is too big" : "Filen er for stor",
+ "Invalid file provided" : "Der er angivet en ugyldig fil",
+ "Invalid image" : "Ugyldigt billede",
+ "Unknown filetype" : "Ukendt filtype",
+ "An error occurred. Please contact your admin." : "Der opstod et problem. Kontakt venligst administratoren.",
"Write to conversation" : "Skriv til samtale",
"Writes event information into a conversation of your choice" : "Skriver begivenhedsinformation i en samtale du vælger",
"%s invited you to a conversation." : "%s inviterede dig til en samtale",
@@ -277,6 +282,8 @@ OC.L10N.register(
"TURN server protocols" : "TURN server protokoller ",
"Test this server" : "Test denne server",
"TURN servers" : "TURN-servere",
+ "OK" : "OK",
+ "Checking …" : "Tjekker...",
"Copy link" : "Kopier link",
"Waiting for others to join the call …" : "Venter på andre tilslutter sig opkaldet ...",
"You can invite others in the participant tab of the sidebar" : "Du kan invitere andre i fanebladet \"deltagere\" i menuen i siden",
@@ -287,6 +294,7 @@ OC.L10N.register(
"Dismiss" : "Afvis",
"Show your screen" : "Vis din skærm",
"Stop screensharing" : "Stop skærmdeling",
+ "More actions" : "Flere handlinger",
"No audio" : "Ingen lyd",
"Mute audio" : "Slå lyden fra",
"No camera" : "Intet kamera",
@@ -311,10 +319,14 @@ OC.L10N.register(
"Drop your files to upload" : "Drop dine filer for at uploade",
"Call in progress" : "Opkald i gang",
"Favorite" : "Foretrukken",
+ "Restricted" : "Begrænset",
+ "Description" : "Beskrivelse",
+ "Notifications" : "Notifikationer",
"Leave conversation" : "Forlad samtale",
"Delete conversation" : "Slet samtale",
"You need to promote a new moderator before you can leave the conversation." : "Du skal udnævne en ny moderator før du kan forlade samtalen.",
"Do you really want to delete \"{displayName}\"?" : "Er du sikker på at du vil slette \"{displayName}\"?",
+ "Allow guests" : "Tillad gæster",
"Password protection" : "Adgangskodebeskyttelse",
"Enter a password" : "Enter a password",
"Copy conversation link" : "Kopier samtalelink",
@@ -322,11 +334,15 @@ OC.L10N.register(
"Start time (optional)" : "Starttid (valgfri)",
"Save" : "Gem",
"Edit" : "Rediger",
+ "More information" : "Mere information",
+ "Delete" : "Slet",
"Password" : "Password",
"API token" : "API nøgle",
"Login" : "Login",
"Nickname" : "Kaldenavn",
"Client ID" : "Klient-ID",
+ "Calls" : "Opkald",
+ "Mark as read" : "Marker som læst",
"Remove from favorites" : "Fjernet fra favoritter",
"Add to favorites" : "Føj til favoritter",
"You: {lastMessage}" : "Dig: {lastMessage}",
@@ -352,8 +368,12 @@ OC.L10N.register(
"Search participants" : "Find deltagere",
"Conversation name" : "Samtalenavn",
"You are currently waiting in the lobby" : "Du venter nu i lobbyen",
+ "Unread messages" : "Ulæste beskedder",
+ "Message sent" : "Beskeden blev sendt",
"Reply" : "Besvar",
+ "Mark as unread" : "Marker som ulæst",
"Go to file" : "Gå til fil",
+ "Contact" : "Kontakt",
"Today" : "I dag",
"Yesterday" : "I går",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -378,7 +398,11 @@ OC.L10N.register(
"Add other sources" : "Tilføj andre kilder",
"Participants" : "Deltagere",
"Chat" : "Chat",
+ "Details" : "Detaljer",
"Settings" : "Indstillinger",
+ "Projects" : "Projekter",
+ "Show all files" : "Vis alle filer",
+ "Privacy" : "Privatliv",
"Keyboard shortcuts" : "Tastaturgenveje",
"Search" : "Søg",
"Error while setting attachment folder" : "Fejl under indstilling af mappe til vedhæftninger",
@@ -396,6 +420,13 @@ OC.L10N.register(
"Link to a conversation" : "Link til samtale",
"Join a conversation or start a new one" : "Deltag i en samtale eller start en ny",
"An error occurred while fetching the participants" : "Kunne ikke hente listen over deltagere",
+ "Media" : "Medier",
+ "Files" : "Filer",
+ "Locations" : "Sted",
+ "Audio" : "Audio",
+ "Other" : "Andet",
+ "Do not disturb" : "Forstyr ikke",
+ "Away" : "Ikke tilstede",
"Error while sharing file" : "Fejl ved deling af fil",
"Sending signaling message has failed." : "Kunne ikke sende signalerings-besked",
"Default" : "Standard",
diff --git a/l10n/da.json b/l10n/da.json
index 8272facca..a42b914c0 100644
--- a/l10n/da.json
+++ b/l10n/da.json
@@ -81,6 +81,11 @@
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Opkald med {user1}, {user2}, {user3}, {user4} og {user5} (Varighed {duration})",
"Talk to %s" : "Tal med %s",
"File is not shared, or shared but not with the user" : "Filen er ikke delt, eller den er delt men ikke med brugeren",
+ "File is too big" : "Filen er for stor",
+ "Invalid file provided" : "Der er angivet en ugyldig fil",
+ "Invalid image" : "Ugyldigt billede",
+ "Unknown filetype" : "Ukendt filtype",
+ "An error occurred. Please contact your admin." : "Der opstod et problem. Kontakt venligst administratoren.",
"Write to conversation" : "Skriv til samtale",
"Writes event information into a conversation of your choice" : "Skriver begivenhedsinformation i en samtale du vælger",
"%s invited you to a conversation." : "%s inviterede dig til en samtale",
@@ -275,6 +280,8 @@
"TURN server protocols" : "TURN server protokoller ",
"Test this server" : "Test denne server",
"TURN servers" : "TURN-servere",
+ "OK" : "OK",
+ "Checking …" : "Tjekker...",
"Copy link" : "Kopier link",
"Waiting for others to join the call …" : "Venter på andre tilslutter sig opkaldet ...",
"You can invite others in the participant tab of the sidebar" : "Du kan invitere andre i fanebladet \"deltagere\" i menuen i siden",
@@ -285,6 +292,7 @@
"Dismiss" : "Afvis",
"Show your screen" : "Vis din skærm",
"Stop screensharing" : "Stop skærmdeling",
+ "More actions" : "Flere handlinger",
"No audio" : "Ingen lyd",
"Mute audio" : "Slå lyden fra",
"No camera" : "Intet kamera",
@@ -309,10 +317,14 @@
"Drop your files to upload" : "Drop dine filer for at uploade",
"Call in progress" : "Opkald i gang",
"Favorite" : "Foretrukken",
+ "Restricted" : "Begrænset",
+ "Description" : "Beskrivelse",
+ "Notifications" : "Notifikationer",
"Leave conversation" : "Forlad samtale",
"Delete conversation" : "Slet samtale",
"You need to promote a new moderator before you can leave the conversation." : "Du skal udnævne en ny moderator før du kan forlade samtalen.",
"Do you really want to delete \"{displayName}\"?" : "Er du sikker på at du vil slette \"{displayName}\"?",
+ "Allow guests" : "Tillad gæster",
"Password protection" : "Adgangskodebeskyttelse",
"Enter a password" : "Enter a password",
"Copy conversation link" : "Kopier samtalelink",
@@ -320,11 +332,15 @@
"Start time (optional)" : "Starttid (valgfri)",
"Save" : "Gem",
"Edit" : "Rediger",
+ "More information" : "Mere information",
+ "Delete" : "Slet",
"Password" : "Password",
"API token" : "API nøgle",
"Login" : "Login",
"Nickname" : "Kaldenavn",
"Client ID" : "Klient-ID",
+ "Calls" : "Opkald",
+ "Mark as read" : "Marker som læst",
"Remove from favorites" : "Fjernet fra favoritter",
"Add to favorites" : "Føj til favoritter",
"You: {lastMessage}" : "Dig: {lastMessage}",
@@ -350,8 +366,12 @@
"Search participants" : "Find deltagere",
"Conversation name" : "Samtalenavn",
"You are currently waiting in the lobby" : "Du venter nu i lobbyen",
+ "Unread messages" : "Ulæste beskedder",
+ "Message sent" : "Beskeden blev sendt",
"Reply" : "Besvar",
+ "Mark as unread" : "Marker som ulæst",
"Go to file" : "Gå til fil",
+ "Contact" : "Kontakt",
"Today" : "I dag",
"Yesterday" : "I går",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -376,7 +396,11 @@
"Add other sources" : "Tilføj andre kilder",
"Participants" : "Deltagere",
"Chat" : "Chat",
+ "Details" : "Detaljer",
"Settings" : "Indstillinger",
+ "Projects" : "Projekter",
+ "Show all files" : "Vis alle filer",
+ "Privacy" : "Privatliv",
"Keyboard shortcuts" : "Tastaturgenveje",
"Search" : "Søg",
"Error while setting attachment folder" : "Fejl under indstilling af mappe til vedhæftninger",
@@ -394,6 +418,13 @@
"Link to a conversation" : "Link til samtale",
"Join a conversation or start a new one" : "Deltag i en samtale eller start en ny",
"An error occurred while fetching the participants" : "Kunne ikke hente listen over deltagere",
+ "Media" : "Medier",
+ "Files" : "Filer",
+ "Locations" : "Sted",
+ "Audio" : "Audio",
+ "Other" : "Andet",
+ "Do not disturb" : "Forstyr ikke",
+ "Away" : "Ikke tilstede",
"Error while sharing file" : "Fejl ved deling af fil",
"Sending signaling message has failed." : "Kunne ikke sende signalerings-besked",
"Default" : "Standard",
diff --git a/l10n/de.js b/l10n/de.js
index d5cc20007..8064a72e6 100644
--- a/l10n/de.js
+++ b/l10n/de.js
@@ -1037,13 +1037,16 @@ OC.L10N.register(
"Chat" : "Chat",
"Details" : "Details",
"Settings" : "Einstellungen",
+ "Shared items" : "Freigegebene Elemente",
"Participants ({count})" : "Teilnehmer ({count})",
- "Media" : "Medien",
- "Files" : "Dateien",
- "Deck cards" : "Deck-Karten",
- "Voice messages" : "Sprachnachrichten",
- "Locations" : "Orte",
- "Audio" : "Audio",
+ "Projects" : "Projekte",
+ "Show all media" : "Alle Medien anzeigen",
+ "Show all files" : "Alle Dateien anzeigen",
+ "Show all deck cards" : "Alle Deck-Karten anzeigen",
+ "Show all voice messages" : "Alle Sprachnachrichten anzeigen",
+ "Show all locations" : "Alle Orte anzeigen",
+ "Show all audio" : "Alle Audiodateien anzeigen",
+ "Show all other" : "Alle sonstigen anzeigen",
"Meeting ID: {meetingId}" : "Meeting-ID: {meetingId}",
"Your PIN: {attendeePin}" : "Deine PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Anzeigename: <strong>{name}</strong>",
@@ -1113,6 +1116,13 @@ OC.L10N.register(
"Error while accessing microphone" : "Fehler beim Zugriff auf das Mikrofon",
"Access to camera is only possible with HTTPS" : "Zugriff auf Kamera ist nur über HTTPS möglich",
"An error occurred while fetching the participants" : "Es ist ein Fehler beim Abrufen der Teilnehmer aufgetreten",
+ "Media" : "Medien",
+ "Files" : "Dateien",
+ "Deck cards" : "Deck-Karten",
+ "Voice messages" : "Sprachnachrichten",
+ "Locations" : "Orte",
+ "Audio" : "Audio",
+ "Other" : "Sonstiges",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk wurde aktualisiert, bitte lade die Seite neu.",
"Do not disturb" : "Nicht stören",
"Away" : "Abwesend",
diff --git a/l10n/de.json b/l10n/de.json
index e3334affe..1a6e5dc4a 100644
--- a/l10n/de.json
+++ b/l10n/de.json
@@ -1035,13 +1035,16 @@
"Chat" : "Chat",
"Details" : "Details",
"Settings" : "Einstellungen",
+ "Shared items" : "Freigegebene Elemente",
"Participants ({count})" : "Teilnehmer ({count})",
- "Media" : "Medien",
- "Files" : "Dateien",
- "Deck cards" : "Deck-Karten",
- "Voice messages" : "Sprachnachrichten",
- "Locations" : "Orte",
- "Audio" : "Audio",
+ "Projects" : "Projekte",
+ "Show all media" : "Alle Medien anzeigen",
+ "Show all files" : "Alle Dateien anzeigen",
+ "Show all deck cards" : "Alle Deck-Karten anzeigen",
+ "Show all voice messages" : "Alle Sprachnachrichten anzeigen",
+ "Show all locations" : "Alle Orte anzeigen",
+ "Show all audio" : "Alle Audiodateien anzeigen",
+ "Show all other" : "Alle sonstigen anzeigen",
"Meeting ID: {meetingId}" : "Meeting-ID: {meetingId}",
"Your PIN: {attendeePin}" : "Deine PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Anzeigename: <strong>{name}</strong>",
@@ -1111,6 +1114,13 @@
"Error while accessing microphone" : "Fehler beim Zugriff auf das Mikrofon",
"Access to camera is only possible with HTTPS" : "Zugriff auf Kamera ist nur über HTTPS möglich",
"An error occurred while fetching the participants" : "Es ist ein Fehler beim Abrufen der Teilnehmer aufgetreten",
+ "Media" : "Medien",
+ "Files" : "Dateien",
+ "Deck cards" : "Deck-Karten",
+ "Voice messages" : "Sprachnachrichten",
+ "Locations" : "Orte",
+ "Audio" : "Audio",
+ "Other" : "Sonstiges",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk wurde aktualisiert, bitte lade die Seite neu.",
"Do not disturb" : "Nicht stören",
"Away" : "Abwesend",
diff --git a/l10n/de_DE.js b/l10n/de_DE.js
index b08106263..73657390a 100644
--- a/l10n/de_DE.js
+++ b/l10n/de_DE.js
@@ -1039,13 +1039,7 @@ OC.L10N.register(
"Settings" : "Einstellungen",
"Shared items" : "Geteilte Elemente",
"Participants ({count})" : "Teilnehmer ({count})",
- "Media" : "Medien",
- "Files" : "Dateien",
- "Deck cards" : "Deck-Karten",
- "Voice messages" : "Sprachnachrichten",
- "Locations" : "Orte",
- "Audio" : "Audio",
- "Other" : "Sonstiges",
+ "Projects" : "Projekte",
"Show all media" : "Alle Medien anzeigen",
"Show all files" : "Alle Dateien anzeigen",
"Show all deck cards" : "Alle Deck-Karten anzeigen",
@@ -1053,7 +1047,6 @@ OC.L10N.register(
"Show all locations" : "Alle Orte anzeigen",
"Show all audio" : "Alle Audios anzeigen",
"Show all other" : "Alle anderen anzeigen",
- "Projects" : "Projekte",
"Meeting ID: {meetingId}" : "Meeting-ID: {meetingId}",
"Your PIN: {attendeePin}" : "Ihre PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Anzeigename: <strong>{name}</strong>",
@@ -1063,6 +1056,7 @@ OC.L10N.register(
"Sounds" : "Töne",
"Play sounds when participants join or leave a call" : "Töne abspielen, wenn Teilnehmer einem Anruf beitreten oder verlassen",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "Aufgrund technischer Einschränkungen des Herstellers können derzeit keine Töne in Safari-Browsern sowie iPad- und iPhone-Geräten abgespielt werden.",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "Die Töne für Chat- und Anrufbenachrichtigungen können in den persönlichen Einstellungen angepasst werden.",
"Keyboard shortcuts" : "Tastaturkürzel",
"Speed up your Talk experience with these quick shortcuts." : "Beschleunigen Sie Ihr Gesprächserlebnis mit diesen Schnell-Verknüpfungen.",
"Focus the chat input" : "Chat-Eingabe in den Vordergrund",
@@ -1123,6 +1117,13 @@ OC.L10N.register(
"Error while accessing microphone" : "Fehler beim Zugriff auf das Mikrofon",
"Access to camera is only possible with HTTPS" : "Zugriff auf Kamera ist nur über HTTPS möglich",
"An error occurred while fetching the participants" : "Es ist ein Fehler beim Abrufen der Teilnehmer aufgetreten",
+ "Media" : "Medien",
+ "Files" : "Dateien",
+ "Deck cards" : "Deck-Karten",
+ "Voice messages" : "Sprachnachrichten",
+ "Locations" : "Orte",
+ "Audio" : "Audio",
+ "Other" : "Sonstiges",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk wurde aktualisiert, bitte laden Sie die Seite neu.",
"Do not disturb" : "Nicht stören",
"Away" : "Abwesend",
@@ -1131,6 +1132,7 @@ OC.L10N.register(
"Not enough free space to upload file \"{fileName}\"" : "Nicht genügend freier Speicherplatz zum Hochladen von \"{fileName}\"",
"Error while uploading file \"{fileName}\"" : "Fehler beim Hochladen der Datei \"{fileName}\"",
"An error happened when trying to share your file" : "Es ist ein Fehler beim Freigeben Ihrer Datei aufgetreten",
+ "{guest} (guest)" : "{guest} (Gast)",
"Could not post message: {errorMessage}" : "Nachricht konnte nicht gesendet werden: {errorMessage}",
"Failed to add reaction" : "Hinzufügen der Reaktion fehlgeschlagen",
"Failed to remove reaction" : "Entfernen der Reaktion fehlgeschlagen",
diff --git a/l10n/de_DE.json b/l10n/de_DE.json
index 0ec5f60ec..d0be3c3eb 100644
--- a/l10n/de_DE.json
+++ b/l10n/de_DE.json
@@ -1037,13 +1037,7 @@
"Settings" : "Einstellungen",
"Shared items" : "Geteilte Elemente",
"Participants ({count})" : "Teilnehmer ({count})",
- "Media" : "Medien",
- "Files" : "Dateien",
- "Deck cards" : "Deck-Karten",
- "Voice messages" : "Sprachnachrichten",
- "Locations" : "Orte",
- "Audio" : "Audio",
- "Other" : "Sonstiges",
+ "Projects" : "Projekte",
"Show all media" : "Alle Medien anzeigen",
"Show all files" : "Alle Dateien anzeigen",
"Show all deck cards" : "Alle Deck-Karten anzeigen",
@@ -1051,7 +1045,6 @@
"Show all locations" : "Alle Orte anzeigen",
"Show all audio" : "Alle Audios anzeigen",
"Show all other" : "Alle anderen anzeigen",
- "Projects" : "Projekte",
"Meeting ID: {meetingId}" : "Meeting-ID: {meetingId}",
"Your PIN: {attendeePin}" : "Ihre PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Anzeigename: <strong>{name}</strong>",
@@ -1061,6 +1054,7 @@
"Sounds" : "Töne",
"Play sounds when participants join or leave a call" : "Töne abspielen, wenn Teilnehmer einem Anruf beitreten oder verlassen",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "Aufgrund technischer Einschränkungen des Herstellers können derzeit keine Töne in Safari-Browsern sowie iPad- und iPhone-Geräten abgespielt werden.",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "Die Töne für Chat- und Anrufbenachrichtigungen können in den persönlichen Einstellungen angepasst werden.",
"Keyboard shortcuts" : "Tastaturkürzel",
"Speed up your Talk experience with these quick shortcuts." : "Beschleunigen Sie Ihr Gesprächserlebnis mit diesen Schnell-Verknüpfungen.",
"Focus the chat input" : "Chat-Eingabe in den Vordergrund",
@@ -1121,6 +1115,13 @@
"Error while accessing microphone" : "Fehler beim Zugriff auf das Mikrofon",
"Access to camera is only possible with HTTPS" : "Zugriff auf Kamera ist nur über HTTPS möglich",
"An error occurred while fetching the participants" : "Es ist ein Fehler beim Abrufen der Teilnehmer aufgetreten",
+ "Media" : "Medien",
+ "Files" : "Dateien",
+ "Deck cards" : "Deck-Karten",
+ "Voice messages" : "Sprachnachrichten",
+ "Locations" : "Orte",
+ "Audio" : "Audio",
+ "Other" : "Sonstiges",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk wurde aktualisiert, bitte laden Sie die Seite neu.",
"Do not disturb" : "Nicht stören",
"Away" : "Abwesend",
@@ -1129,6 +1130,7 @@
"Not enough free space to upload file \"{fileName}\"" : "Nicht genügend freier Speicherplatz zum Hochladen von \"{fileName}\"",
"Error while uploading file \"{fileName}\"" : "Fehler beim Hochladen der Datei \"{fileName}\"",
"An error happened when trying to share your file" : "Es ist ein Fehler beim Freigeben Ihrer Datei aufgetreten",
+ "{guest} (guest)" : "{guest} (Gast)",
"Could not post message: {errorMessage}" : "Nachricht konnte nicht gesendet werden: {errorMessage}",
"Failed to add reaction" : "Hinzufügen der Reaktion fehlgeschlagen",
"Failed to remove reaction" : "Entfernen der Reaktion fehlgeschlagen",
diff --git a/l10n/el.js b/l10n/el.js
index cfe5a0845..7b2940e8e 100644
--- a/l10n/el.js
+++ b/l10n/el.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["%n άλλος","%n άλλοι"],
"{actor} invited you to {call}" : "Ο {actor} σας προσκάλεσε σε {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Σας προσκάλεσαν για <strong>συζήτηση</strong> ή είχατε μια <strong>κλήση</strong>",
+ "Other activities" : "Άλλες δραστηριότητες",
"Talk" : "Talk",
"Guest" : "Επισκέπτης",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Καλωσήρθατε στο Nextcloud Talk!\nΣε αυτήν τη συζήτηση θα ενημερωθείτε για τις νέες διαθέσιμες δυνατότητες του Nextcloud Talk.",
@@ -129,6 +130,7 @@ OC.L10N.register(
"File is not shared, or shared but not with the user" : "Το αρχείο δεν είναι κοινόχρηστο, ή δεν μοιράζεται με τον χρήστη",
"No account available to delete." : "Δεν υπάρχει διαθέσιμος λογαριασμός για διαγραφή.",
"File is too big" : "Το αρχείο είναι πολύ μεγάλο",
+ "Invalid file provided" : "Έχει δοθεί μη έγκυρο αρχείο",
"Invalid image" : "Μη έγκυρη εικόνα",
"Unknown filetype" : "Άγνωστος τύπος αρχείου",
"An error occurred. Please contact your admin." : "Παρουσιάστηκε σφάλμα. Παρακαλούμε επικοινωνήστε με τον διαχειριστή σας.",
@@ -659,6 +661,7 @@ OC.L10N.register(
"Drop your files to upload" : "Αποθέστε τα αρχεία σας για ανέβασμα",
"Call in progress" : "Κλήση σε εξέλιξη",
"Favorite" : "Προσθήκη στα αγαπημένα",
+ "Restricted" : "Περιορισμένο",
"Conversation settings" : "Ρυθμίσεις συνομιλίας",
"Description" : "Περιγραφή",
"Notifications" : "Ειδοποιήσεις",
@@ -756,6 +759,7 @@ OC.L10N.register(
"not running, check Matterbridge log" : "δεν εκτελείται, ελέγξτε το αρχείο καταγραφής Matterbridge",
"not running" : "δεν εκτελείται",
"Bridge saved" : "Η σύνδεση αποθηκεύτηκε",
+ "Calls" : "Kλήσεις",
"Allow participants to join from a phone." : "Να επιτρέπεται στους συμμετέχοντες να συμμετέχουν από ένα τηλέφωνο.",
"Enable SIP dial-in" : "Ενεργοποίηση SIP dial-in",
"SIP dial-in is now enabled" : "Το SIP dial-in είναι πλέον ενεργοποιημένο",
@@ -767,6 +771,7 @@ OC.L10N.register(
"Edit conversation description" : "Επεξεργασία περιγραφής συνομιλίας",
"The description must be less than or equal to {maxLength} characters long. Your current text is {charactersCount} characters long." : "Η περιγραφή πρέπει να έχει μήκος μικρότερο ή ίσο με {maxLength} χαρακτήρες. Το τρέχον κείμενό σας έχει {charactersCount} χαρακτήρες.",
"Choose devices" : "Επιλέξτε συσκευές",
+ "Mark as read" : "Σήμανση ως αναγνωσμένο",
"Remove from favorites" : "Αφαίρεση από τα αγαπημένα",
"Add to favorites" : "Προσθήκη στα αγαπημένα ",
"Joining conversation …" : "Συμμετοχή σε συνομιλία…",
@@ -804,6 +809,7 @@ OC.L10N.register(
"Select microphone" : "Επιλογή μικροφώνου",
"No camera available" : "Δεν υπάρχει διαθέσιμη κάμερα",
"Select camera" : "Επιλογή κάμερας",
+ "Unread messages" : "Μη αναγνωσμένα μηνύματα",
"Sending message" : "Αποστολή μηνύματος",
"Message sent" : "Το μήνυμα στάλθηκε",
"Message read by everyone who shares their reading status" : "Το μήνυμα διαβάστηκε από όλους όσους μοιράζονται την κατάσταση ανάγνωσής τους",
@@ -814,12 +820,16 @@ OC.L10N.register(
"Message could not be deleted because it is too old" : "Δεν ήταν δυνατή η διαγραφή του μηνύματος επειδή είναι αρκετά παλιό ",
"An error occurred while deleting the message" : "Προέκυψε ένα σφάλμα κατά τη διαγραφή του μηνύματος",
"Reply" : "Απάντηση",
+ "Reply privately" : "Απάντηση ιδιωτικά",
+ "Mark as unread" : "επισήμανση ως μή-αναγνωσμένο",
"Go to file" : "Μετάβαση στο αρχείο",
+ "Contact" : "Επικοινωνία",
"{stack} in {board}" : "{stack} στο {board}",
"Scroll to bottom" : "Μετακινηθείτε προς τα κάτω",
"Today" : "Σήμερα",
"Yesterday" : "Χθες",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
+ "Record voice message" : "Εγγραφή φωνητικού μηνύματος",
"Share files to the conversation" : "Διαμοιρασμός αρχείων στην συνομιλία",
"Upload new files" : "Μεταφόρτωση νέων αρχείων",
"Share from Files" : "Κοινή χρήση από Αρχεία",
@@ -836,6 +846,7 @@ OC.L10N.register(
"Demote from moderator" : "Υποβάθμιση από συντονιστή",
"Promote to moderator" : "Προαγωγή από συντονιστή",
"Resend invitation" : "Επαναποστολή πρόσκλησης",
+ "Remove group and members" : "Αφαίρεση ομάδων και μελών",
"Remove participant" : "Αφαίρεση συμμετέχοντα",
"Settings for participant \"{user}\"" : "Ρυθμίσεις για συμμετέχοντα \"{user}\"",
"Add participant \"{user}\"" : "Προσθήκη συμμετέχοντος \"{user}\"",
@@ -862,6 +873,8 @@ OC.L10N.register(
"Chat" : "Συνομιλία",
"Details" : "Λεπτομέρειες",
"Settings" : "Ρυθμίσεις",
+ "Projects" : "Projects",
+ "Show all files" : "Εμφάνιση όλων των αρχείων",
"Meeting ID: {meetingId}" : "Αναγνωριστικό συνάντησης: {meetingId}",
"Your PIN: {attendeePin}" : "Το PIN σας: {attendeePin}",
"Attachments folder" : "Φάκελος συνημμένων",
@@ -912,6 +925,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Σφάλμα κατά την πρόσβαση στο μικρόφωνο.",
"Access to camera is only possible with HTTPS" : "Η πρόσβαση στην κάμερα είναι εφικτή μόνο μέσω HTTPS.",
"An error occurred while fetching the participants" : "Παρουσιάστηκε σφάλμα κατά την ανάκτηση των συμμετεχόντων",
+ "Media" : "Μέσα ενημέρωσης",
+ "Files" : "Αρχεία",
+ "Locations" : "Τοποθεσίες",
+ "Audio" : "Ήχος",
+ "Other" : "Άλλο",
"Nextcloud Talk was updated, please reload the page" : "Το Nextcloud Talk ενημερώθηκε, ανανεώστε τη σελίδα",
"Do not disturb" : "Μην ενοχλείτε",
"Away" : "Λείπω",
diff --git a/l10n/el.json b/l10n/el.json
index 86ea81232..9cfe209e9 100644
--- a/l10n/el.json
+++ b/l10n/el.json
@@ -10,6 +10,7 @@
"_%n other_::_%n others_" : ["%n άλλος","%n άλλοι"],
"{actor} invited you to {call}" : "Ο {actor} σας προσκάλεσε σε {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Σας προσκάλεσαν για <strong>συζήτηση</strong> ή είχατε μια <strong>κλήση</strong>",
+ "Other activities" : "Άλλες δραστηριότητες",
"Talk" : "Talk",
"Guest" : "Επισκέπτης",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Καλωσήρθατε στο Nextcloud Talk!\nΣε αυτήν τη συζήτηση θα ενημερωθείτε για τις νέες διαθέσιμες δυνατότητες του Nextcloud Talk.",
@@ -127,6 +128,7 @@
"File is not shared, or shared but not with the user" : "Το αρχείο δεν είναι κοινόχρηστο, ή δεν μοιράζεται με τον χρήστη",
"No account available to delete." : "Δεν υπάρχει διαθέσιμος λογαριασμός για διαγραφή.",
"File is too big" : "Το αρχείο είναι πολύ μεγάλο",
+ "Invalid file provided" : "Έχει δοθεί μη έγκυρο αρχείο",
"Invalid image" : "Μη έγκυρη εικόνα",
"Unknown filetype" : "Άγνωστος τύπος αρχείου",
"An error occurred. Please contact your admin." : "Παρουσιάστηκε σφάλμα. Παρακαλούμε επικοινωνήστε με τον διαχειριστή σας.",
@@ -657,6 +659,7 @@
"Drop your files to upload" : "Αποθέστε τα αρχεία σας για ανέβασμα",
"Call in progress" : "Κλήση σε εξέλιξη",
"Favorite" : "Προσθήκη στα αγαπημένα",
+ "Restricted" : "Περιορισμένο",
"Conversation settings" : "Ρυθμίσεις συνομιλίας",
"Description" : "Περιγραφή",
"Notifications" : "Ειδοποιήσεις",
@@ -754,6 +757,7 @@
"not running, check Matterbridge log" : "δεν εκτελείται, ελέγξτε το αρχείο καταγραφής Matterbridge",
"not running" : "δεν εκτελείται",
"Bridge saved" : "Η σύνδεση αποθηκεύτηκε",
+ "Calls" : "Kλήσεις",
"Allow participants to join from a phone." : "Να επιτρέπεται στους συμμετέχοντες να συμμετέχουν από ένα τηλέφωνο.",
"Enable SIP dial-in" : "Ενεργοποίηση SIP dial-in",
"SIP dial-in is now enabled" : "Το SIP dial-in είναι πλέον ενεργοποιημένο",
@@ -765,6 +769,7 @@
"Edit conversation description" : "Επεξεργασία περιγραφής συνομιλίας",
"The description must be less than or equal to {maxLength} characters long. Your current text is {charactersCount} characters long." : "Η περιγραφή πρέπει να έχει μήκος μικρότερο ή ίσο με {maxLength} χαρακτήρες. Το τρέχον κείμενό σας έχει {charactersCount} χαρακτήρες.",
"Choose devices" : "Επιλέξτε συσκευές",
+ "Mark as read" : "Σήμανση ως αναγνωσμένο",
"Remove from favorites" : "Αφαίρεση από τα αγαπημένα",
"Add to favorites" : "Προσθήκη στα αγαπημένα ",
"Joining conversation …" : "Συμμετοχή σε συνομιλία…",
@@ -802,6 +807,7 @@
"Select microphone" : "Επιλογή μικροφώνου",
"No camera available" : "Δεν υπάρχει διαθέσιμη κάμερα",
"Select camera" : "Επιλογή κάμερας",
+ "Unread messages" : "Μη αναγνωσμένα μηνύματα",
"Sending message" : "Αποστολή μηνύματος",
"Message sent" : "Το μήνυμα στάλθηκε",
"Message read by everyone who shares their reading status" : "Το μήνυμα διαβάστηκε από όλους όσους μοιράζονται την κατάσταση ανάγνωσής τους",
@@ -812,12 +818,16 @@
"Message could not be deleted because it is too old" : "Δεν ήταν δυνατή η διαγραφή του μηνύματος επειδή είναι αρκετά παλιό ",
"An error occurred while deleting the message" : "Προέκυψε ένα σφάλμα κατά τη διαγραφή του μηνύματος",
"Reply" : "Απάντηση",
+ "Reply privately" : "Απάντηση ιδιωτικά",
+ "Mark as unread" : "επισήμανση ως μή-αναγνωσμένο",
"Go to file" : "Μετάβαση στο αρχείο",
+ "Contact" : "Επικοινωνία",
"{stack} in {board}" : "{stack} στο {board}",
"Scroll to bottom" : "Μετακινηθείτε προς τα κάτω",
"Today" : "Σήμερα",
"Yesterday" : "Χθες",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
+ "Record voice message" : "Εγγραφή φωνητικού μηνύματος",
"Share files to the conversation" : "Διαμοιρασμός αρχείων στην συνομιλία",
"Upload new files" : "Μεταφόρτωση νέων αρχείων",
"Share from Files" : "Κοινή χρήση από Αρχεία",
@@ -834,6 +844,7 @@
"Demote from moderator" : "Υποβάθμιση από συντονιστή",
"Promote to moderator" : "Προαγωγή από συντονιστή",
"Resend invitation" : "Επαναποστολή πρόσκλησης",
+ "Remove group and members" : "Αφαίρεση ομάδων και μελών",
"Remove participant" : "Αφαίρεση συμμετέχοντα",
"Settings for participant \"{user}\"" : "Ρυθμίσεις για συμμετέχοντα \"{user}\"",
"Add participant \"{user}\"" : "Προσθήκη συμμετέχοντος \"{user}\"",
@@ -860,6 +871,8 @@
"Chat" : "Συνομιλία",
"Details" : "Λεπτομέρειες",
"Settings" : "Ρυθμίσεις",
+ "Projects" : "Projects",
+ "Show all files" : "Εμφάνιση όλων των αρχείων",
"Meeting ID: {meetingId}" : "Αναγνωριστικό συνάντησης: {meetingId}",
"Your PIN: {attendeePin}" : "Το PIN σας: {attendeePin}",
"Attachments folder" : "Φάκελος συνημμένων",
@@ -910,6 +923,11 @@
"Error while accessing microphone" : "Σφάλμα κατά την πρόσβαση στο μικρόφωνο.",
"Access to camera is only possible with HTTPS" : "Η πρόσβαση στην κάμερα είναι εφικτή μόνο μέσω HTTPS.",
"An error occurred while fetching the participants" : "Παρουσιάστηκε σφάλμα κατά την ανάκτηση των συμμετεχόντων",
+ "Media" : "Μέσα ενημέρωσης",
+ "Files" : "Αρχεία",
+ "Locations" : "Τοποθεσίες",
+ "Audio" : "Ήχος",
+ "Other" : "Άλλο",
"Nextcloud Talk was updated, please reload the page" : "Το Nextcloud Talk ενημερώθηκε, ανανεώστε τη σελίδα",
"Do not disturb" : "Μην ενοχλείτε",
"Away" : "Λείπω",
diff --git a/l10n/en_GB.js b/l10n/en_GB.js
index 7e01c9305..0acd59553 100644
--- a/l10n/en_GB.js
+++ b/l10n/en_GB.js
@@ -47,6 +47,11 @@ OC.L10N.register(
"You set the description" : "You set the description",
"An administrator set the description" : "An administrator set the description",
"Talk to %s" : "Talk to %s",
+ "File is too big" : "File is too big",
+ "Invalid file provided" : "Invalid file provided",
+ "Invalid image" : "Invalid image",
+ "Unknown filetype" : "Unknown filetype",
+ "An error occurred. Please contact your admin." : "An error occurred. Please contact your admin.",
"{user} mentioned you in a private conversation" : "{user} mentioned you in a private conversation",
"{user} invited you to a private conversation" : "{user} invited you to a private conversation",
"Join call" : "Join call",
@@ -55,6 +60,246 @@ OC.L10N.register(
"Open settings" : "Open settings",
"Conversations" : "Conversations",
"Messages" : "Messages",
+ "Andorra" : "Andorra",
+ "United Arab Emirates" : "United Arab Emirates",
+ "Afghanistan" : "Afghanistan",
+ "Antigua and Barbuda" : "Antigua and Barbuda",
+ "Anguilla" : "Anguilla",
+ "Albania" : "Albania",
+ "Armenia" : "Armenia",
+ "Angola" : "Angola",
+ "Antarctica" : "Antarctica",
+ "Argentina" : "Argentina",
+ "American Samoa" : "American Samoa",
+ "Austria" : "Austria",
+ "Australia" : "Australia",
+ "Aruba" : "Aruba",
+ "Åland Islands" : "Åland Islands",
+ "Azerbaijan" : "Azerbaijan",
+ "Bosnia and Herzegovina" : "Bosnia and Herzegovina",
+ "Barbados" : "Barbados",
+ "Bangladesh" : "Bangladesh",
+ "Belgium" : "Belgium",
+ "Burkina Faso" : "Burkina Faso",
+ "Bulgaria" : "Bulgaria",
+ "Bahrain" : "Bahrain",
+ "Burundi" : "Burundi",
+ "Benin" : "Benin",
+ "Saint Barthélemy" : "Saint Barthélemy",
+ "Bermuda" : "Bermuda",
+ "Brunei Darussalam" : "Brunei Darussalam",
+ "Bonaire, Sint Eustatius and Saba" : "Bonaire, Sint Eustatius and Saba",
+ "Brazil" : "Brazil",
+ "Bahamas" : "Bahamas",
+ "Bhutan" : "Bhutan",
+ "Bouvet Island" : "Bouvet Island",
+ "Botswana" : "Botswana",
+ "Belarus" : "Belarus",
+ "Belize" : "Belize",
+ "Canada" : "Canada",
+ "Cocos (Keeling) Islands" : "Cocos (Keeling) Islands",
+ "Central African Republic" : "Central African Republic",
+ "Congo" : "Congo",
+ "Switzerland" : "Switzerland",
+ "Côte d'Ivoire" : "Côte d'Ivoire",
+ "Cook Islands" : "Cook Islands",
+ "Chile" : "Chile",
+ "Cameroon" : "Cameroon",
+ "China" : "China",
+ "Colombia" : "Colombia",
+ "Costa Rica" : "Costa Rica",
+ "Cuba" : "Cuba",
+ "Cabo Verde" : "Cabo Verde",
+ "Curaçao" : "Curaçao",
+ "Christmas Island" : "Christmas Island",
+ "Cyprus" : "Cyprus",
+ "Czechia" : "Czechia",
+ "Germany" : "Germany",
+ "Djibouti" : "Djibouti",
+ "Denmark" : "Denmark",
+ "Dominica" : "Dominica",
+ "Dominican Republic" : "Dominican Republic",
+ "Algeria" : "Algeria",
+ "Ecuador" : "Ecuador",
+ "Estonia" : "Estonia",
+ "Egypt" : "Egypt",
+ "Western Sahara" : "Western Sahara",
+ "Eritrea" : "Eritrea",
+ "Spain" : "Spain",
+ "Ethiopia" : "Ethiopia",
+ "Finland" : "Finland",
+ "Fiji" : "Fiji",
+ "Falkland Islands (Malvinas)" : "Falkland Islands (Malvinas)",
+ "Faroe Islands" : "Faroe Islands",
+ "France" : "France",
+ "Gabon" : "Gabon",
+ "United Kingdom of Great Britain and Northern Ireland" : "United Kingdom of Great Britain and Northern Ireland",
+ "Grenada" : "Grenada",
+ "Georgia" : "Georgia",
+ "French Guiana" : "French Guiana",
+ "Guernsey" : "Guernsey",
+ "Ghana" : "Ghana",
+ "Gibraltar" : "Gibraltar",
+ "Greenland" : "Greenland",
+ "Gambia" : "Gambia",
+ "Guinea" : "Guinea",
+ "Guadeloupe" : "Guadeloupe",
+ "Equatorial Guinea" : "Equatorial Guinea",
+ "Greece" : "Greece",
+ "South Georgia and the South Sandwich Islands" : "South Georgia and the South Sandwich Islands",
+ "Guatemala" : "Guatemala",
+ "Guam" : "Guam",
+ "Guinea-Bissau" : "Guinea-Bissau",
+ "Guyana" : "Guyana",
+ "Hong Kong" : "Hong Kong",
+ "Heard Island and McDonald Islands" : "Heard Island and McDonald Islands",
+ "Honduras" : "Honduras",
+ "Croatia" : "Croatia",
+ "Haiti" : "Haiti",
+ "Hungary" : "Hungary",
+ "Indonesia" : "Indonesia",
+ "Ireland" : "Ireland",
+ "Israel" : "Israel",
+ "Isle of Man" : "Isle of Man",
+ "India" : "India",
+ "British Indian Ocean Territory" : "British Indian Ocean Territory",
+ "Iraq" : "Iraq",
+ "Iceland" : "Iceland",
+ "Italy" : "Italy",
+ "Jersey" : "Jersey",
+ "Jamaica" : "Jamaica",
+ "Jordan" : "Jordan",
+ "Japan" : "Japan",
+ "Kenya" : "Kenya",
+ "Kyrgyzstan" : "Kyrgyzstan",
+ "Cambodia" : "Cambodia",
+ "Kiribati" : "Kiribati",
+ "Comoros" : "Comoros",
+ "Saint Kitts and Nevis" : "Saint Kitts and Nevis",
+ "Korea, Republic of" : "Korea, Republic of",
+ "Kuwait" : "Kuwait",
+ "Cayman Islands" : "Cayman Islands",
+ "Kazakhstan" : "Kazakhstan",
+ "Lao People's Democratic Republic" : "Lao People's Democratic Republic",
+ "Lebanon" : "Lebanon",
+ "Saint Lucia" : "Saint Lucia",
+ "Liechtenstein" : "Liechtenstein",
+ "Sri Lanka" : "Sri Lanka",
+ "Liberia" : "Liberia",
+ "Lesotho" : "Lesotho",
+ "Lithuania" : "Lithuania",
+ "Luxembourg" : "Luxembourg",
+ "Latvia" : "Latvia",
+ "Libya" : "Libya",
+ "Morocco" : "Morocco",
+ "Monaco" : "Monaco",
+ "Moldova, Republic of" : "Moldova, Republic of",
+ "Montenegro" : "Montenegro",
+ "Saint Martin (French part)" : "Saint Martin (French part)",
+ "Madagascar" : "Madagascar",
+ "Marshall Islands" : "Marshall Islands",
+ "Mali" : "Mali",
+ "Myanmar" : "Myanmar",
+ "Mongolia" : "Mongolia",
+ "Macao" : "Macao",
+ "Northern Mariana Islands" : "Northern Mariana Islands",
+ "Martinique" : "Martinique",
+ "Mauritania" : "Mauritania",
+ "Montserrat" : "Montserrat",
+ "Malta" : "Malta",
+ "Mauritius" : "Mauritius",
+ "Maldives" : "Maldives",
+ "Malawi" : "Malawi",
+ "Mexico" : "Mexico",
+ "Malaysia" : "Malaysia",
+ "Mozambique" : "Mozambique",
+ "Namibia" : "Namibia",
+ "New Caledonia" : "New Caledonia",
+ "Niger" : "Niger",
+ "Norfolk Island" : "Norfolk Island",
+ "Nigeria" : "Nigeria",
+ "Nicaragua" : "Nicaragua",
+ "Netherlands" : "Netherlands",
+ "Norway" : "Norway",
+ "Nepal" : "Nepal",
+ "Nauru" : "Nauru",
+ "Niue" : "Niue",
+ "New Zealand" : "New Zealand",
+ "Oman" : "Oman",
+ "Panama" : "Panama",
+ "Peru" : "Peru",
+ "French Polynesia" : "French Polynesia",
+ "Papua New Guinea" : "Papua New Guinea",
+ "Philippines" : "Philippines",
+ "Pakistan" : "Pakistan",
+ "Poland" : "Poland",
+ "Saint Pierre and Miquelon" : "Saint Pierre and Miquelon",
+ "Pitcairn" : "Pitcairn",
+ "Puerto Rico" : "Puerto Rico",
+ "Palestine, State of" : "Palestine, State of",
+ "Portugal" : "Portugal",
+ "Palau" : "Palau",
+ "Paraguay" : "Paraguay",
+ "Qatar" : "Qatar",
+ "Réunion" : "Réunion",
+ "Romania" : "Romania",
+ "Serbia" : "Serbia",
+ "Russian Federation" : "Russian Federation",
+ "Rwanda" : "Rwanda",
+ "Saudi Arabia" : "Saudi Arabia",
+ "Solomon Islands" : "Solomon Islands",
+ "Seychelles" : "Seychelles",
+ "Sudan" : "Sudan",
+ "Sweden" : "Sweden",
+ "Singapore" : "Singapore",
+ "Saint Helena, Ascension and Tristan da Cunha" : "Saint Helena, Ascension and Tristan da Cunha",
+ "Slovenia" : "Slovenia",
+ "Svalbard and Jan Mayen" : "Svalbard and Jan Mayen",
+ "Slovakia" : "Slovakia",
+ "Sierra Leone" : "Sierra Leone",
+ "San Marino" : "San Marino",
+ "Senegal" : "Senegal",
+ "Somalia" : "Somalia",
+ "Suriname" : "Suriname",
+ "South Sudan" : "South Sudan",
+ "Sao Tome and Principe" : "Sao Tome and Principe",
+ "El Salvador" : "El Salvador",
+ "Sint Maarten (Dutch part)" : "Sint Maarten (Dutch part)",
+ "Syrian Arab Republic" : "Syrian Arab Republic",
+ "Eswatini" : "Eswatini",
+ "Turks and Caicos Islands" : "Turks and Caicos Islands",
+ "Chad" : "Chad",
+ "French Southern Territories" : "French Southern Territories",
+ "Togo" : "Togo",
+ "Thailand" : "Thailand",
+ "Tajikistan" : "Tajikistan",
+ "Tokelau" : "Tokelau",
+ "Timor-Leste" : "Timor-Leste",
+ "Turkmenistan" : "Turkmenistan",
+ "Tunisia" : "Tunisia",
+ "Tonga" : "Tonga",
+ "Turkey" : "Turkey",
+ "Trinidad and Tobago" : "Trinidad and Tobago",
+ "Tuvalu" : "Tuvalu",
+ "Taiwan, Province of China" : "Taiwan, Province of China",
+ "Tanzania, United Republic of" : "Tanzania, United Republic of",
+ "Ukraine" : "Ukraine",
+ "Uganda" : "Uganda",
+ "United States Minor Outlying Islands" : "United States Minor Outlying Islands",
+ "United States of America" : "United States of America",
+ "Uruguay" : "Uruguay",
+ "Uzbekistan" : "Uzbekistan",
+ "Holy See" : "Holy See",
+ "Saint Vincent and the Grenadines" : "Saint Vincent and the Grenadines",
+ "Viet Nam" : "Viet Nam",
+ "Vanuatu" : "Vanuatu",
+ "Wallis and Futuna" : "Wallis and Futuna",
+ "Samoa" : "Samoa",
+ "Yemen" : "Yemen",
+ "Mayotte" : "Mayotte",
+ "South Africa" : "South Africa",
+ "Zambia" : "Zambia",
+ "Zimbabwe" : "Zimbabwe",
"Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD",
"Leave call" : "Leave call",
"This conversation has ended" : "This conversation has ended",
@@ -84,6 +329,8 @@ OC.L10N.register(
"STUN servers" : "STUN servers",
"A STUN server is used to determine the public IP address of participants behind a router." : "A STUN server is used to determine the public IP address of participants behind a router.",
"TURN server protocols" : "TURN server protocols",
+ "OK" : "OK",
+ "Checking …" : "Checking …",
"Copy link" : "Copy link",
"Waiting for others to join the call …" : "Waiting for others to join the call …",
"You can invite others in the participant tab of the sidebar" : "You can invite others in the participant tab of the sidebar",
@@ -92,6 +339,7 @@ OC.L10N.register(
"Dismiss" : "Dismiss",
"Show your screen" : "Show your screen",
"Stop screensharing" : "Stop screensharing",
+ "More actions" : "More actions",
"No audio" : "No audio",
"Mute audio" : "Mute audio",
"Disable video" : "Disable video",
@@ -108,17 +356,22 @@ OC.L10N.register(
"You" : "You",
"Show screen" : "Show screen",
"Favorite" : "Favourite",
+ "Restricted" : "Restricted",
+ "Description" : "Description",
+ "Notifications" : "Notifications",
"Leave conversation" : "Leave conversation",
"Delete conversation" : "Delete conversation",
"Password protection" : "Password protection",
"Enter a password" : "Enter a password",
"Save" : "Save",
"Edit" : "Edit",
+ "Delete" : "Delete",
"Password" : "Password",
"API token" : "API token",
"Login" : "Login",
"Nickname" : "Nickname",
"Client ID" : "Client ID",
+ "Calls" : "Calls",
"Remove from favorites" : "Remove from favourites",
"Add to favorites" : "Add to favourites",
"Loading" : "Loading",
@@ -128,6 +381,7 @@ OC.L10N.register(
"Close" : "Close",
"Conversation name" : "Conversation name",
"Reply" : "Reply",
+ "Contact" : "Contact",
"Today" : "Today",
"Yesterday" : "Yesterday",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -141,13 +395,21 @@ OC.L10N.register(
"Add users or groups" : "Add users or groups",
"Participants" : "Participants",
"Chat" : "Chat",
+ "Details" : "Details",
"Settings" : "Settings",
+ "Privacy" : "Privacy",
"Keyboard shortcuts" : "Keyboard shortcuts",
"Search" : "Search",
"Rename conversation" : "Rename conversation",
"Send" : "Send",
"Start a conversation" : "Start a conversation",
"Join a conversation or start a new one" : "Join a conversation or start a new one",
+ "Media" : "Media",
+ "Files" : "Files",
+ "Audio" : "Audio",
+ "Other" : "Other",
+ "Do not disturb" : "Do not disturb",
+ "Away" : "Away",
"Default" : "Default",
"Access to microphone & camera is only possible with HTTPS" : "Access to microphone & camera is only possible with HTTPS",
"Please move your setup to HTTPS" : "Please move your setup to HTTPS",
diff --git a/l10n/en_GB.json b/l10n/en_GB.json
index 1a5ab16db..406bbbd73 100644
--- a/l10n/en_GB.json
+++ b/l10n/en_GB.json
@@ -45,6 +45,11 @@
"You set the description" : "You set the description",
"An administrator set the description" : "An administrator set the description",
"Talk to %s" : "Talk to %s",
+ "File is too big" : "File is too big",
+ "Invalid file provided" : "Invalid file provided",
+ "Invalid image" : "Invalid image",
+ "Unknown filetype" : "Unknown filetype",
+ "An error occurred. Please contact your admin." : "An error occurred. Please contact your admin.",
"{user} mentioned you in a private conversation" : "{user} mentioned you in a private conversation",
"{user} invited you to a private conversation" : "{user} invited you to a private conversation",
"Join call" : "Join call",
@@ -53,6 +58,246 @@
"Open settings" : "Open settings",
"Conversations" : "Conversations",
"Messages" : "Messages",
+ "Andorra" : "Andorra",
+ "United Arab Emirates" : "United Arab Emirates",
+ "Afghanistan" : "Afghanistan",
+ "Antigua and Barbuda" : "Antigua and Barbuda",
+ "Anguilla" : "Anguilla",
+ "Albania" : "Albania",
+ "Armenia" : "Armenia",
+ "Angola" : "Angola",
+ "Antarctica" : "Antarctica",
+ "Argentina" : "Argentina",
+ "American Samoa" : "American Samoa",
+ "Austria" : "Austria",
+ "Australia" : "Australia",
+ "Aruba" : "Aruba",
+ "Åland Islands" : "Åland Islands",
+ "Azerbaijan" : "Azerbaijan",
+ "Bosnia and Herzegovina" : "Bosnia and Herzegovina",
+ "Barbados" : "Barbados",
+ "Bangladesh" : "Bangladesh",
+ "Belgium" : "Belgium",
+ "Burkina Faso" : "Burkina Faso",
+ "Bulgaria" : "Bulgaria",
+ "Bahrain" : "Bahrain",
+ "Burundi" : "Burundi",
+ "Benin" : "Benin",
+ "Saint Barthélemy" : "Saint Barthélemy",
+ "Bermuda" : "Bermuda",
+ "Brunei Darussalam" : "Brunei Darussalam",
+ "Bonaire, Sint Eustatius and Saba" : "Bonaire, Sint Eustatius and Saba",
+ "Brazil" : "Brazil",
+ "Bahamas" : "Bahamas",
+ "Bhutan" : "Bhutan",
+ "Bouvet Island" : "Bouvet Island",
+ "Botswana" : "Botswana",
+ "Belarus" : "Belarus",
+ "Belize" : "Belize",
+ "Canada" : "Canada",
+ "Cocos (Keeling) Islands" : "Cocos (Keeling) Islands",
+ "Central African Republic" : "Central African Republic",
+ "Congo" : "Congo",
+ "Switzerland" : "Switzerland",
+ "Côte d'Ivoire" : "Côte d'Ivoire",
+ "Cook Islands" : "Cook Islands",
+ "Chile" : "Chile",
+ "Cameroon" : "Cameroon",
+ "China" : "China",
+ "Colombia" : "Colombia",
+ "Costa Rica" : "Costa Rica",
+ "Cuba" : "Cuba",
+ "Cabo Verde" : "Cabo Verde",
+ "Curaçao" : "Curaçao",
+ "Christmas Island" : "Christmas Island",
+ "Cyprus" : "Cyprus",
+ "Czechia" : "Czechia",
+ "Germany" : "Germany",
+ "Djibouti" : "Djibouti",
+ "Denmark" : "Denmark",
+ "Dominica" : "Dominica",
+ "Dominican Republic" : "Dominican Republic",
+ "Algeria" : "Algeria",
+ "Ecuador" : "Ecuador",
+ "Estonia" : "Estonia",
+ "Egypt" : "Egypt",
+ "Western Sahara" : "Western Sahara",
+ "Eritrea" : "Eritrea",
+ "Spain" : "Spain",
+ "Ethiopia" : "Ethiopia",
+ "Finland" : "Finland",
+ "Fiji" : "Fiji",
+ "Falkland Islands (Malvinas)" : "Falkland Islands (Malvinas)",
+ "Faroe Islands" : "Faroe Islands",
+ "France" : "France",
+ "Gabon" : "Gabon",
+ "United Kingdom of Great Britain and Northern Ireland" : "United Kingdom of Great Britain and Northern Ireland",
+ "Grenada" : "Grenada",
+ "Georgia" : "Georgia",
+ "French Guiana" : "French Guiana",
+ "Guernsey" : "Guernsey",
+ "Ghana" : "Ghana",
+ "Gibraltar" : "Gibraltar",
+ "Greenland" : "Greenland",
+ "Gambia" : "Gambia",
+ "Guinea" : "Guinea",
+ "Guadeloupe" : "Guadeloupe",
+ "Equatorial Guinea" : "Equatorial Guinea",
+ "Greece" : "Greece",
+ "South Georgia and the South Sandwich Islands" : "South Georgia and the South Sandwich Islands",
+ "Guatemala" : "Guatemala",
+ "Guam" : "Guam",
+ "Guinea-Bissau" : "Guinea-Bissau",
+ "Guyana" : "Guyana",
+ "Hong Kong" : "Hong Kong",
+ "Heard Island and McDonald Islands" : "Heard Island and McDonald Islands",
+ "Honduras" : "Honduras",
+ "Croatia" : "Croatia",
+ "Haiti" : "Haiti",
+ "Hungary" : "Hungary",
+ "Indonesia" : "Indonesia",
+ "Ireland" : "Ireland",
+ "Israel" : "Israel",
+ "Isle of Man" : "Isle of Man",
+ "India" : "India",
+ "British Indian Ocean Territory" : "British Indian Ocean Territory",
+ "Iraq" : "Iraq",
+ "Iceland" : "Iceland",
+ "Italy" : "Italy",
+ "Jersey" : "Jersey",
+ "Jamaica" : "Jamaica",
+ "Jordan" : "Jordan",
+ "Japan" : "Japan",
+ "Kenya" : "Kenya",
+ "Kyrgyzstan" : "Kyrgyzstan",
+ "Cambodia" : "Cambodia",
+ "Kiribati" : "Kiribati",
+ "Comoros" : "Comoros",
+ "Saint Kitts and Nevis" : "Saint Kitts and Nevis",
+ "Korea, Republic of" : "Korea, Republic of",
+ "Kuwait" : "Kuwait",
+ "Cayman Islands" : "Cayman Islands",
+ "Kazakhstan" : "Kazakhstan",
+ "Lao People's Democratic Republic" : "Lao People's Democratic Republic",
+ "Lebanon" : "Lebanon",
+ "Saint Lucia" : "Saint Lucia",
+ "Liechtenstein" : "Liechtenstein",
+ "Sri Lanka" : "Sri Lanka",
+ "Liberia" : "Liberia",
+ "Lesotho" : "Lesotho",
+ "Lithuania" : "Lithuania",
+ "Luxembourg" : "Luxembourg",
+ "Latvia" : "Latvia",
+ "Libya" : "Libya",
+ "Morocco" : "Morocco",
+ "Monaco" : "Monaco",
+ "Moldova, Republic of" : "Moldova, Republic of",
+ "Montenegro" : "Montenegro",
+ "Saint Martin (French part)" : "Saint Martin (French part)",
+ "Madagascar" : "Madagascar",
+ "Marshall Islands" : "Marshall Islands",
+ "Mali" : "Mali",
+ "Myanmar" : "Myanmar",
+ "Mongolia" : "Mongolia",
+ "Macao" : "Macao",
+ "Northern Mariana Islands" : "Northern Mariana Islands",
+ "Martinique" : "Martinique",
+ "Mauritania" : "Mauritania",
+ "Montserrat" : "Montserrat",
+ "Malta" : "Malta",
+ "Mauritius" : "Mauritius",
+ "Maldives" : "Maldives",
+ "Malawi" : "Malawi",
+ "Mexico" : "Mexico",
+ "Malaysia" : "Malaysia",
+ "Mozambique" : "Mozambique",
+ "Namibia" : "Namibia",
+ "New Caledonia" : "New Caledonia",
+ "Niger" : "Niger",
+ "Norfolk Island" : "Norfolk Island",
+ "Nigeria" : "Nigeria",
+ "Nicaragua" : "Nicaragua",
+ "Netherlands" : "Netherlands",
+ "Norway" : "Norway",
+ "Nepal" : "Nepal",
+ "Nauru" : "Nauru",
+ "Niue" : "Niue",
+ "New Zealand" : "New Zealand",
+ "Oman" : "Oman",
+ "Panama" : "Panama",
+ "Peru" : "Peru",
+ "French Polynesia" : "French Polynesia",
+ "Papua New Guinea" : "Papua New Guinea",
+ "Philippines" : "Philippines",
+ "Pakistan" : "Pakistan",
+ "Poland" : "Poland",
+ "Saint Pierre and Miquelon" : "Saint Pierre and Miquelon",
+ "Pitcairn" : "Pitcairn",
+ "Puerto Rico" : "Puerto Rico",
+ "Palestine, State of" : "Palestine, State of",
+ "Portugal" : "Portugal",
+ "Palau" : "Palau",
+ "Paraguay" : "Paraguay",
+ "Qatar" : "Qatar",
+ "Réunion" : "Réunion",
+ "Romania" : "Romania",
+ "Serbia" : "Serbia",
+ "Russian Federation" : "Russian Federation",
+ "Rwanda" : "Rwanda",
+ "Saudi Arabia" : "Saudi Arabia",
+ "Solomon Islands" : "Solomon Islands",
+ "Seychelles" : "Seychelles",
+ "Sudan" : "Sudan",
+ "Sweden" : "Sweden",
+ "Singapore" : "Singapore",
+ "Saint Helena, Ascension and Tristan da Cunha" : "Saint Helena, Ascension and Tristan da Cunha",
+ "Slovenia" : "Slovenia",
+ "Svalbard and Jan Mayen" : "Svalbard and Jan Mayen",
+ "Slovakia" : "Slovakia",
+ "Sierra Leone" : "Sierra Leone",
+ "San Marino" : "San Marino",
+ "Senegal" : "Senegal",
+ "Somalia" : "Somalia",
+ "Suriname" : "Suriname",
+ "South Sudan" : "South Sudan",
+ "Sao Tome and Principe" : "Sao Tome and Principe",
+ "El Salvador" : "El Salvador",
+ "Sint Maarten (Dutch part)" : "Sint Maarten (Dutch part)",
+ "Syrian Arab Republic" : "Syrian Arab Republic",
+ "Eswatini" : "Eswatini",
+ "Turks and Caicos Islands" : "Turks and Caicos Islands",
+ "Chad" : "Chad",
+ "French Southern Territories" : "French Southern Territories",
+ "Togo" : "Togo",
+ "Thailand" : "Thailand",
+ "Tajikistan" : "Tajikistan",
+ "Tokelau" : "Tokelau",
+ "Timor-Leste" : "Timor-Leste",
+ "Turkmenistan" : "Turkmenistan",
+ "Tunisia" : "Tunisia",
+ "Tonga" : "Tonga",
+ "Turkey" : "Turkey",
+ "Trinidad and Tobago" : "Trinidad and Tobago",
+ "Tuvalu" : "Tuvalu",
+ "Taiwan, Province of China" : "Taiwan, Province of China",
+ "Tanzania, United Republic of" : "Tanzania, United Republic of",
+ "Ukraine" : "Ukraine",
+ "Uganda" : "Uganda",
+ "United States Minor Outlying Islands" : "United States Minor Outlying Islands",
+ "United States of America" : "United States of America",
+ "Uruguay" : "Uruguay",
+ "Uzbekistan" : "Uzbekistan",
+ "Holy See" : "Holy See",
+ "Saint Vincent and the Grenadines" : "Saint Vincent and the Grenadines",
+ "Viet Nam" : "Viet Nam",
+ "Vanuatu" : "Vanuatu",
+ "Wallis and Futuna" : "Wallis and Futuna",
+ "Samoa" : "Samoa",
+ "Yemen" : "Yemen",
+ "Mayotte" : "Mayotte",
+ "South Africa" : "South Africa",
+ "Zambia" : "Zambia",
+ "Zimbabwe" : "Zimbabwe",
"Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD",
"Leave call" : "Leave call",
"This conversation has ended" : "This conversation has ended",
@@ -82,6 +327,8 @@
"STUN servers" : "STUN servers",
"A STUN server is used to determine the public IP address of participants behind a router." : "A STUN server is used to determine the public IP address of participants behind a router.",
"TURN server protocols" : "TURN server protocols",
+ "OK" : "OK",
+ "Checking …" : "Checking …",
"Copy link" : "Copy link",
"Waiting for others to join the call …" : "Waiting for others to join the call …",
"You can invite others in the participant tab of the sidebar" : "You can invite others in the participant tab of the sidebar",
@@ -90,6 +337,7 @@
"Dismiss" : "Dismiss",
"Show your screen" : "Show your screen",
"Stop screensharing" : "Stop screensharing",
+ "More actions" : "More actions",
"No audio" : "No audio",
"Mute audio" : "Mute audio",
"Disable video" : "Disable video",
@@ -106,17 +354,22 @@
"You" : "You",
"Show screen" : "Show screen",
"Favorite" : "Favourite",
+ "Restricted" : "Restricted",
+ "Description" : "Description",
+ "Notifications" : "Notifications",
"Leave conversation" : "Leave conversation",
"Delete conversation" : "Delete conversation",
"Password protection" : "Password protection",
"Enter a password" : "Enter a password",
"Save" : "Save",
"Edit" : "Edit",
+ "Delete" : "Delete",
"Password" : "Password",
"API token" : "API token",
"Login" : "Login",
"Nickname" : "Nickname",
"Client ID" : "Client ID",
+ "Calls" : "Calls",
"Remove from favorites" : "Remove from favourites",
"Add to favorites" : "Add to favourites",
"Loading" : "Loading",
@@ -126,6 +379,7 @@
"Close" : "Close",
"Conversation name" : "Conversation name",
"Reply" : "Reply",
+ "Contact" : "Contact",
"Today" : "Today",
"Yesterday" : "Yesterday",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -139,13 +393,21 @@
"Add users or groups" : "Add users or groups",
"Participants" : "Participants",
"Chat" : "Chat",
+ "Details" : "Details",
"Settings" : "Settings",
+ "Privacy" : "Privacy",
"Keyboard shortcuts" : "Keyboard shortcuts",
"Search" : "Search",
"Rename conversation" : "Rename conversation",
"Send" : "Send",
"Start a conversation" : "Start a conversation",
"Join a conversation or start a new one" : "Join a conversation or start a new one",
+ "Media" : "Media",
+ "Files" : "Files",
+ "Audio" : "Audio",
+ "Other" : "Other",
+ "Do not disturb" : "Do not disturb",
+ "Away" : "Away",
"Default" : "Default",
"Access to microphone & camera is only possible with HTTPS" : "Access to microphone & camera is only possible with HTTPS",
"Please move your setup to HTTPS" : "Please move your setup to HTTPS",
diff --git a/l10n/eo.js b/l10n/eo.js
index d60a4af80..b6f5a15cf 100644
--- a/l10n/eo.js
+++ b/l10n/eo.js
@@ -1,9 +1,15 @@
OC.L10N.register(
"spreed",
{
+ "Other activities" : "Alia aktivado",
"Talk" : "Paroli",
"Guest" : "Gasto",
"Talk to %s" : "Paroli al %s",
+ "File is too big" : "Dosiero tro grandas",
+ "Invalid file provided" : "Nevalida dosiero provizita",
+ "Invalid image" : "Nevalida bildo",
+ "Unknown filetype" : "Nekonata dosiertipo",
+ "An error occurred. Please contact your admin." : "Eraro okazis. Bonvolu kontakti vian administranton.",
"Andorra" : "Andoro",
"United Arab Emirates" : "Unuiĝintaj Arabaj Emirlandoj",
"Afghanistan" : "Afganujo",
@@ -261,16 +267,22 @@ OC.L10N.register(
"Blocked" : "Barita",
"Expired" : "Senvalidiĝis",
"Saved" : "Konservita",
+ "OK" : "Bone",
"Copy link" : "Kopii ligilon",
"Dismiss" : "Preterpasi",
+ "More actions" : "Pliaj agoj",
"Grid view" : "Krada vido",
"Back" : "Antaŭen",
"You" : "Vi",
"Favorite" : "Pliŝatata",
+ "Restricted" : "Limigita",
+ "Description" : "Priskribo",
+ "Notifications" : "Sciigoj",
"Password protection" : "Protektita per pasvorto",
"Enter a password" : "Entajpu pasvorton",
"Save" : "Konservi",
"Edit" : "Modifi",
+ "Delete" : "Forigi",
"Password" : "Pasvorto",
"API token" : "API-ĵetono",
"Login" : "Login",
@@ -284,16 +296,22 @@ OC.L10N.register(
"Password protect" : "Protekti per pasvorto",
"Close" : "Malfermi",
"Reply" : "Respondi",
+ "Contact" : "Kontakto",
"Today" : "Hodiaŭ",
"Yesterday" : "Hieraŭ",
"guest" : "gasto",
"No results" : "Neniu rezulto",
"Add users or groups" : "Add users or groups",
"Chat" : "Babili",
+ "Details" : "Detaloj",
"Settings" : "Agordoj",
+ "Privacy" : "Privateco",
"Keyboard shortcuts" : "Fulmoklavoj",
"Search" : "Serĉi",
"Send" : "Sendi",
+ "Files" : "Dosieroj",
+ "Audio" : "Sonaĵo",
+ "Other" : "Alia",
"Default" : "Defaŭlta",
"The password is wrong. Try again." : "La pasvorto malĝustas. Provu denove.",
"Android app" : "Android-aplikaĵo",
diff --git a/l10n/eo.json b/l10n/eo.json
index 8c209b3b1..8100ca7d7 100644
--- a/l10n/eo.json
+++ b/l10n/eo.json
@@ -1,7 +1,13 @@
{ "translations": {
+ "Other activities" : "Alia aktivado",
"Talk" : "Paroli",
"Guest" : "Gasto",
"Talk to %s" : "Paroli al %s",
+ "File is too big" : "Dosiero tro grandas",
+ "Invalid file provided" : "Nevalida dosiero provizita",
+ "Invalid image" : "Nevalida bildo",
+ "Unknown filetype" : "Nekonata dosiertipo",
+ "An error occurred. Please contact your admin." : "Eraro okazis. Bonvolu kontakti vian administranton.",
"Andorra" : "Andoro",
"United Arab Emirates" : "Unuiĝintaj Arabaj Emirlandoj",
"Afghanistan" : "Afganujo",
@@ -259,16 +265,22 @@
"Blocked" : "Barita",
"Expired" : "Senvalidiĝis",
"Saved" : "Konservita",
+ "OK" : "Bone",
"Copy link" : "Kopii ligilon",
"Dismiss" : "Preterpasi",
+ "More actions" : "Pliaj agoj",
"Grid view" : "Krada vido",
"Back" : "Antaŭen",
"You" : "Vi",
"Favorite" : "Pliŝatata",
+ "Restricted" : "Limigita",
+ "Description" : "Priskribo",
+ "Notifications" : "Sciigoj",
"Password protection" : "Protektita per pasvorto",
"Enter a password" : "Entajpu pasvorton",
"Save" : "Konservi",
"Edit" : "Modifi",
+ "Delete" : "Forigi",
"Password" : "Pasvorto",
"API token" : "API-ĵetono",
"Login" : "Login",
@@ -282,16 +294,22 @@
"Password protect" : "Protekti per pasvorto",
"Close" : "Malfermi",
"Reply" : "Respondi",
+ "Contact" : "Kontakto",
"Today" : "Hodiaŭ",
"Yesterday" : "Hieraŭ",
"guest" : "gasto",
"No results" : "Neniu rezulto",
"Add users or groups" : "Add users or groups",
"Chat" : "Babili",
+ "Details" : "Detaloj",
"Settings" : "Agordoj",
+ "Privacy" : "Privateco",
"Keyboard shortcuts" : "Fulmoklavoj",
"Search" : "Serĉi",
"Send" : "Sendi",
+ "Files" : "Dosieroj",
+ "Audio" : "Sonaĵo",
+ "Other" : "Alia",
"Default" : "Defaŭlta",
"The password is wrong. Try again." : "La pasvorto malĝustas. Provu denove.",
"Android app" : "Android-aplikaĵo",
diff --git a/l10n/es.js b/l10n/es.js
index 2d231e011..86c89ac3b 100644
--- a/l10n/es.js
+++ b/l10n/es.js
@@ -889,6 +889,7 @@ OC.L10N.register(
"No search results" : "No hay resultados de búsqueda",
"Groups" : "Grupos",
"Circles" : "Círculos",
+ "Unread mentions" : "Menciones sin leer",
"Talk settings" : "Configuración de Talk",
"Users, groups and circles" : "Contactos, grupos y círculos",
"Users and groups" : "Usuarios y grupos",
@@ -1024,6 +1025,8 @@ OC.L10N.register(
"Details" : "Detalles",
"Settings" : "Ajustes",
"Participants ({count})" : "Participantes ({count})",
+ "Projects" : "Proyectos",
+ "Show all files" : "Mostrar todos los archivos",
"Meeting ID: {meetingId}" : "ID de reunión: {meetingId}",
"Your PIN: {attendeePin}" : "Tu PIN: {attendeePin}",
"Attachments folder" : "Carpeta de adjuntos",
@@ -1091,6 +1094,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Error al acceder al micrófono",
"Access to camera is only possible with HTTPS" : "El acceso a la cámara solo es posible con HTTPS",
"An error occurred while fetching the participants" : "Ha ocurrido un error al recuperar los participantes",
+ "Media" : "Multimedia",
+ "Files" : "Archivos",
+ "Locations" : "Ubicaciones",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk se ha actualizado. Por favor, vuelve a cargar la página",
"Do not disturb" : "No molestar",
"Away" : "Ausente",
@@ -1183,6 +1191,8 @@ OC.L10N.register(
"Video on and off" : "Vídeo encendido y apagado",
"Choose in which folder attachments should be saved." : "Escoge la carpeta en la que se guardarán los adjuntos.",
"Exit fullscreen (f)" : "Salir de pantalla completa (f)",
- "Fullscreen (f)" : "Pantalla completa (f)"
+ "Fullscreen (f)" : "Pantalla completa (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Establecer el nivel de notificación para la conversación actual. Esto afectará sólo a las notificaciones que reciba.",
+ "OK: \".wasm\" and \".tflite\" files were properly returned by the web server" : "OK: los archivos \".wasm\" y \".tflite\" han sido devueltos correctamente por el servidor web"
},
"nplurals=2; plural=(n != 1);");
diff --git a/l10n/es.json b/l10n/es.json
index 8a4f20c8b..9a903ef1d 100644
--- a/l10n/es.json
+++ b/l10n/es.json
@@ -887,6 +887,7 @@
"No search results" : "No hay resultados de búsqueda",
"Groups" : "Grupos",
"Circles" : "Círculos",
+ "Unread mentions" : "Menciones sin leer",
"Talk settings" : "Configuración de Talk",
"Users, groups and circles" : "Contactos, grupos y círculos",
"Users and groups" : "Usuarios y grupos",
@@ -1022,6 +1023,8 @@
"Details" : "Detalles",
"Settings" : "Ajustes",
"Participants ({count})" : "Participantes ({count})",
+ "Projects" : "Proyectos",
+ "Show all files" : "Mostrar todos los archivos",
"Meeting ID: {meetingId}" : "ID de reunión: {meetingId}",
"Your PIN: {attendeePin}" : "Tu PIN: {attendeePin}",
"Attachments folder" : "Carpeta de adjuntos",
@@ -1089,6 +1092,11 @@
"Error while accessing microphone" : "Error al acceder al micrófono",
"Access to camera is only possible with HTTPS" : "El acceso a la cámara solo es posible con HTTPS",
"An error occurred while fetching the participants" : "Ha ocurrido un error al recuperar los participantes",
+ "Media" : "Multimedia",
+ "Files" : "Archivos",
+ "Locations" : "Ubicaciones",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk se ha actualizado. Por favor, vuelve a cargar la página",
"Do not disturb" : "No molestar",
"Away" : "Ausente",
@@ -1181,6 +1189,8 @@
"Video on and off" : "Vídeo encendido y apagado",
"Choose in which folder attachments should be saved." : "Escoge la carpeta en la que se guardarán los adjuntos.",
"Exit fullscreen (f)" : "Salir de pantalla completa (f)",
- "Fullscreen (f)" : "Pantalla completa (f)"
+ "Fullscreen (f)" : "Pantalla completa (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Establecer el nivel de notificación para la conversación actual. Esto afectará sólo a las notificaciones que reciba.",
+ "OK: \".wasm\" and \".tflite\" files were properly returned by the web server" : "OK: los archivos \".wasm\" y \".tflite\" han sido devueltos correctamente por el servidor web"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/l10n/es_419.js b/l10n/es_419.js
index 50695960c..026fd2402 100644
--- a/l10n/es_419.js
+++ b/l10n/es_419.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -41,6 +46,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -48,6 +55,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -63,15 +71,20 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -80,6 +93,7 @@ OC.L10N.register(
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -90,10 +104,15 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_419.json b/l10n/es_419.json
index a9893dc3c..3a7248bcd 100644
--- a/l10n/es_419.json
+++ b/l10n/es_419.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -39,6 +44,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -46,6 +53,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -61,15 +69,20 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -78,6 +91,7 @@
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -88,10 +102,15 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_AR.js b/l10n/es_AR.js
index fb82c9072..dee8ea623 100644
--- a/l10n/es_AR.js
+++ b/l10n/es_AR.js
@@ -3,6 +3,11 @@ OC.L10N.register(
{
"_%n guest_::_%n guests_" : ["%n inivitado","%n inivitados"],
"Guest" : "Invitado",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Favor de contactar a su adminsitrador. ",
"Open settings" : "Abrir opciones",
"Messages" : "Mensajes",
"Invalid date, date format must be YYYY-MM-DD" : "La fecha es inválida, favor de seguir el formato AAAA-MM-DD",
@@ -27,6 +32,7 @@ OC.L10N.register(
"Blocked" : "Bloqueado",
"Saved" : "Guardado",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
"Copy link" : "Copiar enlace",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"Dismiss" : "Despedir",
@@ -43,12 +49,17 @@ OC.L10N.register(
"Back" : "Atrás",
"You" : "Usted",
"Favorite" : "Favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Eliminar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingrese una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "More information" : "Más información",
+ "Delete" : "Eliminar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Inicio de sesión",
@@ -63,6 +74,7 @@ OC.L10N.register(
"Close" : "Cerrar",
"Conversation name" : "Nombre de conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"Send message" : "Enviar mensaje",
@@ -71,12 +83,21 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Ajustes",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos de teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Start a conversation" : "Iniciar una conversación",
+ "Media" : "Media",
+ "Files" : "Archivos",
+ "Locations" : "Ubicaciones",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Do not disturb" : "No molestar",
+ "Away" : "Lejos",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_AR.json b/l10n/es_AR.json
index 86a5eb58d..5dc977172 100644
--- a/l10n/es_AR.json
+++ b/l10n/es_AR.json
@@ -1,6 +1,11 @@
{ "translations": {
"_%n guest_::_%n guests_" : ["%n inivitado","%n inivitados"],
"Guest" : "Invitado",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Favor de contactar a su adminsitrador. ",
"Open settings" : "Abrir opciones",
"Messages" : "Mensajes",
"Invalid date, date format must be YYYY-MM-DD" : "La fecha es inválida, favor de seguir el formato AAAA-MM-DD",
@@ -25,6 +30,7 @@
"Blocked" : "Bloqueado",
"Saved" : "Guardado",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
"Copy link" : "Copiar enlace",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"Dismiss" : "Despedir",
@@ -41,12 +47,17 @@
"Back" : "Atrás",
"You" : "Usted",
"Favorite" : "Favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Eliminar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingrese una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "More information" : "Más información",
+ "Delete" : "Eliminar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Inicio de sesión",
@@ -61,6 +72,7 @@
"Close" : "Cerrar",
"Conversation name" : "Nombre de conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"Send message" : "Enviar mensaje",
@@ -69,12 +81,21 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Ajustes",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos de teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Start a conversation" : "Iniciar una conversación",
+ "Media" : "Media",
+ "Files" : "Archivos",
+ "Locations" : "Ubicaciones",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Do not disturb" : "No molestar",
+ "Away" : "Lejos",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_CL.js b/l10n/es_CL.js
index 5f04cda64..2095dd4ac 100644
--- a/l10n/es_CL.js
+++ b/l10n/es_CL.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -44,6 +49,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -52,6 +59,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -68,17 +76,22 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -88,6 +101,7 @@ OC.L10N.register(
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -99,12 +113,17 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_CL.json b/l10n/es_CL.json
index 0f5930adf..2b80bb32b 100644
--- a/l10n/es_CL.json
+++ b/l10n/es_CL.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -42,6 +47,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -50,6 +57,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -66,17 +74,22 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -86,6 +99,7 @@
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -97,12 +111,17 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_CO.js b/l10n/es_CO.js
index e7b2c68b5..25311b8e2 100644
--- a/l10n/es_CO.js
+++ b/l10n/es_CO.js
@@ -16,6 +16,11 @@ OC.L10N.register(
"Guest" : "Invitado",
"- Spice up your messages with emojis from the emoji picker" : "Dale sabor a tus mensajes con emojis del selector de emoji",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -47,6 +52,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -55,6 +62,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -71,17 +79,22 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -91,6 +104,7 @@ OC.L10N.register(
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -102,12 +116,18 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Away" : "Ausente",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_CO.json b/l10n/es_CO.json
index a9eda3149..ecf64bb16 100644
--- a/l10n/es_CO.json
+++ b/l10n/es_CO.json
@@ -14,6 +14,11 @@
"Guest" : "Invitado",
"- Spice up your messages with emojis from the emoji picker" : "Dale sabor a tus mensajes con emojis del selector de emoji",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -45,6 +50,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -53,6 +60,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -69,17 +77,22 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -89,6 +102,7 @@
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -100,12 +114,18 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Away" : "Ausente",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_CR.js b/l10n/es_CR.js
index 1c2f97066..340c0baf5 100644
--- a/l10n/es_CR.js
+++ b/l10n/es_CR.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -44,6 +49,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -52,6 +59,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -68,17 +76,22 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -88,6 +101,7 @@ OC.L10N.register(
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -99,12 +113,17 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_CR.json b/l10n/es_CR.json
index 7927a5068..1598ad710 100644
--- a/l10n/es_CR.json
+++ b/l10n/es_CR.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -42,6 +47,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -50,6 +57,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -66,17 +74,22 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -86,6 +99,7 @@
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -97,12 +111,17 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_DO.js b/l10n/es_DO.js
index 1c2f97066..9803ec4ae 100644
--- a/l10n/es_DO.js
+++ b/l10n/es_DO.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -44,6 +49,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -52,6 +59,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -68,17 +76,22 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -88,6 +101,7 @@ OC.L10N.register(
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -99,12 +113,18 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Away" : "Lejos",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_DO.json b/l10n/es_DO.json
index 7927a5068..24a0248af 100644
--- a/l10n/es_DO.json
+++ b/l10n/es_DO.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -42,6 +47,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -50,6 +57,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -66,17 +74,22 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -86,6 +99,7 @@
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -97,12 +111,18 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Away" : "Lejos",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_EC.js b/l10n/es_EC.js
index 028d5ae0f..3e194e73b 100644
--- a/l10n/es_EC.js
+++ b/l10n/es_EC.js
@@ -36,6 +36,11 @@ OC.L10N.register(
"Call with {user1}, {user2}, {user3} and {user4} (Duration {duration})" : "Llamada con {user1}, {user2}, {user3} y {user4} (Duración {duration})",
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Llamada con {user1}, {user2}, {user3}, {user4} y {user5} (Duración {duration})",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"{user} in {call}" : "{user} en {call}",
"Deleted user in {call}" : "Usuario eliminado de {call}",
"{guest} (guest) in {call}" : "{guest} (invitado) en {call}",
@@ -76,6 +81,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -84,6 +91,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"No camera" : "No hay cámara",
@@ -104,17 +112,22 @@ OC.L10N.register(
"Show screen" : "Mostrar pantalla",
"Call in progress" : "Llamada en progreso",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -126,6 +139,7 @@ OC.L10N.register(
"No camera available" : "No hay cámara disponible",
"Select camera" : "Seleccione la cámara",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -137,7 +151,9 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Start call" : "Iniciar llamada",
@@ -145,6 +161,9 @@ OC.L10N.register(
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
"Access to camera is only possible with HTTPS" : "El acceso a la cámara sólo es posible con HTTPS",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Camera {number}" : "Cámara {number}",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
diff --git a/l10n/es_EC.json b/l10n/es_EC.json
index 0a9b3bc64..9b62e1471 100644
--- a/l10n/es_EC.json
+++ b/l10n/es_EC.json
@@ -34,6 +34,11 @@
"Call with {user1}, {user2}, {user3} and {user4} (Duration {duration})" : "Llamada con {user1}, {user2}, {user3} y {user4} (Duración {duration})",
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Llamada con {user1}, {user2}, {user3}, {user4} y {user5} (Duración {duration})",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"{user} in {call}" : "{user} en {call}",
"Deleted user in {call}" : "Usuario eliminado de {call}",
"{guest} (guest) in {call}" : "{guest} (invitado) en {call}",
@@ -74,6 +79,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -82,6 +89,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"No camera" : "No hay cámara",
@@ -102,17 +110,22 @@
"Show screen" : "Mostrar pantalla",
"Call in progress" : "Llamada en progreso",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -124,6 +137,7 @@
"No camera available" : "No hay cámara disponible",
"Select camera" : "Seleccione la cámara",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -135,7 +149,9 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Start call" : "Iniciar llamada",
@@ -143,6 +159,9 @@
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
"Access to camera is only possible with HTTPS" : "El acceso a la cámara sólo es posible con HTTPS",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Camera {number}" : "Cámara {number}",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
diff --git a/l10n/es_GT.js b/l10n/es_GT.js
index df37eb724..17fb30510 100644
--- a/l10n/es_GT.js
+++ b/l10n/es_GT.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -44,6 +49,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -52,6 +59,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -68,17 +76,22 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -88,6 +101,7 @@ OC.L10N.register(
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -99,12 +113,17 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_GT.json b/l10n/es_GT.json
index a09acd161..57bff93ef 100644
--- a/l10n/es_GT.json
+++ b/l10n/es_GT.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -42,6 +47,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -50,6 +57,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -66,17 +74,22 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -86,6 +99,7 @@
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -97,12 +111,17 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_HN.js b/l10n/es_HN.js
index b005364d6..af9397f61 100644
--- a/l10n/es_HN.js
+++ b/l10n/es_HN.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -41,6 +46,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -48,6 +55,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -63,15 +71,20 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -80,6 +93,7 @@ OC.L10N.register(
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -90,10 +104,15 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_HN.json b/l10n/es_HN.json
index 402eb5638..fb1e21659 100644
--- a/l10n/es_HN.json
+++ b/l10n/es_HN.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -39,6 +44,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -46,6 +53,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -61,15 +69,20 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -78,6 +91,7 @@
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -88,10 +102,15 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_MX.js b/l10n/es_MX.js
index 6d8f3e8de..ab64b1f41 100644
--- a/l10n/es_MX.js
+++ b/l10n/es_MX.js
@@ -78,6 +78,11 @@ OC.L10N.register(
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Llamada con {user1}, {user2}, {user3}, {user4} y {user5} (Duración {duration})",
"Talk to %s" : "Hablar con %s",
"File is not shared, or shared but not with the user" : "Archivo no compartido, o compartido pero no con el usuario.",
+ "File is too big" : "El archivo es demasiado grande",
+ "Invalid file provided" : "Se proporcionó un archivo invalido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"%s invited you to a conversation." : "%s te invitó a una conversación",
"You were invited to a conversation." : "fuiste invitado a una conversación",
"Conversation invitation" : "invitación a una conversación",
@@ -121,6 +126,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -129,6 +136,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -145,17 +153,22 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Eliminar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a favoritos",
"Loading" : "Cargando",
@@ -165,6 +178,7 @@ OC.L10N.register(
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -177,12 +191,21 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Media" : "Multimedia",
+ "Files" : "Archivos",
+ "Locations" : "Ubicaciones",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Do not disturb" : "No molestar",
+ "Away" : "Ausente",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_MX.json b/l10n/es_MX.json
index 0eaf1e1e7..b99d8c2f9 100644
--- a/l10n/es_MX.json
+++ b/l10n/es_MX.json
@@ -76,6 +76,11 @@
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Llamada con {user1}, {user2}, {user3}, {user4} y {user5} (Duración {duration})",
"Talk to %s" : "Hablar con %s",
"File is not shared, or shared but not with the user" : "Archivo no compartido, o compartido pero no con el usuario.",
+ "File is too big" : "El archivo es demasiado grande",
+ "Invalid file provided" : "Se proporcionó un archivo invalido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"%s invited you to a conversation." : "%s te invitó a una conversación",
"You were invited to a conversation." : "fuiste invitado a una conversación",
"Conversation invitation" : "invitación a una conversación",
@@ -119,6 +124,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -127,6 +134,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -143,17 +151,22 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Eliminar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a favoritos",
"Loading" : "Cargando",
@@ -163,6 +176,7 @@
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -175,12 +189,21 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Media" : "Multimedia",
+ "Files" : "Archivos",
+ "Locations" : "Ubicaciones",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Do not disturb" : "No molestar",
+ "Away" : "Ausente",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_NI.js b/l10n/es_NI.js
index 5db8c60bf..ae1beec89 100644
--- a/l10n/es_NI.js
+++ b/l10n/es_NI.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -41,6 +46,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -48,6 +55,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -63,15 +71,20 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -80,6 +93,7 @@ OC.L10N.register(
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -90,10 +104,15 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_NI.json b/l10n/es_NI.json
index 94d440b02..71825617f 100644
--- a/l10n/es_NI.json
+++ b/l10n/es_NI.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -39,6 +44,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -46,6 +53,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -61,15 +69,20 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -78,6 +91,7 @@
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -88,10 +102,15 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_PA.js b/l10n/es_PA.js
index b005364d6..af9397f61 100644
--- a/l10n/es_PA.js
+++ b/l10n/es_PA.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -41,6 +46,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -48,6 +55,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -63,15 +71,20 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -80,6 +93,7 @@ OC.L10N.register(
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -90,10 +104,15 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_PA.json b/l10n/es_PA.json
index 402eb5638..fb1e21659 100644
--- a/l10n/es_PA.json
+++ b/l10n/es_PA.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -39,6 +44,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -46,6 +53,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -61,15 +69,20 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -78,6 +91,7 @@
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -88,10 +102,15 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_PE.js b/l10n/es_PE.js
index 5db8c60bf..ae1beec89 100644
--- a/l10n/es_PE.js
+++ b/l10n/es_PE.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -41,6 +46,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -48,6 +55,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -63,15 +71,20 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -80,6 +93,7 @@ OC.L10N.register(
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -90,10 +104,15 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_PE.json b/l10n/es_PE.json
index 94d440b02..71825617f 100644
--- a/l10n/es_PE.json
+++ b/l10n/es_PE.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -39,6 +44,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -46,6 +53,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -61,15 +69,20 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -78,6 +91,7 @@
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -88,10 +102,15 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_PR.js b/l10n/es_PR.js
index 5db8c60bf..ae1beec89 100644
--- a/l10n/es_PR.js
+++ b/l10n/es_PR.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -41,6 +46,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -48,6 +55,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -63,15 +71,20 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -80,6 +93,7 @@ OC.L10N.register(
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -90,10 +104,15 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_PR.json b/l10n/es_PR.json
index 94d440b02..71825617f 100644
--- a/l10n/es_PR.json
+++ b/l10n/es_PR.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -39,6 +44,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -46,6 +53,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -61,15 +69,20 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -78,6 +91,7 @@
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -88,10 +102,15 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_PY.js b/l10n/es_PY.js
index b005364d6..073f6bf01 100644
--- a/l10n/es_PY.js
+++ b/l10n/es_PY.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -41,6 +46,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -48,6 +55,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -63,15 +71,20 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -80,6 +93,7 @@ OC.L10N.register(
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -90,10 +104,16 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Locations" : "Ubicaciones",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_PY.json b/l10n/es_PY.json
index 402eb5638..d3ad32ebe 100644
--- a/l10n/es_PY.json
+++ b/l10n/es_PY.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -39,6 +44,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -46,6 +53,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -61,15 +69,20 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -78,6 +91,7 @@
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -88,10 +102,16 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Locations" : "Ubicaciones",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_SV.js b/l10n/es_SV.js
index 1c2f97066..340c0baf5 100644
--- a/l10n/es_SV.js
+++ b/l10n/es_SV.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -44,6 +49,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -52,6 +59,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -68,17 +76,22 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -88,6 +101,7 @@ OC.L10N.register(
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -99,12 +113,17 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_SV.json b/l10n/es_SV.json
index 7927a5068..1598ad710 100644
--- a/l10n/es_SV.json
+++ b/l10n/es_SV.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -42,6 +47,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -50,6 +57,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"No audio" : "Sin audio",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
@@ -66,17 +74,22 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Leave conversation" : "Dejar la conversación",
"Delete conversation" : "Borrar conversación",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -86,6 +99,7 @@
"Close" : "Cerrar",
"Conversation name" : "Nombre de la conversación",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -97,12 +111,17 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Rename conversation" : "Renombrar conversación",
"Send" : "Enviar",
"Join a conversation or start a new one" : "Únete a la conversación o incia una nueva",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Please move your setup to HTTPS" : "Por favor cambia tu configuración a HTTPS",
diff --git a/l10n/es_UY.js b/l10n/es_UY.js
index b005364d6..672837a07 100644
--- a/l10n/es_UY.js
+++ b/l10n/es_UY.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -41,6 +46,8 @@ OC.L10N.register(
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -48,6 +55,7 @@ OC.L10N.register(
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -63,15 +71,20 @@ OC.L10N.register(
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -80,6 +93,7 @@ OC.L10N.register(
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -90,10 +104,16 @@ OC.L10N.register(
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Away" : "Ausente",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/es_UY.json b/l10n/es_UY.json
index 402eb5638..807fd3385 100644
--- a/l10n/es_UY.json
+++ b/l10n/es_UY.json
@@ -11,6 +11,11 @@
"Talk" : "Hablar",
"Guest" : "Invitado",
"Talk to %s" : "Hablar con %s",
+ "File is too big" : "El archivo es demasiado grande.",
+ "Invalid file provided" : "Archivo proporcionado inválido",
+ "Invalid image" : "Imagen inválida",
+ "Unknown filetype" : "Tipo de archivo desconocido",
+ "An error occurred. Please contact your admin." : "Se presentó un error. Por favor contacta a tu adminsitrador. ",
"Join call" : "Unirse a la llamada",
"A group call has started in {call}" : "Una llamada en grupo ha iniciado en {call}",
"Open settings" : "Abrir configuraciones",
@@ -39,6 +44,8 @@
"STUN servers" : "Servidores STUN",
"A STUN server is used to determine the public IP address of participants behind a router." : "Un servidor STUN se está usando para determinar la IP pública de los participantes que estén detrás de un ruteador. ",
"TURN server protocols" : "Protocolos del servidor TURN",
+ "OK" : "OK",
+ "Checking …" : "Verificando ...",
"Copy link" : "Copiar liga",
"Waiting for others to join the call …" : "Esperando a que los demás se unan a la llamada ...",
"You can invite others in the participant tab of the sidebar" : "Puedes invitar a otras personas en la pestaña de participante del menú lateral",
@@ -46,6 +53,7 @@
"Dismiss" : "Descartar",
"Show your screen" : "Mostrar tu pantalla",
"Stop screensharing" : "Dejar de compartir la pantalla",
+ "More actions" : "Más acciones",
"Mute audio" : "Silenciar audio",
"Disable video" : "Deshabilitar video",
"Enable video" : "Habilitar el video",
@@ -61,15 +69,20 @@
"You" : "Tú",
"Show screen" : "Mostrar pantalla",
"Favorite" : "Hacer favorito",
+ "Restricted" : "Restringido",
+ "Description" : "Descripción",
+ "Notifications" : "Notificaciones",
"Password protection" : "Protección con contraseña",
"Enter a password" : "Ingresa una contraseña",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Borrar",
"Password" : "Contraseña",
"API token" : "Ficha del API",
"Login" : "Iniciar sesión",
"Nickname" : "Apodo",
"Client ID" : "ID del cliente",
+ "Calls" : "Llamadas",
"Remove from favorites" : "Eliminar de favoritos",
"Add to favorites" : "Agregar a tus favoritos",
"Loading" : "Cargando",
@@ -78,6 +91,7 @@
"Password protect" : "Proteger con contraseña",
"Close" : "Cerrar",
"Reply" : "Responder",
+ "Contact" : "Contacto",
"Today" : "Hoy",
"Yesterday" : "Ayer",
"moderator" : "moderador",
@@ -88,10 +102,16 @@
"Add users or groups" : "Agregar usuarios o grupos",
"Participants" : "Participantes",
"Chat" : "Chat",
+ "Details" : "Detalles",
"Settings" : "Configuraciones ",
+ "Privacy" : "Privacidad",
"Keyboard shortcuts" : "Atajos del teclado",
"Search" : "Buscar",
"Send" : "Enviar",
+ "Files" : "Archivos",
+ "Audio" : "Audio",
+ "Other" : "Otro",
+ "Away" : "Ausente",
"Default" : "Predeterminado",
"Access to microphone & camera is only possible with HTTPS" : "El acceso al micrófono & cámara sólo es posible mediante HTTPS",
"Access to microphone & camera was denied" : "El acceso al micrófono & cámara fue denegado",
diff --git a/l10n/et_EE.js b/l10n/et_EE.js
index 789cc6135..2941a4ce4 100644
--- a/l10n/et_EE.js
+++ b/l10n/et_EE.js
@@ -4,6 +4,11 @@ OC.L10N.register(
"_%n guest_::_%n guests_" : ["%n külaline","%n külalist"],
"Talk" : "Talk",
"Guest" : "Külaline",
+ "File is too big" : "Fail on liiga suur",
+ "Invalid file provided" : "Vigane fail",
+ "Invalid image" : "Vigane pilt",
+ "Unknown filetype" : "Tundmatu failitüüp",
+ "An error occurred. Please contact your admin." : "Tekkis tõrge. Palun võta ühendust administraatoriga.",
"Invalid date, date format must be YYYY-MM-DD" : "Vigane kuupäev, formaat peab olema YYYY-MM-DD",
"Limit to groups" : "Luba gruppidele",
"Everyone" : "Igaüks",
@@ -24,6 +29,7 @@ OC.L10N.register(
"Expired" : "Aegunud",
"Delete this server" : "Kustuta see server",
"Saved" : "Salvestatud",
+ "OK" : "OK",
"Copy link" : "Kopeeri link",
"Dismiss" : "Jäta vahele",
"Grid view" : "Ruudustikvaade",
@@ -31,10 +37,14 @@ OC.L10N.register(
"Back" : "Tagasi",
"You" : "Sina",
"Favorite" : "Lemmik",
+ "Restricted" : "Piiratud",
+ "Description" : "Kirjeldus",
+ "Notifications" : "Teavitused",
"Password protection" : "Password protection",
"Enter a password" : "Enter a password",
"Save" : "Salvesta",
"Edit" : "Redigeeri",
+ "Delete" : "Kustuta",
"Password" : "Parool",
"API token" : "API kood",
"Login" : "Logi sisse",
@@ -47,16 +57,23 @@ OC.L10N.register(
"Password protect" : "Parooliga kaitsmine",
"Close" : "Sulge",
"Reply" : "Vasta",
+ "Contact" : "Kontakt",
"Today" : "Täna",
"Yesterday" : "Eile",
"guest" : "külaline",
"Searching …" : "Otsin ...",
"No results" : "Vasteid ei leitud",
"Add users or groups" : "Add users or groups",
+ "Details" : "Üksikasjad",
"Settings" : "Seaded",
+ "Privacy" : "Privaatsus",
"Keyboard shortcuts" : "Klaviatuuri otseteed",
"Search" : "Otsi",
"Send" : "Saada",
+ "Files" : "Failid",
+ "Locations" : "Asukohad",
+ "Audio" : "Helid",
+ "Other" : "Muu",
"Default" : "Vaikeväärtus",
"The password is wrong. Try again." : "Parool on vale. Proovi uuesti.",
"Android app" : "Androidi rakendus",
diff --git a/l10n/et_EE.json b/l10n/et_EE.json
index ec68811cc..450f21583 100644
--- a/l10n/et_EE.json
+++ b/l10n/et_EE.json
@@ -2,6 +2,11 @@
"_%n guest_::_%n guests_" : ["%n külaline","%n külalist"],
"Talk" : "Talk",
"Guest" : "Külaline",
+ "File is too big" : "Fail on liiga suur",
+ "Invalid file provided" : "Vigane fail",
+ "Invalid image" : "Vigane pilt",
+ "Unknown filetype" : "Tundmatu failitüüp",
+ "An error occurred. Please contact your admin." : "Tekkis tõrge. Palun võta ühendust administraatoriga.",
"Invalid date, date format must be YYYY-MM-DD" : "Vigane kuupäev, formaat peab olema YYYY-MM-DD",
"Limit to groups" : "Luba gruppidele",
"Everyone" : "Igaüks",
@@ -22,6 +27,7 @@
"Expired" : "Aegunud",
"Delete this server" : "Kustuta see server",
"Saved" : "Salvestatud",
+ "OK" : "OK",
"Copy link" : "Kopeeri link",
"Dismiss" : "Jäta vahele",
"Grid view" : "Ruudustikvaade",
@@ -29,10 +35,14 @@
"Back" : "Tagasi",
"You" : "Sina",
"Favorite" : "Lemmik",
+ "Restricted" : "Piiratud",
+ "Description" : "Kirjeldus",
+ "Notifications" : "Teavitused",
"Password protection" : "Password protection",
"Enter a password" : "Enter a password",
"Save" : "Salvesta",
"Edit" : "Redigeeri",
+ "Delete" : "Kustuta",
"Password" : "Parool",
"API token" : "API kood",
"Login" : "Logi sisse",
@@ -45,16 +55,23 @@
"Password protect" : "Parooliga kaitsmine",
"Close" : "Sulge",
"Reply" : "Vasta",
+ "Contact" : "Kontakt",
"Today" : "Täna",
"Yesterday" : "Eile",
"guest" : "külaline",
"Searching …" : "Otsin ...",
"No results" : "Vasteid ei leitud",
"Add users or groups" : "Add users or groups",
+ "Details" : "Üksikasjad",
"Settings" : "Seaded",
+ "Privacy" : "Privaatsus",
"Keyboard shortcuts" : "Klaviatuuri otseteed",
"Search" : "Otsi",
"Send" : "Saada",
+ "Files" : "Failid",
+ "Locations" : "Asukohad",
+ "Audio" : "Helid",
+ "Other" : "Muu",
"Default" : "Vaikeväärtus",
"The password is wrong. Try again." : "Parool on vale. Proovi uuesti.",
"Android app" : "Androidi rakendus",
diff --git a/l10n/eu.js b/l10n/eu.js
index 0ce23fcb4..a255d2bac 100644
--- a/l10n/eu.js
+++ b/l10n/eu.js
@@ -885,6 +885,7 @@ OC.L10N.register(
"No search results" : "Ez dago bilaketaren emaitzarik",
"Groups" : "Taldeak",
"Circles" : "Zirkuluak",
+ "Unread mentions" : "Irakurri gabeko aipamenak",
"Talk settings" : "Talk ezarpenak",
"Users, groups and circles" : "Erabiltzaileak, taldeak eta zirkuluak",
"Users and groups" : "Erabiltzaileak eta taldeak",
@@ -1020,6 +1021,8 @@ OC.L10N.register(
"Details" : "Xehetasunak",
"Settings" : "Ezarpenak",
"Participants ({count})" : "Parte-hartzaileak ({count})",
+ "Projects" : "Proiektuak",
+ "Show all files" : "Erakustsi fitxategi guztiak",
"Meeting ID: {meetingId}" : "Bileraren ID: {meetingId}",
"Your PIN: {attendeePin}" : "Zure PINa: {attendeePin}",
"Attachments folder" : "Eranskinen karpeta",
@@ -1088,6 +1091,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Errorea kamera atzitzean",
"Access to camera is only possible with HTTPS" : "Kamera atzitzeko modu bakarra HTTPS bidez da",
"An error occurred while fetching the participants" : "Errore bat gertatu da parte-hartzaileak eskuratzean",
+ "Media" : "Media",
+ "Files" : "Fitxategiak",
+ "Locations" : "Kokapenak",
+ "Audio" : "Audioa",
+ "Other" : "Bestelakoa",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Elkarrizketak eguneratu dira, mesedez freskatu orria",
"Do not disturb" : "Ez molestatu",
"Away" : "Kanpoan",
@@ -1180,6 +1188,7 @@ OC.L10N.register(
"Video on and off" : "Bideoa gaitu eta desgaitu",
"Choose in which folder attachments should be saved." : "Aukeratu zein karpetatan gorde behar diren atxikitakoak.",
"Exit fullscreen (f)" : "Irten pantaila osotik (f)",
- "Fullscreen (f)" : "Pantaila osoa (f)"
+ "Fullscreen (f)" : "Pantaila osoa (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Konfiguratu jakinarazpen maila uneko elkarrizketarentzat. Honek zuk jasotzen dituzun jakinarazpenei bakarrik eragingo die."
},
"nplurals=2; plural=(n != 1);");
diff --git a/l10n/eu.json b/l10n/eu.json
index 71edef2eb..92163ac10 100644
--- a/l10n/eu.json
+++ b/l10n/eu.json
@@ -883,6 +883,7 @@
"No search results" : "Ez dago bilaketaren emaitzarik",
"Groups" : "Taldeak",
"Circles" : "Zirkuluak",
+ "Unread mentions" : "Irakurri gabeko aipamenak",
"Talk settings" : "Talk ezarpenak",
"Users, groups and circles" : "Erabiltzaileak, taldeak eta zirkuluak",
"Users and groups" : "Erabiltzaileak eta taldeak",
@@ -1018,6 +1019,8 @@
"Details" : "Xehetasunak",
"Settings" : "Ezarpenak",
"Participants ({count})" : "Parte-hartzaileak ({count})",
+ "Projects" : "Proiektuak",
+ "Show all files" : "Erakustsi fitxategi guztiak",
"Meeting ID: {meetingId}" : "Bileraren ID: {meetingId}",
"Your PIN: {attendeePin}" : "Zure PINa: {attendeePin}",
"Attachments folder" : "Eranskinen karpeta",
@@ -1086,6 +1089,11 @@
"Error while accessing microphone" : "Errorea kamera atzitzean",
"Access to camera is only possible with HTTPS" : "Kamera atzitzeko modu bakarra HTTPS bidez da",
"An error occurred while fetching the participants" : "Errore bat gertatu da parte-hartzaileak eskuratzean",
+ "Media" : "Media",
+ "Files" : "Fitxategiak",
+ "Locations" : "Kokapenak",
+ "Audio" : "Audioa",
+ "Other" : "Bestelakoa",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Elkarrizketak eguneratu dira, mesedez freskatu orria",
"Do not disturb" : "Ez molestatu",
"Away" : "Kanpoan",
@@ -1178,6 +1186,7 @@
"Video on and off" : "Bideoa gaitu eta desgaitu",
"Choose in which folder attachments should be saved." : "Aukeratu zein karpetatan gorde behar diren atxikitakoak.",
"Exit fullscreen (f)" : "Irten pantaila osotik (f)",
- "Fullscreen (f)" : "Pantaila osoa (f)"
+ "Fullscreen (f)" : "Pantaila osoa (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Konfiguratu jakinarazpen maila uneko elkarrizketarentzat. Honek zuk jasotzen dituzun jakinarazpenei bakarrik eragingo die."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/l10n/fa.js b/l10n/fa.js
index 5aec7a3db..a7b1b7598 100644
--- a/l10n/fa.js
+++ b/l10n/fa.js
@@ -78,6 +78,11 @@ OC.L10N.register(
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "تماس با {user1} ، {user2} ، {user3} ، {user4} و {user5} (مدت زمان {duration})",
"Talk to %s" : "صحبت کردن %s",
"File is not shared, or shared but not with the user" : "پرونده به اشتراک گذاشته نمی شود ، یا به اشتراک گذاشته اما با کاربر به اشتراک گذاشته نمی شود",
+ "File is too big" : "فایل خیلی بزرگ است",
+ "Invalid file provided" : "فایل داده‌شده نا معتبر است",
+ "Invalid image" : "عکس نامعتبر",
+ "Unknown filetype" : "نوع فایل ناشناخته",
+ "An error occurred. Please contact your admin." : "یک خطا رخ داده است. لطفا با مدیر سیستم تماس بگیرید.",
"Write to conversation" : "برای مکالمه بنویسید",
"Writes event information into a conversation of your choice" : "اطلاعات رویداد را در گفتگوی مورد نظر شما می نویسد",
"%s invited you to a conversation." : "%s شما را به یک گفتگو دعوت کرد",
@@ -86,6 +91,7 @@ OC.L10N.register(
"{user} invited you to a private conversation" : "{user} شما را به یک گفتگوی خصوصی دعوت کرد",
"{user} invited you to a group conversation: {call}" : "{user} شما را به یک گفتگو گروهی دعوت کرد: {call}",
"Open settings" : "تنظیمات را باز کنید",
+ "Conversations" : "گفتگو",
"Messages" : "پیام ها",
"There is no such account registered." : "این حساب کاربری ثبت نام نشده است.",
"United Arab Emirates" : "امارات متحده عربی",
@@ -248,6 +254,7 @@ OC.L10N.register(
"User" : "User",
"Disabled" : "غیرفعال شده",
"Users" : "کاربران",
+ "Beta" : "بتا",
"Name" : "نام",
"General settings" : "تنظیمات عمومی",
"Off" : "خاموش",
@@ -261,28 +268,36 @@ OC.L10N.register(
"Active" : "فعال کردن",
"Expired" : "منقضی شده",
"Saved" : "ذخیره شد",
+ "OK" : "تایید",
"Copy link" : "کپی کردن لینک",
"You can invite others in the participant tab of the sidebar" : "شما می‌توانید دیگران را از زبانه اعضا در نوارکناری دعوت کنید",
"Share this link to invite others!" : "این پیوند را به اشتراک بگذارید تا دیگران را دعوت کنید!",
"Dismiss" : "پنهان کن",
+ "More actions" : "اقدامات بیشتر",
"Grid view" : "نمایش گرید",
"Back" : "بازگشت",
"You" : "شما",
"Drop your files to upload" : "برای بارگذاری، پرونده‌ها را اینجا رها کنید",
"Favorite" : "برگزیده",
+ "Description" : "توضیحات",
+ "Notifications" : "آگاهی‌ها",
"Leave conversation" : "ترک صحبت",
"Delete conversation" : "مکالمه را حذف کنید",
+ "Allow guests" : "اجازه میهمانان",
"Password protection" : "Password protection",
"Enter a password" : "یک گذرواژه وارد کنید",
"Save" : "ذخیره",
"Edit" : "ویرایش",
+ "Delete" : "حذف",
"Password" : "گذرواژه",
"API token" : "API token",
"Login" : "ورود",
"Nickname" : "نام مستعار",
"Client ID" : "شناسه مشتری",
+ "Mark as read" : "علامت به عنوان خوانده‌شده",
"Remove from favorites" : "Remove from favorites",
"Add to favorites" : "Add to favorites",
+ "Open conversations" : "مکالمه جدید",
"Loading" : "در حال بار گزاری",
"Groups" : "گروه ها",
"Circles" : "حلقه ها",
@@ -291,10 +306,19 @@ OC.L10N.register(
"Add participants" : "افزودن عضو",
"Close" : "بستن",
"Conversation name" : "نام مکالمه",
+ "Unread messages" : "پیام‌های خوانده نشده",
+ "Message sent" : "پیام ارسال شد",
"Reply" : "پاسخ",
+ "Mark as unread" : "علامت به عنوان خوانده‌نشده",
+ "Contact" : "مخاطب",
"Today" : "Today",
"Yesterday" : "دیروز",
+ "Record voice message" : "ضبط پیام صوتی",
+ "Upload new files" : "فایل‌های جدید را آپلود کنید",
+ "Share from Files" : "اشتراک‌گذاری از فایل‌ها",
"Send message" : "پیام فرستادن",
+ "File to share" : "فایل برای اشتراک‌گذاری",
+ "Invalid path selected" : "مسیر نامعتبر انتخاب شده است",
"guest" : "میهمان",
"Demote from moderator" : "عزل از مدیر",
"Promote to moderator" : "ترفیع به مدیر",
@@ -303,7 +327,11 @@ OC.L10N.register(
"No results" : "نتیجه ای یافت نشد",
"Add users or groups" : "کاربران یا گروه ها را اضافه کنید",
"Participants" : "شركت كنندگان",
+ "Details" : "جزئیات",
"Settings" : "تنظیمات",
+ "Projects" : "پروژه ها",
+ "Show all files" : "نمایش همه پرونده ها",
+ "Privacy" : "حریم خصوصی",
"Keyboard shortcuts" : "میان بر صفحه ی کلید",
"Search" : "جستجو کردن",
"Rename conversation" : "تغییر نام مکالمه",
@@ -312,6 +340,13 @@ OC.L10N.register(
"Start a conversation" : "مکالمه را شروع کنید",
"Join a conversation or start a new one!" : "عضو یک گفتگو شوید یا یک گفتگو جدید شروع کنید!",
"Join a conversation or start a new one" : "عضو یک گفتگو شوید یا یک گفتگو جدید شروع کنید",
+ "Media" : "رسانه‌ها",
+ "Files" : "فایل ها",
+ "Locations" : "مکانها",
+ "Audio" : "صدا",
+ "Other" : "اعلان‌ها",
+ "Do not disturb" : "مزاحم نشوید",
+ "Away" : "دور",
"Default" : "پیش‌گزیده",
"The password is wrong. Try again." : "رمزعبور اشتباه می باشد. دوباره امتحان کنید.",
"Android app" : "اپ اندروید",
diff --git a/l10n/fa.json b/l10n/fa.json
index 2f2d718a6..5d9eb6cde 100644
--- a/l10n/fa.json
+++ b/l10n/fa.json
@@ -76,6 +76,11 @@
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "تماس با {user1} ، {user2} ، {user3} ، {user4} و {user5} (مدت زمان {duration})",
"Talk to %s" : "صحبت کردن %s",
"File is not shared, or shared but not with the user" : "پرونده به اشتراک گذاشته نمی شود ، یا به اشتراک گذاشته اما با کاربر به اشتراک گذاشته نمی شود",
+ "File is too big" : "فایل خیلی بزرگ است",
+ "Invalid file provided" : "فایل داده‌شده نا معتبر است",
+ "Invalid image" : "عکس نامعتبر",
+ "Unknown filetype" : "نوع فایل ناشناخته",
+ "An error occurred. Please contact your admin." : "یک خطا رخ داده است. لطفا با مدیر سیستم تماس بگیرید.",
"Write to conversation" : "برای مکالمه بنویسید",
"Writes event information into a conversation of your choice" : "اطلاعات رویداد را در گفتگوی مورد نظر شما می نویسد",
"%s invited you to a conversation." : "%s شما را به یک گفتگو دعوت کرد",
@@ -84,6 +89,7 @@
"{user} invited you to a private conversation" : "{user} شما را به یک گفتگوی خصوصی دعوت کرد",
"{user} invited you to a group conversation: {call}" : "{user} شما را به یک گفتگو گروهی دعوت کرد: {call}",
"Open settings" : "تنظیمات را باز کنید",
+ "Conversations" : "گفتگو",
"Messages" : "پیام ها",
"There is no such account registered." : "این حساب کاربری ثبت نام نشده است.",
"United Arab Emirates" : "امارات متحده عربی",
@@ -246,6 +252,7 @@
"User" : "User",
"Disabled" : "غیرفعال شده",
"Users" : "کاربران",
+ "Beta" : "بتا",
"Name" : "نام",
"General settings" : "تنظیمات عمومی",
"Off" : "خاموش",
@@ -259,28 +266,36 @@
"Active" : "فعال کردن",
"Expired" : "منقضی شده",
"Saved" : "ذخیره شد",
+ "OK" : "تایید",
"Copy link" : "کپی کردن لینک",
"You can invite others in the participant tab of the sidebar" : "شما می‌توانید دیگران را از زبانه اعضا در نوارکناری دعوت کنید",
"Share this link to invite others!" : "این پیوند را به اشتراک بگذارید تا دیگران را دعوت کنید!",
"Dismiss" : "پنهان کن",
+ "More actions" : "اقدامات بیشتر",
"Grid view" : "نمایش گرید",
"Back" : "بازگشت",
"You" : "شما",
"Drop your files to upload" : "برای بارگذاری، پرونده‌ها را اینجا رها کنید",
"Favorite" : "برگزیده",
+ "Description" : "توضیحات",
+ "Notifications" : "آگاهی‌ها",
"Leave conversation" : "ترک صحبت",
"Delete conversation" : "مکالمه را حذف کنید",
+ "Allow guests" : "اجازه میهمانان",
"Password protection" : "Password protection",
"Enter a password" : "یک گذرواژه وارد کنید",
"Save" : "ذخیره",
"Edit" : "ویرایش",
+ "Delete" : "حذف",
"Password" : "گذرواژه",
"API token" : "API token",
"Login" : "ورود",
"Nickname" : "نام مستعار",
"Client ID" : "شناسه مشتری",
+ "Mark as read" : "علامت به عنوان خوانده‌شده",
"Remove from favorites" : "Remove from favorites",
"Add to favorites" : "Add to favorites",
+ "Open conversations" : "مکالمه جدید",
"Loading" : "در حال بار گزاری",
"Groups" : "گروه ها",
"Circles" : "حلقه ها",
@@ -289,10 +304,19 @@
"Add participants" : "افزودن عضو",
"Close" : "بستن",
"Conversation name" : "نام مکالمه",
+ "Unread messages" : "پیام‌های خوانده نشده",
+ "Message sent" : "پیام ارسال شد",
"Reply" : "پاسخ",
+ "Mark as unread" : "علامت به عنوان خوانده‌نشده",
+ "Contact" : "مخاطب",
"Today" : "Today",
"Yesterday" : "دیروز",
+ "Record voice message" : "ضبط پیام صوتی",
+ "Upload new files" : "فایل‌های جدید را آپلود کنید",
+ "Share from Files" : "اشتراک‌گذاری از فایل‌ها",
"Send message" : "پیام فرستادن",
+ "File to share" : "فایل برای اشتراک‌گذاری",
+ "Invalid path selected" : "مسیر نامعتبر انتخاب شده است",
"guest" : "میهمان",
"Demote from moderator" : "عزل از مدیر",
"Promote to moderator" : "ترفیع به مدیر",
@@ -301,7 +325,11 @@
"No results" : "نتیجه ای یافت نشد",
"Add users or groups" : "کاربران یا گروه ها را اضافه کنید",
"Participants" : "شركت كنندگان",
+ "Details" : "جزئیات",
"Settings" : "تنظیمات",
+ "Projects" : "پروژه ها",
+ "Show all files" : "نمایش همه پرونده ها",
+ "Privacy" : "حریم خصوصی",
"Keyboard shortcuts" : "میان بر صفحه ی کلید",
"Search" : "جستجو کردن",
"Rename conversation" : "تغییر نام مکالمه",
@@ -310,6 +338,13 @@
"Start a conversation" : "مکالمه را شروع کنید",
"Join a conversation or start a new one!" : "عضو یک گفتگو شوید یا یک گفتگو جدید شروع کنید!",
"Join a conversation or start a new one" : "عضو یک گفتگو شوید یا یک گفتگو جدید شروع کنید",
+ "Media" : "رسانه‌ها",
+ "Files" : "فایل ها",
+ "Locations" : "مکانها",
+ "Audio" : "صدا",
+ "Other" : "اعلان‌ها",
+ "Do not disturb" : "مزاحم نشوید",
+ "Away" : "دور",
"Default" : "پیش‌گزیده",
"The password is wrong. Try again." : "رمزعبور اشتباه می باشد. دوباره امتحان کنید.",
"Android app" : "اپ اندروید",
diff --git a/l10n/fi.js b/l10n/fi.js
index 504fef580..88a834b70 100644
--- a/l10n/fi.js
+++ b/l10n/fi.js
@@ -11,9 +11,12 @@ OC.L10N.register(
"You attended a call with {user1}, {user2}, {user3}, {user4} and {user5}" : "Osallistuit puheluun käyttäjien {user1}, {user2}, {user3}, {user4} ja {user5} kanssa",
"_%n other_::_%n others_" : ["%n muu","%n muuta"],
"{actor} invited you to {call}" : "{actor} kutsui sinut puheluun {call}",
+ "You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Sinut kutsuttiin <strong>keskusteluun</strong> tai olit <strong>puhelussa</strong>",
"Other activities" : "Muut tapahtumat",
"Talk" : "Puhe",
"Guest" : "Vieras",
+ "- Raise your hand in a call with the R key" : "- Nosta kätesi puhelussa R-näppäimellä",
+ "There are currently no commands available." : "Tällä hetkellä ei komentoja käytettävissä.",
"The command does not exist" : "Komentoa ei ole olemassa",
"Talk updates ✅" : "Talk-päivitykset ✅",
"{actor} created the conversation" : "{actor} loi keskustelun",
@@ -21,6 +24,7 @@ OC.L10N.register(
"An administrator created the conversation" : "Ylläpitäjä loi keskustelun",
"{actor} renamed the conversation from \"%1$s\" to \"%2$s\"" : "{actor} muutti keskustelun \"%1$s\" uudeksi nimeksi \"%2$s\"",
"You renamed the conversation from \"%1$s\" to \"%2$s\"" : "Sinä muutit keskustelun \"%1$s\" uudeksi nimeksi \"%2$s\"",
+ "An administrator renamed the conversation from \"%1$s\" to \"%2$s\"" : "Ylläpitäjä muutti keskustelun \"%1$s\" uudeksi nimeksi \"%2$s\"",
"{actor} set the description" : "{actor} asetti kuvauksen",
"You set the description" : "Sinä asetit kuvauksen",
"An administrator set the description" : "Ylläpitäjä asetti kuvauksen",
@@ -39,14 +43,22 @@ OC.L10N.register(
"{actor} locked the conversation" : "{actor} lukitsi keskustelun",
"You locked the conversation" : "Sinä lukitsit keskustelun",
"An administrator locked the conversation" : "Ylläpitäjä lukitsi keskustelun",
+ "{actor} limited the conversation to the current participants" : "{actor} rajoitti keskustelun nykyisiin osallistujiin",
+ "You limited the conversation to the current participants" : "Rajoitit keskustelun nykyisiin osallistujiin",
+ "An administrator limited the conversation to the current participants" : "Ylläpitäjä rajoitti keskustelun nykyisiin osallistujiin",
+ "{actor} opened the conversation to registered users" : "{actor} avasi keskustelun rekisteröityneille käyttäjille",
+ "You opened the conversation to registered users" : "Avasit keskustelun rekisteröityneille käyttäjille",
"The conversation is now open to everyone" : "Keskustelu on nyt avoin kaikille",
"{actor} opened the conversation to everyone" : "{actor} avasi keskustelun kaikille",
"You opened the conversation to everyone" : "Avasit uuden keskustelun kaikille",
+ "{actor} restricted the conversation to moderators" : "{actor} rajoitti keskustelun moderaattoreille",
+ "You restricted the conversation to moderators" : "Rajoitit keskustelun moderaattoreille",
"{actor} allowed guests" : "{actor} salli vieraat",
"You allowed guests" : "Sinä sallit vieraat",
"An administrator allowed guests" : "Ylläpitäjä salli vieraat",
"{actor} disallowed guests" : "{actor} esti vieraat",
"You disallowed guests" : "Sinä estit vieraat",
+ "An administrator disallowed guests" : "Ylläpitäjä ei sallinut vieraita",
"{actor} set a password" : "{actor} asetti salasanan",
"You set a password" : "Sinä asetit salasanan",
"An administrator set a password" : "Ylläpitäjä asetti salasanan",
@@ -66,12 +78,19 @@ OC.L10N.register(
"You removed {user}" : "Sinä poistit käyttäjän {user}",
"{actor} removed you" : "{actor} poisti sinut",
"An administrator removed you" : "Ylläpitäjä lisäsi sinut",
+ "An administrator removed {user}" : "Ylläpitäjä poisti käyttäjän {user}",
"{actor} added group {group}" : "{actor} lisäsi ryhmän {group}",
"You added group {group}" : "Lisäsit ryhmän {group}",
"An administrator added group {group}" : "Ylläpitäjä lisäsi ryhmän {group}",
"{actor} removed group {group}" : "{actor} poisti ryhmän {group}",
"You removed group {group}" : "Poistit ryhmän {group}",
"An administrator removed group {group}" : "Ylläpitäjä poisti ryhmän {group}",
+ "{actor} added circle {circle}" : "{actor} lisäsi piirin {circle}",
+ "You added circle {circle}" : "Lisäsit piirin {circle}",
+ "An administrator added circle {circle}" : "Ylläpitäjä lisäsi piirin {circle}",
+ "{actor} removed circle {circle}" : "{actor} poisti piirin {circle}",
+ "You removed circle {circle}" : "Poistit piirin {circle}",
+ "An administrator removed circle {circle}" : "Ylläpitäjä poisti piirin {circle}",
"{actor} promoted {user} to moderator" : "{actor} nosti käyttäjän {user} moderaattoriksi",
"You promoted {user} to moderator" : "Sinä nostit käyttäjän {user} moderaattoriksi",
"{actor} promoted you to moderator" : "{actor} nosti sinut moderaattoriksi",
@@ -80,28 +99,49 @@ OC.L10N.register(
"{actor} demoted you from moderator" : "{actor} poisti sinulta moderaattorin oikeudet",
"{actor} shared a file which is no longer available" : "{actor} jakoi kanssasi tiedoston, joka ei ole enää saatavilla",
"You shared a file which is no longer available" : "Jaoit tiedoston, joka ei ole enää saatavilla",
+ "{actor} updated the Matterbridge configuration" : "{actor} päivitti Matterbridge-kokoonpanon",
+ "You updated the Matterbridge configuration" : "Päivitit Matterbridge-kokoonpanon",
+ "{actor} started Matterbridge" : "{actor} käynnisti Matterbridgen",
+ "You started Matterbridge" : "Käynnistit Matterbridgen",
+ "{actor} stopped Matterbridge" : "{actor} pysäytti Matterbridgen",
+ "You stopped Matterbridge" : "Pysäytit Matterbridgen",
"{actor} deleted a message" : "{actor} poisti viestin",
"You deleted a message" : "Sinä poistit viestin",
+ "{actor} deleted a reaction" : "{actor} poisti reaktion",
+ "You deleted a reaction" : "Poistit reaktion",
"{actor} cleared the history of the conversation" : "{actor} tyhjensi keskusteluhistorian",
"You cleared the history of the conversation" : "Sinä tyhjensit keskusteluhistorian",
"%s (guest)" : "%s (vieras)",
"You missed a call from {user}" : "Sinulta jäi vastaamatta puhelu käyttäjältä {user}",
+ "You tried to call {user}" : "Yritit soittaa käyttäjälle {user}",
"Call with {user1} and {user2} (Duration {duration})" : "Puhelu käyttäjien {user1} ja {user2} kesken (Kesto {duration})",
"Call with {user1}, {user2} and {user3} (Duration {duration})" : "Puhelu käyttäjien {user1}, {user2} ja {user3} kesken (Kesto {duration})",
"Call with {user1}, {user2}, {user3} and {user4} (Duration {duration})" : "Puhelu käyttäjien {user1}, {user2}, {user3} ja {user4} kesken (Kesto {duration})",
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Puhelu käyttäjien {user1}, {user2}, {user3}, {user4} ja {user5} kesken (Kesto {duration})",
+ "File is not shared, or shared but not with the user" : "Tiedosto ei ole jaettu, tai jaettu mutta ei kyseisen käyttäjän kanssa",
+ "No image file provided" : "Kuvatiedostoa ei määritetty",
"File is too big" : "Tiedosto on liian suuri",
+ "Invalid file provided" : "Virheellinen tiedosto määritetty",
"Invalid image" : "Virheellinen kuva",
"Unknown filetype" : "Tuntematon tiedostotyyppi",
+ "An error occurred. Please contact your admin." : "Tapahtui virhe. Ole yhteydessä ylläpitäjään.",
+ "Talk mentions" : "Talk-maininnat",
"Write to conversation" : "Kirjoita keskusteluun",
"%s invited you to a conversation." : "%s kutsui sinut keskusteluun.",
"You were invited to a conversation." : "Sinut kutsuttiin keskusteluun.",
"Conversation invitation" : "Keskustelukutsu",
"Click the button below to join." : "Napsauta alla olevaa painiketta liittyäksesi.",
"Join »%s«" : "Liity »%s«",
+ "You can also dial-in via phone with the following details" : "Voit myös yhdistää puhelimella seuraavin tiedoin",
+ "Dial-in information" : "Puhelintiedot",
+ "Meeting ID" : "Tapaamisen tunniste",
+ "Your PIN" : "PIN-koodisi",
"Password request: %s" : "Salasanapyyntö: %s",
"Private conversation" : "Yksityinen keskustelu",
"Deleted user (%s)" : "Poistettiin käyttäjä (%s)",
+ "{user} in {call}" : "{user} puhelussa {call}",
+ "{guest} (guest) in {call}" : "{guest} (vieras) puhelussa {call}",
+ "Guest in {call}" : "Vieras puhelussa {call}",
"{user} sent you a private message" : "{user} lähetti sinulle yksityisviestin",
"{user} sent a message in conversation {call}" : "{user} lähetti viestin keskusteluun {call}",
"A deleted user sent a message in conversation {call}" : "Poistettu käyttäjä lähetti viestin keskusteluun {call}",
@@ -110,78 +150,262 @@ OC.L10N.register(
"{user} replied to your private message" : "{user} vastasi yksityisviestiisi",
"{user} replied to your message in conversation {call}" : "{user} vastasi viestiisi keskustelussa {call}",
"A guest replied to your message in conversation {call}" : "Vieras vastasi viestiisi keskustelussa {call}",
+ "{user} reacted with {reaction} to your private message" : "{user} vastasi reaktiolla {reaction} yksityisviestiisi",
"{user} mentioned you in a private conversation" : "{user} mainitsi sinut yksityiskeskustelussa",
"{user} mentioned you in conversation {call}" : "{user} mainitsi sinut keskustelussa {call}",
"A deleted user mentioned you in conversation {call}" : "Poistettu käyttäjä mainitsi sinut keskustelussa {call}",
+ "{guest} (guest) mentioned you in conversation {call}" : "{guest} (vieras) mainitsi sinut keskustelussa {call}",
"A guest mentioned you in conversation {call}" : "Vieras mainitsi sinut keskustelussa {call}",
"View chat" : "Näytä keskustelu",
"{user} invited you to a private conversation" : "{user} kutsui sinut yksityiskeskusteluun",
"Join call" : "Liity puheluun",
"{user} invited you to a group conversation: {call}" : "{user} kutsui sinut ryhmäkeskusteluun: {call}",
"Answer call" : "Vastaa puheluun",
+ "{user} would like to talk with you" : "{user} haluaa puhua kanssasi",
"Call back" : "Soita takaisin",
"A group call has started in {call}" : "Ryhmäpuhelu on alkanut puhelussa {call}",
+ "{email} is requesting the password to access {file}" : "{email} pyytää salasanaa saadakseen pääsyn tiedostoon {file}",
"Open settings" : "Avaa asetukset",
+ "Open Talk" : "Avaa Talk",
"Conversations" : "Keskustelut",
"Messages" : "Viestit",
"{user}" : "{user}",
"Messages in {conversation}" : "Viestit keskustelussa {conversation}",
"{user} in {conversation}" : "{user} keskustelussa {conversation}",
+ "Messages in other conversations" : "Viestit muissa keskusteluissa",
"Something unexpected happened." : "Jotain odottamatonta tapahtui.",
+ "The URL is invalid." : "URL-osoite on virheellinen.",
+ "An HTTPS URL is required." : "URL-osoitteen on oltava HTTPS-muodossa.",
"The email address is invalid." : "Sähköpostiosoite on virheellinen.",
"The language is invalid." : "Kieli on virheellinen.",
"The country is invalid." : "Maa on virheellinen.",
"Something unexpected happened. Please try again later." : "Jotain odottamatonta tapahtui. Yritä myöhemmin uudelleen.",
+ "There is no such account registered." : "Kyseistä tiliä ei ole rekisteröity.",
+ "Andorra" : "Andorra",
+ "United Arab Emirates" : "Yhdistyneet arabiemiirikunnat",
+ "Afghanistan" : "Afganistan",
+ "Antigua and Barbuda" : "Antigua ja Barbuda",
+ "Anguilla" : "Anguilla",
+ "Albania" : "Albania",
+ "Armenia" : "Armenia",
+ "Angola" : "Angola",
+ "Antarctica" : "Etelämanner",
+ "Argentina" : "Argentiina",
+ "American Samoa" : "Amerikan Samoa",
"Austria" : "Itävalta",
+ "Australia" : "Australia",
+ "Aruba" : "Aruba",
+ "Åland Islands" : "Ahvenanmaa",
+ "Azerbaijan" : "Azerbaidžan",
+ "Bosnia and Herzegovina" : "Bosnia ja Hertsegovina",
+ "Barbados" : "Barbados",
+ "Bangladesh" : "Bangladesh",
"Belgium" : "Belgia",
+ "Burkina Faso" : "Burkina Faso",
"Bulgaria" : "Bulgaria",
+ "Bahrain" : "Bahrain",
+ "Burundi" : "Burundi",
+ "Benin" : "Benin",
+ "Saint Barthélemy" : "Saint Barthélemy",
+ "Bermuda" : "Bermuda",
+ "Bonaire, Sint Eustatius and Saba" : "Bonaire, Sint Eustatius ja Saba",
"Brazil" : "Brasilia",
+ "Bahamas" : "Bahamasaaret",
+ "Bhutan" : "Bhutan",
+ "Bouvet Island" : "Bouvet'nsaari",
+ "Botswana" : "Botswana",
+ "Belarus" : "Valko-Venäjä",
+ "Belize" : "Belize",
"Canada" : "Kanada",
+ "Cocos (Keeling) Islands" : "Kookossaaret",
+ "Central African Republic" : "Keski-Afrikan tasavalta",
+ "Congo" : "Kongo",
"Switzerland" : "Sveitsi",
+ "Côte d'Ivoire" : "Norsunluurannikko",
+ "Cook Islands" : "Cookinsaaret",
"Chile" : "Chile",
+ "Cameroon" : "Kamerun",
"China" : "Kiina",
+ "Colombia" : "Kolumbia",
+ "Costa Rica" : "Costa Rica",
"Cuba" : "Kuuba",
+ "Cabo Verde" : "Kap Verde",
+ "Curaçao" : "Curaçao",
+ "Christmas Island" : "Joulusaari",
"Cyprus" : "Kypros",
+ "Czechia" : "Tšekki",
"Germany" : "Saksa",
+ "Djibouti" : "Djibouti",
"Denmark" : "Tanska",
+ "Dominican Republic" : "Dominikaaninen tasavalta",
+ "Algeria" : "Algeria",
+ "Ecuador" : "Ecuador",
"Estonia" : "Viro",
"Egypt" : "Egypti",
+ "Eritrea" : "Eritrea",
"Spain" : "Espanja",
+ "Ethiopia" : "Etiopia",
"Finland" : "Suomi",
+ "Fiji" : "Fidži",
+ "Faroe Islands" : "Färsaaret",
"France" : "Ranska",
+ "Gabon" : "Gabon",
+ "Grenada" : "Grenada",
+ "Georgia" : "Georgia",
+ "French Guiana" : "Ranskan Guayana",
+ "Guernsey" : "Guernsey",
+ "Ghana" : "Ghana",
+ "Gibraltar" : "Gibraltar",
+ "Greenland" : "Grönlanti",
+ "Gambia" : "Gambia",
+ "Guinea" : "Guinea",
+ "Guadeloupe" : "Guadeloupe",
+ "Equatorial Guinea" : "Päiväntasaajan Guinea",
"Greece" : "Kreikka",
+ "South Georgia and the South Sandwich Islands" : "Etelä-Georgia ja Eteläiset Sandwichsaaret",
+ "Guatemala" : "Guatemala",
+ "Guam" : "Guam",
+ "Guinea-Bissau" : "Guinea-Bissau",
+ "Guyana" : "Guyana",
+ "Hong Kong" : "Hong Kong",
+ "Heard Island and McDonald Islands" : "Heard ja McDonaldinsaaret",
+ "Honduras" : "Honduras",
"Croatia" : "Kroatia",
"Haiti" : "Haiti",
"Hungary" : "Unkari",
+ "Indonesia" : "Indonesia",
"Ireland" : "Irlanti",
+ "Israel" : "Israel",
+ "Isle of Man" : "Mansaari",
"India" : "Intia",
+ "British Indian Ocean Territory" : "Brittiläinen Intian valtameren alue",
"Iraq" : "Irak",
"Iceland" : "Islanti",
"Italy" : "Italia",
+ "Jamaica" : "Jamaika",
+ "Jordan" : "Jordan",
"Japan" : "Japani",
"Kenya" : "Kenia",
+ "Kyrgyzstan" : "Kirgisia",
+ "Cambodia" : "Kambodža",
+ "Kiribati" : "Kiribati",
+ "Saint Kitts and Nevis" : "Saint Kitts ja Nevis",
+ "Kuwait" : "Kuwait",
+ "Cayman Islands" : "Caymansaaret",
+ "Kazakhstan" : "Kazakhstan",
+ "Lebanon" : "Libanon",
+ "Saint Lucia" : "Saint Lucia",
+ "Liechtenstein" : "Liechtenstein",
+ "Sri Lanka" : "Sri Lanka",
+ "Liberia" : "Liberia",
+ "Lesotho" : "Lesotho",
"Lithuania" : "Liettua",
+ "Luxembourg" : "Luxemburg",
"Latvia" : "Latvia",
+ "Libya" : "Libya",
+ "Morocco" : "Marokko",
+ "Monaco" : "Monaco",
"Montenegro" : "Montenegro",
+ "Madagascar" : "Madagascar",
+ "Marshall Islands" : "Marshallinsaaret",
+ "Mali" : "Mali",
+ "Myanmar" : "Myanmar",
+ "Mongolia" : "Mongolia",
+ "Macao" : "Macao",
+ "Northern Mariana Islands" : "Pohjois-Mariaanit",
+ "Mauritania" : "Mauritania",
+ "Montserrat" : "Montserrat",
+ "Malta" : "Malta",
+ "Mauritius" : "Mauritius",
+ "Maldives" : "Malediivit",
+ "Malawi" : "Malawi",
+ "Mexico" : "Meksiko",
+ "Malaysia" : "Malesia",
+ "Mozambique" : "Mosambik",
+ "Namibia" : "Namibia",
+ "New Caledonia" : "Uusi-Kaledonia",
+ "Niger" : "Niger",
+ "Norfolk Island" : "Norfolkinsaari",
+ "Nigeria" : "Nigeria",
+ "Nicaragua" : "Nicaragua",
+ "Netherlands" : "Alankomaat",
"Norway" : "Norja",
+ "Nepal" : "Nepali",
+ "Nauru" : "Nauru",
+ "Niue" : "Niue",
+ "New Zealand" : "Uusi-Seelanti",
+ "Oman" : "Oman",
"Panama" : "Panama",
"Peru" : "Peru",
+ "French Polynesia" : "Ranskan Polynesia",
+ "Papua New Guinea" : "Papua-Uusi-Guinea",
+ "Philippines" : "Filippiinit",
+ "Pakistan" : "Pakistan",
"Poland" : "Puola",
+ "Saint Pierre and Miquelon" : "Saint Pierre ja Miquelon",
+ "Pitcairn" : "Pitcairnsaaret",
+ "Puerto Rico" : "Puerto Rico",
"Portugal" : "Portugali",
+ "Palau" : "Palau",
+ "Paraguay" : "Paraguay",
+ "Qatar" : "Qatar",
+ "Réunion" : "Réunion",
"Romania" : "Romania",
+ "Serbia" : "Serbia",
+ "Russian Federation" : "Venäjä",
+ "Rwanda" : "Ruanda",
+ "Saudi Arabia" : "Saudi-Arabia",
+ "Solomon Islands" : "Salomonsaaret",
+ "Seychelles" : "Seychellit",
+ "Sudan" : "Sudan",
"Sweden" : "Ruotsi",
"Singapore" : "Singapore",
+ "Saint Helena, Ascension and Tristan da Cunha" : "Saint Helena, Ascension ja Tristan da Cunha",
+ "Slovenia" : "Slovenia",
+ "Svalbard and Jan Mayen" : "Huippuvuoret ja Jan Mayen",
"Slovakia" : "Slovakia",
+ "Sierra Leone" : "Sierra Leone",
+ "San Marino" : "San Marino",
+ "Senegal" : "Senegal",
"Somalia" : "Somalia",
+ "Suriname" : "Suriname",
+ "South Sudan" : "Etelä-Sudan",
+ "Sao Tome and Principe" : "São Tomé ja Príncipe",
+ "El Salvador" : "El Salvador",
+ "Turks and Caicos Islands" : "Turks- ja Caicossaaret",
+ "Chad" : "Tšad",
+ "Togo" : "Togo",
"Thailand" : "Thaimaa",
+ "Tajikistan" : "Tadžikistan",
+ "Tokelau" : "Tokelau",
+ "Timor-Leste" : "Itä-Timor",
+ "Turkmenistan" : "Turkmenistan",
"Tunisia" : "Tunisia",
+ "Tonga" : "Tonga",
"Turkey" : "Turkki",
+ "Trinidad and Tobago" : "Trinidad ja Tobago",
+ "Tuvalu" : "Tuvalu",
"Ukraine" : "Ukraina",
+ "Uganda" : "Uganda",
+ "United States Minor Outlying Islands" : "Yhdysvaltojen pienet syrjäiset saaret",
"United States of America" : "Yhdysvallat",
+ "Uruguay" : "Uruguay",
+ "Uzbekistan" : "Uzbekistan",
+ "Saint Vincent and the Grenadines" : "Saint Vincent ja Grenadiinit",
+ "Viet Nam" : "Vietnam",
+ "Vanuatu" : "Vanuatu",
+ "Wallis and Futuna" : "Wallis ja Futuna",
+ "Samoa" : "Samoa",
+ "Yemen" : "Jemen",
+ "Mayotte" : "Mayotte",
+ "South Africa" : "Etelä-Afrikka",
+ "Zambia" : "Sambia",
+ "Zimbabwe" : "Zimbabwe",
"Invalid date, date format must be YYYY-MM-DD" : "Virheellinen päiväys, päiväyksen muoto tulee olla YYYY-MM-DD",
"Conversation not found" : "Keskustelua ei löydy",
"Path is already shared with this room" : "Polku on jo jaettu tämän huoneen kesken",
"Chat, video & audio-conferencing using WebRTC" : "Keskustelu ja video- sekä äänineuvottelut WebRTC:tä käyttäen",
+ "Navigating away from the page will leave the call in {conversation}" : "Sivulta poistuminen päättää puhelun keskustelussa {conversation}",
"Leave call" : "Poistu puhelusta",
"Stay in call" : "Pysy puhelussa",
"Discuss this file" : "Keskustele tästä tiedostosta",
@@ -194,6 +418,8 @@ OC.L10N.register(
"Limit to groups" : "Rajoita ryhmiin",
"Guests can still join public conversations." : "Vieraat voivat silti liittyä julkisiin keskusteluihin.",
"Everyone" : "Kaikki",
+ "Users and moderators" : "Käyttäjät ja moderaattorit",
+ "Moderators only" : "Vain moderaattorit",
"Save changes" : "Tallenna muutokset",
"Saving …" : "Tallennetaan…",
"Saved!" : "Tallennettu!",
@@ -214,10 +440,13 @@ OC.L10N.register(
"All messages" : "Kaikki viestit",
"@-mentions only" : "Vain @-maininnat",
"Off" : "Pois",
+ "URL of this Nextcloud instance" : "Tämän Nextcloud-instanssin URL-osoite",
+ "Email of the user" : "Käyttäjän sähköpostiosoite",
"Language" : "Kieli",
"Country" : "Maa",
"Status" : "Tila",
"Created at" : "Luotu",
+ "Expires at" : "Vanhenee",
"Pending" : "Odottaa",
"Error" : "Virhe",
"Blocked" : "Estetty",
@@ -228,15 +457,20 @@ OC.L10N.register(
"Matterbridge integration" : "Matterbridge-integraatio",
"Enable Matterbridge integration" : "Käytä Matterbridge-integraatiota",
"Downloading …" : "Ladataan…",
+ "Install Talk Matterbridge" : "Asenna Talk Matterbridge",
"Installed version: {version}" : "Asennettu versio: {version}",
"Matterbridge binary was not found or couldn't be executed." : "Matterbridge-binääriä ei löytynyt tai sitä ei voitu suorittaa.",
+ "An error occurred while installing the Matterbridge app." : "Virhe Matterbridge-sovellusta asentaessa.",
"Failed to execute Matterbridge binary." : "Matterbridge-binäärin suorittaminen epäonnistui.",
+ "SIP configuration" : "SIP-määritys",
"Shared secret" : "Jaettu salaisuus",
"Validate SSL certificate" : "Vahvista SSL-varmenne",
"Delete this server" : "Poista tämä palvelin",
"Status: Checking connection" : "Tila: Tarkistetaan yhteyttä",
"OK: Running version: {version}" : "OK: Suoritetaan versiota: {version}",
"Error: Cannot connect to server" : "Virhe: Ei voi yhdistää palvelimeen",
+ "Could not get version" : "Versiota ei saatu",
+ "Error: Server responded with: {error}" : "Virhe: palvelin vastasi: {error}",
"Error: Unknown error occurred" : "Virhe: Tuntematon virhe",
"Saved" : "Tallennettu",
"Add a new server" : "Lisää uusi palvelin",
@@ -246,7 +480,13 @@ OC.L10N.register(
"TURN server protocols" : "TURN-palvelimen protokollat",
"Test this server" : "Testaa tämä palvelin",
"TURN servers" : "TURN-palvelin",
+ "Failed" : "Epäonnistui",
+ "OK" : "OK",
+ "Checking …" : "Tarkistetaan…",
+ "{nickName} raised their hand." : "{nickName} nosti kätensä.",
+ "A participant raised their hand." : "Osallistuja nosti kätensä.",
"Copy link" : "Kopioi linkki",
+ "Connecting …" : "Yhdistetään…",
"Waiting for others to join the call …" : "Odotetaan muiden liittymistä puheluun...",
"You can invite others in the participant tab of the sidebar" : "Voit kutsua muita sivupalkissa olevan Osallistujat-välilehden kautta",
"You can invite others in the participant tab of the sidebar or share this link to invite others!" : "Voit kutsua muita sivupalkissa olevan Osallistujat-välilehden kautta tai jakamalla tämän linkin!",
@@ -256,14 +496,32 @@ OC.L10N.register(
"Dismiss" : "Hylkää",
"Show your screen" : "Näytä oma näyttösi",
"Stop screensharing" : "Lopeta näytön jakaminen",
+ "Lower hand (R)" : "Laske käsi (R)",
+ "More actions" : "Lisää toimintoja",
+ "Devices settings" : "Laiteasetukset",
+ "Raise hand (R)" : "Nosta käsi (R)",
"Blur background" : "Sumenna tausta",
+ "Disable background blur" : "Poista taustan sumennus käytöstä",
+ "You are not allowed to enable audio" : "Sinulla ei ole oikeutta jakaa ääntä",
"No audio" : "Ei ääntä",
+ "Mute audio (M)" : "Mykistä äänet (M)",
+ "Unmute audio (M)" : "Palauta äänet (M)",
"Mute audio" : "Mykistä ääni",
+ "Unmute audio" : "Palauta äänet",
+ "You are not allowed to enable video" : "Sinulla ei ole oikeutta ottaa videota käyttöön",
"No camera" : "Ei kameraa",
+ "Disable video (V)" : "Poista video käytöstä (V)",
+ "Enable video (V)" : "Ota video käyttöön (v)",
+ "Enable video (V) - Your connection will be briefly interrupted when enabling the video for the first time" : "Ota video käyttöön (V) - Yhteys keskeytyy hetkeksi, kun otat videon käyttöön ensimmäisen kerran",
"Disable video" : "Poista video käytöstä",
"Enable video" : "Käytä videota",
+ "Enable video. Your connection will be briefly interrupted when enabling the video for the first time" : "Ota video käyttöön. Yhteys keskeytyy hetkeksi, kun otat videon käyttöön ensimmäisen kerran",
+ "You are not allowed to enable screensharing" : "Sinulla ei ole oikeutta ottaa näytönjakamista käyttöön",
+ "No screensharing" : "Ei näytönjakamista",
"Screensharing options" : "Näytönjakamisen valinnat",
"Enable screensharing" : "Ota käyttöön näytönjakaminen",
+ "Disable screenshare" : "Poista käytöstä näytönjakaminen",
+ "Speaker view" : "Puhujan näkymä",
"Grid view" : "Ruudukkonäkymä",
"Screen sharing is not supported by your browser." : "Selaimesi ei tue näytönjakoa.",
"Screen sharing requires the page to be loaded through HTTPS." : "Näytön jakaminen vaatii sivun lataamista HTTPS-protokollalla.",
@@ -273,61 +531,123 @@ OC.L10N.register(
"Please use a different browser like Firefox or Chrome to share your screen." : "Käytä näytön jakamiseen jotain toista selainta, kuten Firefoxia tai Chromea.",
"An error occurred while starting screensharing." : "Virhe aloitettaessa näytön jakamista.",
"Back" : "Takaisin",
+ "Access to camera was denied" : "Pääsy kameraan estettiin",
+ "Error while accessing camera: It is likely in use by another program" : "Virhe yrittäessä käyttää kameraa: se on luultavasti toisen ohjelman käytössä",
+ "Error while accessing camera" : "Virhe käyttäessä kameraa",
+ "You have been muted by a moderator" : "Moderaattori on mykistänyt sinut",
"You" : "Sinä",
+ "Connection could not be established …" : "Yhteyttä ei voitu muodostaa…",
+ "Connection was lost and could not be re-established …" : "Yhteys katkesi eikä sitä voitu muodostaa uudelleen…",
+ "Connection could not be established. Trying again …" : "Yhteyttä ei voitu muodostaa. Yritetään uudelleen…",
+ "Connection lost. Trying to reconnect …" : "Yhteys katkesi. Yritetään muodostaa yhteys uudelleen…",
+ "Connection problems …" : "Ongelmia yhteydessä…",
"Show screen" : "Näytä näyttö",
"Mute" : "Mykistä",
"Stop following" : "Lopeta seuraaminen",
+ "Conversation messages" : "Keskustelun viestit",
+ "Post message" : "Lähetä viesti",
+ "You need to be logged in to upload files" : "Sinun tulee olla kirjautunut sisään, jotta voit lähettää tiedostoja",
+ "This conversation is read-only" : "Keskustelu on \"vain luku\"-tilassa",
"Drop your files to upload" : "Pudota tiedostot lähettääksesi ne",
"Call in progress" : "Puhelu meneillään",
"Favorite" : "Suosikki",
+ "All permissions" : "Kaikki oikeudet",
+ "Restricted" : "Rajoitettu",
+ "Advanced permissions" : "Edistyneet oikeudet",
+ "Edit permissions" : "Muokkaa oikeuksia",
"Conversation settings" : "Keskustelun asetukset",
"Description" : "Kuvaus",
"Enter a description for this conversation" : "Anna kuvaus tälle keskustelulle",
"Notifications" : "Ilmoitukset",
+ "Device check" : "Laitteen tarkistus",
+ "Always show the device preview screen before joining a call in this conversation." : "Näytä aina laitteen esikatselunäkymä ennen liittymistä puheluun tässä keskustelussa.",
+ "Guests access" : "Vieraiden pääsy",
+ "Participants permissions" : "Osallistujan oikeudet",
"Meeting settings" : "Kokouksen asetukset",
+ "Matterbridge" : "Matterbridge",
+ "Error while updating conversation description" : "Virhe keskustelun kuvausta päivittäessä",
"Leave conversation" : "Poistu keskustelusta",
"Delete conversation" : "Poista keskustelu",
+ "Permanently delete this conversation." : "Poista tämä keskustelu pysyvästi.",
"Do you really want to delete \"{displayName}\"?" : "Poistetaanko \"{displayName}\"?",
+ "Error while deleting conversation" : "Virhe keskustelua poistaessa",
+ "Allow guests to use a public link to join this conversation." : "Salli vieraiden käyttää julkista linkkiä liittyäkseen tähän keskusteluun.",
"Allow guests" : "Salli vieraat",
+ "Set a password to restrict who can use the public link." : "Aseta salasana rajoittaaksesi, ketkä voivat käyttää julkista linkkiä.",
"Password protection" : "Salasanasuojaus",
"Enter a password" : "Syötä salasana",
"Save password" : "Tallenna salasana",
"Copy conversation link" : "Kopioi keskustelulinkki",
"Resend invitations" : "Lähetä kutsut uudelleen",
+ "Conversation password has been saved" : "Keskustelun salasana on tallennettu",
+ "Conversation password has been removed" : "Keskustelun salasana on poistettu",
+ "Error occurred while saving conversation password" : "Virhe tallentaessa keskustelun salasanaa",
+ "Error occurred while allowing guests" : "Virhe vieraita salliessa",
"Invitations sent" : "Kutsut lähetetty",
"Error occurred when sending invitations" : "Kutsujen lähetyksessä tapahtui virhe",
+ "Open conversation to registered users" : "Avaa keskustelu rekisteröityneille käyttäjille",
+ "This conversation will be shown in search results" : "Tämä keskustelu näytetään hakutuloksissa",
"Enable lobby" : "Käytä aulaa",
+ "Meeting start time" : "Tapaamisen alotusaika",
"Start time (optional)" : "Aloitusaika (valinnainen)",
+ "Start time has been updated" : "Aloitusaika on päivitetty",
+ "Error occurred while updating start time" : "Virhe aloitusaikaa päivittäessä",
"Lock conversation" : "Lukitse keskustelu",
"Error occurred when locking the conversation" : "Keskustelun lukitsemisessa tapahtui virhe",
"Save" : "Tallenna",
"Edit" : "Muokkaa",
"More information" : "Lisää tietoa",
"Delete" : "Poista",
+ "More info on Matterbridge" : "Lisätietoa Matterbridgestä",
+ "Enable bridge" : "Ota silta käyttöön",
+ "Show Matterbridge log" : "Näytä Matterbridge-loki",
+ "Nextcloud URL" : "Nextcloudin URL-osoite",
"Nextcloud user" : "Nextcloud-käyttäjä",
+ "User password" : "Käyttäjän salasana",
+ "Talk conversation" : "Talk-keskustelu",
"Matrix server URL" : "Matrix-palvelimen URL-osoite",
"Matrix channel" : "Matrix-kanava",
+ "Mattermost server URL" : "Mattermost-palvelimen URL-osoite",
"Mattermost user" : "Mattermost-käyttäjä",
+ "Team name" : "Tiimin nimi",
"Channel name" : "Kanavan nimi",
+ "Rocket.Chat server URL" : "Rocket.Chat-palvelimen URL-osoite",
+ "User name or email address" : "Käyttäjänimi tai sähköpostiosoite",
"Password" : "Salasana",
"Rocket.Chat channel" : "Rocket.Chat-kanava",
"Skip TLS verification" : "Ohita TLS-vahvistus",
+ "Zulip server URL" : "Zulip-palvelimen URL-osoite",
+ "Bot user name" : "Botin käyttäjätunnus",
+ "Bot API key" : "Botin rajapinta-avain",
"API token" : "API-poletti",
+ "Slack channel" : "Slack-kanava",
+ "Channel" : "Kanava",
"Login" : "Kirjaudu",
+ "IRC server URL (e.g. chat.freenode.net:6667)" : "IRC-palvelimen URL-osoite (e.g. chat.freenode.net:6667)",
"Nickname" : "Nimimerkki",
"Connection password" : "Yhteyden salasana",
"IRC channel" : "IRC-kanava",
+ "Channel password" : "Kanavan salasana",
"NickServ nickname" : "NickServ-nimimerkki",
"NickServ password" : "NickServ-salasana",
"Use TLS" : "Käytä TLS:ää",
"Use SASL" : "Käytä SASL:ia",
"Client ID" : "Asiakkaan tunniste",
+ "unknown state" : "tuntematon tila",
+ "running" : "käynnissä",
+ "not running" : "ei käynnissä",
"Bridge saved" : "Silta tallennettu",
+ "Chat messages" : "Keskustelun viestit",
+ "Calls" : "Puhelut",
+ "Notify about calls in this conversation" : "llmoita puheluista tässä keskustelussa",
"Edit conversation description" : "Muokkaa keskustelun kuvausta",
+ "Camera and microphone check" : "Kameran ja mikrofonin tarkistus",
"Choose devices" : "Valitse laitteet",
+ "Always show this dialog before joining a call in this conversation." : "Näytä aina tämä ikkuna ennen liittymistä puheluun tässä keskustelussa.",
"Mark as read" : "Merkitse luetuksi",
"Remove from favorites" : "Poista suosikeista",
"Add to favorites" : "Lisää suosikkeihin",
+ "Joining conversation …" : "Liitytään keskusteluun…",
"You: {lastMessage}" : "Sinä: {lastMessage}",
"No matches" : "Ei täsmääviä",
"Conversation list" : "Keskustelulista",
@@ -336,6 +656,8 @@ OC.L10N.register(
"No search results" : "Ei hakutuloksia",
"Groups" : "Ryhmät",
"Circles" : "Piirit",
+ "Unread mentions" : "Lukemattomat maininnat",
+ "Talk settings" : "Talk-asetukset",
"Users, groups and circles" : "Käyttäjät, ryhmät ja piirit",
"Users and groups" : "Käyttäjät ja ryhmät",
"Users and circles" : "Käyttäjät ja piirit",
@@ -343,6 +665,7 @@ OC.L10N.register(
"Other sources" : "Muut lähteet",
"An error occurred while performing the search" : "Hakua suorittaessa tapahtui virhe",
"Creating your conversation" : "Luodaan keskustelua",
+ "All set" : "Kaikki asetettu",
"Error while creating the conversation" : "Virhe keskustelua luotaessa",
"Link copied to the clipboard!" : "Linkki kopioitu leikepöydälle!",
"Create a new group conversation" : "Luo uusi ryhmäkeskustelu",
@@ -353,6 +676,7 @@ OC.L10N.register(
"Choose a password" : "Valitse salasana",
"Search participants" : "Etsi osallistujia",
"Conversation name" : "Keskustelun nimi",
+ "Allow guests to join via link" : "Salli vieraiden liittyä linkin kautta",
"Search conversations or users" : "Hae keskusteluja tai käyttäjiä",
"You are currently waiting in the lobby" : "Odotat parhaillaan aulassa",
"The meeting will start soon" : "Tämä kokous alkaa pian",
@@ -365,18 +689,30 @@ OC.L10N.register(
"Message sent" : "Viesti lähetetty",
"Failed to send the message. Click to try again" : "Viestin lähettäminen epäonnistui. Paina yrittääksesi uudelleen",
"Not enough free space to upload file" : "Ei riittävästi vapaata tilaa tiedoston lähettämiseksi",
+ "You are not allowed to share files" : "Sinulla ei ole oikeutta jakaa tiedostoja",
+ "You cannot send messages to this conversation at the moment" : "Et voi lähettää viestejä tähän keskusteluun tällä hetkellä",
"Deleting message" : "Poistetaan viestiä",
"Message deleted successfully" : "Viesti poistettu onnistuneesti",
+ "An error occurred while deleting the message" : "Virhe viestiä poistaessa",
"Reply" : "Vastaa",
"Reply privately" : "Vastaa yksityisesti",
"Copy message link" : "Kopioi viestin linkki",
"Mark as unread" : "Merkitse lukemattomaksi",
"Go to file" : "Siirry tiedostoon",
+ "Message link copied to clipboard." : "Viestin linkki kopioitu leikepöydälle.",
+ "Your browser does not support playing audio files" : "Selaimesi ei tue äänitiedostojen toistamista",
+ "Contact" : "Yhteystieto",
"Remove {fileName}" : "Poista {fileName}",
"Go to conversation" : "Mene keskusteluun",
+ "Open this location in OpenStreetMap" : "Avaa tämä sijainti OpenStreetMapissa",
"Scroll to bottom" : "Vieritä alas",
"Today" : "Tänään",
"Yesterday" : "Eilen",
+ "Record voice message" : "Äänitä ääniviesti",
+ "End recording and send" : "Lopeta äänitys ja lähetä",
+ "Access to the microphone was denied" : "Pääsy mikrofoniin estettiin",
+ "Microphone either not available or disabled in settings" : "Mikrofoni ei ole käytettävissä tai se on poistettu käytöstä asetuksista",
+ "Error while recording audio" : "Virhe äänittäessä",
"Share files to the conversation" : "Jaa tiedostoja keskusteluun",
"Upload new files" : "Lähetä uusia tiedostoja",
"Add emoji" : "Lisää emoji",
@@ -386,19 +722,38 @@ OC.L10N.register(
"Write message, @ to mention someone …" : "Kirjoita viesti, käytä @-merkkiä mainitaksesi käyttäjän…",
"Invalid path selected" : "Valittu virheellinen polku",
"Start a call" : "Aloita puhelu",
+ "Skip the lobby" : "Ohita aula",
+ "Enable the microphone" : "Ota mikrofoni käyttöön",
+ "Enable the camera" : "Ota kamera käyttöön",
"Share the screen" : "Jaa näyttö",
"Update permissions" : "Päivitä oikeudet",
+ "Updating permissions" : "Päivitetään oikeudet",
+ "In this conversation <strong>{user}</strong> can:" : "Tässä keskustelussa käyttäjä <strong>{user}</strong> voi:",
+ "Disable lobby" : "Poista aula käytöstä",
"moderator" : "moderaattori",
"guest" : "vieras",
"Demote from moderator" : "Alenna moderaattorista",
"Promote to moderator" : "Ylennä moderaattoriksi",
+ "Grant all permissions" : "Myönnä kaikki oikeudet",
+ "Remove all permissions" : "Poista kaikki oikeudet",
+ "Resend invitation" : "Lähetä kutsu uudelleen",
+ "Remove group and members" : "Poista ryhmä ja jäsenet",
"Remove participant" : "Poista osallistuja",
+ "Settings for participant \"{user}\"" : "Osallistujen \"{user}\" asetukset",
+ "Add participant \"{user}\"" : "Lisää osallistuja \"{user}\"",
+ "Participant \"{user}\"" : "Osallistuja \"{user}\"",
+ "Joined with audio" : "Liittyi äänen kera",
+ "Joined with video" : "Liittyi videon kera",
+ "Joined via phone" : "Liittyi puhelimen kautta",
+ "Raised their hand" : "Nosti kätensä",
"Add users" : "Lisää käyttäjiä",
"Add groups" : "Lisää ryhmiä",
"Add emails" : "Lisää sähköpostiosoitteita",
"Add circles" : "Lisää piirejä",
+ "Add federated users" : "Lisää federoituja käyttäjiä",
"Searching …" : "Haetaan…",
"No results" : "Ei tuloksia",
+ "Search for more users" : "Etsi lisää käyttäjiä",
"Add users, groups or circles" : "Lisää käyttäjiä, ryhmiä tai piirejä",
"Add users or groups" : "Lisää käyttäjiä tai ryhmiä",
"Add users or circles" : "Lisää käyttäjiä tai piirejä",
@@ -406,21 +761,51 @@ OC.L10N.register(
"Add other sources" : "Lisää muita lähteitä",
"Participants" : "Osallistujat",
"Search or add participants" : "Etsi tai lisää osallistujia",
+ "An error occurred while adding the participants" : "Virhe osallistujia lisätessä",
"Chat" : "Keskustelu",
+ "Details" : "Tiedot",
"Settings" : "Asetukset",
+ "Shared items" : "Jaetut tietueet",
+ "Participants ({count})" : "Osallistujat ({count})",
+ "Projects" : "Projektit",
+ "Show all media" : "Näytä kaikki media",
+ "Show all files" : "Näytä kaikki tiedostot",
+ "Show all voice messages" : "Näytä kaikki ääniviestit",
+ "Show all locations" : "Näytä kaikki sijainnit",
+ "Show all audio" : "Näytä kaikki ääni",
+ "Show all other" : "Näytä kaikki muu",
+ "Meeting ID: {meetingId}" : "Tapaamisen tunniste: {meetingId}",
+ "Your PIN: {attendeePin}" : "PIN-koodisi: {attendeePin}",
+ "Display name: <strong>{name}</strong>" : "Näyttönimi: <strong>{name}</strong>",
"Attachments folder" : "Liitteiden kansio",
"Privacy" : "Yksityisyys",
+ "Sounds" : "Äänet",
+ "Play sounds when participants join or leave a call" : "Toista ääni kun osallistuja liittyy tai poistuu puhelusta",
"Keyboard shortcuts" : "Pikanäppäimet",
+ "Speed up your Talk experience with these quick shortcuts." : "Nopeuta Talk-kokemusta näillä pikanäppäimillä.",
"Focus the chat input" : "Kohdista keskustelun syötteeseen",
+ "Unfocus the chat input to use shortcuts" : "Poista kohdistus keskustelusta käyttääksesi pikanäppäimiä",
+ "Fullscreen the chat or call" : "Keskustelu tai puhelu koko näyttöön",
"Search" : "Etsi",
+ "Shortcuts while in a call" : "Pikanäppäimet puhelun aikana",
+ "Camera on and off" : "Kamera päälle tai pois päältä",
+ "Microphone on and off" : "Mikrofoni päälle tai pois päältä",
+ "Raise or lower hand" : "Nosta tai laske käsi",
+ "Choose the folder in which attachments should be saved." : "Valitse mihin kansioon liitteet tulee tallentaa.",
"Select location for attachments" : "Valitse sijainti liitteille",
"Error while setting attachment folder" : "Virhe asettaessa liitekansiota",
+ "Failed to save sounds setting" : "Ääniasetusten tallentaminen epäonnistui",
+ "Sounds setting saved" : "Ääniasetukset tallennettu",
+ "Error while saving sounds setting" : "Virhe ääniasetuksia tallentaessa",
+ "End meeting for all" : "Lopeta tapaaminen kaikkien osalta",
"Start call" : "Aloita puhelu",
+ "Conversation actions" : "Keskustelun toiminnot",
"Toggle fullscreen" : "Koko näyttö päälle/pois",
"Rename conversation" : "Nimeä keskustelu uudelleen",
"Mute others" : "Mykistä muut",
"Exit fullscreen (F)" : "Poistu koko näytön tilasta (F)",
"Fullscreen (F)" : "Koko näyttö (F)",
+ "You have been mentioned in the chat." : "Sinut on mainittu keskustelussa.",
"Send" : "Lähetä",
"Add more files" : "Lisää enemmän tiedostoja",
"No unread mentions" : "Ei lukemattomia mainintoja",
@@ -434,11 +819,29 @@ OC.L10N.register(
"No conversations found" : "Keskusteluja ei löytynyt",
"Select conversation" : "Valitse keskustelu",
"Link to a conversation" : "Linkki keskusteluun",
+ "You joined the conversation in another window or device. This is currently not supported by Nextcloud Talk so this session was closed." : "Liityit keskusteluun toisessa ikkunassa tai toisella laitteella. Tämä ei ole tällä hetkellä tuettua Nextcloud Talkissa, joten tämä istunto suljettiin.",
"Join a conversation or start a new one" : "Liity keskusteluun tai aloita uusi",
"Calls are not supported in your browser" : "Selaimesi ei tue puheluja",
+ "Access to microphone is only possible with HTTPS" : "Mikrofonin käyttäminen on mahdollista vain HTTPS-yhteydellä",
+ "Access to microphone was denied" : "Pääsy mikrofoniin estettiin",
+ "Access to camera is only possible with HTTPS" : "Kameran käyttäminen on mahdollista vain HTTPS-yhteydellä",
+ "Media" : "Media",
+ "Files" : "Tiedostot",
+ "Voice messages" : "Ääniviestit",
+ "Locations" : "Sijainnit",
+ "Audio" : "Ääni",
+ "Other" : "Muu",
+ "Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk päivitettiin, lataa sivu uudelleen",
"Do not disturb" : "Älä häiritse",
"Away" : "Poissa",
"Error while sharing file" : "Virhe tiedostoa jakaessa",
+ "Error while clearing conversation history" : "Virhe keskusteluhistoriaa siivotessa",
+ "Not enough free space to upload file \"{fileName}\"" : "Ei riittävästi tallennustilaa tiedoston \"{fileName}\" lähettämiseksi",
+ "Error while uploading file \"{fileName}\"" : "Virhe lähettäessä tiedostoa \"{fileName}\"",
+ "Could not post message: {errorMessage}" : "Ei voitu lähettää viestiä: {errorMessage}",
+ "Failed to add reaction" : "Reaktion lisääminen epäonnistui",
+ "Failed to remove reaction" : "Reaktion poistaminen epäonnistui",
+ "Failed to join the conversation. Try to reload the page." : "Liittyminen keskusteluun epäonnistui. Päivitä sivu.",
"Join here" : "Liity tähän",
"Leave this page" : "Poistu tältä sivulta",
"Nextcloud is in maintenance mode, please reload the page" : "Nextcloud on huoltotilassa, päivitä sivu",
@@ -461,6 +864,13 @@ OC.L10N.register(
"Join conversations at any time, anywhere, on any device." : "Liity keskusteluihin milloin tahansa, mistä tahansa ja miltä tahansa laitteelta.",
"Android app" : "Android-sovellus",
"iOS app" : "iOS-sovellus",
+ "{actor} set the description to \"%1$s\"" : "{actor} asetti kuvaukseksi \"%1$s\"",
+ "You set the description to \"%1$s\"" : "Asetit kuvaukseksi \"%1$s\"",
+ "An administrator set the description to \"%1$s\"" : "Ylläpitäjä asetti kuvaukseksi \"%1$s\"",
+ "{actor} started Matterbridge." : "{actor} käynnisti Matterbridgen.",
+ "You started Matterbridge." : "Käynnistit Matterbridgen.",
+ "{actor} stopped Matterbridge." : "{actor} pysäytti Matterbridgen.",
+ "You stopped Matterbridge." : "Pysäytit Matterbridgen.",
"E-mail of the user" : "Käyttäjän sähköpostiosoite",
"Error: Can not connect to server" : "Virhe: Ei voi yhdistää palvelimeen",
"Share whole screen" : "Jaa koko näyttö",
@@ -471,6 +881,7 @@ OC.L10N.register(
"Unmute audio (m)" : "Palauta äänet (m)",
"Disable video (v)" : "Poista video käytöstä (v)",
"Enable video (v)" : "Ota video käyttöön (v)",
+ "Error while accessing camera: it is likely in use by another program" : "Virhe yrittäessä käyttää kameraa: se on luultavasti toisen ohjelman käytössä",
"User name or e-mail address" : "Käyttäjänimi tai sähköpostiosoite",
"Conversation \"{conversationName}\"" : "Keskustelu \"{conversationName}\"",
"Settings for conversation \"{conversationName}\"" : "Asetukset keskustelulle \"{conversationName}\"",
@@ -479,8 +890,12 @@ OC.L10N.register(
"You are currently waiting in the lobby. This meeting is scheduled for {startTime}" : "Odotat parhaillaan aulassa. Tapaaminen on ajoitettu alkavaksi {startTime}",
"Microphone" : "Mikrofoni",
"Camera" : "Kamera",
+ "You can not send messages to this conversation at the moment" : "Et voi lähettää viestejä tähän keskusteluun juuri nyt",
"Remove" : "Poista",
+ "[Unknown username]" : "[Tuntematon käyttäjänimi]",
+ "Add a description for this conversation" : "Lisää kuvaus tähän keskusteluun",
"Display name: " : "Näyttönimi:",
+ "Choose in which folder attachments should be saved." : "Valitse mihin kansioon liitteet tulee tallentaa.",
"Exit fullscreen (f)" : "Poistu koko näytön tilasta (f)",
"Fullscreen (f)" : "Koko näytön tila (f)"
},
diff --git a/l10n/fi.json b/l10n/fi.json
index 47e8a4eb2..02de0fa0b 100644
--- a/l10n/fi.json
+++ b/l10n/fi.json
@@ -9,9 +9,12 @@
"You attended a call with {user1}, {user2}, {user3}, {user4} and {user5}" : "Osallistuit puheluun käyttäjien {user1}, {user2}, {user3}, {user4} ja {user5} kanssa",
"_%n other_::_%n others_" : ["%n muu","%n muuta"],
"{actor} invited you to {call}" : "{actor} kutsui sinut puheluun {call}",
+ "You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Sinut kutsuttiin <strong>keskusteluun</strong> tai olit <strong>puhelussa</strong>",
"Other activities" : "Muut tapahtumat",
"Talk" : "Puhe",
"Guest" : "Vieras",
+ "- Raise your hand in a call with the R key" : "- Nosta kätesi puhelussa R-näppäimellä",
+ "There are currently no commands available." : "Tällä hetkellä ei komentoja käytettävissä.",
"The command does not exist" : "Komentoa ei ole olemassa",
"Talk updates ✅" : "Talk-päivitykset ✅",
"{actor} created the conversation" : "{actor} loi keskustelun",
@@ -19,6 +22,7 @@
"An administrator created the conversation" : "Ylläpitäjä loi keskustelun",
"{actor} renamed the conversation from \"%1$s\" to \"%2$s\"" : "{actor} muutti keskustelun \"%1$s\" uudeksi nimeksi \"%2$s\"",
"You renamed the conversation from \"%1$s\" to \"%2$s\"" : "Sinä muutit keskustelun \"%1$s\" uudeksi nimeksi \"%2$s\"",
+ "An administrator renamed the conversation from \"%1$s\" to \"%2$s\"" : "Ylläpitäjä muutti keskustelun \"%1$s\" uudeksi nimeksi \"%2$s\"",
"{actor} set the description" : "{actor} asetti kuvauksen",
"You set the description" : "Sinä asetit kuvauksen",
"An administrator set the description" : "Ylläpitäjä asetti kuvauksen",
@@ -37,14 +41,22 @@
"{actor} locked the conversation" : "{actor} lukitsi keskustelun",
"You locked the conversation" : "Sinä lukitsit keskustelun",
"An administrator locked the conversation" : "Ylläpitäjä lukitsi keskustelun",
+ "{actor} limited the conversation to the current participants" : "{actor} rajoitti keskustelun nykyisiin osallistujiin",
+ "You limited the conversation to the current participants" : "Rajoitit keskustelun nykyisiin osallistujiin",
+ "An administrator limited the conversation to the current participants" : "Ylläpitäjä rajoitti keskustelun nykyisiin osallistujiin",
+ "{actor} opened the conversation to registered users" : "{actor} avasi keskustelun rekisteröityneille käyttäjille",
+ "You opened the conversation to registered users" : "Avasit keskustelun rekisteröityneille käyttäjille",
"The conversation is now open to everyone" : "Keskustelu on nyt avoin kaikille",
"{actor} opened the conversation to everyone" : "{actor} avasi keskustelun kaikille",
"You opened the conversation to everyone" : "Avasit uuden keskustelun kaikille",
+ "{actor} restricted the conversation to moderators" : "{actor} rajoitti keskustelun moderaattoreille",
+ "You restricted the conversation to moderators" : "Rajoitit keskustelun moderaattoreille",
"{actor} allowed guests" : "{actor} salli vieraat",
"You allowed guests" : "Sinä sallit vieraat",
"An administrator allowed guests" : "Ylläpitäjä salli vieraat",
"{actor} disallowed guests" : "{actor} esti vieraat",
"You disallowed guests" : "Sinä estit vieraat",
+ "An administrator disallowed guests" : "Ylläpitäjä ei sallinut vieraita",
"{actor} set a password" : "{actor} asetti salasanan",
"You set a password" : "Sinä asetit salasanan",
"An administrator set a password" : "Ylläpitäjä asetti salasanan",
@@ -64,12 +76,19 @@
"You removed {user}" : "Sinä poistit käyttäjän {user}",
"{actor} removed you" : "{actor} poisti sinut",
"An administrator removed you" : "Ylläpitäjä lisäsi sinut",
+ "An administrator removed {user}" : "Ylläpitäjä poisti käyttäjän {user}",
"{actor} added group {group}" : "{actor} lisäsi ryhmän {group}",
"You added group {group}" : "Lisäsit ryhmän {group}",
"An administrator added group {group}" : "Ylläpitäjä lisäsi ryhmän {group}",
"{actor} removed group {group}" : "{actor} poisti ryhmän {group}",
"You removed group {group}" : "Poistit ryhmän {group}",
"An administrator removed group {group}" : "Ylläpitäjä poisti ryhmän {group}",
+ "{actor} added circle {circle}" : "{actor} lisäsi piirin {circle}",
+ "You added circle {circle}" : "Lisäsit piirin {circle}",
+ "An administrator added circle {circle}" : "Ylläpitäjä lisäsi piirin {circle}",
+ "{actor} removed circle {circle}" : "{actor} poisti piirin {circle}",
+ "You removed circle {circle}" : "Poistit piirin {circle}",
+ "An administrator removed circle {circle}" : "Ylläpitäjä poisti piirin {circle}",
"{actor} promoted {user} to moderator" : "{actor} nosti käyttäjän {user} moderaattoriksi",
"You promoted {user} to moderator" : "Sinä nostit käyttäjän {user} moderaattoriksi",
"{actor} promoted you to moderator" : "{actor} nosti sinut moderaattoriksi",
@@ -78,28 +97,49 @@
"{actor} demoted you from moderator" : "{actor} poisti sinulta moderaattorin oikeudet",
"{actor} shared a file which is no longer available" : "{actor} jakoi kanssasi tiedoston, joka ei ole enää saatavilla",
"You shared a file which is no longer available" : "Jaoit tiedoston, joka ei ole enää saatavilla",
+ "{actor} updated the Matterbridge configuration" : "{actor} päivitti Matterbridge-kokoonpanon",
+ "You updated the Matterbridge configuration" : "Päivitit Matterbridge-kokoonpanon",
+ "{actor} started Matterbridge" : "{actor} käynnisti Matterbridgen",
+ "You started Matterbridge" : "Käynnistit Matterbridgen",
+ "{actor} stopped Matterbridge" : "{actor} pysäytti Matterbridgen",
+ "You stopped Matterbridge" : "Pysäytit Matterbridgen",
"{actor} deleted a message" : "{actor} poisti viestin",
"You deleted a message" : "Sinä poistit viestin",
+ "{actor} deleted a reaction" : "{actor} poisti reaktion",
+ "You deleted a reaction" : "Poistit reaktion",
"{actor} cleared the history of the conversation" : "{actor} tyhjensi keskusteluhistorian",
"You cleared the history of the conversation" : "Sinä tyhjensit keskusteluhistorian",
"%s (guest)" : "%s (vieras)",
"You missed a call from {user}" : "Sinulta jäi vastaamatta puhelu käyttäjältä {user}",
+ "You tried to call {user}" : "Yritit soittaa käyttäjälle {user}",
"Call with {user1} and {user2} (Duration {duration})" : "Puhelu käyttäjien {user1} ja {user2} kesken (Kesto {duration})",
"Call with {user1}, {user2} and {user3} (Duration {duration})" : "Puhelu käyttäjien {user1}, {user2} ja {user3} kesken (Kesto {duration})",
"Call with {user1}, {user2}, {user3} and {user4} (Duration {duration})" : "Puhelu käyttäjien {user1}, {user2}, {user3} ja {user4} kesken (Kesto {duration})",
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Puhelu käyttäjien {user1}, {user2}, {user3}, {user4} ja {user5} kesken (Kesto {duration})",
+ "File is not shared, or shared but not with the user" : "Tiedosto ei ole jaettu, tai jaettu mutta ei kyseisen käyttäjän kanssa",
+ "No image file provided" : "Kuvatiedostoa ei määritetty",
"File is too big" : "Tiedosto on liian suuri",
+ "Invalid file provided" : "Virheellinen tiedosto määritetty",
"Invalid image" : "Virheellinen kuva",
"Unknown filetype" : "Tuntematon tiedostotyyppi",
+ "An error occurred. Please contact your admin." : "Tapahtui virhe. Ole yhteydessä ylläpitäjään.",
+ "Talk mentions" : "Talk-maininnat",
"Write to conversation" : "Kirjoita keskusteluun",
"%s invited you to a conversation." : "%s kutsui sinut keskusteluun.",
"You were invited to a conversation." : "Sinut kutsuttiin keskusteluun.",
"Conversation invitation" : "Keskustelukutsu",
"Click the button below to join." : "Napsauta alla olevaa painiketta liittyäksesi.",
"Join »%s«" : "Liity »%s«",
+ "You can also dial-in via phone with the following details" : "Voit myös yhdistää puhelimella seuraavin tiedoin",
+ "Dial-in information" : "Puhelintiedot",
+ "Meeting ID" : "Tapaamisen tunniste",
+ "Your PIN" : "PIN-koodisi",
"Password request: %s" : "Salasanapyyntö: %s",
"Private conversation" : "Yksityinen keskustelu",
"Deleted user (%s)" : "Poistettiin käyttäjä (%s)",
+ "{user} in {call}" : "{user} puhelussa {call}",
+ "{guest} (guest) in {call}" : "{guest} (vieras) puhelussa {call}",
+ "Guest in {call}" : "Vieras puhelussa {call}",
"{user} sent you a private message" : "{user} lähetti sinulle yksityisviestin",
"{user} sent a message in conversation {call}" : "{user} lähetti viestin keskusteluun {call}",
"A deleted user sent a message in conversation {call}" : "Poistettu käyttäjä lähetti viestin keskusteluun {call}",
@@ -108,78 +148,262 @@
"{user} replied to your private message" : "{user} vastasi yksityisviestiisi",
"{user} replied to your message in conversation {call}" : "{user} vastasi viestiisi keskustelussa {call}",
"A guest replied to your message in conversation {call}" : "Vieras vastasi viestiisi keskustelussa {call}",
+ "{user} reacted with {reaction} to your private message" : "{user} vastasi reaktiolla {reaction} yksityisviestiisi",
"{user} mentioned you in a private conversation" : "{user} mainitsi sinut yksityiskeskustelussa",
"{user} mentioned you in conversation {call}" : "{user} mainitsi sinut keskustelussa {call}",
"A deleted user mentioned you in conversation {call}" : "Poistettu käyttäjä mainitsi sinut keskustelussa {call}",
+ "{guest} (guest) mentioned you in conversation {call}" : "{guest} (vieras) mainitsi sinut keskustelussa {call}",
"A guest mentioned you in conversation {call}" : "Vieras mainitsi sinut keskustelussa {call}",
"View chat" : "Näytä keskustelu",
"{user} invited you to a private conversation" : "{user} kutsui sinut yksityiskeskusteluun",
"Join call" : "Liity puheluun",
"{user} invited you to a group conversation: {call}" : "{user} kutsui sinut ryhmäkeskusteluun: {call}",
"Answer call" : "Vastaa puheluun",
+ "{user} would like to talk with you" : "{user} haluaa puhua kanssasi",
"Call back" : "Soita takaisin",
"A group call has started in {call}" : "Ryhmäpuhelu on alkanut puhelussa {call}",
+ "{email} is requesting the password to access {file}" : "{email} pyytää salasanaa saadakseen pääsyn tiedostoon {file}",
"Open settings" : "Avaa asetukset",
+ "Open Talk" : "Avaa Talk",
"Conversations" : "Keskustelut",
"Messages" : "Viestit",
"{user}" : "{user}",
"Messages in {conversation}" : "Viestit keskustelussa {conversation}",
"{user} in {conversation}" : "{user} keskustelussa {conversation}",
+ "Messages in other conversations" : "Viestit muissa keskusteluissa",
"Something unexpected happened." : "Jotain odottamatonta tapahtui.",
+ "The URL is invalid." : "URL-osoite on virheellinen.",
+ "An HTTPS URL is required." : "URL-osoitteen on oltava HTTPS-muodossa.",
"The email address is invalid." : "Sähköpostiosoite on virheellinen.",
"The language is invalid." : "Kieli on virheellinen.",
"The country is invalid." : "Maa on virheellinen.",
"Something unexpected happened. Please try again later." : "Jotain odottamatonta tapahtui. Yritä myöhemmin uudelleen.",
+ "There is no such account registered." : "Kyseistä tiliä ei ole rekisteröity.",
+ "Andorra" : "Andorra",
+ "United Arab Emirates" : "Yhdistyneet arabiemiirikunnat",
+ "Afghanistan" : "Afganistan",
+ "Antigua and Barbuda" : "Antigua ja Barbuda",
+ "Anguilla" : "Anguilla",
+ "Albania" : "Albania",
+ "Armenia" : "Armenia",
+ "Angola" : "Angola",
+ "Antarctica" : "Etelämanner",
+ "Argentina" : "Argentiina",
+ "American Samoa" : "Amerikan Samoa",
"Austria" : "Itävalta",
+ "Australia" : "Australia",
+ "Aruba" : "Aruba",
+ "Åland Islands" : "Ahvenanmaa",
+ "Azerbaijan" : "Azerbaidžan",
+ "Bosnia and Herzegovina" : "Bosnia ja Hertsegovina",
+ "Barbados" : "Barbados",
+ "Bangladesh" : "Bangladesh",
"Belgium" : "Belgia",
+ "Burkina Faso" : "Burkina Faso",
"Bulgaria" : "Bulgaria",
+ "Bahrain" : "Bahrain",
+ "Burundi" : "Burundi",
+ "Benin" : "Benin",
+ "Saint Barthélemy" : "Saint Barthélemy",
+ "Bermuda" : "Bermuda",
+ "Bonaire, Sint Eustatius and Saba" : "Bonaire, Sint Eustatius ja Saba",
"Brazil" : "Brasilia",
+ "Bahamas" : "Bahamasaaret",
+ "Bhutan" : "Bhutan",
+ "Bouvet Island" : "Bouvet'nsaari",
+ "Botswana" : "Botswana",
+ "Belarus" : "Valko-Venäjä",
+ "Belize" : "Belize",
"Canada" : "Kanada",
+ "Cocos (Keeling) Islands" : "Kookossaaret",
+ "Central African Republic" : "Keski-Afrikan tasavalta",
+ "Congo" : "Kongo",
"Switzerland" : "Sveitsi",
+ "Côte d'Ivoire" : "Norsunluurannikko",
+ "Cook Islands" : "Cookinsaaret",
"Chile" : "Chile",
+ "Cameroon" : "Kamerun",
"China" : "Kiina",
+ "Colombia" : "Kolumbia",
+ "Costa Rica" : "Costa Rica",
"Cuba" : "Kuuba",
+ "Cabo Verde" : "Kap Verde",
+ "Curaçao" : "Curaçao",
+ "Christmas Island" : "Joulusaari",
"Cyprus" : "Kypros",
+ "Czechia" : "Tšekki",
"Germany" : "Saksa",
+ "Djibouti" : "Djibouti",
"Denmark" : "Tanska",
+ "Dominican Republic" : "Dominikaaninen tasavalta",
+ "Algeria" : "Algeria",
+ "Ecuador" : "Ecuador",
"Estonia" : "Viro",
"Egypt" : "Egypti",
+ "Eritrea" : "Eritrea",
"Spain" : "Espanja",
+ "Ethiopia" : "Etiopia",
"Finland" : "Suomi",
+ "Fiji" : "Fidži",
+ "Faroe Islands" : "Färsaaret",
"France" : "Ranska",
+ "Gabon" : "Gabon",
+ "Grenada" : "Grenada",
+ "Georgia" : "Georgia",
+ "French Guiana" : "Ranskan Guayana",
+ "Guernsey" : "Guernsey",
+ "Ghana" : "Ghana",
+ "Gibraltar" : "Gibraltar",
+ "Greenland" : "Grönlanti",
+ "Gambia" : "Gambia",
+ "Guinea" : "Guinea",
+ "Guadeloupe" : "Guadeloupe",
+ "Equatorial Guinea" : "Päiväntasaajan Guinea",
"Greece" : "Kreikka",
+ "South Georgia and the South Sandwich Islands" : "Etelä-Georgia ja Eteläiset Sandwichsaaret",
+ "Guatemala" : "Guatemala",
+ "Guam" : "Guam",
+ "Guinea-Bissau" : "Guinea-Bissau",
+ "Guyana" : "Guyana",
+ "Hong Kong" : "Hong Kong",
+ "Heard Island and McDonald Islands" : "Heard ja McDonaldinsaaret",
+ "Honduras" : "Honduras",
"Croatia" : "Kroatia",
"Haiti" : "Haiti",
"Hungary" : "Unkari",
+ "Indonesia" : "Indonesia",
"Ireland" : "Irlanti",
+ "Israel" : "Israel",
+ "Isle of Man" : "Mansaari",
"India" : "Intia",
+ "British Indian Ocean Territory" : "Brittiläinen Intian valtameren alue",
"Iraq" : "Irak",
"Iceland" : "Islanti",
"Italy" : "Italia",
+ "Jamaica" : "Jamaika",
+ "Jordan" : "Jordan",
"Japan" : "Japani",
"Kenya" : "Kenia",
+ "Kyrgyzstan" : "Kirgisia",
+ "Cambodia" : "Kambodža",
+ "Kiribati" : "Kiribati",
+ "Saint Kitts and Nevis" : "Saint Kitts ja Nevis",
+ "Kuwait" : "Kuwait",
+ "Cayman Islands" : "Caymansaaret",
+ "Kazakhstan" : "Kazakhstan",
+ "Lebanon" : "Libanon",
+ "Saint Lucia" : "Saint Lucia",
+ "Liechtenstein" : "Liechtenstein",
+ "Sri Lanka" : "Sri Lanka",
+ "Liberia" : "Liberia",
+ "Lesotho" : "Lesotho",
"Lithuania" : "Liettua",
+ "Luxembourg" : "Luxemburg",
"Latvia" : "Latvia",
+ "Libya" : "Libya",
+ "Morocco" : "Marokko",
+ "Monaco" : "Monaco",
"Montenegro" : "Montenegro",
+ "Madagascar" : "Madagascar",
+ "Marshall Islands" : "Marshallinsaaret",
+ "Mali" : "Mali",
+ "Myanmar" : "Myanmar",
+ "Mongolia" : "Mongolia",
+ "Macao" : "Macao",
+ "Northern Mariana Islands" : "Pohjois-Mariaanit",
+ "Mauritania" : "Mauritania",
+ "Montserrat" : "Montserrat",
+ "Malta" : "Malta",
+ "Mauritius" : "Mauritius",
+ "Maldives" : "Malediivit",
+ "Malawi" : "Malawi",
+ "Mexico" : "Meksiko",
+ "Malaysia" : "Malesia",
+ "Mozambique" : "Mosambik",
+ "Namibia" : "Namibia",
+ "New Caledonia" : "Uusi-Kaledonia",
+ "Niger" : "Niger",
+ "Norfolk Island" : "Norfolkinsaari",
+ "Nigeria" : "Nigeria",
+ "Nicaragua" : "Nicaragua",
+ "Netherlands" : "Alankomaat",
"Norway" : "Norja",
+ "Nepal" : "Nepali",
+ "Nauru" : "Nauru",
+ "Niue" : "Niue",
+ "New Zealand" : "Uusi-Seelanti",
+ "Oman" : "Oman",
"Panama" : "Panama",
"Peru" : "Peru",
+ "French Polynesia" : "Ranskan Polynesia",
+ "Papua New Guinea" : "Papua-Uusi-Guinea",
+ "Philippines" : "Filippiinit",
+ "Pakistan" : "Pakistan",
"Poland" : "Puola",
+ "Saint Pierre and Miquelon" : "Saint Pierre ja Miquelon",
+ "Pitcairn" : "Pitcairnsaaret",
+ "Puerto Rico" : "Puerto Rico",
"Portugal" : "Portugali",
+ "Palau" : "Palau",
+ "Paraguay" : "Paraguay",
+ "Qatar" : "Qatar",
+ "Réunion" : "Réunion",
"Romania" : "Romania",
+ "Serbia" : "Serbia",
+ "Russian Federation" : "Venäjä",
+ "Rwanda" : "Ruanda",
+ "Saudi Arabia" : "Saudi-Arabia",
+ "Solomon Islands" : "Salomonsaaret",
+ "Seychelles" : "Seychellit",
+ "Sudan" : "Sudan",
"Sweden" : "Ruotsi",
"Singapore" : "Singapore",
+ "Saint Helena, Ascension and Tristan da Cunha" : "Saint Helena, Ascension ja Tristan da Cunha",
+ "Slovenia" : "Slovenia",
+ "Svalbard and Jan Mayen" : "Huippuvuoret ja Jan Mayen",
"Slovakia" : "Slovakia",
+ "Sierra Leone" : "Sierra Leone",
+ "San Marino" : "San Marino",
+ "Senegal" : "Senegal",
"Somalia" : "Somalia",
+ "Suriname" : "Suriname",
+ "South Sudan" : "Etelä-Sudan",
+ "Sao Tome and Principe" : "São Tomé ja Príncipe",
+ "El Salvador" : "El Salvador",
+ "Turks and Caicos Islands" : "Turks- ja Caicossaaret",
+ "Chad" : "Tšad",
+ "Togo" : "Togo",
"Thailand" : "Thaimaa",
+ "Tajikistan" : "Tadžikistan",
+ "Tokelau" : "Tokelau",
+ "Timor-Leste" : "Itä-Timor",
+ "Turkmenistan" : "Turkmenistan",
"Tunisia" : "Tunisia",
+ "Tonga" : "Tonga",
"Turkey" : "Turkki",
+ "Trinidad and Tobago" : "Trinidad ja Tobago",
+ "Tuvalu" : "Tuvalu",
"Ukraine" : "Ukraina",
+ "Uganda" : "Uganda",
+ "United States Minor Outlying Islands" : "Yhdysvaltojen pienet syrjäiset saaret",
"United States of America" : "Yhdysvallat",
+ "Uruguay" : "Uruguay",
+ "Uzbekistan" : "Uzbekistan",
+ "Saint Vincent and the Grenadines" : "Saint Vincent ja Grenadiinit",
+ "Viet Nam" : "Vietnam",
+ "Vanuatu" : "Vanuatu",
+ "Wallis and Futuna" : "Wallis ja Futuna",
+ "Samoa" : "Samoa",
+ "Yemen" : "Jemen",
+ "Mayotte" : "Mayotte",
+ "South Africa" : "Etelä-Afrikka",
+ "Zambia" : "Sambia",
+ "Zimbabwe" : "Zimbabwe",
"Invalid date, date format must be YYYY-MM-DD" : "Virheellinen päiväys, päiväyksen muoto tulee olla YYYY-MM-DD",
"Conversation not found" : "Keskustelua ei löydy",
"Path is already shared with this room" : "Polku on jo jaettu tämän huoneen kesken",
"Chat, video & audio-conferencing using WebRTC" : "Keskustelu ja video- sekä äänineuvottelut WebRTC:tä käyttäen",
+ "Navigating away from the page will leave the call in {conversation}" : "Sivulta poistuminen päättää puhelun keskustelussa {conversation}",
"Leave call" : "Poistu puhelusta",
"Stay in call" : "Pysy puhelussa",
"Discuss this file" : "Keskustele tästä tiedostosta",
@@ -192,6 +416,8 @@
"Limit to groups" : "Rajoita ryhmiin",
"Guests can still join public conversations." : "Vieraat voivat silti liittyä julkisiin keskusteluihin.",
"Everyone" : "Kaikki",
+ "Users and moderators" : "Käyttäjät ja moderaattorit",
+ "Moderators only" : "Vain moderaattorit",
"Save changes" : "Tallenna muutokset",
"Saving …" : "Tallennetaan…",
"Saved!" : "Tallennettu!",
@@ -212,10 +438,13 @@
"All messages" : "Kaikki viestit",
"@-mentions only" : "Vain @-maininnat",
"Off" : "Pois",
+ "URL of this Nextcloud instance" : "Tämän Nextcloud-instanssin URL-osoite",
+ "Email of the user" : "Käyttäjän sähköpostiosoite",
"Language" : "Kieli",
"Country" : "Maa",
"Status" : "Tila",
"Created at" : "Luotu",
+ "Expires at" : "Vanhenee",
"Pending" : "Odottaa",
"Error" : "Virhe",
"Blocked" : "Estetty",
@@ -226,15 +455,20 @@
"Matterbridge integration" : "Matterbridge-integraatio",
"Enable Matterbridge integration" : "Käytä Matterbridge-integraatiota",
"Downloading …" : "Ladataan…",
+ "Install Talk Matterbridge" : "Asenna Talk Matterbridge",
"Installed version: {version}" : "Asennettu versio: {version}",
"Matterbridge binary was not found or couldn't be executed." : "Matterbridge-binääriä ei löytynyt tai sitä ei voitu suorittaa.",
+ "An error occurred while installing the Matterbridge app." : "Virhe Matterbridge-sovellusta asentaessa.",
"Failed to execute Matterbridge binary." : "Matterbridge-binäärin suorittaminen epäonnistui.",
+ "SIP configuration" : "SIP-määritys",
"Shared secret" : "Jaettu salaisuus",
"Validate SSL certificate" : "Vahvista SSL-varmenne",
"Delete this server" : "Poista tämä palvelin",
"Status: Checking connection" : "Tila: Tarkistetaan yhteyttä",
"OK: Running version: {version}" : "OK: Suoritetaan versiota: {version}",
"Error: Cannot connect to server" : "Virhe: Ei voi yhdistää palvelimeen",
+ "Could not get version" : "Versiota ei saatu",
+ "Error: Server responded with: {error}" : "Virhe: palvelin vastasi: {error}",
"Error: Unknown error occurred" : "Virhe: Tuntematon virhe",
"Saved" : "Tallennettu",
"Add a new server" : "Lisää uusi palvelin",
@@ -244,7 +478,13 @@
"TURN server protocols" : "TURN-palvelimen protokollat",
"Test this server" : "Testaa tämä palvelin",
"TURN servers" : "TURN-palvelin",
+ "Failed" : "Epäonnistui",
+ "OK" : "OK",
+ "Checking …" : "Tarkistetaan…",
+ "{nickName} raised their hand." : "{nickName} nosti kätensä.",
+ "A participant raised their hand." : "Osallistuja nosti kätensä.",
"Copy link" : "Kopioi linkki",
+ "Connecting …" : "Yhdistetään…",
"Waiting for others to join the call …" : "Odotetaan muiden liittymistä puheluun...",
"You can invite others in the participant tab of the sidebar" : "Voit kutsua muita sivupalkissa olevan Osallistujat-välilehden kautta",
"You can invite others in the participant tab of the sidebar or share this link to invite others!" : "Voit kutsua muita sivupalkissa olevan Osallistujat-välilehden kautta tai jakamalla tämän linkin!",
@@ -254,14 +494,32 @@
"Dismiss" : "Hylkää",
"Show your screen" : "Näytä oma näyttösi",
"Stop screensharing" : "Lopeta näytön jakaminen",
+ "Lower hand (R)" : "Laske käsi (R)",
+ "More actions" : "Lisää toimintoja",
+ "Devices settings" : "Laiteasetukset",
+ "Raise hand (R)" : "Nosta käsi (R)",
"Blur background" : "Sumenna tausta",
+ "Disable background blur" : "Poista taustan sumennus käytöstä",
+ "You are not allowed to enable audio" : "Sinulla ei ole oikeutta jakaa ääntä",
"No audio" : "Ei ääntä",
+ "Mute audio (M)" : "Mykistä äänet (M)",
+ "Unmute audio (M)" : "Palauta äänet (M)",
"Mute audio" : "Mykistä ääni",
+ "Unmute audio" : "Palauta äänet",
+ "You are not allowed to enable video" : "Sinulla ei ole oikeutta ottaa videota käyttöön",
"No camera" : "Ei kameraa",
+ "Disable video (V)" : "Poista video käytöstä (V)",
+ "Enable video (V)" : "Ota video käyttöön (v)",
+ "Enable video (V) - Your connection will be briefly interrupted when enabling the video for the first time" : "Ota video käyttöön (V) - Yhteys keskeytyy hetkeksi, kun otat videon käyttöön ensimmäisen kerran",
"Disable video" : "Poista video käytöstä",
"Enable video" : "Käytä videota",
+ "Enable video. Your connection will be briefly interrupted when enabling the video for the first time" : "Ota video käyttöön. Yhteys keskeytyy hetkeksi, kun otat videon käyttöön ensimmäisen kerran",
+ "You are not allowed to enable screensharing" : "Sinulla ei ole oikeutta ottaa näytönjakamista käyttöön",
+ "No screensharing" : "Ei näytönjakamista",
"Screensharing options" : "Näytönjakamisen valinnat",
"Enable screensharing" : "Ota käyttöön näytönjakaminen",
+ "Disable screenshare" : "Poista käytöstä näytönjakaminen",
+ "Speaker view" : "Puhujan näkymä",
"Grid view" : "Ruudukkonäkymä",
"Screen sharing is not supported by your browser." : "Selaimesi ei tue näytönjakoa.",
"Screen sharing requires the page to be loaded through HTTPS." : "Näytön jakaminen vaatii sivun lataamista HTTPS-protokollalla.",
@@ -271,61 +529,123 @@
"Please use a different browser like Firefox or Chrome to share your screen." : "Käytä näytön jakamiseen jotain toista selainta, kuten Firefoxia tai Chromea.",
"An error occurred while starting screensharing." : "Virhe aloitettaessa näytön jakamista.",
"Back" : "Takaisin",
+ "Access to camera was denied" : "Pääsy kameraan estettiin",
+ "Error while accessing camera: It is likely in use by another program" : "Virhe yrittäessä käyttää kameraa: se on luultavasti toisen ohjelman käytössä",
+ "Error while accessing camera" : "Virhe käyttäessä kameraa",
+ "You have been muted by a moderator" : "Moderaattori on mykistänyt sinut",
"You" : "Sinä",
+ "Connection could not be established …" : "Yhteyttä ei voitu muodostaa…",
+ "Connection was lost and could not be re-established …" : "Yhteys katkesi eikä sitä voitu muodostaa uudelleen…",
+ "Connection could not be established. Trying again …" : "Yhteyttä ei voitu muodostaa. Yritetään uudelleen…",
+ "Connection lost. Trying to reconnect …" : "Yhteys katkesi. Yritetään muodostaa yhteys uudelleen…",
+ "Connection problems …" : "Ongelmia yhteydessä…",
"Show screen" : "Näytä näyttö",
"Mute" : "Mykistä",
"Stop following" : "Lopeta seuraaminen",
+ "Conversation messages" : "Keskustelun viestit",
+ "Post message" : "Lähetä viesti",
+ "You need to be logged in to upload files" : "Sinun tulee olla kirjautunut sisään, jotta voit lähettää tiedostoja",
+ "This conversation is read-only" : "Keskustelu on \"vain luku\"-tilassa",
"Drop your files to upload" : "Pudota tiedostot lähettääksesi ne",
"Call in progress" : "Puhelu meneillään",
"Favorite" : "Suosikki",
+ "All permissions" : "Kaikki oikeudet",
+ "Restricted" : "Rajoitettu",
+ "Advanced permissions" : "Edistyneet oikeudet",
+ "Edit permissions" : "Muokkaa oikeuksia",
"Conversation settings" : "Keskustelun asetukset",
"Description" : "Kuvaus",
"Enter a description for this conversation" : "Anna kuvaus tälle keskustelulle",
"Notifications" : "Ilmoitukset",
+ "Device check" : "Laitteen tarkistus",
+ "Always show the device preview screen before joining a call in this conversation." : "Näytä aina laitteen esikatselunäkymä ennen liittymistä puheluun tässä keskustelussa.",
+ "Guests access" : "Vieraiden pääsy",
+ "Participants permissions" : "Osallistujan oikeudet",
"Meeting settings" : "Kokouksen asetukset",
+ "Matterbridge" : "Matterbridge",
+ "Error while updating conversation description" : "Virhe keskustelun kuvausta päivittäessä",
"Leave conversation" : "Poistu keskustelusta",
"Delete conversation" : "Poista keskustelu",
+ "Permanently delete this conversation." : "Poista tämä keskustelu pysyvästi.",
"Do you really want to delete \"{displayName}\"?" : "Poistetaanko \"{displayName}\"?",
+ "Error while deleting conversation" : "Virhe keskustelua poistaessa",
+ "Allow guests to use a public link to join this conversation." : "Salli vieraiden käyttää julkista linkkiä liittyäkseen tähän keskusteluun.",
"Allow guests" : "Salli vieraat",
+ "Set a password to restrict who can use the public link." : "Aseta salasana rajoittaaksesi, ketkä voivat käyttää julkista linkkiä.",
"Password protection" : "Salasanasuojaus",
"Enter a password" : "Syötä salasana",
"Save password" : "Tallenna salasana",
"Copy conversation link" : "Kopioi keskustelulinkki",
"Resend invitations" : "Lähetä kutsut uudelleen",
+ "Conversation password has been saved" : "Keskustelun salasana on tallennettu",
+ "Conversation password has been removed" : "Keskustelun salasana on poistettu",
+ "Error occurred while saving conversation password" : "Virhe tallentaessa keskustelun salasanaa",
+ "Error occurred while allowing guests" : "Virhe vieraita salliessa",
"Invitations sent" : "Kutsut lähetetty",
"Error occurred when sending invitations" : "Kutsujen lähetyksessä tapahtui virhe",
+ "Open conversation to registered users" : "Avaa keskustelu rekisteröityneille käyttäjille",
+ "This conversation will be shown in search results" : "Tämä keskustelu näytetään hakutuloksissa",
"Enable lobby" : "Käytä aulaa",
+ "Meeting start time" : "Tapaamisen alotusaika",
"Start time (optional)" : "Aloitusaika (valinnainen)",
+ "Start time has been updated" : "Aloitusaika on päivitetty",
+ "Error occurred while updating start time" : "Virhe aloitusaikaa päivittäessä",
"Lock conversation" : "Lukitse keskustelu",
"Error occurred when locking the conversation" : "Keskustelun lukitsemisessa tapahtui virhe",
"Save" : "Tallenna",
"Edit" : "Muokkaa",
"More information" : "Lisää tietoa",
"Delete" : "Poista",
+ "More info on Matterbridge" : "Lisätietoa Matterbridgestä",
+ "Enable bridge" : "Ota silta käyttöön",
+ "Show Matterbridge log" : "Näytä Matterbridge-loki",
+ "Nextcloud URL" : "Nextcloudin URL-osoite",
"Nextcloud user" : "Nextcloud-käyttäjä",
+ "User password" : "Käyttäjän salasana",
+ "Talk conversation" : "Talk-keskustelu",
"Matrix server URL" : "Matrix-palvelimen URL-osoite",
"Matrix channel" : "Matrix-kanava",
+ "Mattermost server URL" : "Mattermost-palvelimen URL-osoite",
"Mattermost user" : "Mattermost-käyttäjä",
+ "Team name" : "Tiimin nimi",
"Channel name" : "Kanavan nimi",
+ "Rocket.Chat server URL" : "Rocket.Chat-palvelimen URL-osoite",
+ "User name or email address" : "Käyttäjänimi tai sähköpostiosoite",
"Password" : "Salasana",
"Rocket.Chat channel" : "Rocket.Chat-kanava",
"Skip TLS verification" : "Ohita TLS-vahvistus",
+ "Zulip server URL" : "Zulip-palvelimen URL-osoite",
+ "Bot user name" : "Botin käyttäjätunnus",
+ "Bot API key" : "Botin rajapinta-avain",
"API token" : "API-poletti",
+ "Slack channel" : "Slack-kanava",
+ "Channel" : "Kanava",
"Login" : "Kirjaudu",
+ "IRC server URL (e.g. chat.freenode.net:6667)" : "IRC-palvelimen URL-osoite (e.g. chat.freenode.net:6667)",
"Nickname" : "Nimimerkki",
"Connection password" : "Yhteyden salasana",
"IRC channel" : "IRC-kanava",
+ "Channel password" : "Kanavan salasana",
"NickServ nickname" : "NickServ-nimimerkki",
"NickServ password" : "NickServ-salasana",
"Use TLS" : "Käytä TLS:ää",
"Use SASL" : "Käytä SASL:ia",
"Client ID" : "Asiakkaan tunniste",
+ "unknown state" : "tuntematon tila",
+ "running" : "käynnissä",
+ "not running" : "ei käynnissä",
"Bridge saved" : "Silta tallennettu",
+ "Chat messages" : "Keskustelun viestit",
+ "Calls" : "Puhelut",
+ "Notify about calls in this conversation" : "llmoita puheluista tässä keskustelussa",
"Edit conversation description" : "Muokkaa keskustelun kuvausta",
+ "Camera and microphone check" : "Kameran ja mikrofonin tarkistus",
"Choose devices" : "Valitse laitteet",
+ "Always show this dialog before joining a call in this conversation." : "Näytä aina tämä ikkuna ennen liittymistä puheluun tässä keskustelussa.",
"Mark as read" : "Merkitse luetuksi",
"Remove from favorites" : "Poista suosikeista",
"Add to favorites" : "Lisää suosikkeihin",
+ "Joining conversation …" : "Liitytään keskusteluun…",
"You: {lastMessage}" : "Sinä: {lastMessage}",
"No matches" : "Ei täsmääviä",
"Conversation list" : "Keskustelulista",
@@ -334,6 +654,8 @@
"No search results" : "Ei hakutuloksia",
"Groups" : "Ryhmät",
"Circles" : "Piirit",
+ "Unread mentions" : "Lukemattomat maininnat",
+ "Talk settings" : "Talk-asetukset",
"Users, groups and circles" : "Käyttäjät, ryhmät ja piirit",
"Users and groups" : "Käyttäjät ja ryhmät",
"Users and circles" : "Käyttäjät ja piirit",
@@ -341,6 +663,7 @@
"Other sources" : "Muut lähteet",
"An error occurred while performing the search" : "Hakua suorittaessa tapahtui virhe",
"Creating your conversation" : "Luodaan keskustelua",
+ "All set" : "Kaikki asetettu",
"Error while creating the conversation" : "Virhe keskustelua luotaessa",
"Link copied to the clipboard!" : "Linkki kopioitu leikepöydälle!",
"Create a new group conversation" : "Luo uusi ryhmäkeskustelu",
@@ -351,6 +674,7 @@
"Choose a password" : "Valitse salasana",
"Search participants" : "Etsi osallistujia",
"Conversation name" : "Keskustelun nimi",
+ "Allow guests to join via link" : "Salli vieraiden liittyä linkin kautta",
"Search conversations or users" : "Hae keskusteluja tai käyttäjiä",
"You are currently waiting in the lobby" : "Odotat parhaillaan aulassa",
"The meeting will start soon" : "Tämä kokous alkaa pian",
@@ -363,18 +687,30 @@
"Message sent" : "Viesti lähetetty",
"Failed to send the message. Click to try again" : "Viestin lähettäminen epäonnistui. Paina yrittääksesi uudelleen",
"Not enough free space to upload file" : "Ei riittävästi vapaata tilaa tiedoston lähettämiseksi",
+ "You are not allowed to share files" : "Sinulla ei ole oikeutta jakaa tiedostoja",
+ "You cannot send messages to this conversation at the moment" : "Et voi lähettää viestejä tähän keskusteluun tällä hetkellä",
"Deleting message" : "Poistetaan viestiä",
"Message deleted successfully" : "Viesti poistettu onnistuneesti",
+ "An error occurred while deleting the message" : "Virhe viestiä poistaessa",
"Reply" : "Vastaa",
"Reply privately" : "Vastaa yksityisesti",
"Copy message link" : "Kopioi viestin linkki",
"Mark as unread" : "Merkitse lukemattomaksi",
"Go to file" : "Siirry tiedostoon",
+ "Message link copied to clipboard." : "Viestin linkki kopioitu leikepöydälle.",
+ "Your browser does not support playing audio files" : "Selaimesi ei tue äänitiedostojen toistamista",
+ "Contact" : "Yhteystieto",
"Remove {fileName}" : "Poista {fileName}",
"Go to conversation" : "Mene keskusteluun",
+ "Open this location in OpenStreetMap" : "Avaa tämä sijainti OpenStreetMapissa",
"Scroll to bottom" : "Vieritä alas",
"Today" : "Tänään",
"Yesterday" : "Eilen",
+ "Record voice message" : "Äänitä ääniviesti",
+ "End recording and send" : "Lopeta äänitys ja lähetä",
+ "Access to the microphone was denied" : "Pääsy mikrofoniin estettiin",
+ "Microphone either not available or disabled in settings" : "Mikrofoni ei ole käytettävissä tai se on poistettu käytöstä asetuksista",
+ "Error while recording audio" : "Virhe äänittäessä",
"Share files to the conversation" : "Jaa tiedostoja keskusteluun",
"Upload new files" : "Lähetä uusia tiedostoja",
"Add emoji" : "Lisää emoji",
@@ -384,19 +720,38 @@
"Write message, @ to mention someone …" : "Kirjoita viesti, käytä @-merkkiä mainitaksesi käyttäjän…",
"Invalid path selected" : "Valittu virheellinen polku",
"Start a call" : "Aloita puhelu",
+ "Skip the lobby" : "Ohita aula",
+ "Enable the microphone" : "Ota mikrofoni käyttöön",
+ "Enable the camera" : "Ota kamera käyttöön",
"Share the screen" : "Jaa näyttö",
"Update permissions" : "Päivitä oikeudet",
+ "Updating permissions" : "Päivitetään oikeudet",
+ "In this conversation <strong>{user}</strong> can:" : "Tässä keskustelussa käyttäjä <strong>{user}</strong> voi:",
+ "Disable lobby" : "Poista aula käytöstä",
"moderator" : "moderaattori",
"guest" : "vieras",
"Demote from moderator" : "Alenna moderaattorista",
"Promote to moderator" : "Ylennä moderaattoriksi",
+ "Grant all permissions" : "Myönnä kaikki oikeudet",
+ "Remove all permissions" : "Poista kaikki oikeudet",
+ "Resend invitation" : "Lähetä kutsu uudelleen",
+ "Remove group and members" : "Poista ryhmä ja jäsenet",
"Remove participant" : "Poista osallistuja",
+ "Settings for participant \"{user}\"" : "Osallistujen \"{user}\" asetukset",
+ "Add participant \"{user}\"" : "Lisää osallistuja \"{user}\"",
+ "Participant \"{user}\"" : "Osallistuja \"{user}\"",
+ "Joined with audio" : "Liittyi äänen kera",
+ "Joined with video" : "Liittyi videon kera",
+ "Joined via phone" : "Liittyi puhelimen kautta",
+ "Raised their hand" : "Nosti kätensä",
"Add users" : "Lisää käyttäjiä",
"Add groups" : "Lisää ryhmiä",
"Add emails" : "Lisää sähköpostiosoitteita",
"Add circles" : "Lisää piirejä",
+ "Add federated users" : "Lisää federoituja käyttäjiä",
"Searching …" : "Haetaan…",
"No results" : "Ei tuloksia",
+ "Search for more users" : "Etsi lisää käyttäjiä",
"Add users, groups or circles" : "Lisää käyttäjiä, ryhmiä tai piirejä",
"Add users or groups" : "Lisää käyttäjiä tai ryhmiä",
"Add users or circles" : "Lisää käyttäjiä tai piirejä",
@@ -404,21 +759,51 @@
"Add other sources" : "Lisää muita lähteitä",
"Participants" : "Osallistujat",
"Search or add participants" : "Etsi tai lisää osallistujia",
+ "An error occurred while adding the participants" : "Virhe osallistujia lisätessä",
"Chat" : "Keskustelu",
+ "Details" : "Tiedot",
"Settings" : "Asetukset",
+ "Shared items" : "Jaetut tietueet",
+ "Participants ({count})" : "Osallistujat ({count})",
+ "Projects" : "Projektit",
+ "Show all media" : "Näytä kaikki media",
+ "Show all files" : "Näytä kaikki tiedostot",
+ "Show all voice messages" : "Näytä kaikki ääniviestit",
+ "Show all locations" : "Näytä kaikki sijainnit",
+ "Show all audio" : "Näytä kaikki ääni",
+ "Show all other" : "Näytä kaikki muu",
+ "Meeting ID: {meetingId}" : "Tapaamisen tunniste: {meetingId}",
+ "Your PIN: {attendeePin}" : "PIN-koodisi: {attendeePin}",
+ "Display name: <strong>{name}</strong>" : "Näyttönimi: <strong>{name}</strong>",
"Attachments folder" : "Liitteiden kansio",
"Privacy" : "Yksityisyys",
+ "Sounds" : "Äänet",
+ "Play sounds when participants join or leave a call" : "Toista ääni kun osallistuja liittyy tai poistuu puhelusta",
"Keyboard shortcuts" : "Pikanäppäimet",
+ "Speed up your Talk experience with these quick shortcuts." : "Nopeuta Talk-kokemusta näillä pikanäppäimillä.",
"Focus the chat input" : "Kohdista keskustelun syötteeseen",
+ "Unfocus the chat input to use shortcuts" : "Poista kohdistus keskustelusta käyttääksesi pikanäppäimiä",
+ "Fullscreen the chat or call" : "Keskustelu tai puhelu koko näyttöön",
"Search" : "Etsi",
+ "Shortcuts while in a call" : "Pikanäppäimet puhelun aikana",
+ "Camera on and off" : "Kamera päälle tai pois päältä",
+ "Microphone on and off" : "Mikrofoni päälle tai pois päältä",
+ "Raise or lower hand" : "Nosta tai laske käsi",
+ "Choose the folder in which attachments should be saved." : "Valitse mihin kansioon liitteet tulee tallentaa.",
"Select location for attachments" : "Valitse sijainti liitteille",
"Error while setting attachment folder" : "Virhe asettaessa liitekansiota",
+ "Failed to save sounds setting" : "Ääniasetusten tallentaminen epäonnistui",
+ "Sounds setting saved" : "Ääniasetukset tallennettu",
+ "Error while saving sounds setting" : "Virhe ääniasetuksia tallentaessa",
+ "End meeting for all" : "Lopeta tapaaminen kaikkien osalta",
"Start call" : "Aloita puhelu",
+ "Conversation actions" : "Keskustelun toiminnot",
"Toggle fullscreen" : "Koko näyttö päälle/pois",
"Rename conversation" : "Nimeä keskustelu uudelleen",
"Mute others" : "Mykistä muut",
"Exit fullscreen (F)" : "Poistu koko näytön tilasta (F)",
"Fullscreen (F)" : "Koko näyttö (F)",
+ "You have been mentioned in the chat." : "Sinut on mainittu keskustelussa.",
"Send" : "Lähetä",
"Add more files" : "Lisää enemmän tiedostoja",
"No unread mentions" : "Ei lukemattomia mainintoja",
@@ -432,11 +817,29 @@
"No conversations found" : "Keskusteluja ei löytynyt",
"Select conversation" : "Valitse keskustelu",
"Link to a conversation" : "Linkki keskusteluun",
+ "You joined the conversation in another window or device. This is currently not supported by Nextcloud Talk so this session was closed." : "Liityit keskusteluun toisessa ikkunassa tai toisella laitteella. Tämä ei ole tällä hetkellä tuettua Nextcloud Talkissa, joten tämä istunto suljettiin.",
"Join a conversation or start a new one" : "Liity keskusteluun tai aloita uusi",
"Calls are not supported in your browser" : "Selaimesi ei tue puheluja",
+ "Access to microphone is only possible with HTTPS" : "Mikrofonin käyttäminen on mahdollista vain HTTPS-yhteydellä",
+ "Access to microphone was denied" : "Pääsy mikrofoniin estettiin",
+ "Access to camera is only possible with HTTPS" : "Kameran käyttäminen on mahdollista vain HTTPS-yhteydellä",
+ "Media" : "Media",
+ "Files" : "Tiedostot",
+ "Voice messages" : "Ääniviestit",
+ "Locations" : "Sijainnit",
+ "Audio" : "Ääni",
+ "Other" : "Muu",
+ "Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk päivitettiin, lataa sivu uudelleen",
"Do not disturb" : "Älä häiritse",
"Away" : "Poissa",
"Error while sharing file" : "Virhe tiedostoa jakaessa",
+ "Error while clearing conversation history" : "Virhe keskusteluhistoriaa siivotessa",
+ "Not enough free space to upload file \"{fileName}\"" : "Ei riittävästi tallennustilaa tiedoston \"{fileName}\" lähettämiseksi",
+ "Error while uploading file \"{fileName}\"" : "Virhe lähettäessä tiedostoa \"{fileName}\"",
+ "Could not post message: {errorMessage}" : "Ei voitu lähettää viestiä: {errorMessage}",
+ "Failed to add reaction" : "Reaktion lisääminen epäonnistui",
+ "Failed to remove reaction" : "Reaktion poistaminen epäonnistui",
+ "Failed to join the conversation. Try to reload the page." : "Liittyminen keskusteluun epäonnistui. Päivitä sivu.",
"Join here" : "Liity tähän",
"Leave this page" : "Poistu tältä sivulta",
"Nextcloud is in maintenance mode, please reload the page" : "Nextcloud on huoltotilassa, päivitä sivu",
@@ -459,6 +862,13 @@
"Join conversations at any time, anywhere, on any device." : "Liity keskusteluihin milloin tahansa, mistä tahansa ja miltä tahansa laitteelta.",
"Android app" : "Android-sovellus",
"iOS app" : "iOS-sovellus",
+ "{actor} set the description to \"%1$s\"" : "{actor} asetti kuvaukseksi \"%1$s\"",
+ "You set the description to \"%1$s\"" : "Asetit kuvaukseksi \"%1$s\"",
+ "An administrator set the description to \"%1$s\"" : "Ylläpitäjä asetti kuvaukseksi \"%1$s\"",
+ "{actor} started Matterbridge." : "{actor} käynnisti Matterbridgen.",
+ "You started Matterbridge." : "Käynnistit Matterbridgen.",
+ "{actor} stopped Matterbridge." : "{actor} pysäytti Matterbridgen.",
+ "You stopped Matterbridge." : "Pysäytit Matterbridgen.",
"E-mail of the user" : "Käyttäjän sähköpostiosoite",
"Error: Can not connect to server" : "Virhe: Ei voi yhdistää palvelimeen",
"Share whole screen" : "Jaa koko näyttö",
@@ -469,6 +879,7 @@
"Unmute audio (m)" : "Palauta äänet (m)",
"Disable video (v)" : "Poista video käytöstä (v)",
"Enable video (v)" : "Ota video käyttöön (v)",
+ "Error while accessing camera: it is likely in use by another program" : "Virhe yrittäessä käyttää kameraa: se on luultavasti toisen ohjelman käytössä",
"User name or e-mail address" : "Käyttäjänimi tai sähköpostiosoite",
"Conversation \"{conversationName}\"" : "Keskustelu \"{conversationName}\"",
"Settings for conversation \"{conversationName}\"" : "Asetukset keskustelulle \"{conversationName}\"",
@@ -477,8 +888,12 @@
"You are currently waiting in the lobby. This meeting is scheduled for {startTime}" : "Odotat parhaillaan aulassa. Tapaaminen on ajoitettu alkavaksi {startTime}",
"Microphone" : "Mikrofoni",
"Camera" : "Kamera",
+ "You can not send messages to this conversation at the moment" : "Et voi lähettää viestejä tähän keskusteluun juuri nyt",
"Remove" : "Poista",
+ "[Unknown username]" : "[Tuntematon käyttäjänimi]",
+ "Add a description for this conversation" : "Lisää kuvaus tähän keskusteluun",
"Display name: " : "Näyttönimi:",
+ "Choose in which folder attachments should be saved." : "Valitse mihin kansioon liitteet tulee tallentaa.",
"Exit fullscreen (f)" : "Poistu koko näytön tilasta (f)",
"Fullscreen (f)" : "Koko näytön tila (f)"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/l10n/fr.js b/l10n/fr.js
index 92aee3f1b..a96642595 100644
--- a/l10n/fr.js
+++ b/l10n/fr.js
@@ -602,7 +602,7 @@ OC.L10N.register(
"Downloading …" : "Téléchargement …",
"Install Talk Matterbridge" : "Installer Talk Matterbridge",
"Installed version: {version}" : "Version installée : {version}",
- "You can install the Matterbridge to link Nextcloud Talk to some other services, visit their {linkstart1}GitHub page{linkend} for more details. Downloading and installing the app can take a while. In case it times out, please install it manually from the {linkstart2}appstore{linkend}." : "Vous pouvez installer Matterbridge pour connecter Nextcloud Talk à d'autres services, visitez leur {linkstart1}dépôt GitHub{linkend} pour plus de détails. Le téléchargement et l'installation de l'application peut prendre un moment. Si elle s'interrompt, veuillez l'installer manuellement depuis {linkstart2}l'appstore{linkend}.",
+ "You can install the Matterbridge to link Nextcloud Talk to some other services, visit their {linkstart1}GitHub page{linkend} for more details. Downloading and installing the app can take a while. In case it times out, please install it manually from the {linkstart2}appstore{linkend}." : "Vous pouvez installer Matterbridge pour connecter Nextcloud Talk à d'autres services, visitez leur {linkstart1}dépôt GitHub{linkend} pour plus de détails. Le téléchargement et l'installation de l'application peut prendre un moment. Si elle s'interrompt, veuillez l'installer manuellement depuis {linkstart2}le magasin d'applications{linkend}.",
"Matterbridge binary has incorrect permissions. Please make sure the Matterbridge binary file is owned by the correct user and can be executed. It can be found in \"/.../nextcloud/apps/talk_matterbridge/bin/\"." : "Le binaire Matterbridge a des permissions incorrectes. Veuillez vous assurer que le fichier binaire Matterbridge est possédé par le bon utilisateur et peut être exécuté. Il peut être trouvé dans \"/../nextcloud/apps/talk_matterbridge/bin/\".",
"Matterbridge binary was not found or couldn't be executed." : "Le binaire Matterbridge est introuvable ou n'a pas pu être exécuté.",
"You can also set the path to the Matterbridge binary manually via the config. Check the {linkstart}Matterbridge integration documentation{linkend} for more information." : "Vous pouvez aussi définir le chemin vers le binaire Matterbridge manuellement via les options. Consultez la {linkstart}documentation d'intégration Matterbridge{linkend} pour plus d'information.",
@@ -902,6 +902,7 @@ OC.L10N.register(
"No search results" : "Aucun résultat",
"Groups" : "Groupes",
"Circles" : "Cercles",
+ "Unread mentions" : "Mentions non lues",
"Talk settings" : "Paramètres de conversation",
"Users, groups and circles" : "Utilisateurs, groupes et cercles",
"Users and groups" : "Utilisateurs et groupes",
@@ -1037,6 +1038,8 @@ OC.L10N.register(
"Details" : "Details",
"Settings" : "Réglages",
"Participants ({count})" : "Participants ({count})",
+ "Projects" : "Projets",
+ "Show all files" : "Afficher tous les fichiers",
"Meeting ID: {meetingId}" : "ID de réunion : {meetingId}",
"Your PIN: {attendeePin}" : "Votre PIN : {attendeePin}",
"Display name: <strong>{name}</strong>" : "Nom affiché : <strong>{name}</strong>",
@@ -1106,6 +1109,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Erreur d'accès au microphone",
"Access to camera is only possible with HTTPS" : "L'accès à la caméra est seulement possible en HTTPS",
"An error occurred while fetching the participants" : "Une erreur est survenue pendant la récupération des participants",
+ "Media" : "Média",
+ "Files" : "Fichiers",
+ "Locations" : "Lieux",
+ "Audio" : "Son",
+ "Other" : "Autre",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk a été mis à jour, veuillez actualiser la page",
"Do not disturb" : "Ne pas déranger",
"Away" : "Absent",
diff --git a/l10n/fr.json b/l10n/fr.json
index af4c48f7a..4ce5bbda1 100644
--- a/l10n/fr.json
+++ b/l10n/fr.json
@@ -600,7 +600,7 @@
"Downloading …" : "Téléchargement …",
"Install Talk Matterbridge" : "Installer Talk Matterbridge",
"Installed version: {version}" : "Version installée : {version}",
- "You can install the Matterbridge to link Nextcloud Talk to some other services, visit their {linkstart1}GitHub page{linkend} for more details. Downloading and installing the app can take a while. In case it times out, please install it manually from the {linkstart2}appstore{linkend}." : "Vous pouvez installer Matterbridge pour connecter Nextcloud Talk à d'autres services, visitez leur {linkstart1}dépôt GitHub{linkend} pour plus de détails. Le téléchargement et l'installation de l'application peut prendre un moment. Si elle s'interrompt, veuillez l'installer manuellement depuis {linkstart2}l'appstore{linkend}.",
+ "You can install the Matterbridge to link Nextcloud Talk to some other services, visit their {linkstart1}GitHub page{linkend} for more details. Downloading and installing the app can take a while. In case it times out, please install it manually from the {linkstart2}appstore{linkend}." : "Vous pouvez installer Matterbridge pour connecter Nextcloud Talk à d'autres services, visitez leur {linkstart1}dépôt GitHub{linkend} pour plus de détails. Le téléchargement et l'installation de l'application peut prendre un moment. Si elle s'interrompt, veuillez l'installer manuellement depuis {linkstart2}le magasin d'applications{linkend}.",
"Matterbridge binary has incorrect permissions. Please make sure the Matterbridge binary file is owned by the correct user and can be executed. It can be found in \"/.../nextcloud/apps/talk_matterbridge/bin/\"." : "Le binaire Matterbridge a des permissions incorrectes. Veuillez vous assurer que le fichier binaire Matterbridge est possédé par le bon utilisateur et peut être exécuté. Il peut être trouvé dans \"/../nextcloud/apps/talk_matterbridge/bin/\".",
"Matterbridge binary was not found or couldn't be executed." : "Le binaire Matterbridge est introuvable ou n'a pas pu être exécuté.",
"You can also set the path to the Matterbridge binary manually via the config. Check the {linkstart}Matterbridge integration documentation{linkend} for more information." : "Vous pouvez aussi définir le chemin vers le binaire Matterbridge manuellement via les options. Consultez la {linkstart}documentation d'intégration Matterbridge{linkend} pour plus d'information.",
@@ -900,6 +900,7 @@
"No search results" : "Aucun résultat",
"Groups" : "Groupes",
"Circles" : "Cercles",
+ "Unread mentions" : "Mentions non lues",
"Talk settings" : "Paramètres de conversation",
"Users, groups and circles" : "Utilisateurs, groupes et cercles",
"Users and groups" : "Utilisateurs et groupes",
@@ -1035,6 +1036,8 @@
"Details" : "Details",
"Settings" : "Réglages",
"Participants ({count})" : "Participants ({count})",
+ "Projects" : "Projets",
+ "Show all files" : "Afficher tous les fichiers",
"Meeting ID: {meetingId}" : "ID de réunion : {meetingId}",
"Your PIN: {attendeePin}" : "Votre PIN : {attendeePin}",
"Display name: <strong>{name}</strong>" : "Nom affiché : <strong>{name}</strong>",
@@ -1104,6 +1107,11 @@
"Error while accessing microphone" : "Erreur d'accès au microphone",
"Access to camera is only possible with HTTPS" : "L'accès à la caméra est seulement possible en HTTPS",
"An error occurred while fetching the participants" : "Une erreur est survenue pendant la récupération des participants",
+ "Media" : "Média",
+ "Files" : "Fichiers",
+ "Locations" : "Lieux",
+ "Audio" : "Son",
+ "Other" : "Autre",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk a été mis à jour, veuillez actualiser la page",
"Do not disturb" : "Ne pas déranger",
"Away" : "Absent",
diff --git a/l10n/gl.js b/l10n/gl.js
index 500635225..622052e98 100644
--- a/l10n/gl.js
+++ b/l10n/gl.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["outro","outros %n"],
"{actor} invited you to {call}" : "{actor} convidouno á {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Foi convidado a unha <strong>conversa</strong> ou tivo unha <strong>chamada</strong>",
+ "Other activities" : "Outras actividades",
"Talk" : "Talk",
"Guest" : "Convidado",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Benvido ao Nextcloud Talk!\nNesta conversa estarás informado sobre novas funcións dispoñíbeis no Nextcloud Talk.",
@@ -127,6 +128,11 @@ OC.L10N.register(
"Talk to %s" : "Falar con %s",
"File is not shared, or shared but not with the user" : "O ficheiro non está compartido, ou compartido, pero non co usuario",
"No account available to delete." : "Non hai conta dispoñíbel para eliminar.",
+ "File is too big" : "O ficheiro é grande de máis",
+ "Invalid file provided" : "O ficheiro fornecido non é válido",
+ "Invalid image" : "Imaxe incorrecta",
+ "Unknown filetype" : "Tipo de ficheiro descoñecido",
+ "An error occurred. Please contact your admin." : "Produciuse un erro. Póñase en contacto cun administrador.",
"Talk mentions" : "Mencións no Talk",
"Write to conversation" : "Escribir á conversa",
"Writes event information into a conversation of your choice" : "Escribe a información do evento nunha conversa da súa escolla",
@@ -582,6 +588,8 @@ OC.L10N.register(
"Testing whether the TURN server returns ICE candidates" : "Probe se o servidor TURN devolve candidatos ICE",
"Test this server" : "Probar este servidor",
"TURN servers" : "Servidores TURN",
+ "OK" : "Aceptar",
+ "Checking …" : "Comprobando...",
"{nickName} raised their hand." : "{nickName} ergueu a man.",
"A participant raised their hand." : "Un participante ergueu a man.",
"Previous page of videos" : "Páxina anterior de vídeos",
@@ -646,8 +654,10 @@ OC.L10N.register(
"Drop your files to upload" : "Arrastre os seus ficheiros para envialos",
"Call in progress" : "Chamada en proceso",
"Favorite" : "Favorito",
+ "Restricted" : "Restrinxida",
"Conversation settings" : "Axustes da conversa",
"Description" : "Descrición",
+ "Notifications" : "Notificacións",
"Guests access" : "Acceso de convidado",
"Meeting settings" : "Axustes da xuntanza",
"Matterbridge" : "Matterbridge",
@@ -748,6 +758,7 @@ OC.L10N.register(
"not running, check Matterbridge log" : "non esta en execución, comprobe o rexistro de Matterbridge",
"not running" : "non se está a executar",
"Bridge saved" : "Ponte gardada",
+ "Calls" : "Chamadas",
"Allow participants to join from a phone." : "Permitirlle aos participantes unirse dende un teléfono.",
"Enable SIP dial-in" : "Activar a marcación SIP",
"SIP dial-in is now enabled" : "Agora está habilitada a marcación SIP",
@@ -816,6 +827,7 @@ OC.L10N.register(
"Mark as unread" : "Marcar como sen ler",
"Go to file" : "Ir ao ficheiro",
"Message link copied to clipboard." : "A ligazón da mensaxe foi copiada ao portapapeis.",
+ "Contact" : "Contacto",
"{stack} in {board}" : "{stack} en {board}",
"Deck Card" : "Tarxeta do Deck",
"Scroll to bottom" : "Desprazarse ata o final",
@@ -866,6 +878,8 @@ OC.L10N.register(
"Chat" : "Conversa",
"Details" : "Detalles",
"Settings" : "Axustes",
+ "Projects" : "Proxectos",
+ "Show all files" : "Amosar todos os ficheiros",
"Meeting ID: {meetingId}" : "ID da xuntanza: {meetingId}",
"Your PIN: {attendeePin}" : "O seu PIN: {attendeePin}",
"Attachments folder" : "Cartafol de anexos",
@@ -921,6 +935,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Produciuse un erro ao acceder ao micrófono",
"Access to camera is only possible with HTTPS" : "O acceso á cámara só é posíbel con HTTPS",
"An error occurred while fetching the participants" : "Produciuse un erro ao obter os participantes",
+ "Media" : "Multimedia",
+ "Files" : "Ficheiros",
+ "Locations" : "Localizacións",
+ "Audio" : "Son",
+ "Other" : "Outro",
"Nextcloud Talk was updated, please reload the page" : "Actualizouse o Nextcloud Talk, volva cargar a páxina",
"Do not disturb" : "Non molestar",
"Away" : "Ausente",
@@ -1010,6 +1029,7 @@ OC.L10N.register(
"Video on and off" : "Acendido e apagado do vídeo",
"Choose in which folder attachments should be saved." : "Escolla en que cartafol se deben gardar os anexos.",
"Exit fullscreen (f)" : "Saír da pantalla completa (f)",
- "Fullscreen (f)" : "Pantalla completa (f)"
+ "Fullscreen (f)" : "Pantalla completa (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Establecer o nivel de notificación para a conversa actual. Isto afectará só ás notificacións que reciba."
},
"nplurals=2; plural=(n != 1);");
diff --git a/l10n/gl.json b/l10n/gl.json
index 9c0500f13..e2566546f 100644
--- a/l10n/gl.json
+++ b/l10n/gl.json
@@ -10,6 +10,7 @@
"_%n other_::_%n others_" : ["outro","outros %n"],
"{actor} invited you to {call}" : "{actor} convidouno á {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Foi convidado a unha <strong>conversa</strong> ou tivo unha <strong>chamada</strong>",
+ "Other activities" : "Outras actividades",
"Talk" : "Talk",
"Guest" : "Convidado",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Benvido ao Nextcloud Talk!\nNesta conversa estarás informado sobre novas funcións dispoñíbeis no Nextcloud Talk.",
@@ -125,6 +126,11 @@
"Talk to %s" : "Falar con %s",
"File is not shared, or shared but not with the user" : "O ficheiro non está compartido, ou compartido, pero non co usuario",
"No account available to delete." : "Non hai conta dispoñíbel para eliminar.",
+ "File is too big" : "O ficheiro é grande de máis",
+ "Invalid file provided" : "O ficheiro fornecido non é válido",
+ "Invalid image" : "Imaxe incorrecta",
+ "Unknown filetype" : "Tipo de ficheiro descoñecido",
+ "An error occurred. Please contact your admin." : "Produciuse un erro. Póñase en contacto cun administrador.",
"Talk mentions" : "Mencións no Talk",
"Write to conversation" : "Escribir á conversa",
"Writes event information into a conversation of your choice" : "Escribe a información do evento nunha conversa da súa escolla",
@@ -580,6 +586,8 @@
"Testing whether the TURN server returns ICE candidates" : "Probe se o servidor TURN devolve candidatos ICE",
"Test this server" : "Probar este servidor",
"TURN servers" : "Servidores TURN",
+ "OK" : "Aceptar",
+ "Checking …" : "Comprobando...",
"{nickName} raised their hand." : "{nickName} ergueu a man.",
"A participant raised their hand." : "Un participante ergueu a man.",
"Previous page of videos" : "Páxina anterior de vídeos",
@@ -644,8 +652,10 @@
"Drop your files to upload" : "Arrastre os seus ficheiros para envialos",
"Call in progress" : "Chamada en proceso",
"Favorite" : "Favorito",
+ "Restricted" : "Restrinxida",
"Conversation settings" : "Axustes da conversa",
"Description" : "Descrición",
+ "Notifications" : "Notificacións",
"Guests access" : "Acceso de convidado",
"Meeting settings" : "Axustes da xuntanza",
"Matterbridge" : "Matterbridge",
@@ -746,6 +756,7 @@
"not running, check Matterbridge log" : "non esta en execución, comprobe o rexistro de Matterbridge",
"not running" : "non se está a executar",
"Bridge saved" : "Ponte gardada",
+ "Calls" : "Chamadas",
"Allow participants to join from a phone." : "Permitirlle aos participantes unirse dende un teléfono.",
"Enable SIP dial-in" : "Activar a marcación SIP",
"SIP dial-in is now enabled" : "Agora está habilitada a marcación SIP",
@@ -814,6 +825,7 @@
"Mark as unread" : "Marcar como sen ler",
"Go to file" : "Ir ao ficheiro",
"Message link copied to clipboard." : "A ligazón da mensaxe foi copiada ao portapapeis.",
+ "Contact" : "Contacto",
"{stack} in {board}" : "{stack} en {board}",
"Deck Card" : "Tarxeta do Deck",
"Scroll to bottom" : "Desprazarse ata o final",
@@ -864,6 +876,8 @@
"Chat" : "Conversa",
"Details" : "Detalles",
"Settings" : "Axustes",
+ "Projects" : "Proxectos",
+ "Show all files" : "Amosar todos os ficheiros",
"Meeting ID: {meetingId}" : "ID da xuntanza: {meetingId}",
"Your PIN: {attendeePin}" : "O seu PIN: {attendeePin}",
"Attachments folder" : "Cartafol de anexos",
@@ -919,6 +933,11 @@
"Error while accessing microphone" : "Produciuse un erro ao acceder ao micrófono",
"Access to camera is only possible with HTTPS" : "O acceso á cámara só é posíbel con HTTPS",
"An error occurred while fetching the participants" : "Produciuse un erro ao obter os participantes",
+ "Media" : "Multimedia",
+ "Files" : "Ficheiros",
+ "Locations" : "Localizacións",
+ "Audio" : "Son",
+ "Other" : "Outro",
"Nextcloud Talk was updated, please reload the page" : "Actualizouse o Nextcloud Talk, volva cargar a páxina",
"Do not disturb" : "Non molestar",
"Away" : "Ausente",
@@ -1008,6 +1027,7 @@
"Video on and off" : "Acendido e apagado do vídeo",
"Choose in which folder attachments should be saved." : "Escolla en que cartafol se deben gardar os anexos.",
"Exit fullscreen (f)" : "Saír da pantalla completa (f)",
- "Fullscreen (f)" : "Pantalla completa (f)"
+ "Fullscreen (f)" : "Pantalla completa (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Establecer o nivel de notificación para a conversa actual. Isto afectará só ás notificacións que reciba."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/l10n/he.js b/l10n/he.js
index f09679354..f4328ca3f 100644
--- a/l10n/he.js
+++ b/l10n/he.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["מישהו נוסף","%n נוספים","%n נוספים","%n נוספים"],
"{actor} invited you to {call}" : "הוזמנת אל {call} על ידי {actor}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "הוזמנת ל<strong>דיון</strong> או שקיבלת <strong>שיחה</strong>",
+ "Other activities" : "פעילויות אחרות",
"Talk" : "שיחה",
"Guest" : "אורח/ת",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "ברוך בואך ל־Talk מבית Nextcloud!\nבדיון הזה נעדכן אותך בנוגע לתכונות החדשות שזמינות ב־Talk מבית Nextcloud.",
@@ -66,6 +67,11 @@ OC.L10N.register(
"{actor} deleted a message" : "הודעה נמחקה על ידי {actor}",
"You deleted a message" : "מחקת הודעה",
"You missed a call from {user}" : "החמצת שיחה עם {user}",
+ "File is too big" : "הקובץ גדול מדי",
+ "Invalid file provided" : "הקובץ שסופק שגוי",
+ "Invalid image" : "תמונה לא חוקית",
+ "Unknown filetype" : "סוג קובץ לא מוכר",
+ "An error occurred. Please contact your admin." : "אירעה שגיאה. יש ליצור קשר עם המנהל שלך.",
"Conversation invitation" : "הזמנה לדיון",
"Click the button below to join." : "יש ללחוץ על הכפתור שלהלן כדי להצטרף.",
"Meeting ID" : "מזהה פגישה",
@@ -326,9 +332,11 @@ OC.L10N.register(
"Zambia" : "זמביה",
"Zimbabwe" : "זימבבואה",
"Invalid date, date format must be YYYY-MM-DD" : "תאריך לא חוקי, תבנית התאריך חייבת להיות YYYY-MM-DD",
+ "Conversation not found" : "הדיון לא נמצא",
"Navigating away from the page will leave the call in {conversation}" : "ניווט מחוץ לעמוד תנתק את השיחה שב־{conversation}",
"Leave call" : "יציאה מהשיחה",
"Stay in call" : "להישאר בשיחה",
+ "Duplicate session" : "שכפול הפעלה",
"Discuss this file" : "לדון על הקובץ הזה",
"Share this file with others to discuss it" : "שיתוף הקובץ הזה לדיונם של אחרים",
"Share this file" : "שיתוף הקובץ הזה",
@@ -358,6 +366,7 @@ OC.L10N.register(
"Response to" : "תגובה אל",
"Enabled for" : "מופעל עבור",
"General settings" : "הגדרות כלליות",
+ "All messages" : "כל ההודעות",
"Off" : "כבוי",
"Language" : "שפה",
"Country" : "מדינה",
@@ -385,6 +394,8 @@ OC.L10N.register(
"TURN server protocols" : "פרוטוקולים לשרתים מסוג TURN",
"Test this server" : "בדיקת השרת הזה",
"TURN servers" : "שרתי TURN",
+ "OK" : "אישור",
+ "Checking …" : "מתבצעת בדיקה…",
"Copy link" : "העתקת קישור",
"Waiting for others to join the call …" : "בהמתנה לאחרים להצטרף לשיחה…",
"You can invite others in the participant tab of the sidebar" : "ניתן להזמין אחרים בלשונית המשתתפים בסרגל הצד",
@@ -393,6 +404,7 @@ OC.L10N.register(
"Dismiss" : "התעלמות",
"Show your screen" : "הצגת המסך שלך",
"Stop screensharing" : "הפסקת שיתוף המסך",
+ "More actions" : "פעולות נוספות",
"No audio" : "אין שמע",
"Mute audio" : "השתקת שמע",
"Disable video" : "השבתת וידאו",
@@ -412,9 +424,13 @@ OC.L10N.register(
"Drop your files to upload" : "יש לגרור לכאן קבצים כדי להעלות",
"Call in progress" : "מתנהלת שיחה",
"Favorite" : "סימון כמועדף",
+ "Restricted" : "מוגבלת",
"Conversation settings" : "הגדרות דיון",
+ "Description" : "תיאור",
+ "Notifications" : "התראות",
"Leave conversation" : "יציאה מהדיון",
"Delete conversation" : "מחיקת דיון",
+ "Allow guests" : "לאפשר אורחים",
"Password protection" : "הגנה בססמה",
"Enter a password" : "נא להקליד ססמה",
"Copy conversation link" : "העתקת קישור דיון",
@@ -422,6 +438,8 @@ OC.L10N.register(
"Start time (optional)" : "מועד התחלה (רשות)",
"Save" : "שמירה",
"Edit" : "עריכה",
+ "More information" : "מידע נוסף",
+ "Delete" : "מחיקה",
"Nextcloud URL" : "כתובת Nextcloud",
"Nextcloud user" : "משתמש Nextcloud",
"User password" : "ססמת משתמש",
@@ -455,7 +473,9 @@ OC.L10N.register(
"Jabber ID" : "מזהה Jabber",
"unknown state" : "מצב לא ידוע",
"Bridge saved" : "הגישור נשמר",
+ "Calls" : "שיחות",
"Choose devices" : "בחירת התקנים",
+ "Mark as read" : "סימון כנקרא",
"Remove from favorites" : "הסרה מהמועדפים",
"Add to favorites" : "הוספה למועדפים",
"Loading" : "בטעינה",
@@ -477,8 +497,13 @@ OC.L10N.register(
"Search participants" : "חיפוש משתתפים",
"Conversation name" : "שם דיון",
"You are currently waiting in the lobby" : "הנך בהמתנה בלובי",
+ "Unread messages" : "הודעות שלא נקראו",
+ "Message sent" : "הודעה נשלחה",
+ "Deleting message" : "ההודעה נמחקה",
"Reply" : "תגובה",
+ "Mark as unread" : "סימון כלא נקרא",
"Go to file" : "מעבר לקובץ",
+ "Contact" : "איש/אשת קשר",
"Today" : "היום",
"Yesterday" : "מחר",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -505,8 +530,11 @@ OC.L10N.register(
"Add other sources" : "הוספת מקורות אחרים",
"Participants" : "משתתפים",
"Chat" : "צ׳אט",
+ "Details" : "פרטים",
"Settings" : "הגדרות",
+ "Projects" : "מיזמים",
"Attachments folder" : "תיקיית הקבצים המצורפים",
+ "Privacy" : "פרטיות",
"Keyboard shortcuts" : "קיצורי מקלדת",
"Search" : "חיפוש",
"Shortcuts while in a call" : "קיצורי דרך בזמן שיחה",
@@ -517,6 +545,7 @@ OC.L10N.register(
"Send" : "שליחה",
"Add more files" : "הוספת קבצים נוספים",
"No unread mentions" : "אין אזכורים שלא נקראו",
+ "Say hi to your friends and colleagues!" : "על הדרך לראות מה עם חבריך לעבודה!",
"Start a conversation" : "התחלת דיון",
"Message without mention" : "הודעה ללא אזכור",
"Mention myself" : "אזכור עצמי",
@@ -529,6 +558,12 @@ OC.L10N.register(
"Calls are not supported in your browser" : "אין תמיכה בשיחות בדפדפן שלך",
"Access to microphone was denied" : "הגישה למיקרופון נדחתה",
"An error occurred while fetching the participants" : "אירעה שגיאה במהלך קבלת המשתתפים",
+ "Files" : "קבצים",
+ "Locations" : "מיקומים",
+ "Audio" : "שמע",
+ "Other" : "אחר",
+ "Do not disturb" : "לא להפריע",
+ "Away" : "לא פה",
"Error while sharing file" : "שגיאה בשיתוף הקובץ",
"Default" : "בררת מחדל",
"Speaker {number}" : "רמקול {number}",
diff --git a/l10n/he.json b/l10n/he.json
index 08bcf9fc5..92ff69967 100644
--- a/l10n/he.json
+++ b/l10n/he.json
@@ -10,6 +10,7 @@
"_%n other_::_%n others_" : ["מישהו נוסף","%n נוספים","%n נוספים","%n נוספים"],
"{actor} invited you to {call}" : "הוזמנת אל {call} על ידי {actor}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "הוזמנת ל<strong>דיון</strong> או שקיבלת <strong>שיחה</strong>",
+ "Other activities" : "פעילויות אחרות",
"Talk" : "שיחה",
"Guest" : "אורח/ת",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "ברוך בואך ל־Talk מבית Nextcloud!\nבדיון הזה נעדכן אותך בנוגע לתכונות החדשות שזמינות ב־Talk מבית Nextcloud.",
@@ -64,6 +65,11 @@
"{actor} deleted a message" : "הודעה נמחקה על ידי {actor}",
"You deleted a message" : "מחקת הודעה",
"You missed a call from {user}" : "החמצת שיחה עם {user}",
+ "File is too big" : "הקובץ גדול מדי",
+ "Invalid file provided" : "הקובץ שסופק שגוי",
+ "Invalid image" : "תמונה לא חוקית",
+ "Unknown filetype" : "סוג קובץ לא מוכר",
+ "An error occurred. Please contact your admin." : "אירעה שגיאה. יש ליצור קשר עם המנהל שלך.",
"Conversation invitation" : "הזמנה לדיון",
"Click the button below to join." : "יש ללחוץ על הכפתור שלהלן כדי להצטרף.",
"Meeting ID" : "מזהה פגישה",
@@ -324,9 +330,11 @@
"Zambia" : "זמביה",
"Zimbabwe" : "זימבבואה",
"Invalid date, date format must be YYYY-MM-DD" : "תאריך לא חוקי, תבנית התאריך חייבת להיות YYYY-MM-DD",
+ "Conversation not found" : "הדיון לא נמצא",
"Navigating away from the page will leave the call in {conversation}" : "ניווט מחוץ לעמוד תנתק את השיחה שב־{conversation}",
"Leave call" : "יציאה מהשיחה",
"Stay in call" : "להישאר בשיחה",
+ "Duplicate session" : "שכפול הפעלה",
"Discuss this file" : "לדון על הקובץ הזה",
"Share this file with others to discuss it" : "שיתוף הקובץ הזה לדיונם של אחרים",
"Share this file" : "שיתוף הקובץ הזה",
@@ -356,6 +364,7 @@
"Response to" : "תגובה אל",
"Enabled for" : "מופעל עבור",
"General settings" : "הגדרות כלליות",
+ "All messages" : "כל ההודעות",
"Off" : "כבוי",
"Language" : "שפה",
"Country" : "מדינה",
@@ -383,6 +392,8 @@
"TURN server protocols" : "פרוטוקולים לשרתים מסוג TURN",
"Test this server" : "בדיקת השרת הזה",
"TURN servers" : "שרתי TURN",
+ "OK" : "אישור",
+ "Checking …" : "מתבצעת בדיקה…",
"Copy link" : "העתקת קישור",
"Waiting for others to join the call …" : "בהמתנה לאחרים להצטרף לשיחה…",
"You can invite others in the participant tab of the sidebar" : "ניתן להזמין אחרים בלשונית המשתתפים בסרגל הצד",
@@ -391,6 +402,7 @@
"Dismiss" : "התעלמות",
"Show your screen" : "הצגת המסך שלך",
"Stop screensharing" : "הפסקת שיתוף המסך",
+ "More actions" : "פעולות נוספות",
"No audio" : "אין שמע",
"Mute audio" : "השתקת שמע",
"Disable video" : "השבתת וידאו",
@@ -410,9 +422,13 @@
"Drop your files to upload" : "יש לגרור לכאן קבצים כדי להעלות",
"Call in progress" : "מתנהלת שיחה",
"Favorite" : "סימון כמועדף",
+ "Restricted" : "מוגבלת",
"Conversation settings" : "הגדרות דיון",
+ "Description" : "תיאור",
+ "Notifications" : "התראות",
"Leave conversation" : "יציאה מהדיון",
"Delete conversation" : "מחיקת דיון",
+ "Allow guests" : "לאפשר אורחים",
"Password protection" : "הגנה בססמה",
"Enter a password" : "נא להקליד ססמה",
"Copy conversation link" : "העתקת קישור דיון",
@@ -420,6 +436,8 @@
"Start time (optional)" : "מועד התחלה (רשות)",
"Save" : "שמירה",
"Edit" : "עריכה",
+ "More information" : "מידע נוסף",
+ "Delete" : "מחיקה",
"Nextcloud URL" : "כתובת Nextcloud",
"Nextcloud user" : "משתמש Nextcloud",
"User password" : "ססמת משתמש",
@@ -453,7 +471,9 @@
"Jabber ID" : "מזהה Jabber",
"unknown state" : "מצב לא ידוע",
"Bridge saved" : "הגישור נשמר",
+ "Calls" : "שיחות",
"Choose devices" : "בחירת התקנים",
+ "Mark as read" : "סימון כנקרא",
"Remove from favorites" : "הסרה מהמועדפים",
"Add to favorites" : "הוספה למועדפים",
"Loading" : "בטעינה",
@@ -475,8 +495,13 @@
"Search participants" : "חיפוש משתתפים",
"Conversation name" : "שם דיון",
"You are currently waiting in the lobby" : "הנך בהמתנה בלובי",
+ "Unread messages" : "הודעות שלא נקראו",
+ "Message sent" : "הודעה נשלחה",
+ "Deleting message" : "ההודעה נמחקה",
"Reply" : "תגובה",
+ "Mark as unread" : "סימון כלא נקרא",
"Go to file" : "מעבר לקובץ",
+ "Contact" : "איש/אשת קשר",
"Today" : "היום",
"Yesterday" : "מחר",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -503,8 +528,11 @@
"Add other sources" : "הוספת מקורות אחרים",
"Participants" : "משתתפים",
"Chat" : "צ׳אט",
+ "Details" : "פרטים",
"Settings" : "הגדרות",
+ "Projects" : "מיזמים",
"Attachments folder" : "תיקיית הקבצים המצורפים",
+ "Privacy" : "פרטיות",
"Keyboard shortcuts" : "קיצורי מקלדת",
"Search" : "חיפוש",
"Shortcuts while in a call" : "קיצורי דרך בזמן שיחה",
@@ -515,6 +543,7 @@
"Send" : "שליחה",
"Add more files" : "הוספת קבצים נוספים",
"No unread mentions" : "אין אזכורים שלא נקראו",
+ "Say hi to your friends and colleagues!" : "על הדרך לראות מה עם חבריך לעבודה!",
"Start a conversation" : "התחלת דיון",
"Message without mention" : "הודעה ללא אזכור",
"Mention myself" : "אזכור עצמי",
@@ -527,6 +556,12 @@
"Calls are not supported in your browser" : "אין תמיכה בשיחות בדפדפן שלך",
"Access to microphone was denied" : "הגישה למיקרופון נדחתה",
"An error occurred while fetching the participants" : "אירעה שגיאה במהלך קבלת המשתתפים",
+ "Files" : "קבצים",
+ "Locations" : "מיקומים",
+ "Audio" : "שמע",
+ "Other" : "אחר",
+ "Do not disturb" : "לא להפריע",
+ "Away" : "לא פה",
"Error while sharing file" : "שגיאה בשיתוף הקובץ",
"Default" : "בררת מחדל",
"Speaker {number}" : "רמקול {number}",
diff --git a/l10n/hr.js b/l10n/hr.js
index fefaa5a7e..4a1f8d7c1 100644
--- a/l10n/hr.js
+++ b/l10n/hr.js
@@ -638,6 +638,7 @@ OC.L10N.register(
"Test this server" : "Ispitaj ovaj poslužitelj",
"TURN servers" : "Poslužitelji TURN",
"A TURN server is used to proxy the traffic from participants behind a firewall. If individual participants cannot connect to others a TURN server is most likely required. See {linkstart}this documentation{linkend} for setup instructions." : "Poslužitelj TURN upotrebljava se za usmjeravanje prometa sudionika iza vatrozida. Ako se pojedini sudionici ne mogu povezati s drugim sudionicima, vjerojatno je potreban poslužitelj TURN. Upute za postavljanje poslužitelja možete pronaći u {linkstart}ovoj dokumentaciji{linkend}.",
+ "OK" : "U redu",
"{nickName} raised their hand." : "{nickName} je podigao ruku.",
"A participant raised their hand." : "Sudionik je podigao ruku.",
"Previous page of videos" : "Prethodna stranica s videozapisima",
@@ -870,6 +871,7 @@ OC.L10N.register(
"No search results" : "Nema rezultata pretraživanja",
"Groups" : "Grupe",
"Circles" : "Krugovi",
+ "Unread mentions" : "Nepročitana spominjanja",
"Talk settings" : "Postavke razgovora",
"Users, groups and circles" : "Korisnici, grupe i krugovi",
"Users and groups" : "Korisnici i grupe",
@@ -1002,6 +1004,8 @@ OC.L10N.register(
"Details" : "Pojedinosti",
"Settings" : "Postavke",
"Participants ({count})" : "Sudionici ({count})",
+ "Projects" : "Projekti",
+ "Show all files" : "Prikaži sve datoteke",
"Meeting ID: {meetingId}" : "ID sastanka: {meetingId}",
"Your PIN: {attendeePin}" : "Vaš PIN: {attendeePin}",
"Attachments folder" : "Mapa s privicima",
@@ -1069,6 +1073,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Došlo je do pogreške pri pristupanju mikrofonu",
"Access to camera is only possible with HTTPS" : "Pristup kameri moguć je samo putem HTTPS-a",
"An error occurred while fetching the participants" : "Došlo je do pogreške pri dohvaćanju sudionika",
+ "Media" : "Medij",
+ "Files" : "Datoteke",
+ "Locations" : "Lokacije",
+ "Audio" : "Audio",
+ "Other" : "Drugo",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk je ažuriran, ponovno učitajte stranicu",
"Do not disturb" : "Ne ometaj",
"Away" : "Odsutan",
@@ -1161,6 +1170,7 @@ OC.L10N.register(
"Video on and off" : "Video uključen i isključen",
"Choose in which folder attachments should be saved." : "Odaberite mapu za spremanje privitaka.",
"Exit fullscreen (f)" : "Zatvori prikaz preko cijelog zaslona (f)",
- "Fullscreen (f)" : "Cijeli zaslon (f)"
+ "Fullscreen (f)" : "Cijeli zaslon (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Postavite razinu obavijesti za trenutni razgovor. To će utjecati samo na obavijesti koje primate."
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");
diff --git a/l10n/hr.json b/l10n/hr.json
index 2053fc960..d3896fe94 100644
--- a/l10n/hr.json
+++ b/l10n/hr.json
@@ -636,6 +636,7 @@
"Test this server" : "Ispitaj ovaj poslužitelj",
"TURN servers" : "Poslužitelji TURN",
"A TURN server is used to proxy the traffic from participants behind a firewall. If individual participants cannot connect to others a TURN server is most likely required. See {linkstart}this documentation{linkend} for setup instructions." : "Poslužitelj TURN upotrebljava se za usmjeravanje prometa sudionika iza vatrozida. Ako se pojedini sudionici ne mogu povezati s drugim sudionicima, vjerojatno je potreban poslužitelj TURN. Upute za postavljanje poslužitelja možete pronaći u {linkstart}ovoj dokumentaciji{linkend}.",
+ "OK" : "U redu",
"{nickName} raised their hand." : "{nickName} je podigao ruku.",
"A participant raised their hand." : "Sudionik je podigao ruku.",
"Previous page of videos" : "Prethodna stranica s videozapisima",
@@ -868,6 +869,7 @@
"No search results" : "Nema rezultata pretraživanja",
"Groups" : "Grupe",
"Circles" : "Krugovi",
+ "Unread mentions" : "Nepročitana spominjanja",
"Talk settings" : "Postavke razgovora",
"Users, groups and circles" : "Korisnici, grupe i krugovi",
"Users and groups" : "Korisnici i grupe",
@@ -1000,6 +1002,8 @@
"Details" : "Pojedinosti",
"Settings" : "Postavke",
"Participants ({count})" : "Sudionici ({count})",
+ "Projects" : "Projekti",
+ "Show all files" : "Prikaži sve datoteke",
"Meeting ID: {meetingId}" : "ID sastanka: {meetingId}",
"Your PIN: {attendeePin}" : "Vaš PIN: {attendeePin}",
"Attachments folder" : "Mapa s privicima",
@@ -1067,6 +1071,11 @@
"Error while accessing microphone" : "Došlo je do pogreške pri pristupanju mikrofonu",
"Access to camera is only possible with HTTPS" : "Pristup kameri moguć je samo putem HTTPS-a",
"An error occurred while fetching the participants" : "Došlo je do pogreške pri dohvaćanju sudionika",
+ "Media" : "Medij",
+ "Files" : "Datoteke",
+ "Locations" : "Lokacije",
+ "Audio" : "Audio",
+ "Other" : "Drugo",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk je ažuriran, ponovno učitajte stranicu",
"Do not disturb" : "Ne ometaj",
"Away" : "Odsutan",
@@ -1159,6 +1168,7 @@
"Video on and off" : "Video uključen i isključen",
"Choose in which folder attachments should be saved." : "Odaberite mapu za spremanje privitaka.",
"Exit fullscreen (f)" : "Zatvori prikaz preko cijelog zaslona (f)",
- "Fullscreen (f)" : "Cijeli zaslon (f)"
+ "Fullscreen (f)" : "Cijeli zaslon (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Postavite razinu obavijesti za trenutni razgovor. To će utjecati samo na obavijesti koje primate."
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
} \ No newline at end of file
diff --git a/l10n/hu.js b/l10n/hu.js
index 8a202c091..014c3beab 100644
--- a/l10n/hu.js
+++ b/l10n/hu.js
@@ -1039,13 +1039,7 @@ OC.L10N.register(
"Settings" : "Beállítások",
"Shared items" : "Megosztott elemek",
"Participants ({count})" : "Résztvevők ({count})",
- "Media" : "Média",
- "Files" : "Fájlok",
- "Deck cards" : "Kártyák",
- "Voice messages" : "Hangüzenetek",
- "Locations" : "Helyek",
- "Audio" : "Hangok",
- "Other" : "Egyebek",
+ "Projects" : "Projektek",
"Show all media" : "Összes média megjelenítése",
"Show all files" : "Összes fájl megjelenítése",
"Show all deck cards" : "Összes kártya megjelenítése",
@@ -1053,7 +1047,6 @@ OC.L10N.register(
"Show all locations" : "Összes hely megjelenítése",
"Show all audio" : "Összes hang megjelenítése",
"Show all other" : "Összes egyéb megtekintése",
- "Projects" : "Projektek",
"Meeting ID: {meetingId}" : "Megbeszélés azonosító: {meetingId}",
"Your PIN: {attendeePin}" : "Az Ön PIN-kódja: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Megjelenítendő név: <strong>{name}</strong>",
@@ -1063,6 +1056,7 @@ OC.L10N.register(
"Sounds" : "Hangok",
"Play sounds when participants join or leave a call" : "Hangjelzések lejátszása, amikor a résztvevők csatlakoznak, vagy elhagyják a hívást",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "A hangokat a gyártó műszaki korlátozásai miatt jelenleg nem lehet lejátszani Safari böngészőben, valamint iPad és iPhone eszközökön.",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "A csevegési és hívásértesítések hangja a személyes beállításokban módosítható. ",
"Keyboard shortcuts" : "Gyorsbillentyűk",
"Speed up your Talk experience with these quick shortcuts." : "Ezekkel a billentyűparancsokkal felpörgetheti a Beszélgetés élményét.",
"Focus the chat input" : "Fókusz a csevegés beviteli mezőjére",
@@ -1123,6 +1117,13 @@ OC.L10N.register(
"Error while accessing microphone" : "Hiba történt a mikrofon elérésekor",
"Access to camera is only possible with HTTPS" : "A kamera hozzáférése csak HTTPS-en lehetséges",
"An error occurred while fetching the participants" : "Hiba történt a résztvevők letöltése során",
+ "Media" : "Média",
+ "Files" : "Fájlok",
+ "Deck cards" : "Kártyák",
+ "Voice messages" : "Hangüzenetek",
+ "Locations" : "Helyek",
+ "Audio" : "Hangok",
+ "Other" : "Egyebek",
"Nextcloud Talk was updated, please reload the page" : "A Nextcloud Beszélgetés frissült, töltse újra az oldalt",
"Do not disturb" : "Ne zavarjanak",
"Away" : "Távol",
@@ -1131,6 +1132,7 @@ OC.L10N.register(
"Not enough free space to upload file \"{fileName}\"" : "Nincs elég szabad hely a(z) „{fileName}” fájl feltöltéséhez",
"Error while uploading file \"{fileName}\"" : "Hiba történt a(z) „{fileName}” fájl feltöltésekor",
"An error happened when trying to share your file" : "Hiba történt a fájl megosztása során",
+ "{guest} (guest)" : "{guest} (vendég)",
"Could not post message: {errorMessage}" : "Nem sikerült elküldeni az üzenetet: {errorMessage}",
"Failed to add reaction" : "A reakció hozzáadása sikertelen",
"Failed to remove reaction" : "A reakció eltávolítása sikertelen",
diff --git a/l10n/hu.json b/l10n/hu.json
index 0fc311179..25bbd083f 100644
--- a/l10n/hu.json
+++ b/l10n/hu.json
@@ -1037,13 +1037,7 @@
"Settings" : "Beállítások",
"Shared items" : "Megosztott elemek",
"Participants ({count})" : "Résztvevők ({count})",
- "Media" : "Média",
- "Files" : "Fájlok",
- "Deck cards" : "Kártyák",
- "Voice messages" : "Hangüzenetek",
- "Locations" : "Helyek",
- "Audio" : "Hangok",
- "Other" : "Egyebek",
+ "Projects" : "Projektek",
"Show all media" : "Összes média megjelenítése",
"Show all files" : "Összes fájl megjelenítése",
"Show all deck cards" : "Összes kártya megjelenítése",
@@ -1051,7 +1045,6 @@
"Show all locations" : "Összes hely megjelenítése",
"Show all audio" : "Összes hang megjelenítése",
"Show all other" : "Összes egyéb megtekintése",
- "Projects" : "Projektek",
"Meeting ID: {meetingId}" : "Megbeszélés azonosító: {meetingId}",
"Your PIN: {attendeePin}" : "Az Ön PIN-kódja: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Megjelenítendő név: <strong>{name}</strong>",
@@ -1061,6 +1054,7 @@
"Sounds" : "Hangok",
"Play sounds when participants join or leave a call" : "Hangjelzések lejátszása, amikor a résztvevők csatlakoznak, vagy elhagyják a hívást",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "A hangokat a gyártó műszaki korlátozásai miatt jelenleg nem lehet lejátszani Safari böngészőben, valamint iPad és iPhone eszközökön.",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "A csevegési és hívásértesítések hangja a személyes beállításokban módosítható. ",
"Keyboard shortcuts" : "Gyorsbillentyűk",
"Speed up your Talk experience with these quick shortcuts." : "Ezekkel a billentyűparancsokkal felpörgetheti a Beszélgetés élményét.",
"Focus the chat input" : "Fókusz a csevegés beviteli mezőjére",
@@ -1121,6 +1115,13 @@
"Error while accessing microphone" : "Hiba történt a mikrofon elérésekor",
"Access to camera is only possible with HTTPS" : "A kamera hozzáférése csak HTTPS-en lehetséges",
"An error occurred while fetching the participants" : "Hiba történt a résztvevők letöltése során",
+ "Media" : "Média",
+ "Files" : "Fájlok",
+ "Deck cards" : "Kártyák",
+ "Voice messages" : "Hangüzenetek",
+ "Locations" : "Helyek",
+ "Audio" : "Hangok",
+ "Other" : "Egyebek",
"Nextcloud Talk was updated, please reload the page" : "A Nextcloud Beszélgetés frissült, töltse újra az oldalt",
"Do not disturb" : "Ne zavarjanak",
"Away" : "Távol",
@@ -1129,6 +1130,7 @@
"Not enough free space to upload file \"{fileName}\"" : "Nincs elég szabad hely a(z) „{fileName}” fájl feltöltéséhez",
"Error while uploading file \"{fileName}\"" : "Hiba történt a(z) „{fileName}” fájl feltöltésekor",
"An error happened when trying to share your file" : "Hiba történt a fájl megosztása során",
+ "{guest} (guest)" : "{guest} (vendég)",
"Could not post message: {errorMessage}" : "Nem sikerült elküldeni az üzenetet: {errorMessage}",
"Failed to add reaction" : "A reakció hozzáadása sikertelen",
"Failed to remove reaction" : "A reakció eltávolítása sikertelen",
diff --git a/l10n/id.js b/l10n/id.js
new file mode 100644
index 000000000..f3d435906
--- /dev/null
+++ b/l10n/id.js
@@ -0,0 +1,78 @@
+OC.L10N.register(
+ "spreed",
+ {
+ "You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Anda diundang dalam <strong>percakapan</strong> atau mendapat <strong>panggilan</strong>",
+ "File is too big" : "Berkas terlalu besar",
+ "Invalid file provided" : "Berkas tidak valid",
+ "Invalid image" : "Gambar tidak valid",
+ "Unknown filetype" : "Tipe berkas tak dikenal",
+ "An error occurred. Please contact your admin." : "Terjadi kesalahan. Silakan hubungi admin Anda.",
+ "Invalid date, date format must be YYYY-MM-DD" : "Tanggal salah, format tanggal harus TTTT-BB-HH",
+ "Limit to groups" : "Batasi ke grup",
+ "Everyone" : "Semua orang",
+ "Save changes" : "Simpan perubahan",
+ "Saving …" : "Menyimpan ...",
+ "None" : "Tidak ada",
+ "User" : "Pengguna",
+ "Disabled" : "Dinonaktifkan",
+ "Users" : "Pengguna",
+ "Name" : "Nama",
+ "Language" : "Bahasa",
+ "Country" : "Negara",
+ "Status" : "Status",
+ "Created at" : "Dibuat saat",
+ "Pending" : "Tunggu",
+ "Error" : "Kesalahan",
+ "Saved" : "Disimpan",
+ "OK" : "OK",
+ "Copy link" : "Salin tautan",
+ "Dismiss" : "Batal",
+ "Grid view" : "Tampilan kotak",
+ "Back" : "Kembali",
+ "Drop your files to upload" : "Lepas berkas Anda untuk mengunggah",
+ "Favorite" : "Favorit",
+ "Restricted" : "Terbatas",
+ "Description" : "Deskrisi",
+ "Notifications" : "Pemberitahuan",
+ "Password protection" : "Password protection",
+ "Enter a password" : "Masukkan kata sandi",
+ "Save" : "Simpan",
+ "Edit" : "Sunting",
+ "Delete" : "Hapus",
+ "Password" : "Kata kunci",
+ "Login" : "Log masuk",
+ "Nickname" : "Nama panggilan",
+ "Client ID" : "ID Klien",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Tambah ke favorit",
+ "Loading" : "Memuat",
+ "Groups" : "Grup",
+ "Password protect" : "Lindungi dengan kata sandi",
+ "Close" : "Tutup",
+ "Reply" : "Balas",
+ "Today" : "Hari ini",
+ "Yesterday" : "Kemarin",
+ "Invalid path selected" : "Jalur terpilih invalid",
+ "guest" : "pengunjung",
+ "No results" : "Tidak ada hasil",
+ "Add users or groups" : "Add users or groups",
+ "Details" : "Detail",
+ "Settings" : "Setelan",
+ "Projects" : "Proyek",
+ "Privacy" : "Privasi",
+ "Keyboard shortcuts" : "Pintasan keyboard",
+ "Search" : "Cari",
+ "Send" : "Kirim",
+ "Media" : "Media",
+ "Files" : "Berkas",
+ "Audio" : "Audio",
+ "Other" : "Lainnya",
+ "Do not disturb" : "Jangan diganggu",
+ "Away" : "Jauh",
+ "Default" : "Bawaan",
+ "The password is wrong. Try again." : "Kata sandi salah. Coba lagi",
+ "Android app" : "Aplikasi Android",
+ "iOS app" : "Aplikasi iOS",
+ "Remove" : "Buang"
+},
+"nplurals=1; plural=0;");
diff --git a/l10n/id.json b/l10n/id.json
new file mode 100644
index 000000000..fa7a900f6
--- /dev/null
+++ b/l10n/id.json
@@ -0,0 +1,76 @@
+{ "translations": {
+ "You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Anda diundang dalam <strong>percakapan</strong> atau mendapat <strong>panggilan</strong>",
+ "File is too big" : "Berkas terlalu besar",
+ "Invalid file provided" : "Berkas tidak valid",
+ "Invalid image" : "Gambar tidak valid",
+ "Unknown filetype" : "Tipe berkas tak dikenal",
+ "An error occurred. Please contact your admin." : "Terjadi kesalahan. Silakan hubungi admin Anda.",
+ "Invalid date, date format must be YYYY-MM-DD" : "Tanggal salah, format tanggal harus TTTT-BB-HH",
+ "Limit to groups" : "Batasi ke grup",
+ "Everyone" : "Semua orang",
+ "Save changes" : "Simpan perubahan",
+ "Saving …" : "Menyimpan ...",
+ "None" : "Tidak ada",
+ "User" : "Pengguna",
+ "Disabled" : "Dinonaktifkan",
+ "Users" : "Pengguna",
+ "Name" : "Nama",
+ "Language" : "Bahasa",
+ "Country" : "Negara",
+ "Status" : "Status",
+ "Created at" : "Dibuat saat",
+ "Pending" : "Tunggu",
+ "Error" : "Kesalahan",
+ "Saved" : "Disimpan",
+ "OK" : "OK",
+ "Copy link" : "Salin tautan",
+ "Dismiss" : "Batal",
+ "Grid view" : "Tampilan kotak",
+ "Back" : "Kembali",
+ "Drop your files to upload" : "Lepas berkas Anda untuk mengunggah",
+ "Favorite" : "Favorit",
+ "Restricted" : "Terbatas",
+ "Description" : "Deskrisi",
+ "Notifications" : "Pemberitahuan",
+ "Password protection" : "Password protection",
+ "Enter a password" : "Masukkan kata sandi",
+ "Save" : "Simpan",
+ "Edit" : "Sunting",
+ "Delete" : "Hapus",
+ "Password" : "Kata kunci",
+ "Login" : "Log masuk",
+ "Nickname" : "Nama panggilan",
+ "Client ID" : "ID Klien",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Tambah ke favorit",
+ "Loading" : "Memuat",
+ "Groups" : "Grup",
+ "Password protect" : "Lindungi dengan kata sandi",
+ "Close" : "Tutup",
+ "Reply" : "Balas",
+ "Today" : "Hari ini",
+ "Yesterday" : "Kemarin",
+ "Invalid path selected" : "Jalur terpilih invalid",
+ "guest" : "pengunjung",
+ "No results" : "Tidak ada hasil",
+ "Add users or groups" : "Add users or groups",
+ "Details" : "Detail",
+ "Settings" : "Setelan",
+ "Projects" : "Proyek",
+ "Privacy" : "Privasi",
+ "Keyboard shortcuts" : "Pintasan keyboard",
+ "Search" : "Cari",
+ "Send" : "Kirim",
+ "Media" : "Media",
+ "Files" : "Berkas",
+ "Audio" : "Audio",
+ "Other" : "Lainnya",
+ "Do not disturb" : "Jangan diganggu",
+ "Away" : "Jauh",
+ "Default" : "Bawaan",
+ "The password is wrong. Try again." : "Kata sandi salah. Coba lagi",
+ "Android app" : "Aplikasi Android",
+ "iOS app" : "Aplikasi iOS",
+ "Remove" : "Buang"
+},"pluralForm" :"nplurals=1; plural=0;"
+} \ No newline at end of file
diff --git a/l10n/is.js b/l10n/is.js
index 8f16793d6..dcb3db123 100644
--- a/l10n/is.js
+++ b/l10n/is.js
@@ -64,6 +64,11 @@ OC.L10N.register(
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Samtal við {user1}, {user2}, {user3}, {user4} og {user5} (tímalengd {duration})",
"Talk to %s" : "Tala við %s",
"File is not shared, or shared but not with the user" : "Skránni er ekki deilt, eða henni er deilt en ekki með notandanum",
+ "File is too big" : "Skrá er of stór",
+ "Invalid file provided" : "Ógild skrá gefin",
+ "Invalid image" : "Ógild mynd",
+ "Unknown filetype" : "Óþekkt skráategund",
+ "An error occurred. Please contact your admin." : "Villa kom upp. Hafðu samband við kerfisstjóra.",
"%s invited you to a conversation." : "%s bauð þér að taka þátt í samtali.",
"You were invited to a conversation." : "Þér var boðið að taka þátt í samtali.",
"Conversation invitation" : "Boð í samtal",
@@ -338,6 +343,7 @@ OC.L10N.register(
"Path is already shared with this room" : "Slóðinni er þegar deilt með þessu spjallsvæði",
"Chat, video & audio-conferencing using WebRTC" : "Spjall, mynd- og hljóðfundir með WebRTC",
"Leave call" : "Hætta símtali",
+ "Duplicate session" : "Duplicate session",
"Share this file" : "Deila þessari skrá",
"Request password" : "Biðja um lykilorð",
"Error requesting the password." : "Villa kom upp við að biðja um lykilorð.",
@@ -364,6 +370,7 @@ OC.L10N.register(
"Enabled for" : "Virkjað fyrir",
"General settings" : "Almennar stillingar",
"All messages" : "Öll skilaboð",
+ "@-mentions only" : "@-mentions only",
"Off" : "Slökkt",
"Language" : "Tungumál",
"Country" : "Country",
@@ -389,6 +396,8 @@ OC.L10N.register(
"TURN server protocols" : "Samskiptareglur TURN-þjóns",
"Test this server" : "Prófa þennan þjón",
"TURN servers" : "TURN-miðlarar",
+ "OK" : "Í lagi",
+ "Checking …" : "Athuga …",
"Copy link" : "Afrita tengil",
"Waiting for others to join the call …" : "Bíð eftir að fleiri komi inn í símtalið …",
"You can invite others in the participant tab of the sidebar" : "Þú getur boðið öðrum að taka þátt af þátttakendaflipa hliðarspjaldsins",
@@ -397,6 +406,7 @@ OC.L10N.register(
"Dismiss" : "Hafna",
"Show your screen" : "Birta skjáinn þinn",
"Stop screensharing" : "Hætta skjádeilingu",
+ "More actions" : "Fleiri aðgerðir",
"No audio" : "Ekkert hljóð",
"Mute audio" : "Þagga hljóð",
"Disable video" : "Gera myndskeið óvirk",
@@ -410,37 +420,55 @@ OC.L10N.register(
"Please use a different browser like Firefox or Chrome to share your screen." : "Veldu einhvern annan vafra eins og Firefox eða Chrome til að deila skjánum þínum.",
"An error occurred while starting screensharing." : "Villa kom upp við að hefja skjádeilingu.",
"Back" : "Til baka",
+ "You have been muted by a moderator" : "You have been muted by a moderator",
"You" : "Þú",
"Show screen" : "Birta skjá",
+ "This conversation is read-only" : "This conversation is read-only",
"Favorite" : "Eftirlæti",
+ "Restricted" : "Takmarkað",
+ "Description" : "Lýsing",
+ "Notifications" : "Tilkynningar",
"Leave conversation" : "Hætta í samtali",
"Delete conversation" : "Eyða samtali",
"You need to promote a new moderator before you can leave the conversation." : "Þú þarft að uppfæra einhvern í stöðu umsjónarmanna áður en þú getur hætt í samtalinu.",
+ "Allow guests" : "Leyfa gesti",
"Password protection" : "Verndun með lykilorði",
"Enter a password" : "Settu inn lykilorð",
"Start time (optional)" : "Upphafstími (valfrjálst)",
"Save" : "Vista",
"Edit" : "Breyta",
+ "More information" : "Nánari upplýsingar",
+ "Delete" : "Eyða",
"Password" : "Lykilorð",
"API token" : "API-teikn",
"Login" : "Innskráning",
"Nickname" : "Stuttnefni",
"Client ID" : "Biðlaraauðkenni",
+ "Calls" : "Samtöl",
+ "Mark as read" : "Merkja sem lesið",
"Remove from favorites" : "Fjarlægja úr eftirlætum",
"Add to favorites" : "Bæta í eftirlæti",
"Loading" : "Hleð inn",
"Groups" : "Hópar",
"Circles" : "Hringir",
+ "Create a new group conversation" : "Create a new group conversation",
"Password protect" : "Verja með lykilorði",
+ "Add participants" : "Bæta við þátttakanda",
"Close" : "Loka",
"Conversation name" : "Heiti samtals",
+ "You are currently waiting in the lobby" : "You are currently waiting in the lobby",
+ "Unread messages" : "Ólesin skilaboð",
+ "Message sent" : "Skilaboðin hafa verið send",
"Reply" : "Svara",
+ "Mark as unread" : "Merkja allt sem ólesið",
"Go to file" : "Fara í skrá",
+ "Contact" : "Tengiliður",
"Today" : "Í dag",
"Yesterday" : "Í gær",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
"Send message" : "Senda skilaboð",
"File to share" : "Skrá til að deila",
+ "Write message, @ to mention someone …" : "Write message, @ to mention someone …",
"Invalid path selected" : "Ógild slóð valin",
"moderator" : "umsjónarmaður",
"guest" : "gestanotandi",
@@ -452,7 +480,10 @@ OC.L10N.register(
"Add users or groups" : "Bæta við notendum eða hópum",
"Participants" : "Þátttakendur",
"Chat" : "Spjall",
+ "Details" : "Details",
"Settings" : "Stillingar",
+ "Projects" : "Verkefni",
+ "Privacy" : "Gagnaleynd",
"Keyboard shortcuts" : "Flýtileiðir á lyklaborði",
"Search" : "Search",
"Start call" : "Hefja samtal",
@@ -463,6 +494,14 @@ OC.L10N.register(
"Select conversation" : "Veldu samtal",
"Link to a conversation" : "Tengill á samtal",
"Join a conversation or start a new one" : "Taktu þátt í samtali eða byrjaðu nýtt samtal",
+ "Media" : "Margmiðlunargögn",
+ "Files" : "Skrár",
+ "Locations" : "Staðsetningar",
+ "Audio" : "Hljóð",
+ "Other" : "Annað",
+ "Do not disturb" : "Ónáðið ekki",
+ "Away" : "Fjarverandi",
+ "Error while sharing file" : "Villa við deilingu skráar",
"Default" : "Sjálfgefið",
"Access to microphone & camera is only possible with HTTPS" : "Aðgangur að hljóðnema og myndavél er einungis mögulegur í gegnum HTTPS",
"Please move your setup to HTTPS" : "Endilega færðu uppsetninguna þína yfir í HTTPS",
@@ -488,6 +527,7 @@ OC.L10N.register(
"Disable video (v)" : "Gera myndskeið óvirk (v)",
"Enable video (v)" : "Virkja myndskeið (v)",
"Enable video (v) - Your connection will be briefly interrupted when enabling the video for the first time" : "Virkja myndskeið (v) - Tengingin þín verður trufluð í stutta stund á meðan myndmerkið er virkjað í fyrsta skipti",
+ "Microphone" : "Microphone",
"Camera" : "Myndavél",
"Remove" : "Fjarlægja",
"Exit fullscreen (f)" : "Hætta í skjáfylli (f)",
diff --git a/l10n/is.json b/l10n/is.json
index f0ff82bd9..b62e63342 100644
--- a/l10n/is.json
+++ b/l10n/is.json
@@ -62,6 +62,11 @@
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Samtal við {user1}, {user2}, {user3}, {user4} og {user5} (tímalengd {duration})",
"Talk to %s" : "Tala við %s",
"File is not shared, or shared but not with the user" : "Skránni er ekki deilt, eða henni er deilt en ekki með notandanum",
+ "File is too big" : "Skrá er of stór",
+ "Invalid file provided" : "Ógild skrá gefin",
+ "Invalid image" : "Ógild mynd",
+ "Unknown filetype" : "Óþekkt skráategund",
+ "An error occurred. Please contact your admin." : "Villa kom upp. Hafðu samband við kerfisstjóra.",
"%s invited you to a conversation." : "%s bauð þér að taka þátt í samtali.",
"You were invited to a conversation." : "Þér var boðið að taka þátt í samtali.",
"Conversation invitation" : "Boð í samtal",
@@ -336,6 +341,7 @@
"Path is already shared with this room" : "Slóðinni er þegar deilt með þessu spjallsvæði",
"Chat, video & audio-conferencing using WebRTC" : "Spjall, mynd- og hljóðfundir með WebRTC",
"Leave call" : "Hætta símtali",
+ "Duplicate session" : "Duplicate session",
"Share this file" : "Deila þessari skrá",
"Request password" : "Biðja um lykilorð",
"Error requesting the password." : "Villa kom upp við að biðja um lykilorð.",
@@ -362,6 +368,7 @@
"Enabled for" : "Virkjað fyrir",
"General settings" : "Almennar stillingar",
"All messages" : "Öll skilaboð",
+ "@-mentions only" : "@-mentions only",
"Off" : "Slökkt",
"Language" : "Tungumál",
"Country" : "Country",
@@ -387,6 +394,8 @@
"TURN server protocols" : "Samskiptareglur TURN-þjóns",
"Test this server" : "Prófa þennan þjón",
"TURN servers" : "TURN-miðlarar",
+ "OK" : "Í lagi",
+ "Checking …" : "Athuga …",
"Copy link" : "Afrita tengil",
"Waiting for others to join the call …" : "Bíð eftir að fleiri komi inn í símtalið …",
"You can invite others in the participant tab of the sidebar" : "Þú getur boðið öðrum að taka þátt af þátttakendaflipa hliðarspjaldsins",
@@ -395,6 +404,7 @@
"Dismiss" : "Hafna",
"Show your screen" : "Birta skjáinn þinn",
"Stop screensharing" : "Hætta skjádeilingu",
+ "More actions" : "Fleiri aðgerðir",
"No audio" : "Ekkert hljóð",
"Mute audio" : "Þagga hljóð",
"Disable video" : "Gera myndskeið óvirk",
@@ -408,37 +418,55 @@
"Please use a different browser like Firefox or Chrome to share your screen." : "Veldu einhvern annan vafra eins og Firefox eða Chrome til að deila skjánum þínum.",
"An error occurred while starting screensharing." : "Villa kom upp við að hefja skjádeilingu.",
"Back" : "Til baka",
+ "You have been muted by a moderator" : "You have been muted by a moderator",
"You" : "Þú",
"Show screen" : "Birta skjá",
+ "This conversation is read-only" : "This conversation is read-only",
"Favorite" : "Eftirlæti",
+ "Restricted" : "Takmarkað",
+ "Description" : "Lýsing",
+ "Notifications" : "Tilkynningar",
"Leave conversation" : "Hætta í samtali",
"Delete conversation" : "Eyða samtali",
"You need to promote a new moderator before you can leave the conversation." : "Þú þarft að uppfæra einhvern í stöðu umsjónarmanna áður en þú getur hætt í samtalinu.",
+ "Allow guests" : "Leyfa gesti",
"Password protection" : "Verndun með lykilorði",
"Enter a password" : "Settu inn lykilorð",
"Start time (optional)" : "Upphafstími (valfrjálst)",
"Save" : "Vista",
"Edit" : "Breyta",
+ "More information" : "Nánari upplýsingar",
+ "Delete" : "Eyða",
"Password" : "Lykilorð",
"API token" : "API-teikn",
"Login" : "Innskráning",
"Nickname" : "Stuttnefni",
"Client ID" : "Biðlaraauðkenni",
+ "Calls" : "Samtöl",
+ "Mark as read" : "Merkja sem lesið",
"Remove from favorites" : "Fjarlægja úr eftirlætum",
"Add to favorites" : "Bæta í eftirlæti",
"Loading" : "Hleð inn",
"Groups" : "Hópar",
"Circles" : "Hringir",
+ "Create a new group conversation" : "Create a new group conversation",
"Password protect" : "Verja með lykilorði",
+ "Add participants" : "Bæta við þátttakanda",
"Close" : "Loka",
"Conversation name" : "Heiti samtals",
+ "You are currently waiting in the lobby" : "You are currently waiting in the lobby",
+ "Unread messages" : "Ólesin skilaboð",
+ "Message sent" : "Skilaboðin hafa verið send",
"Reply" : "Svara",
+ "Mark as unread" : "Merkja allt sem ólesið",
"Go to file" : "Fara í skrá",
+ "Contact" : "Tengiliður",
"Today" : "Í dag",
"Yesterday" : "Í gær",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
"Send message" : "Senda skilaboð",
"File to share" : "Skrá til að deila",
+ "Write message, @ to mention someone …" : "Write message, @ to mention someone …",
"Invalid path selected" : "Ógild slóð valin",
"moderator" : "umsjónarmaður",
"guest" : "gestanotandi",
@@ -450,7 +478,10 @@
"Add users or groups" : "Bæta við notendum eða hópum",
"Participants" : "Þátttakendur",
"Chat" : "Spjall",
+ "Details" : "Details",
"Settings" : "Stillingar",
+ "Projects" : "Verkefni",
+ "Privacy" : "Gagnaleynd",
"Keyboard shortcuts" : "Flýtileiðir á lyklaborði",
"Search" : "Search",
"Start call" : "Hefja samtal",
@@ -461,6 +492,14 @@
"Select conversation" : "Veldu samtal",
"Link to a conversation" : "Tengill á samtal",
"Join a conversation or start a new one" : "Taktu þátt í samtali eða byrjaðu nýtt samtal",
+ "Media" : "Margmiðlunargögn",
+ "Files" : "Skrár",
+ "Locations" : "Staðsetningar",
+ "Audio" : "Hljóð",
+ "Other" : "Annað",
+ "Do not disturb" : "Ónáðið ekki",
+ "Away" : "Fjarverandi",
+ "Error while sharing file" : "Villa við deilingu skráar",
"Default" : "Sjálfgefið",
"Access to microphone & camera is only possible with HTTPS" : "Aðgangur að hljóðnema og myndavél er einungis mögulegur í gegnum HTTPS",
"Please move your setup to HTTPS" : "Endilega færðu uppsetninguna þína yfir í HTTPS",
@@ -486,6 +525,7 @@
"Disable video (v)" : "Gera myndskeið óvirk (v)",
"Enable video (v)" : "Virkja myndskeið (v)",
"Enable video (v) - Your connection will be briefly interrupted when enabling the video for the first time" : "Virkja myndskeið (v) - Tengingin þín verður trufluð í stutta stund á meðan myndmerkið er virkjað í fyrsta skipti",
+ "Microphone" : "Microphone",
"Camera" : "Myndavél",
"Remove" : "Fjarlægja",
"Exit fullscreen (f)" : "Hætta í skjáfylli (f)",
diff --git a/l10n/it.js b/l10n/it.js
index abc056587..918868e2a 100644
--- a/l10n/it.js
+++ b/l10n/it.js
@@ -899,6 +899,7 @@ OC.L10N.register(
"No search results" : "Nessun risultato di ricerca",
"Groups" : "Gruppi",
"Circles" : "Cerchie",
+ "Unread mentions" : "Menzioni non lette",
"Talk settings" : "Impostazioni di Talk",
"Users, groups and circles" : "Utenti, gruppi e cerchie",
"Users and groups" : "Utenti e gruppi",
@@ -1034,6 +1035,8 @@ OC.L10N.register(
"Details" : "Dettagli",
"Settings" : "Impostazioni",
"Participants ({count})" : "Partecipanti ({count})",
+ "Projects" : "Progetti",
+ "Show all files" : "Mostra tutti i file",
"Meeting ID: {meetingId}" : "ID riunione: {meetingId}",
"Your PIN: {attendeePin}" : "Il tuo PIN: {attendeePin}",
"Attachments folder" : "Cartella degli allegati",
@@ -1102,6 +1105,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Errore durante l'accesso al microfono",
"Access to camera is only possible with HTTPS" : "L'accesso alla fotocamera è possibile solo con HTTPS",
"An error occurred while fetching the participants" : "Si è verificato un errore durante il recupero dei partecipanti",
+ "Media" : "Media",
+ "Files" : "File",
+ "Locations" : "Posizioni",
+ "Audio" : "Audio",
+ "Other" : "Altro",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk è stato aggiornato, ricarica la pagina",
"Do not disturb" : "Non disturbare",
"Away" : "Assente",
diff --git a/l10n/it.json b/l10n/it.json
index ec40e3595..46582069b 100644
--- a/l10n/it.json
+++ b/l10n/it.json
@@ -897,6 +897,7 @@
"No search results" : "Nessun risultato di ricerca",
"Groups" : "Gruppi",
"Circles" : "Cerchie",
+ "Unread mentions" : "Menzioni non lette",
"Talk settings" : "Impostazioni di Talk",
"Users, groups and circles" : "Utenti, gruppi e cerchie",
"Users and groups" : "Utenti e gruppi",
@@ -1032,6 +1033,8 @@
"Details" : "Dettagli",
"Settings" : "Impostazioni",
"Participants ({count})" : "Partecipanti ({count})",
+ "Projects" : "Progetti",
+ "Show all files" : "Mostra tutti i file",
"Meeting ID: {meetingId}" : "ID riunione: {meetingId}",
"Your PIN: {attendeePin}" : "Il tuo PIN: {attendeePin}",
"Attachments folder" : "Cartella degli allegati",
@@ -1100,6 +1103,11 @@
"Error while accessing microphone" : "Errore durante l'accesso al microfono",
"Access to camera is only possible with HTTPS" : "L'accesso alla fotocamera è possibile solo con HTTPS",
"An error occurred while fetching the participants" : "Si è verificato un errore durante il recupero dei partecipanti",
+ "Media" : "Media",
+ "Files" : "File",
+ "Locations" : "Posizioni",
+ "Audio" : "Audio",
+ "Other" : "Altro",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk è stato aggiornato, ricarica la pagina",
"Do not disturb" : "Non disturbare",
"Away" : "Assente",
diff --git a/l10n/ja.js b/l10n/ja.js
index 662e6d562..8fd34a759 100644
--- a/l10n/ja.js
+++ b/l10n/ja.js
@@ -631,6 +631,7 @@ OC.L10N.register(
"TURN servers" : "TURNサーバー",
"A TURN server is used to proxy the traffic from participants behind a firewall. If individual participants cannot connect to others a TURN server is most likely required. See {linkstart}this documentation{linkend} for setup instructions." : "TURNサーバーは、ファイアウォールの内側で参加者からのトラフィックをプロキシするために使用されます。個々の参加者が他の参加者に接続できない場合は、TURNサーバーが必要になる可能性があります。セットアップ手順については、{linkstart}このドキュメント{linkend}を参照してください。",
"OK" : "OK",
+ "Checking …" : "チェック中…",
"{nickName} raised their hand." : "{nickName} が挙手しました",
"A participant raised their hand." : "参加者が挙手しました",
"Collapse stripe" : "スレッドを折りたたむ",
@@ -712,6 +713,7 @@ OC.L10N.register(
"Call in progress" : "呼び出し中",
"Favorite" : "お気に入り",
"All permissions" : "すべての権限",
+ "Restricted" : "制限付き",
"Edit permissions" : "権限を編集",
"Conversation settings" : "会話設定",
"Description" : "詳細",
@@ -983,6 +985,8 @@ OC.L10N.register(
"Chat" : "チャット",
"Details" : "詳細",
"Settings" : "設定",
+ "Projects" : "プロジェクト",
+ "Show all files" : "すべてのファイルを表示",
"Meeting ID: {meetingId}" : "ミーティングID: {meetingId}",
"Your PIN: {attendeePin}" : "PIN: {attendeePin}",
"Attachments folder" : "添付ファイルフォルダー",
@@ -1049,6 +1053,11 @@ OC.L10N.register(
"Error while accessing microphone" : "マイクへのアクセス中にエラーが発生しました",
"Access to camera is only possible with HTTPS" : "カメラへのアクセスはHTTPSでのみ可能です",
"An error occurred while fetching the participants" : "参加者の取得中にエラーが発生しました。",
+ "Media" : "メディア",
+ "Files" : "ファイル",
+ "Locations" : "場所",
+ "Audio" : "オーディオ",
+ "Other" : "その他",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talkを更新しました。ページをリロードしてください。",
"Do not disturb" : "取り込み中",
"Away" : "離席中",
@@ -1140,6 +1149,7 @@ OC.L10N.register(
"Video on and off" : "ビデオのオンとオフ",
"Choose in which folder attachments should be saved." : "添付ファイルを保存するフォルダーを選択します。",
"Exit fullscreen (f)" : "全画面終了 (f)",
- "Fullscreen (f)" : "全画面 (f)"
+ "Fullscreen (f)" : "全画面 (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "現在の会話の通知レベルを設定します。これから受信する通知にのみ有効です。"
},
"nplurals=1; plural=0;");
diff --git a/l10n/ja.json b/l10n/ja.json
index e6e6bd906..08256b49c 100644
--- a/l10n/ja.json
+++ b/l10n/ja.json
@@ -629,6 +629,7 @@
"TURN servers" : "TURNサーバー",
"A TURN server is used to proxy the traffic from participants behind a firewall. If individual participants cannot connect to others a TURN server is most likely required. See {linkstart}this documentation{linkend} for setup instructions." : "TURNサーバーは、ファイアウォールの内側で参加者からのトラフィックをプロキシするために使用されます。個々の参加者が他の参加者に接続できない場合は、TURNサーバーが必要になる可能性があります。セットアップ手順については、{linkstart}このドキュメント{linkend}を参照してください。",
"OK" : "OK",
+ "Checking …" : "チェック中…",
"{nickName} raised their hand." : "{nickName} が挙手しました",
"A participant raised their hand." : "参加者が挙手しました",
"Collapse stripe" : "スレッドを折りたたむ",
@@ -710,6 +711,7 @@
"Call in progress" : "呼び出し中",
"Favorite" : "お気に入り",
"All permissions" : "すべての権限",
+ "Restricted" : "制限付き",
"Edit permissions" : "権限を編集",
"Conversation settings" : "会話設定",
"Description" : "詳細",
@@ -981,6 +983,8 @@
"Chat" : "チャット",
"Details" : "詳細",
"Settings" : "設定",
+ "Projects" : "プロジェクト",
+ "Show all files" : "すべてのファイルを表示",
"Meeting ID: {meetingId}" : "ミーティングID: {meetingId}",
"Your PIN: {attendeePin}" : "PIN: {attendeePin}",
"Attachments folder" : "添付ファイルフォルダー",
@@ -1047,6 +1051,11 @@
"Error while accessing microphone" : "マイクへのアクセス中にエラーが発生しました",
"Access to camera is only possible with HTTPS" : "カメラへのアクセスはHTTPSでのみ可能です",
"An error occurred while fetching the participants" : "参加者の取得中にエラーが発生しました。",
+ "Media" : "メディア",
+ "Files" : "ファイル",
+ "Locations" : "場所",
+ "Audio" : "オーディオ",
+ "Other" : "その他",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talkを更新しました。ページをリロードしてください。",
"Do not disturb" : "取り込み中",
"Away" : "離席中",
@@ -1138,6 +1147,7 @@
"Video on and off" : "ビデオのオンとオフ",
"Choose in which folder attachments should be saved." : "添付ファイルを保存するフォルダーを選択します。",
"Exit fullscreen (f)" : "全画面終了 (f)",
- "Fullscreen (f)" : "全画面 (f)"
+ "Fullscreen (f)" : "全画面 (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "現在の会話の通知レベルを設定します。これから受信する通知にのみ有効です。"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/l10n/ka_GE.js b/l10n/ka_GE.js
index c00409869..d7c7a6159 100644
--- a/l10n/ka_GE.js
+++ b/l10n/ka_GE.js
@@ -13,6 +13,11 @@ OC.L10N.register(
"Talk" : "საუბარი",
"Guest" : "სტუმარი",
"Talk to %s" : "საუბარი მომხმარებელთან %s",
+ "File is too big" : "ფაილი ზედმეტად დიდია",
+ "Invalid file provided" : "არასწორი ფაილი",
+ "Invalid image" : "არასწორი სურათი",
+ "Unknown filetype" : "ამოუცნობი ფაილის ტიპი",
+ "An error occurred. Please contact your admin." : "წარმოიშვა შეცდომა. გთხოვთ დაუკავშირდეთ თქვენს ადმინისტრატორს.",
"Join call" : "შეუერთდით ზარს",
"A group call has started in {call}" : "ჯგუფური ზარი დაიწყო {call}-ში",
"Open settings" : "პარამეტრების გახსნა",
@@ -42,6 +47,8 @@ OC.L10N.register(
"STUN servers" : "STUN სერვერები",
"A STUN server is used to determine the public IP address of participants behind a router." : "STUN სერვერი როუტერს მიღმა მყოფი მონაწილეების ღია IP მისამართების დადგენისთვის.",
"TURN server protocols" : "TURN სერვერის პროტოკოლები",
+ "OK" : "კარგი",
+ "Checking …" : "მოწმდება ...",
"Copy link" : "ბმულის კოპირება",
"Waiting for others to join the call …" : "ზარში შემოსვლისთვის ველოდებით სხვებს …",
"You can invite others in the participant tab of the sidebar" : "შეგიძლიათ სხვები მოიწვიოთ გვერდით ბარში, მონაწილებიის ტაბულით",
@@ -49,6 +56,7 @@ OC.L10N.register(
"Dismiss" : "დათხოვნა",
"Show your screen" : "თქვენი ეკრანის ჩვენება",
"Stop screensharing" : "ეკრანის გაზიარების გათიშვა",
+ "More actions" : "მეტი ქმედება",
"Mute audio" : "ხმის ჩახშობა",
"Disable video" : "ვიდეოს გათიშვა",
"Enable video" : "ვიდეოს ამოქმედება",
@@ -64,15 +72,21 @@ OC.L10N.register(
"You" : "თქვენ",
"Show screen" : "ეკრანის ჩვენება",
"Favorite" : "რჩეული",
+ "Restricted" : "აკრძალული",
+ "Description" : "აღწერილობა",
+ "Notifications" : "შეტყობინებები",
"Password protection" : "პაროლით თავდაცვა",
"Enter a password" : "შეიყვანეთ პაროლი",
"Save" : "შენახვა",
"Edit" : "შეცვლა",
+ "Delete" : "წაშლა",
"Password" : "პაროლი",
"API token" : "API ტოკენი",
"Login" : "ავტორიზაცია",
"Nickname" : "ნიკნეიმი",
"Client ID" : "კლიენტის ID",
+ "Calls" : "ზარები",
+ "Mark as read" : "წაკითხულად მონიშვნა",
"Remove from favorites" : "რჩეულებიდან ამოშლა",
"Add to favorites" : "რჩეულებში დამატება",
"Loading" : "იტვირთება",
@@ -81,7 +95,10 @@ OC.L10N.register(
"Password protect" : "პაროლით დაცვა",
"Close" : "დახურვა",
"Conversation name" : "საუბრის სახელწოდება",
+ "Message sent" : "წერილი გაგზავნილია",
"Reply" : "პასუხი",
+ "Mark as unread" : "წაუკითხავად მონიშვნა",
+ "Contact" : "კონტაქტი",
"Today" : "დღეს",
"Yesterday" : "გუშინ",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -93,10 +110,15 @@ OC.L10N.register(
"Add users or groups" : "დაამატეთ მომხმარებლები ან ჯგუფები",
"Participants" : "მონაწილეები",
"Chat" : "ჩეთი",
+ "Details" : "დეტალები",
"Settings" : "პარამეტრები",
+ "Privacy" : "კონფიდენციალურობა",
"Keyboard shortcuts" : "კლავიატურის კომბინაციები",
"Search" : "ძიება",
"Send" : "გაგზავნა",
+ "Files" : "ფაილები",
+ "Audio" : "აუდიო",
+ "Other" : "სხვა",
"Default" : "საწყისი",
"Access to microphone & camera is only possible with HTTPS" : "წვდომა მიკროფონთან და კამერასთან მხარდაჭერილია მხოლოდ HTTPS პროტოკოლით",
"Access to microphone & camera was denied" : "წვდომა მიკროფონზე და კამერაზე აიკრძალა",
diff --git a/l10n/ka_GE.json b/l10n/ka_GE.json
index 757fc830b..662b89a88 100644
--- a/l10n/ka_GE.json
+++ b/l10n/ka_GE.json
@@ -11,6 +11,11 @@
"Talk" : "საუბარი",
"Guest" : "სტუმარი",
"Talk to %s" : "საუბარი მომხმარებელთან %s",
+ "File is too big" : "ფაილი ზედმეტად დიდია",
+ "Invalid file provided" : "არასწორი ფაილი",
+ "Invalid image" : "არასწორი სურათი",
+ "Unknown filetype" : "ამოუცნობი ფაილის ტიპი",
+ "An error occurred. Please contact your admin." : "წარმოიშვა შეცდომა. გთხოვთ დაუკავშირდეთ თქვენს ადმინისტრატორს.",
"Join call" : "შეუერთდით ზარს",
"A group call has started in {call}" : "ჯგუფური ზარი დაიწყო {call}-ში",
"Open settings" : "პარამეტრების გახსნა",
@@ -40,6 +45,8 @@
"STUN servers" : "STUN სერვერები",
"A STUN server is used to determine the public IP address of participants behind a router." : "STUN სერვერი როუტერს მიღმა მყოფი მონაწილეების ღია IP მისამართების დადგენისთვის.",
"TURN server protocols" : "TURN სერვერის პროტოკოლები",
+ "OK" : "კარგი",
+ "Checking …" : "მოწმდება ...",
"Copy link" : "ბმულის კოპირება",
"Waiting for others to join the call …" : "ზარში შემოსვლისთვის ველოდებით სხვებს …",
"You can invite others in the participant tab of the sidebar" : "შეგიძლიათ სხვები მოიწვიოთ გვერდით ბარში, მონაწილებიის ტაბულით",
@@ -47,6 +54,7 @@
"Dismiss" : "დათხოვნა",
"Show your screen" : "თქვენი ეკრანის ჩვენება",
"Stop screensharing" : "ეკრანის გაზიარების გათიშვა",
+ "More actions" : "მეტი ქმედება",
"Mute audio" : "ხმის ჩახშობა",
"Disable video" : "ვიდეოს გათიშვა",
"Enable video" : "ვიდეოს ამოქმედება",
@@ -62,15 +70,21 @@
"You" : "თქვენ",
"Show screen" : "ეკრანის ჩვენება",
"Favorite" : "რჩეული",
+ "Restricted" : "აკრძალული",
+ "Description" : "აღწერილობა",
+ "Notifications" : "შეტყობინებები",
"Password protection" : "პაროლით თავდაცვა",
"Enter a password" : "შეიყვანეთ პაროლი",
"Save" : "შენახვა",
"Edit" : "შეცვლა",
+ "Delete" : "წაშლა",
"Password" : "პაროლი",
"API token" : "API ტოკენი",
"Login" : "ავტორიზაცია",
"Nickname" : "ნიკნეიმი",
"Client ID" : "კლიენტის ID",
+ "Calls" : "ზარები",
+ "Mark as read" : "წაკითხულად მონიშვნა",
"Remove from favorites" : "რჩეულებიდან ამოშლა",
"Add to favorites" : "რჩეულებში დამატება",
"Loading" : "იტვირთება",
@@ -79,7 +93,10 @@
"Password protect" : "პაროლით დაცვა",
"Close" : "დახურვა",
"Conversation name" : "საუბრის სახელწოდება",
+ "Message sent" : "წერილი გაგზავნილია",
"Reply" : "პასუხი",
+ "Mark as unread" : "წაუკითხავად მონიშვნა",
+ "Contact" : "კონტაქტი",
"Today" : "დღეს",
"Yesterday" : "გუშინ",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -91,10 +108,15 @@
"Add users or groups" : "დაამატეთ მომხმარებლები ან ჯგუფები",
"Participants" : "მონაწილეები",
"Chat" : "ჩეთი",
+ "Details" : "დეტალები",
"Settings" : "პარამეტრები",
+ "Privacy" : "კონფიდენციალურობა",
"Keyboard shortcuts" : "კლავიატურის კომბინაციები",
"Search" : "ძიება",
"Send" : "გაგზავნა",
+ "Files" : "ფაილები",
+ "Audio" : "აუდიო",
+ "Other" : "სხვა",
"Default" : "საწყისი",
"Access to microphone & camera is only possible with HTTPS" : "წვდომა მიკროფონთან და კამერასთან მხარდაჭერილია მხოლოდ HTTPS პროტოკოლით",
"Access to microphone & camera was denied" : "წვდომა მიკროფონზე და კამერაზე აიკრძალა",
diff --git a/l10n/ko.js b/l10n/ko.js
index caa5e5e91..915dabac2 100644
--- a/l10n/ko.js
+++ b/l10n/ko.js
@@ -110,6 +110,11 @@ OC.L10N.register(
"Talk to %s" : "%s 님과 대화",
"File is not shared, or shared but not with the user" : "파일이 공유 되지 않았거나 파일이 유저를 포함하지 않고 공유됨",
"No account available to delete." : "삭제할 수 있는 계정이 없습니다.",
+ "File is too big" : "파일이 너무 큼",
+ "Invalid file provided" : "잘못된 파일 지정됨",
+ "Invalid image" : "잘못된 사진",
+ "Unknown filetype" : "알 수 없는 파일 형식",
+ "An error occurred. Please contact your admin." : "오류가 발생했습니다. 시스템 관리자에게 연락하십시오.",
"Talk mentions" : "토크 언급",
"Write to conversation" : "대화를 적다.",
"Writes event information into a conversation of your choice" : "원하는 대화에 이벤트 정보 기록",
@@ -560,6 +565,8 @@ OC.L10N.register(
"Testing whether the TURN server returns ICE candidates" : "TURN 서버가 ICE 후보를 반환하는지 테스트",
"Test this server" : "이 서버 테스트",
"TURN servers" : "TURN 서버",
+ "OK" : "확인",
+ "Checking …" : "검사 중…",
"A participant raised their hand." : "한 참가자가 손을 들었다.",
"Previous page of videos" : "비디오의 이전 페이지",
"Next page of videos" : "비디오의 다음 페이지",
@@ -622,8 +629,10 @@ OC.L10N.register(
"Drop your files to upload" : "업로드를 하려면 파일을 올리시오.",
"Call in progress" : "통화중",
"Favorite" : "즐겨찾기",
+ "Restricted" : "제한됨",
"Conversation settings" : "대화 환경설정",
"Description" : "설명",
+ "Notifications" : "알림",
"Guests access" : "손님 접근",
"Meeting settings" : "미팅 설정",
"Error while updating conversation description" : "대화 설명을 업데이트하는 중 오류 발생",
@@ -711,6 +720,7 @@ OC.L10N.register(
"not running, check Matterbridge log" : "실행 중이지 않습니다. Matterbridge 로그를 확인하십시오.",
"not running" : "실행 중이지 않습니다.",
"Bridge saved" : "연결 저장",
+ "Calls" : "통화",
"Allow participants to join from a phone." : "참가자의 전화 참여를 허용합니다.",
"Enable SIP dial-in" : "SIP서버에 사용",
"SIP dial-in is now enabled" : "이제 SIP 전화 접속이 활성화됨",
@@ -722,6 +732,7 @@ OC.L10N.register(
"Edit conversation description" : "대화 설명 편집",
"The description must be less than or equal to {maxLength} characters long. Your current text is {charactersCount} characters long." : "설명은 {maxLength} 자 미만이어야 합니다. 현재 텍스트 길이는 {chartersCount} 자입니다.",
"Choose devices" : "장치 선택",
+ "Mark as read" : "읽은 것으로 표시",
"Remove from favorites" : "즐겨찾기에서 제거",
"Add to favorites" : "즐겨찾기에 추가",
"Joining conversation …" : "대화에 참여하는 중 ...",
@@ -757,15 +768,26 @@ OC.L10N.register(
"Select microphone" : "마이크 선택",
"No camera available" : "사용가능한 카메라 없음",
"Select camera" : "카메라 선택",
+ "Unread messages" : "읽지 않은 메세지",
"Sending message" : "메시지 전송",
"Message sent" : "보낸 메시지",
"Message read by everyone who shares their reading status" : "읽기 상태를 공유하는 모든 사용자가 읽은 메시지",
+ "Deleting message" : "메시지 삭제",
+ "Message deleted successfully, but Matterbridge is configured and the message might already be distributed to other services" : "메시지가 성공적으로 삭제되었으나, Matterbridge가 설정되어 다른 서비스에 메시지가 이미 전송되었을 수 있습니다.",
+ "Message deleted successfully" : "메시지가 성공적으로 삭제됨",
+ "Message could not be deleted because it is too old" : "메시지가 너무 오래되어 삭제할 수 없습니다",
+ "Only normal chat messages can be deleted" : "일반 채팅 메시지만 삭제할 수 있습니다",
+ "An error occurred while deleting the message" : "메시지를 지우는 중 오류 발생",
"Reply" : "답장",
+ "Reply privately" : "비공개로 답장",
+ "Mark as unread" : "읽지 않은 것으로 표시",
"Go to file" : "파일로 이동",
+ "Contact" : "연락처",
"Scroll to bottom" : "맨 아래로 스크롤",
"Today" : "오늘",
"Yesterday" : "어제",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
+ "Record voice message" : "음성 메시지 녹음",
"Share files to the conversation" : "대화로 파일 공유",
"Upload new files" : "새로운 파일 업로드",
"Share from Files" : "파일 공유",
@@ -804,7 +826,10 @@ OC.L10N.register(
"Search or add participants" : "참가자 검색 및 추가",
"An error occurred while adding the participants" : "참가자를 추가하는 동안 오류가 발생했습니다.",
"Chat" : "대화",
+ "Details" : "세부사항",
"Settings" : "설정",
+ "Projects" : "프로젝트",
+ "Show all files" : "모든 파일 보기",
"Meeting ID: {meetingId}" : "미팅 아이디 : {meetingId}",
"Your PIN: {attendeePin}" : "당신의 PIN : {attendeePin}",
"Attachments folder" : "첨부 파일 폴더",
@@ -854,6 +879,10 @@ OC.L10N.register(
"Error while accessing microphone" : "마이크 액세스 중 오류 발생",
"Access to camera is only possible with HTTPS" : "카메라에 대한 액세스는 HTTPS를 통해서만 가능합니다.",
"An error occurred while fetching the participants" : "참가자를 가져오는 동안 오류가 발생했습니다.",
+ "Media" : "미디어",
+ "Files" : "파일",
+ "Audio" : "오디오",
+ "Other" : "기타",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud 토크가 업데이트되었습니다. 페이지를 다시 로드하십시오.",
"Do not disturb" : "방해 금지",
"Away" : "자리 비움",
diff --git a/l10n/ko.json b/l10n/ko.json
index 6e4863ff7..ebf241410 100644
--- a/l10n/ko.json
+++ b/l10n/ko.json
@@ -108,6 +108,11 @@
"Talk to %s" : "%s 님과 대화",
"File is not shared, or shared but not with the user" : "파일이 공유 되지 않았거나 파일이 유저를 포함하지 않고 공유됨",
"No account available to delete." : "삭제할 수 있는 계정이 없습니다.",
+ "File is too big" : "파일이 너무 큼",
+ "Invalid file provided" : "잘못된 파일 지정됨",
+ "Invalid image" : "잘못된 사진",
+ "Unknown filetype" : "알 수 없는 파일 형식",
+ "An error occurred. Please contact your admin." : "오류가 발생했습니다. 시스템 관리자에게 연락하십시오.",
"Talk mentions" : "토크 언급",
"Write to conversation" : "대화를 적다.",
"Writes event information into a conversation of your choice" : "원하는 대화에 이벤트 정보 기록",
@@ -558,6 +563,8 @@
"Testing whether the TURN server returns ICE candidates" : "TURN 서버가 ICE 후보를 반환하는지 테스트",
"Test this server" : "이 서버 테스트",
"TURN servers" : "TURN 서버",
+ "OK" : "확인",
+ "Checking …" : "검사 중…",
"A participant raised their hand." : "한 참가자가 손을 들었다.",
"Previous page of videos" : "비디오의 이전 페이지",
"Next page of videos" : "비디오의 다음 페이지",
@@ -620,8 +627,10 @@
"Drop your files to upload" : "업로드를 하려면 파일을 올리시오.",
"Call in progress" : "통화중",
"Favorite" : "즐겨찾기",
+ "Restricted" : "제한됨",
"Conversation settings" : "대화 환경설정",
"Description" : "설명",
+ "Notifications" : "알림",
"Guests access" : "손님 접근",
"Meeting settings" : "미팅 설정",
"Error while updating conversation description" : "대화 설명을 업데이트하는 중 오류 발생",
@@ -709,6 +718,7 @@
"not running, check Matterbridge log" : "실행 중이지 않습니다. Matterbridge 로그를 확인하십시오.",
"not running" : "실행 중이지 않습니다.",
"Bridge saved" : "연결 저장",
+ "Calls" : "통화",
"Allow participants to join from a phone." : "참가자의 전화 참여를 허용합니다.",
"Enable SIP dial-in" : "SIP서버에 사용",
"SIP dial-in is now enabled" : "이제 SIP 전화 접속이 활성화됨",
@@ -720,6 +730,7 @@
"Edit conversation description" : "대화 설명 편집",
"The description must be less than or equal to {maxLength} characters long. Your current text is {charactersCount} characters long." : "설명은 {maxLength} 자 미만이어야 합니다. 현재 텍스트 길이는 {chartersCount} 자입니다.",
"Choose devices" : "장치 선택",
+ "Mark as read" : "읽은 것으로 표시",
"Remove from favorites" : "즐겨찾기에서 제거",
"Add to favorites" : "즐겨찾기에 추가",
"Joining conversation …" : "대화에 참여하는 중 ...",
@@ -755,15 +766,26 @@
"Select microphone" : "마이크 선택",
"No camera available" : "사용가능한 카메라 없음",
"Select camera" : "카메라 선택",
+ "Unread messages" : "읽지 않은 메세지",
"Sending message" : "메시지 전송",
"Message sent" : "보낸 메시지",
"Message read by everyone who shares their reading status" : "읽기 상태를 공유하는 모든 사용자가 읽은 메시지",
+ "Deleting message" : "메시지 삭제",
+ "Message deleted successfully, but Matterbridge is configured and the message might already be distributed to other services" : "메시지가 성공적으로 삭제되었으나, Matterbridge가 설정되어 다른 서비스에 메시지가 이미 전송되었을 수 있습니다.",
+ "Message deleted successfully" : "메시지가 성공적으로 삭제됨",
+ "Message could not be deleted because it is too old" : "메시지가 너무 오래되어 삭제할 수 없습니다",
+ "Only normal chat messages can be deleted" : "일반 채팅 메시지만 삭제할 수 있습니다",
+ "An error occurred while deleting the message" : "메시지를 지우는 중 오류 발생",
"Reply" : "답장",
+ "Reply privately" : "비공개로 답장",
+ "Mark as unread" : "읽지 않은 것으로 표시",
"Go to file" : "파일로 이동",
+ "Contact" : "연락처",
"Scroll to bottom" : "맨 아래로 스크롤",
"Today" : "오늘",
"Yesterday" : "어제",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
+ "Record voice message" : "음성 메시지 녹음",
"Share files to the conversation" : "대화로 파일 공유",
"Upload new files" : "새로운 파일 업로드",
"Share from Files" : "파일 공유",
@@ -802,7 +824,10 @@
"Search or add participants" : "참가자 검색 및 추가",
"An error occurred while adding the participants" : "참가자를 추가하는 동안 오류가 발생했습니다.",
"Chat" : "대화",
+ "Details" : "세부사항",
"Settings" : "설정",
+ "Projects" : "프로젝트",
+ "Show all files" : "모든 파일 보기",
"Meeting ID: {meetingId}" : "미팅 아이디 : {meetingId}",
"Your PIN: {attendeePin}" : "당신의 PIN : {attendeePin}",
"Attachments folder" : "첨부 파일 폴더",
@@ -852,6 +877,10 @@
"Error while accessing microphone" : "마이크 액세스 중 오류 발생",
"Access to camera is only possible with HTTPS" : "카메라에 대한 액세스는 HTTPS를 통해서만 가능합니다.",
"An error occurred while fetching the participants" : "참가자를 가져오는 동안 오류가 발생했습니다.",
+ "Media" : "미디어",
+ "Files" : "파일",
+ "Audio" : "오디오",
+ "Other" : "기타",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud 토크가 업데이트되었습니다. 페이지를 다시 로드하십시오.",
"Do not disturb" : "방해 금지",
"Away" : "자리 비움",
diff --git a/l10n/lt_LT.js b/l10n/lt_LT.js
index 616cd9a40..5da8efc63 100644
--- a/l10n/lt_LT.js
+++ b/l10n/lt_LT.js
@@ -486,9 +486,12 @@ OC.L10N.register(
"Show screen" : "Rodyti ekraną",
"Mute" : "Nutildyti",
"This conversation is read-only" : "Šis pokalbis yra tik skaitymui",
+ "Drop your files to upload" : "Tempkite failus, norėdami juos išsiųsti",
"Favorite" : "Mėgstamas",
+ "Restricted" : "Apribota",
"Conversation settings" : "Pokalbio nustatymai",
"Description" : "Aprašas",
+ "Notifications" : "Pranešimai",
"Meeting settings" : "Susitikimo nustatymai",
"Danger zone" : "Pavojinga zona",
"Error while updating conversation description" : "Klaida atnaujinant pokalbio aprašą",
@@ -498,6 +501,7 @@ OC.L10N.register(
"You need to promote a new moderator before you can leave the conversation." : "Prieš išeidami iš pokalbio, turite paaukštinti naują moderatorių.",
"Do you really want to delete \"{displayName}\"?" : "Ar tikrai norite ištrinti \"{displayName}\"?",
"Error while deleting conversation" : "Klaida ištrinant pokalbį",
+ "Allow guests" : "Leisti svečius",
"Password protection" : "Apsauga slaptažodžiu",
"Enter a password" : "Enter a password",
"Save password" : "Įrašyti slaptažodį",
@@ -539,6 +543,7 @@ OC.L10N.register(
"MUC server URL" : "MUC serverio URL",
"Jabber ID" : "Jabber ID",
"unknown state" : "nežinoma būsena",
+ "Calls" : "Skambučiai",
"Choose devices" : "Pasirinkti įrenginius",
"Mark as read" : "Žymėti kaip skaitytą",
"Remove from favorites" : "Šalinti iš mėgstamų",
@@ -586,6 +591,7 @@ OC.L10N.register(
"Mark as unread" : "Žymėti kaip neskaitytą",
"Go to file" : "Pereiti į failą",
"Forward message" : "Persiųsti žinutę",
+ "Contact" : "Adresatas",
"Remove {fileName}" : "Šalinti {fileName}",
"Error while forwarding message" : "Klaida persiunčiant žinutę",
"Scroll to bottom" : "Slinkti į apačią",
@@ -593,6 +599,7 @@ OC.L10N.register(
"Yesterday" : "Vakar",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
"Microphone either not available or disabled in settings" : "Mikrofonas arba neprieinamas, arba išjungtas nustatymuose",
+ "Upload new files" : "Išsiųsti naujus failus",
"Share from Files" : "Bendrinti iš Failų",
"Add emoji" : "Pridėti šypsenėlę",
"Send message" : "Siųsti žinutę",
@@ -607,6 +614,7 @@ OC.L10N.register(
"Promote to moderator" : "Paaukštinti į moderatorius",
"Resend invitation" : "Siųsti pakvietimą iš naujo",
"Remove participant" : "Šalinti dalyvį",
+ "Add users" : "Pridėti naudotojus",
"Add groups" : "Pridėti grupes",
"Add emails" : "Pridėti el. paštus",
"Add circles" : "Pridėti ratus",
@@ -620,6 +628,8 @@ OC.L10N.register(
"Chat" : "Pokalbis",
"Details" : "Išsamiau",
"Settings" : "Nustatymai",
+ "Projects" : "Projektai",
+ "Show all files" : "Rodyti visus failus",
"Meeting ID: {meetingId}" : "Susitikimo ID: {meetingId}",
"Your PIN: {attendeePin}" : "Jūsų PIN kodas: {attendeePin}",
"Attachments folder" : "Priedų aplankas",
@@ -653,6 +663,10 @@ OC.L10N.register(
"Error while accessing microphone" : "Klaida gaunant prieigą prie mikrofono",
"Access to camera is only possible with HTTPS" : "Prieiga prie kameros yra įmanoma tik naudojant HTTPS",
"An error occurred while fetching the participants" : "Gaunant dalyvius, įvyko klaida",
+ "Media" : "Medija",
+ "Files" : "Failai",
+ "Locations" : "Vietos",
+ "Other" : "Kita",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Pokalbiai buvo atnaujinti, įkelkite puslapį iš naujo",
"Do not disturb" : "Netrukdyti",
"Away" : "Atsitraukęs",
diff --git a/l10n/lt_LT.json b/l10n/lt_LT.json
index 8d1b5894f..e25eb83da 100644
--- a/l10n/lt_LT.json
+++ b/l10n/lt_LT.json
@@ -484,9 +484,12 @@
"Show screen" : "Rodyti ekraną",
"Mute" : "Nutildyti",
"This conversation is read-only" : "Šis pokalbis yra tik skaitymui",
+ "Drop your files to upload" : "Tempkite failus, norėdami juos išsiųsti",
"Favorite" : "Mėgstamas",
+ "Restricted" : "Apribota",
"Conversation settings" : "Pokalbio nustatymai",
"Description" : "Aprašas",
+ "Notifications" : "Pranešimai",
"Meeting settings" : "Susitikimo nustatymai",
"Danger zone" : "Pavojinga zona",
"Error while updating conversation description" : "Klaida atnaujinant pokalbio aprašą",
@@ -496,6 +499,7 @@
"You need to promote a new moderator before you can leave the conversation." : "Prieš išeidami iš pokalbio, turite paaukštinti naują moderatorių.",
"Do you really want to delete \"{displayName}\"?" : "Ar tikrai norite ištrinti \"{displayName}\"?",
"Error while deleting conversation" : "Klaida ištrinant pokalbį",
+ "Allow guests" : "Leisti svečius",
"Password protection" : "Apsauga slaptažodžiu",
"Enter a password" : "Enter a password",
"Save password" : "Įrašyti slaptažodį",
@@ -537,6 +541,7 @@
"MUC server URL" : "MUC serverio URL",
"Jabber ID" : "Jabber ID",
"unknown state" : "nežinoma būsena",
+ "Calls" : "Skambučiai",
"Choose devices" : "Pasirinkti įrenginius",
"Mark as read" : "Žymėti kaip skaitytą",
"Remove from favorites" : "Šalinti iš mėgstamų",
@@ -584,6 +589,7 @@
"Mark as unread" : "Žymėti kaip neskaitytą",
"Go to file" : "Pereiti į failą",
"Forward message" : "Persiųsti žinutę",
+ "Contact" : "Adresatas",
"Remove {fileName}" : "Šalinti {fileName}",
"Error while forwarding message" : "Klaida persiunčiant žinutę",
"Scroll to bottom" : "Slinkti į apačią",
@@ -591,6 +597,7 @@
"Yesterday" : "Vakar",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
"Microphone either not available or disabled in settings" : "Mikrofonas arba neprieinamas, arba išjungtas nustatymuose",
+ "Upload new files" : "Išsiųsti naujus failus",
"Share from Files" : "Bendrinti iš Failų",
"Add emoji" : "Pridėti šypsenėlę",
"Send message" : "Siųsti žinutę",
@@ -605,6 +612,7 @@
"Promote to moderator" : "Paaukštinti į moderatorius",
"Resend invitation" : "Siųsti pakvietimą iš naujo",
"Remove participant" : "Šalinti dalyvį",
+ "Add users" : "Pridėti naudotojus",
"Add groups" : "Pridėti grupes",
"Add emails" : "Pridėti el. paštus",
"Add circles" : "Pridėti ratus",
@@ -618,6 +626,8 @@
"Chat" : "Pokalbis",
"Details" : "Išsamiau",
"Settings" : "Nustatymai",
+ "Projects" : "Projektai",
+ "Show all files" : "Rodyti visus failus",
"Meeting ID: {meetingId}" : "Susitikimo ID: {meetingId}",
"Your PIN: {attendeePin}" : "Jūsų PIN kodas: {attendeePin}",
"Attachments folder" : "Priedų aplankas",
@@ -651,6 +661,10 @@
"Error while accessing microphone" : "Klaida gaunant prieigą prie mikrofono",
"Access to camera is only possible with HTTPS" : "Prieiga prie kameros yra įmanoma tik naudojant HTTPS",
"An error occurred while fetching the participants" : "Gaunant dalyvius, įvyko klaida",
+ "Media" : "Medija",
+ "Files" : "Failai",
+ "Locations" : "Vietos",
+ "Other" : "Kita",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Pokalbiai buvo atnaujinti, įkelkite puslapį iš naujo",
"Do not disturb" : "Netrukdyti",
"Away" : "Atsitraukęs",
diff --git a/l10n/lv.js b/l10n/lv.js
index c076137b1..3cf82fa15 100644
--- a/l10n/lv.js
+++ b/l10n/lv.js
@@ -64,6 +64,11 @@ OC.L10N.register(
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Saruna ar {user1}, {user2}, {user3}, {user4} un {user5} ( Ilgums {duration})",
"Talk to %s" : "Runāt ar %s",
"File is not shared, or shared but not with the user" : "Datne nav koplietota vai koplietots, bet nav koplietots ar lietotāju",
+ "File is too big" : "Datne ir par lielu",
+ "Invalid file provided" : "Norādīta nederīga datne",
+ "Invalid image" : "Nederīgs attēls",
+ "Unknown filetype" : "Nezināms datnes tips",
+ "An error occurred. Please contact your admin." : "Notika kļūda. Lūdzu sazinies ar savu administratoru.",
"%s invited you to a conversation." : "%s uzaicināja jūs uz sarunu.",
"You were invited to a conversation." : "Jūs uzaicinājāt uz sarunu.",
"Conversation invitation" : "Sarunas uzaicinājums",
@@ -132,6 +137,7 @@ OC.L10N.register(
"TURN server protocols" : "TURN servera protokols",
"Test this server" : "Testēt šo serveri",
"TURN servers" : "TURN serveris",
+ "OK" : "Labi",
"Copy link" : "Kopēt saiti",
"Waiting for others to join the call …" : "Gaidot citus pievienoties zvanam …",
"You can invite others in the participant tab of the sidebar" : "Sānjoslā, dalībnieku cilnē var uzaicināt citus dalībniekus",
@@ -156,6 +162,9 @@ OC.L10N.register(
"You" : "Jūs",
"Show screen" : "Rādīt ekrānu",
"Favorite" : "Favorīts",
+ "Restricted" : "Ierobežota",
+ "Description" : "Apraksts",
+ "Notifications" : "Paziņojumi",
"Leave conversation" : "Atstāt sarunu",
"Delete conversation" : "Dzēst sarunu",
"You need to promote a new moderator before you can leave the conversation." : "Pirms sarunas atstāšanas ir jāieceļ jauns regulētājs.",
@@ -163,6 +172,7 @@ OC.L10N.register(
"Enter a password" : "Enter a password",
"Save" : "Saglabāt",
"Edit" : "Rediģēt",
+ "Delete" : "Dzēst",
"Password" : "Parole",
"API token" : "API pilnvara",
"Login" : "Autorizēties",
@@ -177,20 +187,26 @@ OC.L10N.register(
"Conversation name" : "Sarunas nosaukums",
"Reply" : "Atbildēt",
"Go to file" : "Doties uz datni",
+ "Contact" : "Kontakts",
"Today" : "Šodien",
"Yesterday" : "Vakar",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
"File to share" : "Kopīgojamā datne",
"Write message, @ to mention someone …" : "Rakstiet ziņu, @ lai pieminētu kādu …",
"moderator" : "moderators",
+ "guest" : "viesis",
"Demote from moderator" : "Pazemināt no regulētāja",
"Promote to moderator" : "Paaugstināt par regulētāju",
"Remove participant" : "Noņemt dalībnieku",
+ "Searching …" : "Meklē...",
"No results" : "Nav rezultātu",
"Add users or groups" : "Add users or groups",
"Participants" : "Dalībnieki",
"Chat" : "Tērzēt",
+ "Details" : "Detaļas",
"Settings" : "Iestatījumi",
+ "Projects" : "Projekti",
+ "Privacy" : "Privātums",
"Keyboard shortcuts" : "Tastatūras saīsnes",
"Search" : "Meklēt",
"Start call" : "Sākt zvanu",
@@ -200,6 +216,9 @@ OC.L10N.register(
"Select conversation" : "Izvēlēties sarunu",
"Link to a conversation" : "Saite uz sarunu",
"Join a conversation or start a new one" : "Pievienoties sarunai vai sākt jaunu",
+ "Files" : "Datnes",
+ "Audio" : "Audio",
+ "Other" : "Cits",
"Default" : "Noklusējuma",
"This is taking longer than expected. Are the media permissions already granted (or rejected)? If yes please restart your browser, as audio and video are failing" : "Tas aizņem vairāk laika, nekā paredzēts. Vai multivides atļaujas jau ir piešķirtas (vai noraidītas)? Ja atbilde ir “jā”, restartējiet pārlūkprogrammu, jo ir audio un video kļūme",
"Access to microphone & camera is only possible with HTTPS" : "Piekļuve mikrofonam un kamerai ir iespējama izmantojot tikai HTTPS",
diff --git a/l10n/lv.json b/l10n/lv.json
index 539132f75..9b1688df3 100644
--- a/l10n/lv.json
+++ b/l10n/lv.json
@@ -62,6 +62,11 @@
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Saruna ar {user1}, {user2}, {user3}, {user4} un {user5} ( Ilgums {duration})",
"Talk to %s" : "Runāt ar %s",
"File is not shared, or shared but not with the user" : "Datne nav koplietota vai koplietots, bet nav koplietots ar lietotāju",
+ "File is too big" : "Datne ir par lielu",
+ "Invalid file provided" : "Norādīta nederīga datne",
+ "Invalid image" : "Nederīgs attēls",
+ "Unknown filetype" : "Nezināms datnes tips",
+ "An error occurred. Please contact your admin." : "Notika kļūda. Lūdzu sazinies ar savu administratoru.",
"%s invited you to a conversation." : "%s uzaicināja jūs uz sarunu.",
"You were invited to a conversation." : "Jūs uzaicinājāt uz sarunu.",
"Conversation invitation" : "Sarunas uzaicinājums",
@@ -130,6 +135,7 @@
"TURN server protocols" : "TURN servera protokols",
"Test this server" : "Testēt šo serveri",
"TURN servers" : "TURN serveris",
+ "OK" : "Labi",
"Copy link" : "Kopēt saiti",
"Waiting for others to join the call …" : "Gaidot citus pievienoties zvanam …",
"You can invite others in the participant tab of the sidebar" : "Sānjoslā, dalībnieku cilnē var uzaicināt citus dalībniekus",
@@ -154,6 +160,9 @@
"You" : "Jūs",
"Show screen" : "Rādīt ekrānu",
"Favorite" : "Favorīts",
+ "Restricted" : "Ierobežota",
+ "Description" : "Apraksts",
+ "Notifications" : "Paziņojumi",
"Leave conversation" : "Atstāt sarunu",
"Delete conversation" : "Dzēst sarunu",
"You need to promote a new moderator before you can leave the conversation." : "Pirms sarunas atstāšanas ir jāieceļ jauns regulētājs.",
@@ -161,6 +170,7 @@
"Enter a password" : "Enter a password",
"Save" : "Saglabāt",
"Edit" : "Rediģēt",
+ "Delete" : "Dzēst",
"Password" : "Parole",
"API token" : "API pilnvara",
"Login" : "Autorizēties",
@@ -175,20 +185,26 @@
"Conversation name" : "Sarunas nosaukums",
"Reply" : "Atbildēt",
"Go to file" : "Doties uz datni",
+ "Contact" : "Kontakts",
"Today" : "Šodien",
"Yesterday" : "Vakar",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
"File to share" : "Kopīgojamā datne",
"Write message, @ to mention someone …" : "Rakstiet ziņu, @ lai pieminētu kādu …",
"moderator" : "moderators",
+ "guest" : "viesis",
"Demote from moderator" : "Pazemināt no regulētāja",
"Promote to moderator" : "Paaugstināt par regulētāju",
"Remove participant" : "Noņemt dalībnieku",
+ "Searching …" : "Meklē...",
"No results" : "Nav rezultātu",
"Add users or groups" : "Add users or groups",
"Participants" : "Dalībnieki",
"Chat" : "Tērzēt",
+ "Details" : "Detaļas",
"Settings" : "Iestatījumi",
+ "Projects" : "Projekti",
+ "Privacy" : "Privātums",
"Keyboard shortcuts" : "Tastatūras saīsnes",
"Search" : "Meklēt",
"Start call" : "Sākt zvanu",
@@ -198,6 +214,9 @@
"Select conversation" : "Izvēlēties sarunu",
"Link to a conversation" : "Saite uz sarunu",
"Join a conversation or start a new one" : "Pievienoties sarunai vai sākt jaunu",
+ "Files" : "Datnes",
+ "Audio" : "Audio",
+ "Other" : "Cits",
"Default" : "Noklusējuma",
"This is taking longer than expected. Are the media permissions already granted (or rejected)? If yes please restart your browser, as audio and video are failing" : "Tas aizņem vairāk laika, nekā paredzēts. Vai multivides atļaujas jau ir piešķirtas (vai noraidītas)? Ja atbilde ir “jā”, restartējiet pārlūkprogrammu, jo ir audio un video kļūme",
"Access to microphone & camera is only possible with HTTPS" : "Piekļuve mikrofonam un kamerai ir iespējama izmantojot tikai HTTPS",
diff --git a/l10n/mk.js b/l10n/mk.js
index 9df2f292a..a0b16a083 100644
--- a/l10n/mk.js
+++ b/l10n/mk.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["уште 1","%n други"],
"{actor} invited you to {call}" : "{actor} ве покани во {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Поканети сте во <strong>разговор</strong> или имате <strong>повик</strong>",
+ "Other activities" : "Други активности",
"Talk" : "Разговор",
"Guest" : "Гостин",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Добредојдовте на Nextcloud Talk!\nВо овој разговор ќе бидете информирани за новите функции достапни во Nextcloud Talk.",
@@ -109,6 +110,11 @@ OC.L10N.register(
"Talk to %s" : "Разговор со %s",
"File is not shared, or shared but not with the user" : "Датотеката не е споделена, или е споделена но не со корисници",
"No account available to delete." : "Нема сметка достапна за бришење.",
+ "File is too big" : "Датотеката е премногу голема",
+ "Invalid file provided" : "Доставена е невалидна датотека",
+ "Invalid image" : "Невалидна фотографија",
+ "Unknown filetype" : "Непознат тип на датотека",
+ "An error occurred. Please contact your admin." : "Настана грешка. Контактирате со администраторот.",
"Talk mentions" : "Спомнувања",
"Write to conversation" : "Пишивајте во разговорот",
"Writes event information into a conversation of your choice" : "Напишете информации за настанот во разговорот по ваш избор",
@@ -484,6 +490,7 @@ OC.L10N.register(
"Error" : "Грешка",
"Blocked" : "Блокирани",
"Active" : "Активно",
+ "Expired" : "Истечен",
"_%n user_::_%n users_" : ["1 корисник","%n корисници"],
"Matterbridge integration" : "Мост интеграција",
"Enable Matterbridge integration" : "Овозможи мост интеграција",
@@ -504,6 +511,7 @@ OC.L10N.register(
"TURN server URL" : "TURN сервер URL",
"Test this server" : "Тестирај го овој сервер",
"TURN servers" : "TURN сервери",
+ "OK" : "Добро",
"Copy link" : "Копирај линк",
"Waiting for others to join the call …" : "Чекање на останатите да се приклучат кон повикот ...",
"You can invite others in the participant tab of the sidebar" : "Можете да поканите други учесници во картичката за учесници во страничната лента",
@@ -557,7 +565,10 @@ OC.L10N.register(
"Drop your files to upload" : "Повлечи датотеки за да прикачите",
"Call in progress" : "Повик е во тек",
"Favorite" : "Омилен",
+ "Restricted" : "Ограничена",
"Conversation settings" : "Параметри за разговор",
+ "Description" : "Опис",
+ "Notifications" : "Известувања",
"Leave conversation" : "Напушти разговор",
"Delete conversation" : "Избриши разговор",
"You need to promote a new moderator before you can leave the conversation." : "Треба да промовирате нов модератор пред да го напуштите разговорот.",
@@ -570,6 +581,8 @@ OC.L10N.register(
"Start time (optional)" : "Време на почеток (опционално)",
"Save" : "Зачувај",
"Edit" : "Уреди",
+ "More information" : "Повеќе информации",
+ "Delete" : "Избриши",
"Nextcloud URL" : "Nextcloud URL",
"Nextcloud user" : "Nextcloud корисник",
"User password" : "Лозинка на корисник",
@@ -616,8 +629,10 @@ OC.L10N.register(
"Select microphone" : "Избери микрофон",
"No camera available" : "Нема камера",
"Select camera" : "Избери камера",
+ "Unread messages" : "Непрочитани пораки",
"Reply" : "Одговор",
"Go to file" : "Оди до датотеката",
+ "Contact" : "Контакт",
"Scroll to bottom" : "Скролај до долу",
"Today" : "Денес",
"Yesterday" : "Вчера",
@@ -650,7 +665,10 @@ OC.L10N.register(
"Add other sources" : "Додади други извори",
"Participants" : "Учесници",
"Chat" : "Разговор",
+ "Details" : "Детали",
"Settings" : "Параметри",
+ "Projects" : "Проекти",
+ "Show all files" : "Прикажи ги сите датотеки",
"Attachments folder" : "Папка со прилози",
"Privacy" : "Приватност",
"Keyboard shortcuts" : "Кратенки преку тастатура",
@@ -685,6 +703,10 @@ OC.L10N.register(
"Access to microphone was denied" : "Нема пристап до микрофонот",
"Error while accessing microphone" : "Грешка при пристап до микрофон",
"Access to camera is only possible with HTTPS" : "Пристап до камерата е возможен само преку безбедноска врска HTTPS",
+ "Files" : "Датотеки",
+ "Locations" : "Локации",
+ "Audio" : "Аудио",
+ "Other" : "Останато",
"Do not disturb" : "Не вознемирувај",
"Away" : "Далеку",
"Error while sharing file" : "Грешка при споделување на датотека",
diff --git a/l10n/mk.json b/l10n/mk.json
index 15f93fec3..93712a0c8 100644
--- a/l10n/mk.json
+++ b/l10n/mk.json
@@ -10,6 +10,7 @@
"_%n other_::_%n others_" : ["уште 1","%n други"],
"{actor} invited you to {call}" : "{actor} ве покани во {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Поканети сте во <strong>разговор</strong> или имате <strong>повик</strong>",
+ "Other activities" : "Други активности",
"Talk" : "Разговор",
"Guest" : "Гостин",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Добредојдовте на Nextcloud Talk!\nВо овој разговор ќе бидете информирани за новите функции достапни во Nextcloud Talk.",
@@ -107,6 +108,11 @@
"Talk to %s" : "Разговор со %s",
"File is not shared, or shared but not with the user" : "Датотеката не е споделена, или е споделена но не со корисници",
"No account available to delete." : "Нема сметка достапна за бришење.",
+ "File is too big" : "Датотеката е премногу голема",
+ "Invalid file provided" : "Доставена е невалидна датотека",
+ "Invalid image" : "Невалидна фотографија",
+ "Unknown filetype" : "Непознат тип на датотека",
+ "An error occurred. Please contact your admin." : "Настана грешка. Контактирате со администраторот.",
"Talk mentions" : "Спомнувања",
"Write to conversation" : "Пишивајте во разговорот",
"Writes event information into a conversation of your choice" : "Напишете информации за настанот во разговорот по ваш избор",
@@ -482,6 +488,7 @@
"Error" : "Грешка",
"Blocked" : "Блокирани",
"Active" : "Активно",
+ "Expired" : "Истечен",
"_%n user_::_%n users_" : ["1 корисник","%n корисници"],
"Matterbridge integration" : "Мост интеграција",
"Enable Matterbridge integration" : "Овозможи мост интеграција",
@@ -502,6 +509,7 @@
"TURN server URL" : "TURN сервер URL",
"Test this server" : "Тестирај го овој сервер",
"TURN servers" : "TURN сервери",
+ "OK" : "Добро",
"Copy link" : "Копирај линк",
"Waiting for others to join the call …" : "Чекање на останатите да се приклучат кон повикот ...",
"You can invite others in the participant tab of the sidebar" : "Можете да поканите други учесници во картичката за учесници во страничната лента",
@@ -555,7 +563,10 @@
"Drop your files to upload" : "Повлечи датотеки за да прикачите",
"Call in progress" : "Повик е во тек",
"Favorite" : "Омилен",
+ "Restricted" : "Ограничена",
"Conversation settings" : "Параметри за разговор",
+ "Description" : "Опис",
+ "Notifications" : "Известувања",
"Leave conversation" : "Напушти разговор",
"Delete conversation" : "Избриши разговор",
"You need to promote a new moderator before you can leave the conversation." : "Треба да промовирате нов модератор пред да го напуштите разговорот.",
@@ -568,6 +579,8 @@
"Start time (optional)" : "Време на почеток (опционално)",
"Save" : "Зачувај",
"Edit" : "Уреди",
+ "More information" : "Повеќе информации",
+ "Delete" : "Избриши",
"Nextcloud URL" : "Nextcloud URL",
"Nextcloud user" : "Nextcloud корисник",
"User password" : "Лозинка на корисник",
@@ -614,8 +627,10 @@
"Select microphone" : "Избери микрофон",
"No camera available" : "Нема камера",
"Select camera" : "Избери камера",
+ "Unread messages" : "Непрочитани пораки",
"Reply" : "Одговор",
"Go to file" : "Оди до датотеката",
+ "Contact" : "Контакт",
"Scroll to bottom" : "Скролај до долу",
"Today" : "Денес",
"Yesterday" : "Вчера",
@@ -648,7 +663,10 @@
"Add other sources" : "Додади други извори",
"Participants" : "Учесници",
"Chat" : "Разговор",
+ "Details" : "Детали",
"Settings" : "Параметри",
+ "Projects" : "Проекти",
+ "Show all files" : "Прикажи ги сите датотеки",
"Attachments folder" : "Папка со прилози",
"Privacy" : "Приватност",
"Keyboard shortcuts" : "Кратенки преку тастатура",
@@ -683,6 +701,10 @@
"Access to microphone was denied" : "Нема пристап до микрофонот",
"Error while accessing microphone" : "Грешка при пристап до микрофон",
"Access to camera is only possible with HTTPS" : "Пристап до камерата е возможен само преку безбедноска врска HTTPS",
+ "Files" : "Датотеки",
+ "Locations" : "Локации",
+ "Audio" : "Аудио",
+ "Other" : "Останато",
"Do not disturb" : "Не вознемирувај",
"Away" : "Далеку",
"Error while sharing file" : "Грешка при споделување на датотека",
diff --git a/l10n/nb.js b/l10n/nb.js
index e821c6ec4..498479a92 100644
--- a/l10n/nb.js
+++ b/l10n/nb.js
@@ -72,6 +72,11 @@ OC.L10N.register(
"%s (guest)" : "%s (gjest)",
"_Call with %n guest (Duration {duration})_::_Call with %n guests (Duration {duration})_" : ["Samtale med %n gjest (Varighet {duration})","Samtale med %n gjester (Varighet {duration})"],
"Talk to %s" : "Snakk med %s",
+ "File is too big" : "Filen er for stor",
+ "Invalid file provided" : "Ugyldig fil oppgitt",
+ "Invalid image" : "Ugyldig bilde",
+ "Unknown filetype" : "Ukjent filtype",
+ "An error occurred. Please contact your admin." : "Det oppstod en feil. Kontakt din administrator.",
"Talk mentions" : "Talk nevner",
"Write to conversation" : "Skrive til samtalen",
"You were invited to a conversation." : "Du ble invitert til en samtale.",
@@ -111,12 +116,14 @@ OC.L10N.register(
"Andorra" : "Andorra",
"United Arab Emirates" : "De forente arabiske emirater",
"Afghanistan" : "Afganistan",
+ "Antigua and Barbuda" : "Antigua og Barbuda",
"Anguilla" : "Angola",
"Albania" : "Albania",
"Armenia" : "Armenia",
"Angola" : "Angola",
"Antarctica" : "Antarktis",
"Argentina" : "Argentina",
+ "American Samoa" : "Amerikansk Samoa",
"Austria" : "Østerike",
"Australia" : "Australia",
"Aruba" : "Aruba",
@@ -126,34 +133,50 @@ OC.L10N.register(
"Barbados" : "Barbados",
"Bangladesh" : "Bangladesh",
"Belgium" : "Belgia",
+ "Burkina Faso" : "Burkina Faso",
"Bulgaria" : "Bulgaria",
"Bahrain" : "Bahrain",
"Burundi" : "Burundi",
"Benin" : "Benin",
+ "Saint Barthélemy" : "Saint-Barthélemy",
"Bermuda" : "Bermuda",
+ "Brunei Darussalam" : "Brunei",
+ "Bonaire, Sint Eustatius and Saba" : "Bonaire, Sint Eustatius og Saba",
"Brazil" : "Brasil",
"Bahamas" : "Bahamas",
"Bhutan" : "Bhutan",
+ "Bouvet Island" : "Bouvetøya",
"Botswana" : "Botswana",
"Belarus" : "Hviterusland",
+ "Belize" : "Belize",
"Canada" : "Kanada",
+ "Cocos (Keeling) Islands" : "Kokosøyene",
+ "Central African Republic" : "Den sentralafrikanske republikk",
"Congo" : "Kongo",
"Switzerland" : "Sveits",
+ "Côte d'Ivoire" : "Elfenbenskysten",
+ "Cook Islands" : "Cookøyene",
"Chile" : "Chile",
"Cameroon" : "Kameron",
"China" : "Kina",
"Colombia" : "Kolombia",
"Costa Rica" : "Costa Rica",
"Cuba" : "Kuba",
+ "Cabo Verde" : "Kapp Verde",
+ "Curaçao" : "Curaçao",
+ "Christmas Island" : "Christmasøya",
"Cyprus" : "Kypros",
+ "Czechia" : "Tsjekkia",
"Germany" : "Tyskland",
"Djibouti" : "Djibouti",
"Denmark" : "Danmark",
+ "Dominica" : "Dominica",
"Dominican Republic" : "Den dominikanske republikk",
"Algeria" : "Algeri",
"Ecuador" : "Ecuador",
"Estonia" : "Estland",
"Egypt" : "Egypt",
+ "Western Sahara" : "Vest-Sahara",
"Eritrea" : "Eritrea",
"Spain" : "Spania",
"Ethiopia" : "Etiopia",
@@ -162,7 +185,9 @@ OC.L10N.register(
"Falkland Islands (Malvinas)" : "Falklandsøyene (Malvinas)",
"Faroe Islands" : "Færøyene",
"France" : "Frankrike",
+ "Gabon" : "Gabon",
"United Kingdom of Great Britain and Northern Ireland" : "Storbritannia og Nord-Irland",
+ "Grenada" : "Grenada",
"Georgia" : "Georgia",
"French Guiana" : "Fransk Guiana",
"Guernsey" : "Guernsey",
@@ -171,9 +196,16 @@ OC.L10N.register(
"Greenland" : "Grønland",
"Gambia" : "Gambia",
"Guinea" : "Guinea",
+ "Guadeloupe" : "Guadeloupe",
+ "Equatorial Guinea" : "Ekvatorial-Guinea",
"Greece" : "Hellas",
+ "South Georgia and the South Sandwich Islands" : "Sør-Georgia og Sør-Sandwichøyene",
"Guatemala" : "Guatemala",
+ "Guam" : "Guam",
+ "Guinea-Bissau" : "Guinea-Bissau",
+ "Guyana" : "Guyana",
"Hong Kong" : "Hong Kong",
+ "Heard Island and McDonald Islands" : "Heard- og McDonaldøyene",
"Honduras" : "Honduras",
"Croatia" : "Kroatia",
"Haiti" : "Haiti",
@@ -183,6 +215,7 @@ OC.L10N.register(
"Israel" : "Israel",
"Isle of Man" : "Isle of Man",
"India" : "India",
+ "British Indian Ocean Territory" : "Det britiske territoriet i Indiahavet",
"Iraq" : "Irak",
"Iran, Islamic Republic of" : "Iran",
"Iceland" : "Island",
@@ -191,12 +224,18 @@ OC.L10N.register(
"Jamaica" : "Jamaica",
"Jordan" : "Jordan",
"Japan" : "Japan",
+ "Kenya" : "Kenya",
"Kyrgyzstan" : "Kyrgyzstan",
"Cambodia" : "Kambodia",
"Kiribati" : "Kiribati",
+ "Comoros" : "Komorene",
+ "Saint Kitts and Nevis" : "Saint Kitts og Nevis",
"Kuwait" : "Kuwait",
"Cayman Islands" : "Cayman Islands",
+ "Kazakhstan" : "Kazakhstan",
+ "Lao People's Democratic Republic" : "Laos",
"Lebanon" : "Libanon",
+ "Saint Lucia" : "Saint Lucia",
"Liechtenstein" : "Liechtenstein",
"Sri Lanka" : "Sri Lanka",
"Liberia" : "Liberia",
@@ -210,9 +249,15 @@ OC.L10N.register(
"Montenegro" : "Montenegro",
"Saint Martin (French part)" : "Saint Martin (Fransk del)",
"Madagascar" : "Madagascar",
+ "Marshall Islands" : "Marshalløyene",
"Mali" : "Mali",
"Myanmar" : "Myanmar",
"Mongolia" : "Mongolia",
+ "Macao" : "Macao",
+ "Northern Mariana Islands" : "Nord-Marianene",
+ "Martinique" : "Martinique",
+ "Mauritania" : "Mauritania",
+ "Montserrat" : "Montserrat",
"Malta" : "Malta",
"Mauritius" : "Mauritius",
"Maldives" : "Maldivene",
@@ -221,26 +266,34 @@ OC.L10N.register(
"Malaysia" : "Malaysia",
"Mozambique" : "Mosambik",
"Namibia" : "Namibia",
+ "New Caledonia" : "Ny-Caledonia",
"Niger" : "Niger",
+ "Norfolk Island" : "Norfolkøya",
"Nigeria" : "Nigeria",
"Nicaragua" : "Nicaragua",
"Netherlands" : "Nederland",
"Norway" : "Norge",
"Nepal" : "Nepal",
"Nauru" : "Nauru",
+ "Niue" : "Niue",
"New Zealand" : "New Zealand",
"Oman" : "Oman",
"Panama" : "Panama",
"Peru" : "Peru",
+ "French Polynesia" : "Fransk Polynesia",
+ "Papua New Guinea" : "Papua Ny-Guinea",
"Philippines" : "Filipinene",
"Pakistan" : "Pakistan",
"Poland" : "Polen",
+ "Saint Pierre and Miquelon" : "Saint-Pierre og Miquelon",
"Pitcairn" : "Pitcairn",
"Puerto Rico" : "Puerto Rico",
"Palestine, State of" : "Palestina",
"Portugal" : "Portugal",
+ "Palau" : "Palau",
"Paraguay" : "Paraguay",
"Qatar" : "Qatar",
+ "Réunion" : "Réunion",
"Romania" : "Romania",
"Serbia" : "Serbia",
"Russian Federation" : "Russland",
@@ -251,6 +304,7 @@ OC.L10N.register(
"Sudan" : "Sudan",
"Sweden" : "Sverige",
"Singapore" : "Singapore",
+ "Saint Helena, Ascension and Tristan da Cunha" : "Saint Helena, Ascension og Tristan da Cunha",
"Slovenia" : "Slovenia",
"Svalbard and Jan Mayen" : "Svalbard og Jan Mayen",
"Slovakia" : "Slovakia",
@@ -258,13 +312,20 @@ OC.L10N.register(
"San Marino" : "San Marino",
"Senegal" : "Senegal",
"Somalia" : "Somalia",
+ "Suriname" : "Surinam",
"South Sudan" : "Sør Sudan",
+ "Sao Tome and Principe" : "Sao Tome og Principe",
"El Salvador" : "El Salvador",
+ "Sint Maarten (Dutch part)" : "Sint Maarten (Nederlandsk del)",
"Syrian Arab Republic" : "Syria",
+ "Turks and Caicos Islands" : "Turks- og Caicosøyene",
"Chad" : "Chad",
+ "French Southern Territories" : "De franske sørterritorier",
"Togo" : "Togo",
"Thailand" : "Thailand",
"Tajikistan" : "Tajikistan",
+ "Tokelau" : "Tokelau",
+ "Timor-Leste" : "Timor-Leste",
"Turkmenistan" : "Turkmenistan",
"Tunisia" : "Tunis",
"Tonga" : "Tonga",
@@ -275,16 +336,21 @@ OC.L10N.register(
"Tanzania, United Republic of" : "Tanzania",
"Ukraine" : "Ukraina",
"Uganda" : "Uganda",
+ "United States Minor Outlying Islands" : "USAs ytre småøyer",
"United States of America" : "USA",
"Uruguay" : "Uruguay",
"Uzbekistan" : "Uzbekistan",
+ "Holy See" : "Den hellige stol",
+ "Saint Vincent and the Grenadines" : "Saint Vincent og Grenadinene",
"Venezuela, Bolivarian Republic of" : "Venezuela",
"Virgin Islands, British" : "Jomfruøyene, engelsk",
"Virgin Islands, U.S." : "Jomfruøyene, US",
"Viet Nam" : "Vietnam",
"Vanuatu" : "Vanuatu",
+ "Wallis and Futuna" : "Wallis- og Futunaøyene",
"Samoa" : "Samoa",
"Yemen" : "Yemen",
+ "Mayotte" : "Mayotte",
"South Africa" : "Sør-Afrika",
"Zambia" : "Zambia",
"Zimbabwe" : "Zimbabwe",
@@ -349,6 +415,8 @@ OC.L10N.register(
"TURN server URL" : "TURN server URL",
"TURN server protocols" : "TURN-serverprotokoller",
"Test this server" : "Test denne serveren",
+ "OK" : "OK",
+ "Checking …" : "Sjekker…",
"A participant raised their hand." : "En deltaker løftet hånden.",
"Previous page of videos" : "Forrige side med videoer",
"Next page of videos" : "Neste side med videoer",
@@ -383,7 +451,10 @@ OC.L10N.register(
"Post message" : "Send melding",
"You need to be logged in to upload files" : "Du må være på logget for å laste opp filer",
"Favorite" : "Merk som favoritt",
+ "Restricted" : "Begrenset",
"Conversation settings" : "Samtale innstillinger",
+ "Description" : "Beskrivelse",
+ "Notifications" : "Varsler",
"Guests access" : "Gjeste tilgang",
"Meeting settings" : "Møte innstillinger",
"Leave conversation" : "Forlat samtale",
@@ -403,11 +474,15 @@ OC.L10N.register(
"Lock conversation" : "Lås samtalen",
"Save" : "Lagre",
"Edit" : "Rediger",
+ "More information" : "Mer informasjon",
+ "Delete" : "Slett",
"Password" : "Passord",
"API token" : "API-symbol",
"Login" : "Logg inn",
"Nickname" : "Kallenavn",
"Client ID" : "Klient-ID",
+ "Calls" : "Samtaler",
+ "Mark as read" : "Merk som lest",
"Remove from favorites" : "Fjern fra favoritter",
"Add to favorites" : "Legg til i favoritter",
"You: {lastMessage}" : "Du: {lastMessage}",
@@ -418,6 +493,7 @@ OC.L10N.register(
"No search results" : "Ingen søkeresultater",
"Groups" : "Grupper",
"Circles" : "Sirkler",
+ "Unread mentions" : "Uleste nevner",
"Talk settings" : "Talk innstillinger",
"Users, groups and circles" : "Brukere, grupper og sirkler",
"Users and groups" : "Brukere og grupper",
@@ -438,9 +514,12 @@ OC.L10N.register(
"Select microphone" : "Velg mikrofon",
"No camera available" : "Ingen kamera tilgjengelig",
"Select camera" : "Velg kamera",
+ "Unread messages" : "Uleste meldinger",
"Sending message" : "Sender melding",
"Message sent" : "Melding sendt",
"Reply" : "Svar",
+ "Mark as unread" : "Merk som ulest",
+ "Contact" : "Kontakt",
"Today" : "I dag",
"Yesterday" : "I går",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -451,11 +530,16 @@ OC.L10N.register(
"Demote from moderator" : "Fjern moderatorstatus",
"Promote to moderator" : "Gi moderatorstatus",
"Remove participant" : "Fjern deltaker",
+ "Searching …" : "Søker ...",
"No results" : "Ingen resultater",
"Add users or groups" : "Legg til bruker eller gruppe",
"Participants" : "Deltakere",
"Chat" : "Sludre",
+ "Details" : "Detaljer",
"Settings" : "Innstillinger",
+ "Projects" : "Prosjekter",
+ "Show all files" : "Vis alle filer",
+ "Privacy" : "Personvern",
"Keyboard shortcuts" : "Tastatursnarveier",
"Search" : "Søk",
"Start call" : "Start samtale",
@@ -463,6 +547,11 @@ OC.L10N.register(
"Send" : "Send",
"Start a conversation" : "Start en samtale",
"Join a conversation or start a new one" : "Ta del i en samtale eller start en ny",
+ "Media" : "Media",
+ "Files" : "Filer",
+ "Locations" : "Steder",
+ "Audio" : "Lyd",
+ "Other" : "Annet",
"Do not disturb" : "Ikke forstyrr",
"Away" : "Borte",
"Default" : "Standard",
diff --git a/l10n/nb.json b/l10n/nb.json
index 92caba239..99264c03b 100644
--- a/l10n/nb.json
+++ b/l10n/nb.json
@@ -70,6 +70,11 @@
"%s (guest)" : "%s (gjest)",
"_Call with %n guest (Duration {duration})_::_Call with %n guests (Duration {duration})_" : ["Samtale med %n gjest (Varighet {duration})","Samtale med %n gjester (Varighet {duration})"],
"Talk to %s" : "Snakk med %s",
+ "File is too big" : "Filen er for stor",
+ "Invalid file provided" : "Ugyldig fil oppgitt",
+ "Invalid image" : "Ugyldig bilde",
+ "Unknown filetype" : "Ukjent filtype",
+ "An error occurred. Please contact your admin." : "Det oppstod en feil. Kontakt din administrator.",
"Talk mentions" : "Talk nevner",
"Write to conversation" : "Skrive til samtalen",
"You were invited to a conversation." : "Du ble invitert til en samtale.",
@@ -109,12 +114,14 @@
"Andorra" : "Andorra",
"United Arab Emirates" : "De forente arabiske emirater",
"Afghanistan" : "Afganistan",
+ "Antigua and Barbuda" : "Antigua og Barbuda",
"Anguilla" : "Angola",
"Albania" : "Albania",
"Armenia" : "Armenia",
"Angola" : "Angola",
"Antarctica" : "Antarktis",
"Argentina" : "Argentina",
+ "American Samoa" : "Amerikansk Samoa",
"Austria" : "Østerike",
"Australia" : "Australia",
"Aruba" : "Aruba",
@@ -124,34 +131,50 @@
"Barbados" : "Barbados",
"Bangladesh" : "Bangladesh",
"Belgium" : "Belgia",
+ "Burkina Faso" : "Burkina Faso",
"Bulgaria" : "Bulgaria",
"Bahrain" : "Bahrain",
"Burundi" : "Burundi",
"Benin" : "Benin",
+ "Saint Barthélemy" : "Saint-Barthélemy",
"Bermuda" : "Bermuda",
+ "Brunei Darussalam" : "Brunei",
+ "Bonaire, Sint Eustatius and Saba" : "Bonaire, Sint Eustatius og Saba",
"Brazil" : "Brasil",
"Bahamas" : "Bahamas",
"Bhutan" : "Bhutan",
+ "Bouvet Island" : "Bouvetøya",
"Botswana" : "Botswana",
"Belarus" : "Hviterusland",
+ "Belize" : "Belize",
"Canada" : "Kanada",
+ "Cocos (Keeling) Islands" : "Kokosøyene",
+ "Central African Republic" : "Den sentralafrikanske republikk",
"Congo" : "Kongo",
"Switzerland" : "Sveits",
+ "Côte d'Ivoire" : "Elfenbenskysten",
+ "Cook Islands" : "Cookøyene",
"Chile" : "Chile",
"Cameroon" : "Kameron",
"China" : "Kina",
"Colombia" : "Kolombia",
"Costa Rica" : "Costa Rica",
"Cuba" : "Kuba",
+ "Cabo Verde" : "Kapp Verde",
+ "Curaçao" : "Curaçao",
+ "Christmas Island" : "Christmasøya",
"Cyprus" : "Kypros",
+ "Czechia" : "Tsjekkia",
"Germany" : "Tyskland",
"Djibouti" : "Djibouti",
"Denmark" : "Danmark",
+ "Dominica" : "Dominica",
"Dominican Republic" : "Den dominikanske republikk",
"Algeria" : "Algeri",
"Ecuador" : "Ecuador",
"Estonia" : "Estland",
"Egypt" : "Egypt",
+ "Western Sahara" : "Vest-Sahara",
"Eritrea" : "Eritrea",
"Spain" : "Spania",
"Ethiopia" : "Etiopia",
@@ -160,7 +183,9 @@
"Falkland Islands (Malvinas)" : "Falklandsøyene (Malvinas)",
"Faroe Islands" : "Færøyene",
"France" : "Frankrike",
+ "Gabon" : "Gabon",
"United Kingdom of Great Britain and Northern Ireland" : "Storbritannia og Nord-Irland",
+ "Grenada" : "Grenada",
"Georgia" : "Georgia",
"French Guiana" : "Fransk Guiana",
"Guernsey" : "Guernsey",
@@ -169,9 +194,16 @@
"Greenland" : "Grønland",
"Gambia" : "Gambia",
"Guinea" : "Guinea",
+ "Guadeloupe" : "Guadeloupe",
+ "Equatorial Guinea" : "Ekvatorial-Guinea",
"Greece" : "Hellas",
+ "South Georgia and the South Sandwich Islands" : "Sør-Georgia og Sør-Sandwichøyene",
"Guatemala" : "Guatemala",
+ "Guam" : "Guam",
+ "Guinea-Bissau" : "Guinea-Bissau",
+ "Guyana" : "Guyana",
"Hong Kong" : "Hong Kong",
+ "Heard Island and McDonald Islands" : "Heard- og McDonaldøyene",
"Honduras" : "Honduras",
"Croatia" : "Kroatia",
"Haiti" : "Haiti",
@@ -181,6 +213,7 @@
"Israel" : "Israel",
"Isle of Man" : "Isle of Man",
"India" : "India",
+ "British Indian Ocean Territory" : "Det britiske territoriet i Indiahavet",
"Iraq" : "Irak",
"Iran, Islamic Republic of" : "Iran",
"Iceland" : "Island",
@@ -189,12 +222,18 @@
"Jamaica" : "Jamaica",
"Jordan" : "Jordan",
"Japan" : "Japan",
+ "Kenya" : "Kenya",
"Kyrgyzstan" : "Kyrgyzstan",
"Cambodia" : "Kambodia",
"Kiribati" : "Kiribati",
+ "Comoros" : "Komorene",
+ "Saint Kitts and Nevis" : "Saint Kitts og Nevis",
"Kuwait" : "Kuwait",
"Cayman Islands" : "Cayman Islands",
+ "Kazakhstan" : "Kazakhstan",
+ "Lao People's Democratic Republic" : "Laos",
"Lebanon" : "Libanon",
+ "Saint Lucia" : "Saint Lucia",
"Liechtenstein" : "Liechtenstein",
"Sri Lanka" : "Sri Lanka",
"Liberia" : "Liberia",
@@ -208,9 +247,15 @@
"Montenegro" : "Montenegro",
"Saint Martin (French part)" : "Saint Martin (Fransk del)",
"Madagascar" : "Madagascar",
+ "Marshall Islands" : "Marshalløyene",
"Mali" : "Mali",
"Myanmar" : "Myanmar",
"Mongolia" : "Mongolia",
+ "Macao" : "Macao",
+ "Northern Mariana Islands" : "Nord-Marianene",
+ "Martinique" : "Martinique",
+ "Mauritania" : "Mauritania",
+ "Montserrat" : "Montserrat",
"Malta" : "Malta",
"Mauritius" : "Mauritius",
"Maldives" : "Maldivene",
@@ -219,26 +264,34 @@
"Malaysia" : "Malaysia",
"Mozambique" : "Mosambik",
"Namibia" : "Namibia",
+ "New Caledonia" : "Ny-Caledonia",
"Niger" : "Niger",
+ "Norfolk Island" : "Norfolkøya",
"Nigeria" : "Nigeria",
"Nicaragua" : "Nicaragua",
"Netherlands" : "Nederland",
"Norway" : "Norge",
"Nepal" : "Nepal",
"Nauru" : "Nauru",
+ "Niue" : "Niue",
"New Zealand" : "New Zealand",
"Oman" : "Oman",
"Panama" : "Panama",
"Peru" : "Peru",
+ "French Polynesia" : "Fransk Polynesia",
+ "Papua New Guinea" : "Papua Ny-Guinea",
"Philippines" : "Filipinene",
"Pakistan" : "Pakistan",
"Poland" : "Polen",
+ "Saint Pierre and Miquelon" : "Saint-Pierre og Miquelon",
"Pitcairn" : "Pitcairn",
"Puerto Rico" : "Puerto Rico",
"Palestine, State of" : "Palestina",
"Portugal" : "Portugal",
+ "Palau" : "Palau",
"Paraguay" : "Paraguay",
"Qatar" : "Qatar",
+ "Réunion" : "Réunion",
"Romania" : "Romania",
"Serbia" : "Serbia",
"Russian Federation" : "Russland",
@@ -249,6 +302,7 @@
"Sudan" : "Sudan",
"Sweden" : "Sverige",
"Singapore" : "Singapore",
+ "Saint Helena, Ascension and Tristan da Cunha" : "Saint Helena, Ascension og Tristan da Cunha",
"Slovenia" : "Slovenia",
"Svalbard and Jan Mayen" : "Svalbard og Jan Mayen",
"Slovakia" : "Slovakia",
@@ -256,13 +310,20 @@
"San Marino" : "San Marino",
"Senegal" : "Senegal",
"Somalia" : "Somalia",
+ "Suriname" : "Surinam",
"South Sudan" : "Sør Sudan",
+ "Sao Tome and Principe" : "Sao Tome og Principe",
"El Salvador" : "El Salvador",
+ "Sint Maarten (Dutch part)" : "Sint Maarten (Nederlandsk del)",
"Syrian Arab Republic" : "Syria",
+ "Turks and Caicos Islands" : "Turks- og Caicosøyene",
"Chad" : "Chad",
+ "French Southern Territories" : "De franske sørterritorier",
"Togo" : "Togo",
"Thailand" : "Thailand",
"Tajikistan" : "Tajikistan",
+ "Tokelau" : "Tokelau",
+ "Timor-Leste" : "Timor-Leste",
"Turkmenistan" : "Turkmenistan",
"Tunisia" : "Tunis",
"Tonga" : "Tonga",
@@ -273,16 +334,21 @@
"Tanzania, United Republic of" : "Tanzania",
"Ukraine" : "Ukraina",
"Uganda" : "Uganda",
+ "United States Minor Outlying Islands" : "USAs ytre småøyer",
"United States of America" : "USA",
"Uruguay" : "Uruguay",
"Uzbekistan" : "Uzbekistan",
+ "Holy See" : "Den hellige stol",
+ "Saint Vincent and the Grenadines" : "Saint Vincent og Grenadinene",
"Venezuela, Bolivarian Republic of" : "Venezuela",
"Virgin Islands, British" : "Jomfruøyene, engelsk",
"Virgin Islands, U.S." : "Jomfruøyene, US",
"Viet Nam" : "Vietnam",
"Vanuatu" : "Vanuatu",
+ "Wallis and Futuna" : "Wallis- og Futunaøyene",
"Samoa" : "Samoa",
"Yemen" : "Yemen",
+ "Mayotte" : "Mayotte",
"South Africa" : "Sør-Afrika",
"Zambia" : "Zambia",
"Zimbabwe" : "Zimbabwe",
@@ -347,6 +413,8 @@
"TURN server URL" : "TURN server URL",
"TURN server protocols" : "TURN-serverprotokoller",
"Test this server" : "Test denne serveren",
+ "OK" : "OK",
+ "Checking …" : "Sjekker…",
"A participant raised their hand." : "En deltaker løftet hånden.",
"Previous page of videos" : "Forrige side med videoer",
"Next page of videos" : "Neste side med videoer",
@@ -381,7 +449,10 @@
"Post message" : "Send melding",
"You need to be logged in to upload files" : "Du må være på logget for å laste opp filer",
"Favorite" : "Merk som favoritt",
+ "Restricted" : "Begrenset",
"Conversation settings" : "Samtale innstillinger",
+ "Description" : "Beskrivelse",
+ "Notifications" : "Varsler",
"Guests access" : "Gjeste tilgang",
"Meeting settings" : "Møte innstillinger",
"Leave conversation" : "Forlat samtale",
@@ -401,11 +472,15 @@
"Lock conversation" : "Lås samtalen",
"Save" : "Lagre",
"Edit" : "Rediger",
+ "More information" : "Mer informasjon",
+ "Delete" : "Slett",
"Password" : "Passord",
"API token" : "API-symbol",
"Login" : "Logg inn",
"Nickname" : "Kallenavn",
"Client ID" : "Klient-ID",
+ "Calls" : "Samtaler",
+ "Mark as read" : "Merk som lest",
"Remove from favorites" : "Fjern fra favoritter",
"Add to favorites" : "Legg til i favoritter",
"You: {lastMessage}" : "Du: {lastMessage}",
@@ -416,6 +491,7 @@
"No search results" : "Ingen søkeresultater",
"Groups" : "Grupper",
"Circles" : "Sirkler",
+ "Unread mentions" : "Uleste nevner",
"Talk settings" : "Talk innstillinger",
"Users, groups and circles" : "Brukere, grupper og sirkler",
"Users and groups" : "Brukere og grupper",
@@ -436,9 +512,12 @@
"Select microphone" : "Velg mikrofon",
"No camera available" : "Ingen kamera tilgjengelig",
"Select camera" : "Velg kamera",
+ "Unread messages" : "Uleste meldinger",
"Sending message" : "Sender melding",
"Message sent" : "Melding sendt",
"Reply" : "Svar",
+ "Mark as unread" : "Merk som ulest",
+ "Contact" : "Kontakt",
"Today" : "I dag",
"Yesterday" : "I går",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -449,11 +528,16 @@
"Demote from moderator" : "Fjern moderatorstatus",
"Promote to moderator" : "Gi moderatorstatus",
"Remove participant" : "Fjern deltaker",
+ "Searching …" : "Søker ...",
"No results" : "Ingen resultater",
"Add users or groups" : "Legg til bruker eller gruppe",
"Participants" : "Deltakere",
"Chat" : "Sludre",
+ "Details" : "Detaljer",
"Settings" : "Innstillinger",
+ "Projects" : "Prosjekter",
+ "Show all files" : "Vis alle filer",
+ "Privacy" : "Personvern",
"Keyboard shortcuts" : "Tastatursnarveier",
"Search" : "Søk",
"Start call" : "Start samtale",
@@ -461,6 +545,11 @@
"Send" : "Send",
"Start a conversation" : "Start en samtale",
"Join a conversation or start a new one" : "Ta del i en samtale eller start en ny",
+ "Media" : "Media",
+ "Files" : "Filer",
+ "Locations" : "Steder",
+ "Audio" : "Lyd",
+ "Other" : "Annet",
"Do not disturb" : "Ikke forstyrr",
"Away" : "Borte",
"Default" : "Standard",
diff --git a/l10n/nl.js b/l10n/nl.js
index 7d8dd0701..dd2713f65 100644
--- a/l10n/nl.js
+++ b/l10n/nl.js
@@ -892,6 +892,7 @@ OC.L10N.register(
"No search results" : "Geen zoekresultaten",
"Groups" : "Groepen",
"Circles" : "Kringen",
+ "Unread mentions" : "Ongelezen vermeldingen",
"Talk settings" : "Talk instellingen",
"Users, groups and circles" : "Gebruikers, groepen en kringen",
"Users and groups" : "Gebruikers en groepen",
@@ -1027,6 +1028,8 @@ OC.L10N.register(
"Details" : "Details",
"Settings" : "Instellingen",
"Participants ({count})" : "Deelnemers ({count})",
+ "Projects" : "Projecten",
+ "Show all files" : "Toon alle bestanden",
"Meeting ID: {meetingId}" : "Meeting ID: {meetingId}",
"Your PIN: {attendeePin}" : "Je PIN: {attendeePin}",
"Attachments folder" : "Bijlagemap",
@@ -1095,6 +1098,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Fout bij toegang tot microfoon",
"Access to camera is only possible with HTTPS" : "Toegang tot de camera is alleen mogelijk met HTTPS",
"An error occurred while fetching the participants" : "Er trad een fout op bij het ophalen van de deelnemers",
+ "Media" : "Media",
+ "Files" : "Bestanden",
+ "Locations" : "Locaties",
+ "Audio" : "Geluid",
+ "Other" : "Andere",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk is bijgewerkt, herlaad de pagina",
"Do not disturb" : "Niet storen",
"Away" : "Afwezig",
@@ -1187,6 +1195,8 @@ OC.L10N.register(
"Video on and off" : "Video aan en uit",
"Choose in which folder attachments should be saved." : "Kies in welke map bijlagen moeten worden opgeslagen.",
"Exit fullscreen (f)" : "Ga uit volledig scherm (f)",
- "Fullscreen (f)" : "Volledig scherm (f)"
+ "Fullscreen (f)" : "Volledig scherm (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Stel het meldingsniveau in voor het huidige gesprek. Dit heef alleen invloed op de meldingen die u ontvangt.",
+ "OK: \".wasm\" and \".tflite\" files were properly returned by the web server" : "OK: \".wasm\" en \".tflite\" bestanden werden juist geretourneerd door de webserver"
},
"nplurals=2; plural=(n != 1);");
diff --git a/l10n/nl.json b/l10n/nl.json
index cc06a939d..c41eecfa4 100644
--- a/l10n/nl.json
+++ b/l10n/nl.json
@@ -890,6 +890,7 @@
"No search results" : "Geen zoekresultaten",
"Groups" : "Groepen",
"Circles" : "Kringen",
+ "Unread mentions" : "Ongelezen vermeldingen",
"Talk settings" : "Talk instellingen",
"Users, groups and circles" : "Gebruikers, groepen en kringen",
"Users and groups" : "Gebruikers en groepen",
@@ -1025,6 +1026,8 @@
"Details" : "Details",
"Settings" : "Instellingen",
"Participants ({count})" : "Deelnemers ({count})",
+ "Projects" : "Projecten",
+ "Show all files" : "Toon alle bestanden",
"Meeting ID: {meetingId}" : "Meeting ID: {meetingId}",
"Your PIN: {attendeePin}" : "Je PIN: {attendeePin}",
"Attachments folder" : "Bijlagemap",
@@ -1093,6 +1096,11 @@
"Error while accessing microphone" : "Fout bij toegang tot microfoon",
"Access to camera is only possible with HTTPS" : "Toegang tot de camera is alleen mogelijk met HTTPS",
"An error occurred while fetching the participants" : "Er trad een fout op bij het ophalen van de deelnemers",
+ "Media" : "Media",
+ "Files" : "Bestanden",
+ "Locations" : "Locaties",
+ "Audio" : "Geluid",
+ "Other" : "Andere",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk is bijgewerkt, herlaad de pagina",
"Do not disturb" : "Niet storen",
"Away" : "Afwezig",
@@ -1185,6 +1193,8 @@
"Video on and off" : "Video aan en uit",
"Choose in which folder attachments should be saved." : "Kies in welke map bijlagen moeten worden opgeslagen.",
"Exit fullscreen (f)" : "Ga uit volledig scherm (f)",
- "Fullscreen (f)" : "Volledig scherm (f)"
+ "Fullscreen (f)" : "Volledig scherm (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Stel het meldingsniveau in voor het huidige gesprek. Dit heef alleen invloed op de meldingen die u ontvangt.",
+ "OK: \".wasm\" and \".tflite\" files were properly returned by the web server" : "OK: \".wasm\" en \".tflite\" bestanden werden juist geretourneerd door de webserver"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/l10n/nn_NO.js b/l10n/nn_NO.js
new file mode 100644
index 000000000..1dbb19f21
--- /dev/null
+++ b/l10n/nn_NO.js
@@ -0,0 +1,85 @@
+OC.L10N.register(
+ "spreed",
+ {
+ "Talk" : "Prat",
+ "Guest" : "Gjest",
+ "File is too big" : "Fila er for stor",
+ "Invalid file provided" : "Ugyldig fil",
+ "Invalid image" : "Ugyldig bilete",
+ "Unknown filetype" : "Ukjend filtype",
+ "An error occurred. Please contact your admin." : "Det oppstod ein feil. Ver venleg og kontakt systemadministrator.",
+ "Open settings" : "Opne instillingar",
+ "Messages" : "Meldingar",
+ "Everyone" : "Alle",
+ "None" : "Ingen",
+ "User" : "Bruker",
+ "Users" : "Brukarare",
+ "Name" : "Namn",
+ "Language" : "Språk",
+ "Country" : "Land",
+ "Status" : "Status",
+ "Created at" : "Skapt den",
+ "Pending" : "Under vegs",
+ "Error" : "Feil",
+ "Saved" : "Lagra",
+ "OK" : "OK",
+ "Dismiss" : "Forkast",
+ "Grid view" : "Rutenett visning",
+ "Back" : "Tilbake",
+ "Favorite" : "Favoritt",
+ "Description" : "Skildring",
+ "Notifications" : "Varsel",
+ "Leave conversation" : "Forlat samtalen",
+ "Delete conversation" : "Slett samtale",
+ "Allow guests" : "Tillat gjester",
+ "Password protection" : "Password protection",
+ "Enter a password" : "Skriv inn eit passord",
+ "Save" : "Lagre",
+ "Edit" : "Endra",
+ "More information" : "Meir informasjon",
+ "Delete" : "Slett",
+ "Password" : "Passord",
+ "Login" : "Login",
+ "Nickname" : "Kallenamn",
+ "Calls" : "Samtalar",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Add to favorites",
+ "Loading" : "Loading",
+ "Groups" : "Grupper",
+ "Circles" : "Sirklar",
+ "Password protect" : "Vern med passord",
+ "Add participants" : "Legg til deltakarar",
+ "Close" : "Lukk",
+ "Conversation name" : "Samtale namn",
+ "Unread messages" : "Meldingar er ikkje lest",
+ "Message sent" : "Melding sendt",
+ "Reply" : "Svare",
+ "Reply privately" : "Svar privat",
+ "Today" : "I dag",
+ "Yesterday" : "i går",
+ "Record voice message" : "Ta opp lyd melding ",
+ "Send message" : "Send melding",
+ "Demote from moderator" : "Nedrykk frå moderator",
+ "Promote to moderator" : "Fremje til moderator",
+ "Remove group and members" : "Eksterne gruppe og medlemmar",
+ "Remove participant" : "Eksterne deltakarar",
+ "Add users or groups" : "Add users or groups",
+ "Participants" : "Deltakarar",
+ "Chat" : "Lynmelding",
+ "Details" : "Detaljar",
+ "Settings" : "Instillingar",
+ "Privacy" : "Personvern",
+ "Keyboard shortcuts" : "Tastatursnarvegar",
+ "Search" : "Search",
+ "Rename conversation" : "Eksterne samtalar ",
+ "Send" : "Send",
+ "Say hi to your friends and colleagues!" : "Sei hei til dine venner og kollegar!",
+ "Join a conversation or start a new one" : "Delta i ein samtale eller start ein ny ein",
+ "Files" : "Filer",
+ "Other" : "Anna",
+ "Away" : "Borte",
+ "Default" : "Standard",
+ "The password is wrong. Try again." : "Passordet er gale. Prøv igjen.",
+ "Remove" : "Fjern"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/l10n/nn_NO.json b/l10n/nn_NO.json
new file mode 100644
index 000000000..16b3b58b5
--- /dev/null
+++ b/l10n/nn_NO.json
@@ -0,0 +1,83 @@
+{ "translations": {
+ "Talk" : "Prat",
+ "Guest" : "Gjest",
+ "File is too big" : "Fila er for stor",
+ "Invalid file provided" : "Ugyldig fil",
+ "Invalid image" : "Ugyldig bilete",
+ "Unknown filetype" : "Ukjend filtype",
+ "An error occurred. Please contact your admin." : "Det oppstod ein feil. Ver venleg og kontakt systemadministrator.",
+ "Open settings" : "Opne instillingar",
+ "Messages" : "Meldingar",
+ "Everyone" : "Alle",
+ "None" : "Ingen",
+ "User" : "Bruker",
+ "Users" : "Brukarare",
+ "Name" : "Namn",
+ "Language" : "Språk",
+ "Country" : "Land",
+ "Status" : "Status",
+ "Created at" : "Skapt den",
+ "Pending" : "Under vegs",
+ "Error" : "Feil",
+ "Saved" : "Lagra",
+ "OK" : "OK",
+ "Dismiss" : "Forkast",
+ "Grid view" : "Rutenett visning",
+ "Back" : "Tilbake",
+ "Favorite" : "Favoritt",
+ "Description" : "Skildring",
+ "Notifications" : "Varsel",
+ "Leave conversation" : "Forlat samtalen",
+ "Delete conversation" : "Slett samtale",
+ "Allow guests" : "Tillat gjester",
+ "Password protection" : "Password protection",
+ "Enter a password" : "Skriv inn eit passord",
+ "Save" : "Lagre",
+ "Edit" : "Endra",
+ "More information" : "Meir informasjon",
+ "Delete" : "Slett",
+ "Password" : "Passord",
+ "Login" : "Login",
+ "Nickname" : "Kallenamn",
+ "Calls" : "Samtalar",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Add to favorites",
+ "Loading" : "Loading",
+ "Groups" : "Grupper",
+ "Circles" : "Sirklar",
+ "Password protect" : "Vern med passord",
+ "Add participants" : "Legg til deltakarar",
+ "Close" : "Lukk",
+ "Conversation name" : "Samtale namn",
+ "Unread messages" : "Meldingar er ikkje lest",
+ "Message sent" : "Melding sendt",
+ "Reply" : "Svare",
+ "Reply privately" : "Svar privat",
+ "Today" : "I dag",
+ "Yesterday" : "i går",
+ "Record voice message" : "Ta opp lyd melding ",
+ "Send message" : "Send melding",
+ "Demote from moderator" : "Nedrykk frå moderator",
+ "Promote to moderator" : "Fremje til moderator",
+ "Remove group and members" : "Eksterne gruppe og medlemmar",
+ "Remove participant" : "Eksterne deltakarar",
+ "Add users or groups" : "Add users or groups",
+ "Participants" : "Deltakarar",
+ "Chat" : "Lynmelding",
+ "Details" : "Detaljar",
+ "Settings" : "Instillingar",
+ "Privacy" : "Personvern",
+ "Keyboard shortcuts" : "Tastatursnarvegar",
+ "Search" : "Search",
+ "Rename conversation" : "Eksterne samtalar ",
+ "Send" : "Send",
+ "Say hi to your friends and colleagues!" : "Sei hei til dine venner og kollegar!",
+ "Join a conversation or start a new one" : "Delta i ein samtale eller start ein ny ein",
+ "Files" : "Filer",
+ "Other" : "Anna",
+ "Away" : "Borte",
+ "Default" : "Standard",
+ "The password is wrong. Try again." : "Passordet er gale. Prøv igjen.",
+ "Remove" : "Fjern"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/l10n/oc.js b/l10n/oc.js
index 1ef051bb7..700af8262 100644
--- a/l10n/oc.js
+++ b/l10n/oc.js
@@ -920,19 +920,13 @@ OC.L10N.register(
"Settings" : "Paramètres",
"Shared items" : "Elements partejats",
"Participants ({count})" : "Participants ({count})",
- "Media" : "Mèdia",
- "Files" : "Fichièrs",
- "Voice messages" : "Messatges àudio",
- "Locations" : "Emplaçaments",
- "Audio" : "Àudio",
- "Other" : "Autre",
+ "Projects" : "Projèctes",
"Show all media" : "Veire totes los mèdia",
"Show all files" : "Veire totes los fichièrs",
"Show all voice messages" : "Veire totes los messatges àudio",
"Show all locations" : "Veire totes los emplaçaments",
"Show all audio" : "Veire totes los àudios",
"Show all other" : "Veire tota la rèsta",
- "Projects" : "Projèctes",
"Meeting ID: {meetingId}" : "ID reünion : {meetingId}",
"Your PIN: {attendeePin}" : "Vòstre PIN : {attendeePin}",
"Display name: <strong>{name}</strong>" : "Nom d’afichatge : <strong>{name}</strong>",
@@ -996,6 +990,12 @@ OC.L10N.register(
"Error while accessing microphone" : "Error pendent l’accès al microfòn",
"Access to camera is only possible with HTTPS" : "L’accès a la camèra es sonque possibla amb HTTPS",
"An error occurred while fetching the participants" : "Una error s’es producha en recuperant los participants",
+ "Media" : "Mèdia",
+ "Files" : "Fichièrs",
+ "Voice messages" : "Messatges àudio",
+ "Locations" : "Emplaçaments",
+ "Audio" : "Àudio",
+ "Other" : "Autre",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk foguèt mes a jorn, mercés de tornar cargar la pagina",
"Do not disturb" : "Me desrengar pas",
"Away" : "Absent",
diff --git a/l10n/oc.json b/l10n/oc.json
index ec7743fde..97576c429 100644
--- a/l10n/oc.json
+++ b/l10n/oc.json
@@ -918,19 +918,13 @@
"Settings" : "Paramètres",
"Shared items" : "Elements partejats",
"Participants ({count})" : "Participants ({count})",
- "Media" : "Mèdia",
- "Files" : "Fichièrs",
- "Voice messages" : "Messatges àudio",
- "Locations" : "Emplaçaments",
- "Audio" : "Àudio",
- "Other" : "Autre",
+ "Projects" : "Projèctes",
"Show all media" : "Veire totes los mèdia",
"Show all files" : "Veire totes los fichièrs",
"Show all voice messages" : "Veire totes los messatges àudio",
"Show all locations" : "Veire totes los emplaçaments",
"Show all audio" : "Veire totes los àudios",
"Show all other" : "Veire tota la rèsta",
- "Projects" : "Projèctes",
"Meeting ID: {meetingId}" : "ID reünion : {meetingId}",
"Your PIN: {attendeePin}" : "Vòstre PIN : {attendeePin}",
"Display name: <strong>{name}</strong>" : "Nom d’afichatge : <strong>{name}</strong>",
@@ -994,6 +988,12 @@
"Error while accessing microphone" : "Error pendent l’accès al microfòn",
"Access to camera is only possible with HTTPS" : "L’accès a la camèra es sonque possibla amb HTTPS",
"An error occurred while fetching the participants" : "Una error s’es producha en recuperant los participants",
+ "Media" : "Mèdia",
+ "Files" : "Fichièrs",
+ "Voice messages" : "Messatges àudio",
+ "Locations" : "Emplaçaments",
+ "Audio" : "Àudio",
+ "Other" : "Autre",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk foguèt mes a jorn, mercés de tornar cargar la pagina",
"Do not disturb" : "Me desrengar pas",
"Away" : "Absent",
diff --git a/l10n/pl.js b/l10n/pl.js
index de80f1ea0..53d2a0526 100644
--- a/l10n/pl.js
+++ b/l10n/pl.js
@@ -1039,13 +1039,7 @@ OC.L10N.register(
"Settings" : "Ustawienia",
"Shared items" : "Udostępnione elementy",
"Participants ({count})" : "Uczestnicy ({count})",
- "Media" : "Multimedia",
- "Files" : "Pliki",
- "Deck cards" : "Karty tablicy",
- "Voice messages" : "Wiadomości głosowe",
- "Locations" : "Lokalizacje",
- "Audio" : "Audio",
- "Other" : "Inne",
+ "Projects" : "Projekty",
"Show all media" : "Pokaż wszystkie multimedia",
"Show all files" : "Pokaż wszystkie pliki",
"Show all deck cards" : "Pokaż wszystkie karty tablicy",
@@ -1053,7 +1047,6 @@ OC.L10N.register(
"Show all locations" : "Pokaż wszystkie lokalizacje",
"Show all audio" : "Pokaż wszystkie audio",
"Show all other" : "Pokaż wszystkie inne",
- "Projects" : "Projekty",
"Meeting ID: {meetingId}" : "ID spotkania: {meetingId}",
"Your PIN: {attendeePin}" : "Twój kod PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Wyświetlana nazwa: <strong>{name}</strong>",
@@ -1063,6 +1056,7 @@ OC.L10N.register(
"Sounds" : "Dźwięki",
"Play sounds when participants join or leave a call" : "Odtwarzaj dźwięki, gdy uczestnicy dołączają lub opuszczają połączenie",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "Obecnie nie można odtwarzać dźwięków w przeglądarce Safari oraz na urządzeniach iPad i iPhone ze względu na ograniczenia techniczne producenta.",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "Dźwięki powiadomień dla czatu i połączeń można dostosować w ustawieniach osobistych.",
"Keyboard shortcuts" : "Skróty klawiaturowe",
"Speed up your Talk experience with these quick shortcuts." : "Przyspiesz korzystanie z Talka dzięki szybkim skrótom.",
"Focus the chat input" : "Skoncentruj się na rozmowie",
@@ -1123,6 +1117,13 @@ OC.L10N.register(
"Error while accessing microphone" : "Błąd podczas uzyskiwania dostępu do mikrofonu",
"Access to camera is only possible with HTTPS" : "Dostęp do kamery jest możliwy tylko przy użyciu protokołu HTTPS",
"An error occurred while fetching the participants" : "Wystąpił błąd podczas pobierania uczestników",
+ "Media" : "Multimedia",
+ "Files" : "Pliki",
+ "Deck cards" : "Karty tablicy",
+ "Voice messages" : "Wiadomości głosowe",
+ "Locations" : "Lokalizacje",
+ "Audio" : "Audio",
+ "Other" : "Inne",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk został zaktualizowany, przeładuj stronę",
"Do not disturb" : "Nie przeszkadzać",
"Away" : "Bezczynny",
@@ -1131,6 +1132,7 @@ OC.L10N.register(
"Not enough free space to upload file \"{fileName}\"" : "Za mało wolnego miejsca, aby wysłać plik \"{fileName}\"",
"Error while uploading file \"{fileName}\"" : "Błąd podczas wysyłania pliku \"{fileName}\"",
"An error happened when trying to share your file" : "Wystąpił błąd podczas udostępnienia tego pliku",
+ "{guest} (guest)" : "{guest} (gość)",
"Could not post message: {errorMessage}" : "Nie można wysłać wiadomości: {errorMessage}",
"Failed to add reaction" : "Nie udało się dodać reakcji",
"Failed to remove reaction" : "Nie udało się usunąć reakcji",
diff --git a/l10n/pl.json b/l10n/pl.json
index 4fca4484a..3a414558d 100644
--- a/l10n/pl.json
+++ b/l10n/pl.json
@@ -1037,13 +1037,7 @@
"Settings" : "Ustawienia",
"Shared items" : "Udostępnione elementy",
"Participants ({count})" : "Uczestnicy ({count})",
- "Media" : "Multimedia",
- "Files" : "Pliki",
- "Deck cards" : "Karty tablicy",
- "Voice messages" : "Wiadomości głosowe",
- "Locations" : "Lokalizacje",
- "Audio" : "Audio",
- "Other" : "Inne",
+ "Projects" : "Projekty",
"Show all media" : "Pokaż wszystkie multimedia",
"Show all files" : "Pokaż wszystkie pliki",
"Show all deck cards" : "Pokaż wszystkie karty tablicy",
@@ -1051,7 +1045,6 @@
"Show all locations" : "Pokaż wszystkie lokalizacje",
"Show all audio" : "Pokaż wszystkie audio",
"Show all other" : "Pokaż wszystkie inne",
- "Projects" : "Projekty",
"Meeting ID: {meetingId}" : "ID spotkania: {meetingId}",
"Your PIN: {attendeePin}" : "Twój kod PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Wyświetlana nazwa: <strong>{name}</strong>",
@@ -1061,6 +1054,7 @@
"Sounds" : "Dźwięki",
"Play sounds when participants join or leave a call" : "Odtwarzaj dźwięki, gdy uczestnicy dołączają lub opuszczają połączenie",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "Obecnie nie można odtwarzać dźwięków w przeglądarce Safari oraz na urządzeniach iPad i iPhone ze względu na ograniczenia techniczne producenta.",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "Dźwięki powiadomień dla czatu i połączeń można dostosować w ustawieniach osobistych.",
"Keyboard shortcuts" : "Skróty klawiaturowe",
"Speed up your Talk experience with these quick shortcuts." : "Przyspiesz korzystanie z Talka dzięki szybkim skrótom.",
"Focus the chat input" : "Skoncentruj się na rozmowie",
@@ -1121,6 +1115,13 @@
"Error while accessing microphone" : "Błąd podczas uzyskiwania dostępu do mikrofonu",
"Access to camera is only possible with HTTPS" : "Dostęp do kamery jest możliwy tylko przy użyciu protokołu HTTPS",
"An error occurred while fetching the participants" : "Wystąpił błąd podczas pobierania uczestników",
+ "Media" : "Multimedia",
+ "Files" : "Pliki",
+ "Deck cards" : "Karty tablicy",
+ "Voice messages" : "Wiadomości głosowe",
+ "Locations" : "Lokalizacje",
+ "Audio" : "Audio",
+ "Other" : "Inne",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk został zaktualizowany, przeładuj stronę",
"Do not disturb" : "Nie przeszkadzać",
"Away" : "Bezczynny",
@@ -1129,6 +1130,7 @@
"Not enough free space to upload file \"{fileName}\"" : "Za mało wolnego miejsca, aby wysłać plik \"{fileName}\"",
"Error while uploading file \"{fileName}\"" : "Błąd podczas wysyłania pliku \"{fileName}\"",
"An error happened when trying to share your file" : "Wystąpił błąd podczas udostępnienia tego pliku",
+ "{guest} (guest)" : "{guest} (gość)",
"Could not post message: {errorMessage}" : "Nie można wysłać wiadomości: {errorMessage}",
"Failed to add reaction" : "Nie udało się dodać reakcji",
"Failed to remove reaction" : "Nie udało się usunąć reakcji",
diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js
index 30734c464..5cf2db172 100644
--- a/l10n/pt_BR.js
+++ b/l10n/pt_BR.js
@@ -1039,13 +1039,7 @@ OC.L10N.register(
"Settings" : "Configurações",
"Shared items" : "Itens compartilhados",
"Participants ({count})" : "Participantes ({count}) ",
- "Media" : "Meios de comunicação",
- "Files" : "Arquivos",
- "Deck cards" : "Cartas de baralho",
- "Voice messages" : "Mensagens de voz",
- "Locations" : "Localizações",
- "Audio" : "Áudio",
- "Other" : "Outro",
+ "Projects" : "Projetos",
"Show all media" : "Mostrar todas as mídias",
"Show all files" : "Mostrar todos os arquivos",
"Show all deck cards" : "Mostrar todas as cartas de baralho",
@@ -1053,7 +1047,6 @@ OC.L10N.register(
"Show all locations" : "Mostrar todos os locais",
"Show all audio" : "Mostrar todo o áudio",
"Show all other" : "Mostrar todos os outros",
- "Projects" : "Projetos",
"Meeting ID: {meetingId}" : "ID da reunião: {meetingId}",
"Your PIN: {attendeePin}" : "Seu PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Mostrar nome: <strong>{name}</strong>",
@@ -1123,6 +1116,13 @@ OC.L10N.register(
"Error while accessing microphone" : "Erro ao acessar microfone",
"Access to camera is only possible with HTTPS" : "O acesso à câmera somente é possível via HTTPS",
"An error occurred while fetching the participants" : "Erro ao buscar os participantes",
+ "Media" : "Meios de comunicação",
+ "Files" : "Arquivos",
+ "Deck cards" : "Cartas de baralho",
+ "Voice messages" : "Mensagens de voz",
+ "Locations" : "Localizações",
+ "Audio" : "Áudio",
+ "Other" : "Outro",
"Nextcloud Talk was updated, please reload the page" : "O Nextcloud Talk foi atualizado, recarregue a página",
"Do not disturb" : "Não perturbe",
"Away" : "Fora",
diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json
index 3f472b044..4ac6b42b9 100644
--- a/l10n/pt_BR.json
+++ b/l10n/pt_BR.json
@@ -1037,13 +1037,7 @@
"Settings" : "Configurações",
"Shared items" : "Itens compartilhados",
"Participants ({count})" : "Participantes ({count}) ",
- "Media" : "Meios de comunicação",
- "Files" : "Arquivos",
- "Deck cards" : "Cartas de baralho",
- "Voice messages" : "Mensagens de voz",
- "Locations" : "Localizações",
- "Audio" : "Áudio",
- "Other" : "Outro",
+ "Projects" : "Projetos",
"Show all media" : "Mostrar todas as mídias",
"Show all files" : "Mostrar todos os arquivos",
"Show all deck cards" : "Mostrar todas as cartas de baralho",
@@ -1051,7 +1045,6 @@
"Show all locations" : "Mostrar todos os locais",
"Show all audio" : "Mostrar todo o áudio",
"Show all other" : "Mostrar todos os outros",
- "Projects" : "Projetos",
"Meeting ID: {meetingId}" : "ID da reunião: {meetingId}",
"Your PIN: {attendeePin}" : "Seu PIN: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Mostrar nome: <strong>{name}</strong>",
@@ -1121,6 +1114,13 @@
"Error while accessing microphone" : "Erro ao acessar microfone",
"Access to camera is only possible with HTTPS" : "O acesso à câmera somente é possível via HTTPS",
"An error occurred while fetching the participants" : "Erro ao buscar os participantes",
+ "Media" : "Meios de comunicação",
+ "Files" : "Arquivos",
+ "Deck cards" : "Cartas de baralho",
+ "Voice messages" : "Mensagens de voz",
+ "Locations" : "Localizações",
+ "Audio" : "Áudio",
+ "Other" : "Outro",
"Nextcloud Talk was updated, please reload the page" : "O Nextcloud Talk foi atualizado, recarregue a página",
"Do not disturb" : "Não perturbe",
"Away" : "Fora",
diff --git a/l10n/pt_PT.js b/l10n/pt_PT.js
index 2f48e2332..e69f0c2a6 100644
--- a/l10n/pt_PT.js
+++ b/l10n/pt_PT.js
@@ -12,33 +12,54 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["%n outro","%n outros"],
"{actor} invited you to {call}" : "{actor} convidou-o para {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Foi convidado para uma <strong>conversa</strong> ou teve uma <strong>chamada</strong>",
+ "Other activities" : "Outras atividades",
"Talk" : "Falar",
"Guest" : "Convidado",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Bem-vindo ao Nextcloud Talk!\nNesta conversa será informado sobre novas funcionalidades disponíveis no Nextcloud Talk.",
"- Microsoft Edge and Safari can now be used to participate in audio and video calls" : "- O Microsoft Edge e o Safari podem, agora, ser utilizados para participar em chamadas áudio e vídeo.",
"Talk to %s" : "Falar com %s",
+ "File is too big" : "O ficheiro é demasiado grande",
+ "Invalid file provided" : "Fornecido ficheiro inválido",
+ "Invalid image" : "Imagem inválida",
+ "Unknown filetype" : "Tipo de ficheiro desconhecido",
+ "An error occurred. Please contact your admin." : "Ocorreu um erro. Por favor, contacte o seu administrador.",
"Join call" : "Juntar-se à chamada",
"A group call has started in {call}" : "Uma chamada de grupo começou em {call}",
"Open settings" : "Abrir definições",
"Conversations" : "Conversações",
"Messages" : "Mensagens",
"Andorra" : "Andorra",
+ "United Arab Emirates" : "Emirados Árabes Unidos",
"Afghanistan" : "Afeganistão",
+ "Albania" : "Albânia",
"Armenia" : "Arménia",
"Angola" : "Angola",
+ "Antarctica" : "Antárctica",
"Argentina" : "Argentina",
+ "American Samoa" : "Samoa Americana",
"Austria" : "Áustria",
"Australia" : "Austrália",
+ "Aruba" : "Aruba",
"Azerbaijan" : "Azerbaijão",
+ "Bosnia and Herzegovina" : "Bosnia Herzegovina",
+ "Barbados" : "Barbados",
"Bangladesh" : "Bangladesh",
"Belgium" : "Bélgica",
"Burkina Faso" : "Burkina Faso",
"Bulgaria" : "Bulgária",
+ "Burundi" : "Burundi",
+ "Benin" : "Benim",
"Brazil" : "Brasil",
"Bahamas" : "Bahamas",
+ "Bhutan" : "Butão",
"Botswana" : "Botswana",
+ "Belarus" : "Bielorrússia",
+ "Belize" : "Belize",
"Canada" : "Canada",
+ "Central African Republic" : "República Central Africana",
"Congo" : "Congo",
+ "Switzerland" : "Suiça",
+ "Cook Islands" : "Ilhas Cook",
"Chile" : "Chile",
"Cameroon" : "Camarões",
"China" : "China",
@@ -46,25 +67,160 @@ OC.L10N.register(
"Costa Rica" : "Costa Rica",
"Cuba" : "Cuba",
"Cabo Verde" : "Cabo Verde",
+ "Cyprus" : "Chipre",
+ "Germany" : "Alemanha",
+ "Djibouti" : "Djibouti",
"Denmark" : "Dinamarca",
+ "Dominican Republic" : "República Dominicana",
"Algeria" : "Algéria",
+ "Ecuador" : "Equador",
"Estonia" : "Estónia",
+ "Egypt" : "Egipto",
+ "Eritrea" : "Eritreia",
+ "Spain" : "Espanha",
"Ethiopia" : "Etiópia",
"Finland" : "Finlândia",
+ "Fiji" : "Ilhas Fiji",
+ "Faroe Islands" : "Ilhas Faroe",
"France" : "França",
+ "Gabon" : "Gabão",
+ "Grenada" : "Granada",
+ "Georgia" : "Geórgia",
+ "French Guiana" : "Guiana Francesa",
+ "Guernsey" : "Guernsey",
+ "Ghana" : "Gana",
+ "Gibraltar" : "Gibraltar",
+ "Greenland" : "Islândia",
+ "Gambia" : "Gambia",
+ "Guinea" : "Guiné",
+ "Guadeloupe" : "Guadalupe",
+ "Equatorial Guinea" : "Guiné Equatorial",
+ "Greece" : "Grécia",
+ "Guatemala" : "Guatemala",
+ "Guam" : "Guam",
+ "Guinea-Bissau" : "Guiné-Bissau",
+ "Guyana" : "Guiana",
+ "Hong Kong" : "Hong Kong",
+ "Honduras" : "Honduras",
"Croatia" : "Croácia",
+ "Haiti" : "Haiti",
+ "Hungary" : "Hungria",
+ "Indonesia" : "Indonésia",
+ "Ireland" : "Irlanda",
+ "Israel" : "Israel",
+ "Isle of Man" : "Ilha de Man",
+ "India" : "Índia",
+ "Iraq" : "Iraque",
+ "Iceland" : "Islândia",
+ "Italy" : "Italia",
+ "Jamaica" : "Jamaica",
+ "Jordan" : "Jordânia",
+ "Japan" : "Japão",
+ "Kenya" : "Quénia",
+ "Kyrgyzstan" : "Quirquistão",
+ "Cambodia" : "Cambodja",
+ "Kuwait" : "Kuwait",
+ "Cayman Islands" : "Ilhas Caimão",
+ "Kazakhstan" : "Casaquistão",
+ "Lebanon" : "Líbano",
+ "Liechtenstein" : "Liechtenstein",
+ "Sri Lanka" : "Sri Lanka",
+ "Liberia" : "Libéria",
+ "Lesotho" : "Lesoto",
+ "Lithuania" : "Lituania",
+ "Luxembourg" : "Luxemburgo",
+ "Latvia" : "Letónia",
+ "Libya" : "Libia",
+ "Morocco" : "Marrocos",
+ "Monaco" : "Mónaco",
+ "Montenegro" : "Montenegro",
+ "Madagascar" : "Madagáscar",
+ "Marshall Islands" : "Ilhas Marshall",
+ "Mali" : "Mali",
+ "Myanmar" : "Myanmar",
+ "Mongolia" : "Mongolia",
+ "Macao" : "Macau",
+ "Mauritania" : "Mauritânia",
+ "Montserrat" : "Monserrate",
+ "Malta" : "Malta",
+ "Mauritius" : "Ilhas Maurícias",
+ "Maldives" : "Ilhas Maldivas",
+ "Malawi" : "Malawi",
+ "Mexico" : "México",
+ "Malaysia" : "Malasia",
+ "Mozambique" : "Moçambique",
+ "Namibia" : "Namíbia",
+ "New Caledonia" : "Nova Caledónia",
+ "Niger" : "Níger",
+ "Nigeria" : "Nigéria",
+ "Nicaragua" : "Nicarágua",
+ "Netherlands" : "Holanda",
+ "Norway" : "Noruega",
+ "Nepal" : "Nepal",
+ "New Zealand" : "Nova Zelândia",
+ "Oman" : "Oman",
+ "Panama" : "Panamá",
+ "Peru" : "Peru",
+ "French Polynesia" : "Polinésia Francesa",
+ "Papua New Guinea" : "Papua Nova Guiné",
+ "Philippines" : "Filipinas",
+ "Pakistan" : "Paquistão",
+ "Poland" : "Polónia",
+ "Puerto Rico" : "Porto Rico",
"Portugal" : "Portugal",
+ "Paraguay" : "Paraguai",
+ "Qatar" : "Quatar ",
+ "Romania" : "Roménia",
+ "Serbia" : "Servia",
+ "Rwanda" : "Ruanda",
+ "Saudi Arabia" : "Arábia Saudita",
+ "Solomon Islands" : "Ilhas Salomão",
+ "Seychelles" : "Ilhas Seychelles",
+ "Sudan" : "Sudão",
+ "Sweden" : "Suécia",
+ "Singapore" : "Singapura",
+ "Slovenia" : "Eslovénia",
+ "Sierra Leone" : "Serra Leoa",
+ "San Marino" : "San Marino",
+ "Senegal" : "Senegal",
+ "Somalia" : "Somália",
+ "Suriname" : "Suriname",
+ "Sao Tome and Principe" : "São Tomé e Príncipe",
+ "El Salvador" : "El Salvador",
+ "Chad" : "Chade",
+ "Togo" : "Togo",
+ "Thailand" : "Tailândia",
+ "Tajikistan" : "Tajaquistão",
+ "Timor-Leste" : "Timor-Leste",
+ "Turkmenistan" : "Turcomenistão",
+ "Tunisia" : "Tunísia",
+ "Tonga" : "Tonga",
+ "Turkey" : "Turquia",
+ "Trinidad and Tobago" : "Trinidad e Tobago",
+ "Tuvalu" : "Tuvalu",
+ "Ukraine" : "Ucrânia",
+ "Uganda" : "Uganda",
+ "Uruguay" : "Uruguai",
+ "Uzbekistan" : "Uzbequistão",
+ "Vanuatu" : "Vanuatu",
+ "Samoa" : "Samoa",
+ "Yemen" : "Iemen",
+ "South Africa" : "África do Sul",
+ "Zambia" : "Zâmbia",
+ "Zimbabwe" : "Zimbábue ",
"Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD",
"Leave call" : "Sair da chamada",
"Limit to groups" : "Limitado a grupos",
"Everyone" : "Para todos",
"Save changes" : "Guardar alterações",
+ "Saving …" : "A guardar...",
"Saved!" : "Gravado!",
"None" : "Nenhum",
"User" : "Utilizador",
"Disabled" : "Desactivado",
"Users" : "Utilizadores",
"Name" : "Nome",
+ "General settings" : "Definições Gerais",
"Language" : "Idioma",
"Country" : "País",
"Status" : "Estado",
@@ -77,11 +233,14 @@ OC.L10N.register(
"Validate SSL certificate" : "Validar certificado SSL",
"Saved" : "Gravado",
"TURN server protocols" : "Protocolos do servidor TURN",
+ "OK" : "Ok",
+ "Checking …" : "A verificar...",
"Copy link" : "Copiar ligação",
"Waiting for others to join the call …" : "À espera que outros se juntem à chamada ..",
"You can invite others in the participant tab of the sidebar" : "Pode convidar outros no separador participantes na barra lateral ",
"Share this link to invite others!" : "Envie este link para convidar outros!",
"Dismiss" : "Dispensar",
+ "More actions" : "Mais acções",
"Mute audio" : "Silenciar áudio",
"Disable video" : "desactivar vídeo",
"Enable video" : "activar vídeo",
@@ -97,12 +256,16 @@ OC.L10N.register(
"You" : "Você",
"Show screen" : "Mostrar ecrã",
"Favorite" : "Favorito",
+ "Description" : "Descrição",
+ "Notifications" : "Notificações",
"Leave conversation" : "Sair da conversação",
"Delete conversation" : "Eliminar conversação",
"Password protection" : "Protegido por palavra-passe",
"Enter a password" : "Insira uma palavra-passe",
+ "Enable lobby" : "Ativar lobby",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Apagar",
"Password" : "Palavra-passe",
"API token" : "Token de API",
"Login" : "Iniciar sessão",
@@ -117,6 +280,7 @@ OC.L10N.register(
"Close" : "Fechar",
"Conversation name" : "Nome da conversação",
"Reply" : "Resposta",
+ "Contact" : "Contacto",
"Today" : "Hoje",
"Yesterday" : "Ontem",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -126,16 +290,27 @@ OC.L10N.register(
"Demote from moderator" : "Relegar de moderador",
"Promote to moderator" : "Promover a moderador",
"Remove participant" : "Remover participante",
+ "Searching …" : "À procura …",
"No results" : "Sem resultados",
"Add users or groups" : "Add users or groups",
"Participants" : "Participantes",
"Chat" : "Conversa",
+ "Details" : "Detalhes",
"Settings" : "Definições",
+ "Privacy" : "Privacidade",
"Keyboard shortcuts" : "Atalhos de teclado",
"Search" : "Pesquisa sobre",
"Rename conversation" : "Renomear conversação",
"Send" : "Enviar",
"Start a conversation" : "Iniciar uma conversação",
+ "Media" : "Media",
+ "Files" : "Ficheiros",
+ "Locations" : "Localizações",
+ "Audio" : "Áudio",
+ "Other" : "Outro",
+ "Do not disturb" : "Não incomodar",
+ "Away" : "Ausente",
+ "Error while sharing file" : "Erro ao partilhar ficheiro",
"Default" : "Predefinida",
"Access to microphone & camera is only possible with HTTPS" : "Só é possível aceder ao microfone & câmera com HTTPS",
"Access to microphone & camera was denied" : "Acesso recusado ao microfone & câmera",
diff --git a/l10n/pt_PT.json b/l10n/pt_PT.json
index 8c147ca96..155f08eb5 100644
--- a/l10n/pt_PT.json
+++ b/l10n/pt_PT.json
@@ -10,33 +10,54 @@
"_%n other_::_%n others_" : ["%n outro","%n outros"],
"{actor} invited you to {call}" : "{actor} convidou-o para {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Foi convidado para uma <strong>conversa</strong> ou teve uma <strong>chamada</strong>",
+ "Other activities" : "Outras atividades",
"Talk" : "Falar",
"Guest" : "Convidado",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Bem-vindo ao Nextcloud Talk!\nNesta conversa será informado sobre novas funcionalidades disponíveis no Nextcloud Talk.",
"- Microsoft Edge and Safari can now be used to participate in audio and video calls" : "- O Microsoft Edge e o Safari podem, agora, ser utilizados para participar em chamadas áudio e vídeo.",
"Talk to %s" : "Falar com %s",
+ "File is too big" : "O ficheiro é demasiado grande",
+ "Invalid file provided" : "Fornecido ficheiro inválido",
+ "Invalid image" : "Imagem inválida",
+ "Unknown filetype" : "Tipo de ficheiro desconhecido",
+ "An error occurred. Please contact your admin." : "Ocorreu um erro. Por favor, contacte o seu administrador.",
"Join call" : "Juntar-se à chamada",
"A group call has started in {call}" : "Uma chamada de grupo começou em {call}",
"Open settings" : "Abrir definições",
"Conversations" : "Conversações",
"Messages" : "Mensagens",
"Andorra" : "Andorra",
+ "United Arab Emirates" : "Emirados Árabes Unidos",
"Afghanistan" : "Afeganistão",
+ "Albania" : "Albânia",
"Armenia" : "Arménia",
"Angola" : "Angola",
+ "Antarctica" : "Antárctica",
"Argentina" : "Argentina",
+ "American Samoa" : "Samoa Americana",
"Austria" : "Áustria",
"Australia" : "Austrália",
+ "Aruba" : "Aruba",
"Azerbaijan" : "Azerbaijão",
+ "Bosnia and Herzegovina" : "Bosnia Herzegovina",
+ "Barbados" : "Barbados",
"Bangladesh" : "Bangladesh",
"Belgium" : "Bélgica",
"Burkina Faso" : "Burkina Faso",
"Bulgaria" : "Bulgária",
+ "Burundi" : "Burundi",
+ "Benin" : "Benim",
"Brazil" : "Brasil",
"Bahamas" : "Bahamas",
+ "Bhutan" : "Butão",
"Botswana" : "Botswana",
+ "Belarus" : "Bielorrússia",
+ "Belize" : "Belize",
"Canada" : "Canada",
+ "Central African Republic" : "República Central Africana",
"Congo" : "Congo",
+ "Switzerland" : "Suiça",
+ "Cook Islands" : "Ilhas Cook",
"Chile" : "Chile",
"Cameroon" : "Camarões",
"China" : "China",
@@ -44,25 +65,160 @@
"Costa Rica" : "Costa Rica",
"Cuba" : "Cuba",
"Cabo Verde" : "Cabo Verde",
+ "Cyprus" : "Chipre",
+ "Germany" : "Alemanha",
+ "Djibouti" : "Djibouti",
"Denmark" : "Dinamarca",
+ "Dominican Republic" : "República Dominicana",
"Algeria" : "Algéria",
+ "Ecuador" : "Equador",
"Estonia" : "Estónia",
+ "Egypt" : "Egipto",
+ "Eritrea" : "Eritreia",
+ "Spain" : "Espanha",
"Ethiopia" : "Etiópia",
"Finland" : "Finlândia",
+ "Fiji" : "Ilhas Fiji",
+ "Faroe Islands" : "Ilhas Faroe",
"France" : "França",
+ "Gabon" : "Gabão",
+ "Grenada" : "Granada",
+ "Georgia" : "Geórgia",
+ "French Guiana" : "Guiana Francesa",
+ "Guernsey" : "Guernsey",
+ "Ghana" : "Gana",
+ "Gibraltar" : "Gibraltar",
+ "Greenland" : "Islândia",
+ "Gambia" : "Gambia",
+ "Guinea" : "Guiné",
+ "Guadeloupe" : "Guadalupe",
+ "Equatorial Guinea" : "Guiné Equatorial",
+ "Greece" : "Grécia",
+ "Guatemala" : "Guatemala",
+ "Guam" : "Guam",
+ "Guinea-Bissau" : "Guiné-Bissau",
+ "Guyana" : "Guiana",
+ "Hong Kong" : "Hong Kong",
+ "Honduras" : "Honduras",
"Croatia" : "Croácia",
+ "Haiti" : "Haiti",
+ "Hungary" : "Hungria",
+ "Indonesia" : "Indonésia",
+ "Ireland" : "Irlanda",
+ "Israel" : "Israel",
+ "Isle of Man" : "Ilha de Man",
+ "India" : "Índia",
+ "Iraq" : "Iraque",
+ "Iceland" : "Islândia",
+ "Italy" : "Italia",
+ "Jamaica" : "Jamaica",
+ "Jordan" : "Jordânia",
+ "Japan" : "Japão",
+ "Kenya" : "Quénia",
+ "Kyrgyzstan" : "Quirquistão",
+ "Cambodia" : "Cambodja",
+ "Kuwait" : "Kuwait",
+ "Cayman Islands" : "Ilhas Caimão",
+ "Kazakhstan" : "Casaquistão",
+ "Lebanon" : "Líbano",
+ "Liechtenstein" : "Liechtenstein",
+ "Sri Lanka" : "Sri Lanka",
+ "Liberia" : "Libéria",
+ "Lesotho" : "Lesoto",
+ "Lithuania" : "Lituania",
+ "Luxembourg" : "Luxemburgo",
+ "Latvia" : "Letónia",
+ "Libya" : "Libia",
+ "Morocco" : "Marrocos",
+ "Monaco" : "Mónaco",
+ "Montenegro" : "Montenegro",
+ "Madagascar" : "Madagáscar",
+ "Marshall Islands" : "Ilhas Marshall",
+ "Mali" : "Mali",
+ "Myanmar" : "Myanmar",
+ "Mongolia" : "Mongolia",
+ "Macao" : "Macau",
+ "Mauritania" : "Mauritânia",
+ "Montserrat" : "Monserrate",
+ "Malta" : "Malta",
+ "Mauritius" : "Ilhas Maurícias",
+ "Maldives" : "Ilhas Maldivas",
+ "Malawi" : "Malawi",
+ "Mexico" : "México",
+ "Malaysia" : "Malasia",
+ "Mozambique" : "Moçambique",
+ "Namibia" : "Namíbia",
+ "New Caledonia" : "Nova Caledónia",
+ "Niger" : "Níger",
+ "Nigeria" : "Nigéria",
+ "Nicaragua" : "Nicarágua",
+ "Netherlands" : "Holanda",
+ "Norway" : "Noruega",
+ "Nepal" : "Nepal",
+ "New Zealand" : "Nova Zelândia",
+ "Oman" : "Oman",
+ "Panama" : "Panamá",
+ "Peru" : "Peru",
+ "French Polynesia" : "Polinésia Francesa",
+ "Papua New Guinea" : "Papua Nova Guiné",
+ "Philippines" : "Filipinas",
+ "Pakistan" : "Paquistão",
+ "Poland" : "Polónia",
+ "Puerto Rico" : "Porto Rico",
"Portugal" : "Portugal",
+ "Paraguay" : "Paraguai",
+ "Qatar" : "Quatar ",
+ "Romania" : "Roménia",
+ "Serbia" : "Servia",
+ "Rwanda" : "Ruanda",
+ "Saudi Arabia" : "Arábia Saudita",
+ "Solomon Islands" : "Ilhas Salomão",
+ "Seychelles" : "Ilhas Seychelles",
+ "Sudan" : "Sudão",
+ "Sweden" : "Suécia",
+ "Singapore" : "Singapura",
+ "Slovenia" : "Eslovénia",
+ "Sierra Leone" : "Serra Leoa",
+ "San Marino" : "San Marino",
+ "Senegal" : "Senegal",
+ "Somalia" : "Somália",
+ "Suriname" : "Suriname",
+ "Sao Tome and Principe" : "São Tomé e Príncipe",
+ "El Salvador" : "El Salvador",
+ "Chad" : "Chade",
+ "Togo" : "Togo",
+ "Thailand" : "Tailândia",
+ "Tajikistan" : "Tajaquistão",
+ "Timor-Leste" : "Timor-Leste",
+ "Turkmenistan" : "Turcomenistão",
+ "Tunisia" : "Tunísia",
+ "Tonga" : "Tonga",
+ "Turkey" : "Turquia",
+ "Trinidad and Tobago" : "Trinidad e Tobago",
+ "Tuvalu" : "Tuvalu",
+ "Ukraine" : "Ucrânia",
+ "Uganda" : "Uganda",
+ "Uruguay" : "Uruguai",
+ "Uzbekistan" : "Uzbequistão",
+ "Vanuatu" : "Vanuatu",
+ "Samoa" : "Samoa",
+ "Yemen" : "Iemen",
+ "South Africa" : "África do Sul",
+ "Zambia" : "Zâmbia",
+ "Zimbabwe" : "Zimbábue ",
"Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD",
"Leave call" : "Sair da chamada",
"Limit to groups" : "Limitado a grupos",
"Everyone" : "Para todos",
"Save changes" : "Guardar alterações",
+ "Saving …" : "A guardar...",
"Saved!" : "Gravado!",
"None" : "Nenhum",
"User" : "Utilizador",
"Disabled" : "Desactivado",
"Users" : "Utilizadores",
"Name" : "Nome",
+ "General settings" : "Definições Gerais",
"Language" : "Idioma",
"Country" : "País",
"Status" : "Estado",
@@ -75,11 +231,14 @@
"Validate SSL certificate" : "Validar certificado SSL",
"Saved" : "Gravado",
"TURN server protocols" : "Protocolos do servidor TURN",
+ "OK" : "Ok",
+ "Checking …" : "A verificar...",
"Copy link" : "Copiar ligação",
"Waiting for others to join the call …" : "À espera que outros se juntem à chamada ..",
"You can invite others in the participant tab of the sidebar" : "Pode convidar outros no separador participantes na barra lateral ",
"Share this link to invite others!" : "Envie este link para convidar outros!",
"Dismiss" : "Dispensar",
+ "More actions" : "Mais acções",
"Mute audio" : "Silenciar áudio",
"Disable video" : "desactivar vídeo",
"Enable video" : "activar vídeo",
@@ -95,12 +254,16 @@
"You" : "Você",
"Show screen" : "Mostrar ecrã",
"Favorite" : "Favorito",
+ "Description" : "Descrição",
+ "Notifications" : "Notificações",
"Leave conversation" : "Sair da conversação",
"Delete conversation" : "Eliminar conversação",
"Password protection" : "Protegido por palavra-passe",
"Enter a password" : "Insira uma palavra-passe",
+ "Enable lobby" : "Ativar lobby",
"Save" : "Guardar",
"Edit" : "Editar",
+ "Delete" : "Apagar",
"Password" : "Palavra-passe",
"API token" : "Token de API",
"Login" : "Iniciar sessão",
@@ -115,6 +278,7 @@
"Close" : "Fechar",
"Conversation name" : "Nome da conversação",
"Reply" : "Resposta",
+ "Contact" : "Contacto",
"Today" : "Hoje",
"Yesterday" : "Ontem",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -124,16 +288,27 @@
"Demote from moderator" : "Relegar de moderador",
"Promote to moderator" : "Promover a moderador",
"Remove participant" : "Remover participante",
+ "Searching …" : "À procura …",
"No results" : "Sem resultados",
"Add users or groups" : "Add users or groups",
"Participants" : "Participantes",
"Chat" : "Conversa",
+ "Details" : "Detalhes",
"Settings" : "Definições",
+ "Privacy" : "Privacidade",
"Keyboard shortcuts" : "Atalhos de teclado",
"Search" : "Pesquisa sobre",
"Rename conversation" : "Renomear conversação",
"Send" : "Enviar",
"Start a conversation" : "Iniciar uma conversação",
+ "Media" : "Media",
+ "Files" : "Ficheiros",
+ "Locations" : "Localizações",
+ "Audio" : "Áudio",
+ "Other" : "Outro",
+ "Do not disturb" : "Não incomodar",
+ "Away" : "Ausente",
+ "Error while sharing file" : "Erro ao partilhar ficheiro",
"Default" : "Predefinida",
"Access to microphone & camera is only possible with HTTPS" : "Só é possível aceder ao microfone & câmera com HTTPS",
"Access to microphone & camera was denied" : "Acesso recusado ao microfone & câmera",
diff --git a/l10n/ro.js b/l10n/ro.js
index cc314b044..698e60151 100644
--- a/l10n/ro.js
+++ b/l10n/ro.js
@@ -1,6 +1,12 @@
OC.L10N.register(
"spreed",
{
+ "File is too big" : "Fișierul este prea mare",
+ "Invalid file provided" : "Numele fișierului pe care l-ai oferit este invalid",
+ "Invalid image" : "Imagine invalidă",
+ "Unknown filetype" : "Tip fișier necunoscut",
+ "An error occurred. Please contact your admin." : "A apărut o eroare. Te rugăm să contactezi administratorul.",
+ "Open settings" : "Deschide setările",
"Andorra" : "Andorra",
"United Arab Emirates" : "United Arab Emirates",
"Afghanistan" : "Afghanistan",
@@ -247,27 +253,36 @@ OC.L10N.register(
"User" : "Utilizator",
"Disabled" : "Dezactivați",
"Users" : "Utilizatori",
+ "Beta" : "Beta",
"Name" : "Nume",
+ "Off" : "Oprit",
"Language" : "Limba",
"Country" : "Țară",
"Status" : "Stare",
+ "Created at" : "Creat la",
"Pending" : "În așteptare",
"Error" : "Eroare",
"Blocked" : "Blocat",
"Saved" : "Salvat",
+ "OK" : "OK",
"Copy link" : "Copiză link",
"Dismiss" : "Elimină",
+ "More actions" : "Mai multe acțiuni",
"Grid view" : "Afișare în grilă",
"Back" : "Înapoi",
"Favorite" : "Favorite",
+ "Description" : "Descriere",
+ "Notifications" : "Notificări",
"Password protection" : "Password protection",
"Enter a password" : "Enter a password",
"Save" : "Salvează",
"Edit" : "Editează",
+ "Delete" : "Șterge",
"Password" : "Parolă",
"Login" : "Autentificare",
"Nickname" : "Pseudonim",
"Client ID" : "ID client",
+ "Calls" : "Apeluri",
"Remove from favorites" : "Șterge din favorite",
"Add to favorites" : "Adăugați la favorite",
"Loading" : "Loading",
@@ -276,15 +291,26 @@ OC.L10N.register(
"Password protect" : "Protejare cu parolă",
"Close" : "Închide",
"Reply" : "Răspunde",
+ "Contact" : "Contact",
"Today" : "Azi",
"Yesterday" : "Ieri",
"guest" : "invitat",
"No results" : "Niciun rezultat",
"Add users or groups" : "Add users or groups",
+ "Details" : "Detalii",
"Settings" : "Setări",
+ "Projects" : "Proiecte",
+ "Show all files" : "Arată toate fișierele",
+ "Privacy" : "Confindențialitate",
"Keyboard shortcuts" : "Scurtături din tastatură",
"Search" : "Caută",
"Send" : "Trimite",
+ "Media" : "Media",
+ "Files" : "Fișiere",
+ "Audio" : "Audio",
+ "Other" : "Altele",
+ "Do not disturb" : "Nu deranja",
+ "Away" : "Plecat",
"Default" : "Implicit",
"Access to microphone & camera was denied" : "Accesul la microfon și cameră a fost refuzat",
"The password is wrong. Try again." : "Parola este incorectă. Încercaţi din nou.",
diff --git a/l10n/ro.json b/l10n/ro.json
index f12ba21fd..60fbfd2fa 100644
--- a/l10n/ro.json
+++ b/l10n/ro.json
@@ -1,4 +1,10 @@
{ "translations": {
+ "File is too big" : "Fișierul este prea mare",
+ "Invalid file provided" : "Numele fișierului pe care l-ai oferit este invalid",
+ "Invalid image" : "Imagine invalidă",
+ "Unknown filetype" : "Tip fișier necunoscut",
+ "An error occurred. Please contact your admin." : "A apărut o eroare. Te rugăm să contactezi administratorul.",
+ "Open settings" : "Deschide setările",
"Andorra" : "Andorra",
"United Arab Emirates" : "United Arab Emirates",
"Afghanistan" : "Afghanistan",
@@ -245,27 +251,36 @@
"User" : "Utilizator",
"Disabled" : "Dezactivați",
"Users" : "Utilizatori",
+ "Beta" : "Beta",
"Name" : "Nume",
+ "Off" : "Oprit",
"Language" : "Limba",
"Country" : "Țară",
"Status" : "Stare",
+ "Created at" : "Creat la",
"Pending" : "În așteptare",
"Error" : "Eroare",
"Blocked" : "Blocat",
"Saved" : "Salvat",
+ "OK" : "OK",
"Copy link" : "Copiză link",
"Dismiss" : "Elimină",
+ "More actions" : "Mai multe acțiuni",
"Grid view" : "Afișare în grilă",
"Back" : "Înapoi",
"Favorite" : "Favorite",
+ "Description" : "Descriere",
+ "Notifications" : "Notificări",
"Password protection" : "Password protection",
"Enter a password" : "Enter a password",
"Save" : "Salvează",
"Edit" : "Editează",
+ "Delete" : "Șterge",
"Password" : "Parolă",
"Login" : "Autentificare",
"Nickname" : "Pseudonim",
"Client ID" : "ID client",
+ "Calls" : "Apeluri",
"Remove from favorites" : "Șterge din favorite",
"Add to favorites" : "Adăugați la favorite",
"Loading" : "Loading",
@@ -274,15 +289,26 @@
"Password protect" : "Protejare cu parolă",
"Close" : "Închide",
"Reply" : "Răspunde",
+ "Contact" : "Contact",
"Today" : "Azi",
"Yesterday" : "Ieri",
"guest" : "invitat",
"No results" : "Niciun rezultat",
"Add users or groups" : "Add users or groups",
+ "Details" : "Detalii",
"Settings" : "Setări",
+ "Projects" : "Proiecte",
+ "Show all files" : "Arată toate fișierele",
+ "Privacy" : "Confindențialitate",
"Keyboard shortcuts" : "Scurtături din tastatură",
"Search" : "Caută",
"Send" : "Trimite",
+ "Media" : "Media",
+ "Files" : "Fișiere",
+ "Audio" : "Audio",
+ "Other" : "Altele",
+ "Do not disturb" : "Nu deranja",
+ "Away" : "Plecat",
"Default" : "Implicit",
"Access to microphone & camera was denied" : "Accesul la microfon și cameră a fost refuzat",
"The password is wrong. Try again." : "Parola este incorectă. Încercaţi din nou.",
diff --git a/l10n/ru.js b/l10n/ru.js
index 6d46122de..a283fb35c 100644
--- a/l10n/ru.js
+++ b/l10n/ru.js
@@ -892,6 +892,7 @@ OC.L10N.register(
"No search results" : "Ничего не найдено",
"Groups" : "Группы",
"Circles" : "Круги",
+ "Unread mentions" : "Непрочитанные упоминания",
"Talk settings" : "Параметры приложения",
"Users, groups and circles" : "Пользователи, группы и круги",
"Users and groups" : "Пользователи и группы",
@@ -1027,6 +1028,8 @@ OC.L10N.register(
"Details" : "Дополнительно",
"Settings" : "Настройки",
"Participants ({count})" : "Участники ({count})",
+ "Projects" : "Проекты",
+ "Show all files" : "Показать всё файлы",
"Meeting ID: {meetingId}" : "ID встречи: {meetingId}",
"Your PIN: {attendeePin}" : "Ваш PIN: {attendeePin}",
"Attachments folder" : "Папка для вложений",
@@ -1095,6 +1098,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Не удалось получить доступ к микрофону",
"Access to camera is only possible with HTTPS" : "Доступ к камере разрешён только при использовании протокола HTTPS",
"An error occurred while fetching the participants" : "Не удалось получить список участников",
+ "Media" : "Медиа",
+ "Files" : "Файлы",
+ "Locations" : "Места",
+ "Audio" : "Звук",
+ "Other" : "Другое",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk обновлен, пожалуйста обновите страницу",
"Do not disturb" : "Не беспокоить",
"Away" : "Отсутствует",
diff --git a/l10n/ru.json b/l10n/ru.json
index 58d4ab14d..28f83720a 100644
--- a/l10n/ru.json
+++ b/l10n/ru.json
@@ -890,6 +890,7 @@
"No search results" : "Ничего не найдено",
"Groups" : "Группы",
"Circles" : "Круги",
+ "Unread mentions" : "Непрочитанные упоминания",
"Talk settings" : "Параметры приложения",
"Users, groups and circles" : "Пользователи, группы и круги",
"Users and groups" : "Пользователи и группы",
@@ -1025,6 +1026,8 @@
"Details" : "Дополнительно",
"Settings" : "Настройки",
"Participants ({count})" : "Участники ({count})",
+ "Projects" : "Проекты",
+ "Show all files" : "Показать всё файлы",
"Meeting ID: {meetingId}" : "ID встречи: {meetingId}",
"Your PIN: {attendeePin}" : "Ваш PIN: {attendeePin}",
"Attachments folder" : "Папка для вложений",
@@ -1093,6 +1096,11 @@
"Error while accessing microphone" : "Не удалось получить доступ к микрофону",
"Access to camera is only possible with HTTPS" : "Доступ к камере разрешён только при использовании протокола HTTPS",
"An error occurred while fetching the participants" : "Не удалось получить список участников",
+ "Media" : "Медиа",
+ "Files" : "Файлы",
+ "Locations" : "Места",
+ "Audio" : "Звук",
+ "Other" : "Другое",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk обновлен, пожалуйста обновите страницу",
"Do not disturb" : "Не беспокоить",
"Away" : "Отсутствует",
diff --git a/l10n/sc.js b/l10n/sc.js
index 331059656..53b405e05 100644
--- a/l10n/sc.js
+++ b/l10n/sc.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["%n other","%n àtere"],
"{actor} invited you to {call}" : "{actor} t'at cumbidadu a {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "T'ant cumbidadu a una <strong>resonada</strong> o as tentu una <strong>mutida</strong>",
+ "Other activities" : "Àteras atividades",
"Talk" : "Faedda",
"Guest" : "Persone invitada",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Ti donamus sa benebènnida in Nextcloud Talk!\nIn custa resonada t'amus a informare subra de elementos noos disponìbiles in Nextcloud Talk.",
@@ -621,6 +622,7 @@ OC.L10N.register(
"Test this server" : "Proa custu serbidore",
"TURN servers" : "TURN serbidores",
"A TURN server is used to proxy the traffic from participants behind a firewall. If individual participants cannot connect to others a TURN server is most likely required. See {linkstart}this documentation{linkend} for setup instructions." : "Unu serbidore TURN s'impreat pro imbiare su tràficu dae is partezipantes a secus de unu firewall. Chi is partetzipantes individuales non si podent connètere cun is àteras persones, est probàbile chi serbat unu serbidore TURN. Controlla {linkstart}custa documentatzione{linkend} pro is istrutziones de cunfiguratzione.",
+ "OK" : "AB",
"{nickName} raised their hand." : "{nickName} ant artziadu sa manu",
"A participant raised their hand." : "Una persona at artziadu sa manu",
"Previous page of videos" : "Pàgina de vìdeos pretzedente ",
@@ -696,9 +698,11 @@ OC.L10N.register(
"Drop your files to upload" : "Iscapa is archìvios pro ddus carrigare",
"Call in progress" : "Mutida in cursu",
"Favorite" : "Preferidu",
+ "Restricted" : "Limitadu",
"Conversation settings" : "Impostatziones de sa resonada",
"Description" : "Descritzione",
"Enter a description for this conversation" : "Inserta una descritzione pro custa resonada",
+ "Notifications" : "Notìficas",
"Guests access" : "Atzessu de is persones invitadas",
"Meeting settings" : "Impostatziones de sa riunione",
"Matterbridge" : "Matterbridge",
@@ -807,6 +811,7 @@ OC.L10N.register(
"not running, check Matterbridge log" : "non in esecutzione, controlla su registru de Matterbridge",
"not running" : "non in esecutzione",
"Bridge saved" : "Collegamentu sarvadu",
+ "Calls" : "Mutidas",
"Allow participants to join from a phone." : "Permite a is partetzipantes de intrare dae unu telèfonu.",
"Enable SIP dial-in" : "Ativa s'atzessu SIP",
"SIP dial-in is now enabled" : "S'atzessu SIP immoe est ativu",
@@ -944,6 +949,8 @@ OC.L10N.register(
"Chat" : "Tzarrada",
"Details" : "Detàllios",
"Settings" : "Impostatziones",
+ "Projects" : "Progetos",
+ "Show all files" : "Mustra totu is documentos",
"Meeting ID: {meetingId}" : "ID de s'atòbiu : {meetingId}",
"Your PIN: {attendeePin}" : "Su PIN tuo: {attendeePin}",
"Attachments folder" : "Cartella de alligongiados",
@@ -1010,6 +1017,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Errore in s'atzessu a su micròfonu",
"Access to camera is only possible with HTTPS" : "S'atzessu a sa càmera si podet fàghere isceti cun HTTPS",
"An error occurred while fetching the participants" : "B'at àpidu un'errore in su recùperu de is partetzipantes",
+ "Media" : "Media",
+ "Files" : "Archìvios",
+ "Locations" : "Positziones",
+ "Audio" : "Àudio",
+ "Other" : "Àteru",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud est istadu agiornadu, torra a carrigare sa pàgina",
"Do not disturb" : "No istorbes",
"Away" : "Foras",
@@ -1101,6 +1113,7 @@ OC.L10N.register(
"Video on and off" : "Vìdeo allutu e istudadu",
"Choose in which folder attachments should be saved." : "Sèbera in cale cartella depent èssere sarvados is alligongiados",
"Exit fullscreen (f)" : "Bessi dae sa modalidade a totu ischermu (f)",
- "Fullscreen (f)" : "Totu ischermu (f)"
+ "Fullscreen (f)" : "Totu ischermu (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Imposta su livellu de notìfica pro custa resonada. Cust'atzione at a pertocare isceti is notìficas chi retzis."
},
"nplurals=2; plural=(n != 1);");
diff --git a/l10n/sc.json b/l10n/sc.json
index 706ae2bfc..7e9f4946b 100644
--- a/l10n/sc.json
+++ b/l10n/sc.json
@@ -10,6 +10,7 @@
"_%n other_::_%n others_" : ["%n other","%n àtere"],
"{actor} invited you to {call}" : "{actor} t'at cumbidadu a {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "T'ant cumbidadu a una <strong>resonada</strong> o as tentu una <strong>mutida</strong>",
+ "Other activities" : "Àteras atividades",
"Talk" : "Faedda",
"Guest" : "Persone invitada",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Ti donamus sa benebènnida in Nextcloud Talk!\nIn custa resonada t'amus a informare subra de elementos noos disponìbiles in Nextcloud Talk.",
@@ -619,6 +620,7 @@
"Test this server" : "Proa custu serbidore",
"TURN servers" : "TURN serbidores",
"A TURN server is used to proxy the traffic from participants behind a firewall. If individual participants cannot connect to others a TURN server is most likely required. See {linkstart}this documentation{linkend} for setup instructions." : "Unu serbidore TURN s'impreat pro imbiare su tràficu dae is partezipantes a secus de unu firewall. Chi is partetzipantes individuales non si podent connètere cun is àteras persones, est probàbile chi serbat unu serbidore TURN. Controlla {linkstart}custa documentatzione{linkend} pro is istrutziones de cunfiguratzione.",
+ "OK" : "AB",
"{nickName} raised their hand." : "{nickName} ant artziadu sa manu",
"A participant raised their hand." : "Una persona at artziadu sa manu",
"Previous page of videos" : "Pàgina de vìdeos pretzedente ",
@@ -694,9 +696,11 @@
"Drop your files to upload" : "Iscapa is archìvios pro ddus carrigare",
"Call in progress" : "Mutida in cursu",
"Favorite" : "Preferidu",
+ "Restricted" : "Limitadu",
"Conversation settings" : "Impostatziones de sa resonada",
"Description" : "Descritzione",
"Enter a description for this conversation" : "Inserta una descritzione pro custa resonada",
+ "Notifications" : "Notìficas",
"Guests access" : "Atzessu de is persones invitadas",
"Meeting settings" : "Impostatziones de sa riunione",
"Matterbridge" : "Matterbridge",
@@ -805,6 +809,7 @@
"not running, check Matterbridge log" : "non in esecutzione, controlla su registru de Matterbridge",
"not running" : "non in esecutzione",
"Bridge saved" : "Collegamentu sarvadu",
+ "Calls" : "Mutidas",
"Allow participants to join from a phone." : "Permite a is partetzipantes de intrare dae unu telèfonu.",
"Enable SIP dial-in" : "Ativa s'atzessu SIP",
"SIP dial-in is now enabled" : "S'atzessu SIP immoe est ativu",
@@ -942,6 +947,8 @@
"Chat" : "Tzarrada",
"Details" : "Detàllios",
"Settings" : "Impostatziones",
+ "Projects" : "Progetos",
+ "Show all files" : "Mustra totu is documentos",
"Meeting ID: {meetingId}" : "ID de s'atòbiu : {meetingId}",
"Your PIN: {attendeePin}" : "Su PIN tuo: {attendeePin}",
"Attachments folder" : "Cartella de alligongiados",
@@ -1008,6 +1015,11 @@
"Error while accessing microphone" : "Errore in s'atzessu a su micròfonu",
"Access to camera is only possible with HTTPS" : "S'atzessu a sa càmera si podet fàghere isceti cun HTTPS",
"An error occurred while fetching the participants" : "B'at àpidu un'errore in su recùperu de is partetzipantes",
+ "Media" : "Media",
+ "Files" : "Archìvios",
+ "Locations" : "Positziones",
+ "Audio" : "Àudio",
+ "Other" : "Àteru",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud est istadu agiornadu, torra a carrigare sa pàgina",
"Do not disturb" : "No istorbes",
"Away" : "Foras",
@@ -1099,6 +1111,7 @@
"Video on and off" : "Vìdeo allutu e istudadu",
"Choose in which folder attachments should be saved." : "Sèbera in cale cartella depent èssere sarvados is alligongiados",
"Exit fullscreen (f)" : "Bessi dae sa modalidade a totu ischermu (f)",
- "Fullscreen (f)" : "Totu ischermu (f)"
+ "Fullscreen (f)" : "Totu ischermu (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Imposta su livellu de notìfica pro custa resonada. Cust'atzione at a pertocare isceti is notìficas chi retzis."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/l10n/sk.js b/l10n/sk.js
index 306cc7cc3..e7dde36b9 100644
--- a/l10n/sk.js
+++ b/l10n/sk.js
@@ -902,6 +902,7 @@ OC.L10N.register(
"No search results" : "Žiadne výsledky vyhľadávania",
"Groups" : "Skupiny",
"Circles" : "Kruhy",
+ "Unread mentions" : "Neprečítané upozornenia",
"Talk settings" : "Nastavenia Talk",
"Users, groups and circles" : "Používatelia, skupiny a okruhy",
"Users and groups" : "Používatelia a skupiny",
@@ -1037,6 +1038,8 @@ OC.L10N.register(
"Details" : "Podrobnosti",
"Settings" : "Nastavenia",
"Participants ({count})" : "({count}) účastníkov",
+ "Projects" : "Projekty",
+ "Show all files" : "Zobraziť všetky súbory",
"Meeting ID: {meetingId}" : "ID schôdzky: {meetingId}",
"Your PIN: {attendeePin}" : "Váš PIN: {attendeePin}",
"Attachments folder" : "Priečinok s prílohami",
@@ -1105,6 +1108,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Nastala chyba pri prístupe k mikrofónu",
"Access to camera is only possible with HTTPS" : "Prístup ku kamere je možný iba pomocou protokolu HTTPS",
"An error occurred while fetching the participants" : "Pri načítavaní účastníkov sa vyskytla chyba",
+ "Media" : "Média",
+ "Files" : "Súbory",
+ "Locations" : "Umiestnenie",
+ "Audio" : "Zvuk",
+ "Other" : "Iné",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk bolo aktualizované, znova načítajte stránku",
"Do not disturb" : "Nerušiť",
"Away" : "Preč",
diff --git a/l10n/sk.json b/l10n/sk.json
index c5995483e..3319b4233 100644
--- a/l10n/sk.json
+++ b/l10n/sk.json
@@ -900,6 +900,7 @@
"No search results" : "Žiadne výsledky vyhľadávania",
"Groups" : "Skupiny",
"Circles" : "Kruhy",
+ "Unread mentions" : "Neprečítané upozornenia",
"Talk settings" : "Nastavenia Talk",
"Users, groups and circles" : "Používatelia, skupiny a okruhy",
"Users and groups" : "Používatelia a skupiny",
@@ -1035,6 +1036,8 @@
"Details" : "Podrobnosti",
"Settings" : "Nastavenia",
"Participants ({count})" : "({count}) účastníkov",
+ "Projects" : "Projekty",
+ "Show all files" : "Zobraziť všetky súbory",
"Meeting ID: {meetingId}" : "ID schôdzky: {meetingId}",
"Your PIN: {attendeePin}" : "Váš PIN: {attendeePin}",
"Attachments folder" : "Priečinok s prílohami",
@@ -1103,6 +1106,11 @@
"Error while accessing microphone" : "Nastala chyba pri prístupe k mikrofónu",
"Access to camera is only possible with HTTPS" : "Prístup ku kamere je možný iba pomocou protokolu HTTPS",
"An error occurred while fetching the participants" : "Pri načítavaní účastníkov sa vyskytla chyba",
+ "Media" : "Média",
+ "Files" : "Súbory",
+ "Locations" : "Umiestnenie",
+ "Audio" : "Zvuk",
+ "Other" : "Iné",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk bolo aktualizované, znova načítajte stránku",
"Do not disturb" : "Nerušiť",
"Away" : "Preč",
diff --git a/l10n/sl.js b/l10n/sl.js
index 9cb9777bd..483d8c746 100644
--- a/l10n/sl.js
+++ b/l10n/sl.js
@@ -870,6 +870,7 @@ OC.L10N.register(
"No search results" : "Ni zadetkov iskanja",
"Groups" : "Skupine",
"Circles" : "Krogi",
+ "Unread mentions" : "Neprebrane omembe",
"Talk settings" : "Nastavitve Talk",
"Users, groups and circles" : "Uporabniki, skupine in krogi",
"Users and groups" : "Uporabniki in skupine",
@@ -997,6 +998,8 @@ OC.L10N.register(
"Details" : "Podrobnosti",
"Settings" : "Nastavitve",
"Participants ({count})" : "Udeleženci ({count})",
+ "Projects" : "Projekti",
+ "Show all files" : "Pokaži vse datoteke",
"Meeting ID: {meetingId}" : "ID Sestanka: {meetingId}",
"Your PIN: {attendeePin}" : "Koda PIN: {attendeePin}",
"Attachments folder" : "Mapa prilog",
@@ -1064,6 +1067,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Napaka med dostopom do mikrofona",
"Access to camera is only possible with HTTPS" : "Dostop do kamere je mogoče le prek protokola HTTPS",
"An error occurred while fetching the participants" : "Med pridobivanjem udeležencev je prišlo do napake",
+ "Media" : "Predstavna vsebina",
+ "Files" : "Datoteke",
+ "Locations" : "Mesta",
+ "Audio" : "Zvok",
+ "Other" : "Drugo",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk je bil posodobljen, ponovno je treba naložiti stran",
"Do not disturb" : "Ne pustim se motiti",
"Away" : "Trenutno ne spremljam",
@@ -1156,6 +1164,7 @@ OC.L10N.register(
"Video on and off" : "Preklopi prikaz videa pogovora",
"Choose in which folder attachments should be saved." : "Izbor mape, v katero naj bodo shranjene priloge.",
"Exit fullscreen (f)" : "Končaj celozaslonski način (f)",
- "Fullscreen (f)" : "Celozaslonski način (f)"
+ "Fullscreen (f)" : "Celozaslonski način (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Nastavi raven obveščanja za trenutni pogovor. To vpliva le na prejemanje obvestil."
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/l10n/sl.json b/l10n/sl.json
index 62c71f4ab..fe8502aeb 100644
--- a/l10n/sl.json
+++ b/l10n/sl.json
@@ -868,6 +868,7 @@
"No search results" : "Ni zadetkov iskanja",
"Groups" : "Skupine",
"Circles" : "Krogi",
+ "Unread mentions" : "Neprebrane omembe",
"Talk settings" : "Nastavitve Talk",
"Users, groups and circles" : "Uporabniki, skupine in krogi",
"Users and groups" : "Uporabniki in skupine",
@@ -995,6 +996,8 @@
"Details" : "Podrobnosti",
"Settings" : "Nastavitve",
"Participants ({count})" : "Udeleženci ({count})",
+ "Projects" : "Projekti",
+ "Show all files" : "Pokaži vse datoteke",
"Meeting ID: {meetingId}" : "ID Sestanka: {meetingId}",
"Your PIN: {attendeePin}" : "Koda PIN: {attendeePin}",
"Attachments folder" : "Mapa prilog",
@@ -1062,6 +1065,11 @@
"Error while accessing microphone" : "Napaka med dostopom do mikrofona",
"Access to camera is only possible with HTTPS" : "Dostop do kamere je mogoče le prek protokola HTTPS",
"An error occurred while fetching the participants" : "Med pridobivanjem udeležencev je prišlo do napake",
+ "Media" : "Predstavna vsebina",
+ "Files" : "Datoteke",
+ "Locations" : "Mesta",
+ "Audio" : "Zvok",
+ "Other" : "Drugo",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk je bil posodobljen, ponovno je treba naložiti stran",
"Do not disturb" : "Ne pustim se motiti",
"Away" : "Trenutno ne spremljam",
@@ -1154,6 +1162,7 @@
"Video on and off" : "Preklopi prikaz videa pogovora",
"Choose in which folder attachments should be saved." : "Izbor mape, v katero naj bodo shranjene priloge.",
"Exit fullscreen (f)" : "Končaj celozaslonski način (f)",
- "Fullscreen (f)" : "Celozaslonski način (f)"
+ "Fullscreen (f)" : "Celozaslonski način (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Nastavi raven obveščanja za trenutni pogovor. To vpliva le na prejemanje obvestil."
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/l10n/sq.js b/l10n/sq.js
index 7dd052bf7..4d96cefef 100644
--- a/l10n/sq.js
+++ b/l10n/sq.js
@@ -3,6 +3,11 @@ OC.L10N.register(
{
"_%n guest_::_%n guests_" : ["%n të ftuar","%n të ftuar"],
"Guest" : "I ftuar",
+ "File is too big" : "Skedari është shumë i madh",
+ "Invalid file provided" : "U dha kartelë e pavlefshme",
+ "Invalid image" : "Figurë e pavlefshme",
+ "Unknown filetype" : "Lloj i panjohur skedari",
+ "An error occurred. Please contact your admin." : "Ndodhi një gabim. Ju lutemi, lidhuni me përgjegjësin tuaj.",
"Open settings" : "Hap rregullimet",
"Conversations" : "Bisedat",
"Andorra" : "Andorra",
@@ -164,11 +169,14 @@ OC.L10N.register(
"Blocked" : "I bllokuar",
"Saved" : "U ruajt",
"TURN server protocols" : "Protokollet e serverit TURN",
+ "OK" : "OK",
+ "Checking …" : "Duke kontrolluar ...",
"Copy link" : "Kopjo linkun",
"Waiting for others to join the call …" : "Duke pritur që të tjerët t'i bashkohen thirrjes ...",
"Dismiss" : "Hiq",
"Show your screen" : "Shfaq ekranin tënd",
"Stop screensharing" : "Ndalo ndarjen e ekranit",
+ "More actions" : "Më tepër veprime ",
"Mute audio" : "Mute audio",
"Disable video" : "Çaktivizo video",
"Grid view" : "Pamje galeri",
@@ -180,17 +188,23 @@ OC.L10N.register(
"Back" : "Prapa",
"You" : "Ju",
"Favorite" : "I/E Preferuar",
+ "Restricted" : "I/E kufizuar",
+ "Description" : "Përshkrim",
+ "Notifications" : "Njoftimet",
"Leave conversation" : "Largohuni nga biseda",
"Delete conversation" : "Fshijeni bisedën",
"Password protection" : "Password protection",
"Enter a password" : "Fusni një fjalëkalim",
"Save" : "Ruaj",
"Edit" : "Përpuno",
+ "Delete" : "Fshij",
"Password" : "Fjalëkalim",
"API token" : "Çelës identifikues i API-t ",
"Login" : "Hyrje",
"Nickname" : "Nofkë",
"Client ID" : "ID klienti",
+ "Calls" : "Thirrjet",
+ "Mark as read" : "Shënoje si të lexuar",
"Remove from favorites" : "Remove from favorites",
"Add to favorites" : "Shtoje tek të parapëlqyerat",
"Loading" : "Duke ngarkuar",
@@ -199,19 +213,28 @@ OC.L10N.register(
"Password protect" : "Mbroje me fjalëkalim",
"Close" : "Mbylleni",
"Conversation name" : "Emri i bisedës",
+ "Message sent" : "Mesazhi u dërgua",
"Reply" : "Përgjigju",
+ "Mark as unread" : "Shënoje si të palexuar",
+ "Contact" : "Kontakt",
"Today" : "Sot",
"Yesterday" : "Dje",
"Send message" : "Dërgo mesazh",
"guest" : "vizitor",
"No results" : "Asnjë rezultat",
"Add users or groups" : "Add users or groups",
+ "Details" : "Detajet",
"Settings" : "Rregullimet",
+ "Privacy" : "Privatësia",
"Keyboard shortcuts" : "Shkurtoret e tastierës",
"Search" : "Kërko",
"Rename conversation" : "Riemërtojeni bisedën",
"Send" : "Dërgo",
"Start a conversation" : "Filloni një bisedë",
+ "Media" : "Media",
+ "Files" : "Skedarët",
+ "Audio" : "Audio",
+ "Other" : "Tjetër",
"Default" : "E paracaktuar",
"Access to microphone & camera is only possible with HTTPS" : "Aksesi në mikrofon & kamera është i mundur vetëm me HTTPS",
"Access to microphone & camera was denied" : "Aksesi tek mikrofoni & kamera u mohua",
diff --git a/l10n/sq.json b/l10n/sq.json
index 325020aa2..9995f4ea2 100644
--- a/l10n/sq.json
+++ b/l10n/sq.json
@@ -1,6 +1,11 @@
{ "translations": {
"_%n guest_::_%n guests_" : ["%n të ftuar","%n të ftuar"],
"Guest" : "I ftuar",
+ "File is too big" : "Skedari është shumë i madh",
+ "Invalid file provided" : "U dha kartelë e pavlefshme",
+ "Invalid image" : "Figurë e pavlefshme",
+ "Unknown filetype" : "Lloj i panjohur skedari",
+ "An error occurred. Please contact your admin." : "Ndodhi një gabim. Ju lutemi, lidhuni me përgjegjësin tuaj.",
"Open settings" : "Hap rregullimet",
"Conversations" : "Bisedat",
"Andorra" : "Andorra",
@@ -162,11 +167,14 @@
"Blocked" : "I bllokuar",
"Saved" : "U ruajt",
"TURN server protocols" : "Protokollet e serverit TURN",
+ "OK" : "OK",
+ "Checking …" : "Duke kontrolluar ...",
"Copy link" : "Kopjo linkun",
"Waiting for others to join the call …" : "Duke pritur që të tjerët t'i bashkohen thirrjes ...",
"Dismiss" : "Hiq",
"Show your screen" : "Shfaq ekranin tënd",
"Stop screensharing" : "Ndalo ndarjen e ekranit",
+ "More actions" : "Më tepër veprime ",
"Mute audio" : "Mute audio",
"Disable video" : "Çaktivizo video",
"Grid view" : "Pamje galeri",
@@ -178,17 +186,23 @@
"Back" : "Prapa",
"You" : "Ju",
"Favorite" : "I/E Preferuar",
+ "Restricted" : "I/E kufizuar",
+ "Description" : "Përshkrim",
+ "Notifications" : "Njoftimet",
"Leave conversation" : "Largohuni nga biseda",
"Delete conversation" : "Fshijeni bisedën",
"Password protection" : "Password protection",
"Enter a password" : "Fusni një fjalëkalim",
"Save" : "Ruaj",
"Edit" : "Përpuno",
+ "Delete" : "Fshij",
"Password" : "Fjalëkalim",
"API token" : "Çelës identifikues i API-t ",
"Login" : "Hyrje",
"Nickname" : "Nofkë",
"Client ID" : "ID klienti",
+ "Calls" : "Thirrjet",
+ "Mark as read" : "Shënoje si të lexuar",
"Remove from favorites" : "Remove from favorites",
"Add to favorites" : "Shtoje tek të parapëlqyerat",
"Loading" : "Duke ngarkuar",
@@ -197,19 +211,28 @@
"Password protect" : "Mbroje me fjalëkalim",
"Close" : "Mbylleni",
"Conversation name" : "Emri i bisedës",
+ "Message sent" : "Mesazhi u dërgua",
"Reply" : "Përgjigju",
+ "Mark as unread" : "Shënoje si të palexuar",
+ "Contact" : "Kontakt",
"Today" : "Sot",
"Yesterday" : "Dje",
"Send message" : "Dërgo mesazh",
"guest" : "vizitor",
"No results" : "Asnjë rezultat",
"Add users or groups" : "Add users or groups",
+ "Details" : "Detajet",
"Settings" : "Rregullimet",
+ "Privacy" : "Privatësia",
"Keyboard shortcuts" : "Shkurtoret e tastierës",
"Search" : "Kërko",
"Rename conversation" : "Riemërtojeni bisedën",
"Send" : "Dërgo",
"Start a conversation" : "Filloni një bisedë",
+ "Media" : "Media",
+ "Files" : "Skedarët",
+ "Audio" : "Audio",
+ "Other" : "Tjetër",
"Default" : "E paracaktuar",
"Access to microphone & camera is only possible with HTTPS" : "Aksesi në mikrofon & kamera është i mundur vetëm me HTTPS",
"Access to microphone & camera was denied" : "Aksesi tek mikrofoni & kamera u mohua",
diff --git a/l10n/sr.js b/l10n/sr.js
index 6ffb56e5b..63b310c6f 100644
--- a/l10n/sr.js
+++ b/l10n/sr.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["%n остали","%n осталих","%n осталих"],
"{actor} invited you to {call}" : "{actor} Вас је позвао у разговор {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Били сте позвани у собу на <strong>разговор</strong> или сте имали <strong>позив</strong>",
+ "Other activities" : "Остале активности",
"Talk" : "Разговор",
"Guest" : "Гост",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Добродошли у Некстклауд Разговор!\nУ овом разговору ћете бити обавештавани о новим функционалностима доступним у Некстклауд Разговору.",
@@ -79,6 +80,11 @@ OC.L10N.register(
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Позив са корисницима {user1}, {user2} {user3}, {user4} и {user5} (трајање {duration})",
"Talk to %s" : "Причај са %s",
"File is not shared, or shared but not with the user" : "Фајл није дељен, или је дељен али не са корисником",
+ "File is too big" : "Фајл је превелики",
+ "Invalid file provided" : "Дати фајл је неисправан",
+ "Invalid image" : "Неисправна слика",
+ "Unknown filetype" : "Непознат тип фајла",
+ "An error occurred. Please contact your admin." : "Дошло је до грешке. Контактирајте администратора.",
"%s invited you to a conversation." : "%s Вас је позвао у разговор.",
"You were invited to a conversation." : "Позвани сте у разговор.",
"Conversation invitation" : "Позив за разговор",
@@ -418,6 +424,8 @@ OC.L10N.register(
"TURN server protocols" : "TURN серверски протокол",
"Test this server" : "Тестирај овај сервер",
"TURN servers" : "TURN сервери",
+ "OK" : "У реду",
+ "Checking …" : "Проверавам…",
"Copy link" : "Копирај везу",
"Waiting for others to join the call …" : "Чекам да се остали прикључе разговору…",
"You can invite others in the participant tab of the sidebar" : "Можете позвати остале у језичку са учесницима у траци са стране",
@@ -426,6 +434,7 @@ OC.L10N.register(
"Dismiss" : "Уклони",
"Show your screen" : "Прикажите екран",
"Stop screensharing" : "Заустави дељење екрана",
+ "More actions" : "Још акција",
"No audio" : "Нема звука",
"Mute audio" : "Искључи звук",
"Disable video" : "Искључи видео",
@@ -443,20 +452,28 @@ OC.L10N.register(
"Show screen" : "Прикажи екран",
"Drop your files to upload" : "Отпустите фајлове за отпремање",
"Favorite" : "Омиљени",
+ "Restricted" : "Ограничена",
+ "Description" : "Опис",
+ "Notifications" : "Обавештења",
"Leave conversation" : "Напусти разговор",
"Delete conversation" : "Обриши разовор",
"You need to promote a new moderator before you can leave the conversation." : "Морате унапредити новог модератора пре него што напустите разговор.",
+ "Allow guests" : "Дозволи госте",
"Password protection" : "Заштита лозинком",
"Enter a password" : "Унесите лозинку",
"Enable lobby" : "Омогући лоби",
"Start time (optional)" : "Време почетка (опционо)",
"Save" : "Сачувај",
"Edit" : "Измени",
+ "More information" : "Још информација",
+ "Delete" : "Избриши",
"Password" : "Лозинка",
"API token" : "API токен",
"Login" : "Пријава",
"Nickname" : "Надимак",
"Client ID" : "ID клијента",
+ "Calls" : "Позиви",
+ "Mark as read" : "Означи као прочитано",
"Remove from favorites" : "Уклони из омиљених",
"Add to favorites" : "Додаје у омиљене",
"Loading" : "Учитавање",
@@ -469,8 +486,12 @@ OC.L10N.register(
"Close" : "Затвори",
"Conversation name" : "Назив разговора",
"You are currently waiting in the lobby" : "Тренутно чекате у лобију",
+ "Unread messages" : "Непрочитане поруке",
+ "Message sent" : "Порука послата",
"Reply" : "Одговори",
+ "Mark as unread" : "Означи као непрочитано",
"Go to file" : "Иди на фајл",
+ "Contact" : "Контакт",
"Today" : "Данас",
"Yesterday" : "Јуче",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -488,7 +509,11 @@ OC.L10N.register(
"Add users or groups" : "Додај кориснике или групе",
"Participants" : "Учесници",
"Chat" : "Ћаскање",
+ "Details" : "Детаљи",
"Settings" : "Поставке",
+ "Projects" : "Пројекти",
+ "Show all files" : "Прикажи све фајлове",
+ "Privacy" : "Приватност",
"Keyboard shortcuts" : "Пречице на тастатури",
"Search" : "Претрага",
"Start call" : "Почни позив",
@@ -500,6 +525,11 @@ OC.L10N.register(
"Link to a conversation" : "Веза ка разговору",
"Join a conversation or start a new one" : "Придружи се разговору или започни нови",
"An error occurred while fetching the participants" : "Грешка приликом дохватања учесника",
+ "Media" : "Мултимедија",
+ "Files" : "Фајлови",
+ "Locations" : "Локације",
+ "Audio" : "Звук",
+ "Other" : "Остало",
"Error while sharing file" : "Грешка приликом дељења фајла",
"Default" : "Подразумевано",
"You seem to be talking while muted, please unmute yourself for others to hear you" : "Изгледа да причате док сте утишани. Укључите звук да би Вас други чули",
diff --git a/l10n/sr.json b/l10n/sr.json
index 77744edcd..eeb42ac3e 100644
--- a/l10n/sr.json
+++ b/l10n/sr.json
@@ -10,6 +10,7 @@
"_%n other_::_%n others_" : ["%n остали","%n осталих","%n осталих"],
"{actor} invited you to {call}" : "{actor} Вас је позвао у разговор {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Били сте позвани у собу на <strong>разговор</strong> или сте имали <strong>позив</strong>",
+ "Other activities" : "Остале активности",
"Talk" : "Разговор",
"Guest" : "Гост",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Добродошли у Некстклауд Разговор!\nУ овом разговору ћете бити обавештавани о новим функционалностима доступним у Некстклауд Разговору.",
@@ -77,6 +78,11 @@
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Позив са корисницима {user1}, {user2} {user3}, {user4} и {user5} (трајање {duration})",
"Talk to %s" : "Причај са %s",
"File is not shared, or shared but not with the user" : "Фајл није дељен, или је дељен али не са корисником",
+ "File is too big" : "Фајл је превелики",
+ "Invalid file provided" : "Дати фајл је неисправан",
+ "Invalid image" : "Неисправна слика",
+ "Unknown filetype" : "Непознат тип фајла",
+ "An error occurred. Please contact your admin." : "Дошло је до грешке. Контактирајте администратора.",
"%s invited you to a conversation." : "%s Вас је позвао у разговор.",
"You were invited to a conversation." : "Позвани сте у разговор.",
"Conversation invitation" : "Позив за разговор",
@@ -416,6 +422,8 @@
"TURN server protocols" : "TURN серверски протокол",
"Test this server" : "Тестирај овај сервер",
"TURN servers" : "TURN сервери",
+ "OK" : "У реду",
+ "Checking …" : "Проверавам…",
"Copy link" : "Копирај везу",
"Waiting for others to join the call …" : "Чекам да се остали прикључе разговору…",
"You can invite others in the participant tab of the sidebar" : "Можете позвати остале у језичку са учесницима у траци са стране",
@@ -424,6 +432,7 @@
"Dismiss" : "Уклони",
"Show your screen" : "Прикажите екран",
"Stop screensharing" : "Заустави дељење екрана",
+ "More actions" : "Још акција",
"No audio" : "Нема звука",
"Mute audio" : "Искључи звук",
"Disable video" : "Искључи видео",
@@ -441,20 +450,28 @@
"Show screen" : "Прикажи екран",
"Drop your files to upload" : "Отпустите фајлове за отпремање",
"Favorite" : "Омиљени",
+ "Restricted" : "Ограничена",
+ "Description" : "Опис",
+ "Notifications" : "Обавештења",
"Leave conversation" : "Напусти разговор",
"Delete conversation" : "Обриши разовор",
"You need to promote a new moderator before you can leave the conversation." : "Морате унапредити новог модератора пре него што напустите разговор.",
+ "Allow guests" : "Дозволи госте",
"Password protection" : "Заштита лозинком",
"Enter a password" : "Унесите лозинку",
"Enable lobby" : "Омогући лоби",
"Start time (optional)" : "Време почетка (опционо)",
"Save" : "Сачувај",
"Edit" : "Измени",
+ "More information" : "Још информација",
+ "Delete" : "Избриши",
"Password" : "Лозинка",
"API token" : "API токен",
"Login" : "Пријава",
"Nickname" : "Надимак",
"Client ID" : "ID клијента",
+ "Calls" : "Позиви",
+ "Mark as read" : "Означи као прочитано",
"Remove from favorites" : "Уклони из омиљених",
"Add to favorites" : "Додаје у омиљене",
"Loading" : "Учитавање",
@@ -467,8 +484,12 @@
"Close" : "Затвори",
"Conversation name" : "Назив разговора",
"You are currently waiting in the lobby" : "Тренутно чекате у лобију",
+ "Unread messages" : "Непрочитане поруке",
+ "Message sent" : "Порука послата",
"Reply" : "Одговори",
+ "Mark as unread" : "Означи као непрочитано",
"Go to file" : "Иди на фајл",
+ "Contact" : "Контакт",
"Today" : "Данас",
"Yesterday" : "Јуче",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -486,7 +507,11 @@
"Add users or groups" : "Додај кориснике или групе",
"Participants" : "Учесници",
"Chat" : "Ћаскање",
+ "Details" : "Детаљи",
"Settings" : "Поставке",
+ "Projects" : "Пројекти",
+ "Show all files" : "Прикажи све фајлове",
+ "Privacy" : "Приватност",
"Keyboard shortcuts" : "Пречице на тастатури",
"Search" : "Претрага",
"Start call" : "Почни позив",
@@ -498,6 +523,11 @@
"Link to a conversation" : "Веза ка разговору",
"Join a conversation or start a new one" : "Придружи се разговору или започни нови",
"An error occurred while fetching the participants" : "Грешка приликом дохватања учесника",
+ "Media" : "Мултимедија",
+ "Files" : "Фајлови",
+ "Locations" : "Локације",
+ "Audio" : "Звук",
+ "Other" : "Остало",
"Error while sharing file" : "Грешка приликом дељења фајла",
"Default" : "Подразумевано",
"You seem to be talking while muted, please unmute yourself for others to hear you" : "Изгледа да причате док сте утишани. Укључите звук да би Вас други чули",
diff --git a/l10n/sv.js b/l10n/sv.js
index e3c9a6dd5..35c32e9dd 100644
--- a/l10n/sv.js
+++ b/l10n/sv.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["%n annan","%n andra"],
"{actor} invited you to {call}" : "{actor} bjöd in dig till {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Du blev inbjuden till en <strong>konversation</strong> eller hade ett <strong>samtal</strong>",
+ "Other activities" : "Andra aktiviteter",
"Talk" : "Talk",
"Guest" : "Gäst",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Välkommen till Nextcloud Talk!\nI denna konversation kommer du att bli informerad om nya funktioner som finns i Nextcloud Talk.",
@@ -115,6 +116,11 @@ OC.L10N.register(
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Samtal med {user1}, {user2}, {user3}, {user4} och {user5} (Varade {duration})",
"Talk to %s" : "Prata med %s",
"File is not shared, or shared but not with the user" : "Filen delas inte eller delas men inte med användaren",
+ "File is too big" : "Filen är för stor",
+ "Invalid file provided" : "Ogiltig fil tillhandahölls",
+ "Invalid image" : "Ogiltig bild",
+ "Unknown filetype" : "Okänd filtyp",
+ "An error occurred. Please contact your admin." : "Ett fel har inträffat. Kontakta din administratör.",
"Talk mentions" : "Talk-omnämnanden",
"Write to conversation" : "Skriv till konversation",
"Writes event information into a conversation of your choice" : "Skriver händelseinformation till en konversation du väljer",
@@ -278,6 +284,7 @@ OC.L10N.register(
"Kiribati" : "Kiribati",
"Comoros" : "Comoros",
"Saint Kitts and Nevis" : "Saint Kitts and Nevis",
+ "Korea, Republic of" : "Sydkorea",
"Kuwait" : "Kuwait",
"Cayman Islands" : "Cayman Islands",
"Kazakhstan" : "Kazakstan",
@@ -294,6 +301,7 @@ OC.L10N.register(
"Libya" : "Libyen",
"Morocco" : "Marocko",
"Monaco" : "Monaco",
+ "Moldova, Republic of" : "Moldavien",
"Montenegro" : "Montenegro",
"Saint Martin (French part)" : "Saint Martin (French part)",
"Madagascar" : "Madagaskar",
@@ -366,6 +374,7 @@ OC.L10N.register(
"El Salvador" : "El Salvador",
"Sint Maarten (Dutch part)" : "Sint Maarten (Dutch part)",
"Syrian Arab Republic" : "Syrian Arab Republic",
+ "Eswatini" : "Swaziland",
"Turks and Caicos Islands" : "Turks- och Caicosöarna",
"Chad" : "Chad",
"French Southern Territories" : "Franska södra territorierna",
@@ -380,6 +389,7 @@ OC.L10N.register(
"Turkey" : "Turkiet",
"Trinidad and Tobago" : "Trinidad och Tobago",
"Tuvalu" : "Tuvalu",
+ "Taiwan, Province of China" : "Taiwan",
"Tanzania, United Republic of" : "Tanzania, United Republic of",
"Ukraine" : "Ukraina",
"Uganda" : "Uganda",
@@ -483,6 +493,8 @@ OC.L10N.register(
"TURN server protocols" : "TURN-server protokoll",
"Test this server" : "Testa denna server",
"TURN servers" : "TURN-servrar",
+ "OK" : "OK",
+ "Checking …" : "Kontrollerar...",
"Copy link" : "Kopiera länk",
"Waiting for others to join the call …" : "Väntar på andra ansluter sig till samtalet ...",
"You can invite others in the participant tab of the sidebar" : "Du kan bjuda in andra på fliken deltagare i sidofältet",
@@ -493,6 +505,7 @@ OC.L10N.register(
"Dismiss" : "Avfärda",
"Show your screen" : "Visa din skärm",
"Stop screensharing" : "Stoppa skärmdelning",
+ "More actions" : "Fler händelser",
"No audio" : "Inget ljud",
"Mute audio" : "Stäng av ljudet",
"Unmute audio" : "Aktivera ljud",
@@ -520,11 +533,15 @@ OC.L10N.register(
"Drop your files to upload" : "Släpp dina filer för att ladda upp",
"Call in progress" : "Samtal pågår",
"Favorite" : "Favorit",
+ "Restricted" : "Begränsad",
"Conversation settings" : "Konversationsinställningar",
+ "Description" : "Beskrivning",
+ "Notifications" : "Aviseringar",
"Leave conversation" : "Lämna konversationen",
"Delete conversation" : "Ta bort konversationen",
"You need to promote a new moderator before you can leave the conversation." : "Du måste tilldela en ny moderator innan du kan lämna konversationen.",
"Do you really want to delete \"{displayName}\"?" : "Vill du verkligen radera \"{displayName}\"?",
+ "Allow guests" : "Tillåt gäster",
"Password protection" : "Lösenordsskydd",
"Enter a password" : "Ange ett lösenord",
"Copy conversation link" : "Kopiera konversationslänk",
@@ -533,6 +550,8 @@ OC.L10N.register(
"Start time (optional)" : "Starttid (valfritt)",
"Save" : "Spara",
"Edit" : "Ändra",
+ "More information" : "Mer information",
+ "Delete" : "Radera",
"Nextcloud URL" : "Nextcloud-URL",
"Nextcloud user" : "Nextcloud-användare",
"Matrix server URL" : "Matrix server-URL",
@@ -549,6 +568,8 @@ OC.L10N.register(
"Client ID" : "Klient-ID",
"Jabber ID" : "Jabber-id",
"Bridge saved" : "Brygga sparad",
+ "Calls" : "Samtal",
+ "Mark as read" : "Markera som läst",
"Remove from favorites" : "Ta bort från favoriter",
"Add to favorites" : "Lägg till som favorit",
"You: {lastMessage}" : "Du: {lastMessage}",
@@ -578,8 +599,12 @@ OC.L10N.register(
"Conversation name" : "Konversationens namn",
"Search conversations or users" : "Sök konversationer eller användare",
"You are currently waiting in the lobby" : "Du väntar för närvarande i lobbyn",
+ "Unread messages" : "Olästa meddelanden",
+ "Message sent" : "Meddelande skickat",
"Reply" : "Svara",
+ "Mark as unread" : "Markera som oläst",
"Go to file" : "Gå till fil",
+ "Contact" : "Kontakt",
"Today" : "Idag",
"Yesterday" : "Igår",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -610,7 +635,11 @@ OC.L10N.register(
"Participants" : "Deltagare",
"Search or add participants" : "Sök eller lägg till deltagare",
"Chat" : "Chat",
+ "Details" : "Detaljer",
"Settings" : "Inställningar",
+ "Projects" : "Projekt",
+ "Show all files" : "Visa alla filer",
+ "Privacy" : "Integritet",
"Keyboard shortcuts" : "Tangentbordsgenvägar",
"Search" : "Sök",
"Error while setting attachment folder" : "Fel vid inställning av mapp för bilagor",
@@ -632,6 +661,11 @@ OC.L10N.register(
"Link to a conversation" : "Länka till en konversation",
"Join a conversation or start a new one" : "Anslut till en konversation eller starta en ny",
"An error occurred while fetching the participants" : "Ett fel uppstod när deltagarna hämtades",
+ "Media" : "Media",
+ "Files" : "Filer",
+ "Locations" : "Platser",
+ "Audio" : "Ljud",
+ "Other" : "Annat",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk uppdaterades, ladda om sidan igen",
"Do not disturb" : "Stör ej",
"Away" : "Iväg",
diff --git a/l10n/sv.json b/l10n/sv.json
index 6865360c5..27ff1f09d 100644
--- a/l10n/sv.json
+++ b/l10n/sv.json
@@ -10,6 +10,7 @@
"_%n other_::_%n others_" : ["%n annan","%n andra"],
"{actor} invited you to {call}" : "{actor} bjöd in dig till {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Du blev inbjuden till en <strong>konversation</strong> eller hade ett <strong>samtal</strong>",
+ "Other activities" : "Andra aktiviteter",
"Talk" : "Talk",
"Guest" : "Gäst",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Välkommen till Nextcloud Talk!\nI denna konversation kommer du att bli informerad om nya funktioner som finns i Nextcloud Talk.",
@@ -113,6 +114,11 @@
"Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration {duration})" : "Samtal med {user1}, {user2}, {user3}, {user4} och {user5} (Varade {duration})",
"Talk to %s" : "Prata med %s",
"File is not shared, or shared but not with the user" : "Filen delas inte eller delas men inte med användaren",
+ "File is too big" : "Filen är för stor",
+ "Invalid file provided" : "Ogiltig fil tillhandahölls",
+ "Invalid image" : "Ogiltig bild",
+ "Unknown filetype" : "Okänd filtyp",
+ "An error occurred. Please contact your admin." : "Ett fel har inträffat. Kontakta din administratör.",
"Talk mentions" : "Talk-omnämnanden",
"Write to conversation" : "Skriv till konversation",
"Writes event information into a conversation of your choice" : "Skriver händelseinformation till en konversation du väljer",
@@ -276,6 +282,7 @@
"Kiribati" : "Kiribati",
"Comoros" : "Comoros",
"Saint Kitts and Nevis" : "Saint Kitts and Nevis",
+ "Korea, Republic of" : "Sydkorea",
"Kuwait" : "Kuwait",
"Cayman Islands" : "Cayman Islands",
"Kazakhstan" : "Kazakstan",
@@ -292,6 +299,7 @@
"Libya" : "Libyen",
"Morocco" : "Marocko",
"Monaco" : "Monaco",
+ "Moldova, Republic of" : "Moldavien",
"Montenegro" : "Montenegro",
"Saint Martin (French part)" : "Saint Martin (French part)",
"Madagascar" : "Madagaskar",
@@ -364,6 +372,7 @@
"El Salvador" : "El Salvador",
"Sint Maarten (Dutch part)" : "Sint Maarten (Dutch part)",
"Syrian Arab Republic" : "Syrian Arab Republic",
+ "Eswatini" : "Swaziland",
"Turks and Caicos Islands" : "Turks- och Caicosöarna",
"Chad" : "Chad",
"French Southern Territories" : "Franska södra territorierna",
@@ -378,6 +387,7 @@
"Turkey" : "Turkiet",
"Trinidad and Tobago" : "Trinidad och Tobago",
"Tuvalu" : "Tuvalu",
+ "Taiwan, Province of China" : "Taiwan",
"Tanzania, United Republic of" : "Tanzania, United Republic of",
"Ukraine" : "Ukraina",
"Uganda" : "Uganda",
@@ -481,6 +491,8 @@
"TURN server protocols" : "TURN-server protokoll",
"Test this server" : "Testa denna server",
"TURN servers" : "TURN-servrar",
+ "OK" : "OK",
+ "Checking …" : "Kontrollerar...",
"Copy link" : "Kopiera länk",
"Waiting for others to join the call …" : "Väntar på andra ansluter sig till samtalet ...",
"You can invite others in the participant tab of the sidebar" : "Du kan bjuda in andra på fliken deltagare i sidofältet",
@@ -491,6 +503,7 @@
"Dismiss" : "Avfärda",
"Show your screen" : "Visa din skärm",
"Stop screensharing" : "Stoppa skärmdelning",
+ "More actions" : "Fler händelser",
"No audio" : "Inget ljud",
"Mute audio" : "Stäng av ljudet",
"Unmute audio" : "Aktivera ljud",
@@ -518,11 +531,15 @@
"Drop your files to upload" : "Släpp dina filer för att ladda upp",
"Call in progress" : "Samtal pågår",
"Favorite" : "Favorit",
+ "Restricted" : "Begränsad",
"Conversation settings" : "Konversationsinställningar",
+ "Description" : "Beskrivning",
+ "Notifications" : "Aviseringar",
"Leave conversation" : "Lämna konversationen",
"Delete conversation" : "Ta bort konversationen",
"You need to promote a new moderator before you can leave the conversation." : "Du måste tilldela en ny moderator innan du kan lämna konversationen.",
"Do you really want to delete \"{displayName}\"?" : "Vill du verkligen radera \"{displayName}\"?",
+ "Allow guests" : "Tillåt gäster",
"Password protection" : "Lösenordsskydd",
"Enter a password" : "Ange ett lösenord",
"Copy conversation link" : "Kopiera konversationslänk",
@@ -531,6 +548,8 @@
"Start time (optional)" : "Starttid (valfritt)",
"Save" : "Spara",
"Edit" : "Ändra",
+ "More information" : "Mer information",
+ "Delete" : "Radera",
"Nextcloud URL" : "Nextcloud-URL",
"Nextcloud user" : "Nextcloud-användare",
"Matrix server URL" : "Matrix server-URL",
@@ -547,6 +566,8 @@
"Client ID" : "Klient-ID",
"Jabber ID" : "Jabber-id",
"Bridge saved" : "Brygga sparad",
+ "Calls" : "Samtal",
+ "Mark as read" : "Markera som läst",
"Remove from favorites" : "Ta bort från favoriter",
"Add to favorites" : "Lägg till som favorit",
"You: {lastMessage}" : "Du: {lastMessage}",
@@ -576,8 +597,12 @@
"Conversation name" : "Konversationens namn",
"Search conversations or users" : "Sök konversationer eller användare",
"You are currently waiting in the lobby" : "Du väntar för närvarande i lobbyn",
+ "Unread messages" : "Olästa meddelanden",
+ "Message sent" : "Meddelande skickat",
"Reply" : "Svara",
+ "Mark as unread" : "Markera som oläst",
"Go to file" : "Gå till fil",
+ "Contact" : "Kontakt",
"Today" : "Idag",
"Yesterday" : "Igår",
"{relativeDate}, {absoluteDate}" : "{relativeDate}, {absoluteDate}",
@@ -608,7 +633,11 @@
"Participants" : "Deltagare",
"Search or add participants" : "Sök eller lägg till deltagare",
"Chat" : "Chat",
+ "Details" : "Detaljer",
"Settings" : "Inställningar",
+ "Projects" : "Projekt",
+ "Show all files" : "Visa alla filer",
+ "Privacy" : "Integritet",
"Keyboard shortcuts" : "Tangentbordsgenvägar",
"Search" : "Sök",
"Error while setting attachment folder" : "Fel vid inställning av mapp för bilagor",
@@ -630,6 +659,11 @@
"Link to a conversation" : "Länka till en konversation",
"Join a conversation or start a new one" : "Anslut till en konversation eller starta en ny",
"An error occurred while fetching the participants" : "Ett fel uppstod när deltagarna hämtades",
+ "Media" : "Media",
+ "Files" : "Filer",
+ "Locations" : "Platser",
+ "Audio" : "Ljud",
+ "Other" : "Annat",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk uppdaterades, ladda om sidan igen",
"Do not disturb" : "Stör ej",
"Away" : "Iväg",
diff --git a/l10n/th.js b/l10n/th.js
new file mode 100644
index 000000000..9c19944f3
--- /dev/null
+++ b/l10n/th.js
@@ -0,0 +1,84 @@
+OC.L10N.register(
+ "spreed",
+ {
+ "File is too big" : "ไฟล์ใหญ่เกินไป",
+ "Invalid file provided" : "ระบุไฟล์ไม่ถูกต้อง",
+ "Invalid image" : "รูปภาพไม่ถูกต้อง",
+ "Unknown filetype" : "ชนิดไฟล์ที่ไม่รู้จัก",
+ "An error occurred. Please contact your admin." : "เกิดข้อผิดพลาด กรุณาติดต่อผู้ดูแลระบบของคุณ",
+ "Open settings" : "เปิดการตั้งค่า",
+ "Invalid date, date format must be YYYY-MM-DD" : "วันที่ไม่ถูกต้อง รูปแบบวันที่จะต้องเป็น YYYY-MM-DD",
+ "Conversation not found" : "ไม่พบการสนทนา",
+ "Everyone" : "ทุกคน",
+ "Save changes" : "บันทึกการเปลี่ยนแปลง",
+ "Saving …" : "กำลังบันทึก …",
+ "None" : "ไม่มี",
+ "User" : "User",
+ "Disabled" : "ปิดการใช้งาน",
+ "Users" : "ผู้ใช้งาน",
+ "Name" : "ชื่อ",
+ "All messages" : "ข้อความทั้งหมด",
+ "@-mentions only" : "@-เฉพาะการกล่าวถึง",
+ "Language" : "ภาษา",
+ "Country" : "ประเทศ",
+ "Status" : "สถานะ",
+ "Pending" : "อยู่ระหว่างดำเนินการ",
+ "Error" : "ข้อผิดพลาด",
+ "Saved" : "บันทึกแล้ว",
+ "OK" : "ตกลง",
+ "Copy link" : "คัดลอกลิงค์",
+ "Dismiss" : "ยกเลิก",
+ "Grid view" : "มุมมองแบบตาราง Grid",
+ "Back" : "ย้อนกลับ",
+ "Favorite" : "รายการโปรด",
+ "Restricted" : "ถูกจำกัด",
+ "Description" : "รายละเอียด",
+ "Notifications" : "การแจ้งเตือน",
+ "Password protection" : "Password protection",
+ "Enter a password" : "Enter a password",
+ "Save" : "บันทึก",
+ "Edit" : "แก้ไข",
+ "Delete" : "ลบ",
+ "Password" : "รหัสผ่าน",
+ "Login" : "Login",
+ "Nickname" : "ชื่อเล่น",
+ "Client ID" : "Client ID",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Add to favorites",
+ "Loading" : "Loading",
+ "Groups" : "กลุ่ม",
+ "Password protect" : "ป้องกันด้วยรหัสผ่าน",
+ "Add participants" : "เพิ่มผู้เข้าร่วม",
+ "Close" : "ปิด",
+ "Reply" : "ตอบกลับ",
+ "Today" : "วันนี้",
+ "Yesterday" : "เมื่อวานนี้",
+ "Invalid path selected" : "เลือกเส้นทางไม่ถูกต้อง",
+ "bot" : "บอต",
+ "guest" : "ผู้เยี่ยมชม",
+ "Searching …" : "กำลังค้นหา …",
+ "No results" : "ไม่มีผลลัพธ์",
+ "Add users or groups" : "Add users or groups",
+ "Chat" : "แชท",
+ "Details" : "รายละเอียด",
+ "Settings" : "ตั้งค่า",
+ "Privacy" : "ความเป็นส่วนตัว",
+ "Keyboard shortcuts" : "ปุ่มลัด",
+ "Search" : "Search",
+ "Send" : "ส่ง",
+ "Media" : "สื่อ",
+ "Files" : "ไฟล์",
+ "Locations" : "สถานที่",
+ "Audio" : "เสียง",
+ "Other" : "อื่น ๆ",
+ "Do not disturb" : "ห้ามรบกวน",
+ "Away" : "ไม่อยู่",
+ "Default" : "ค่าเริ่มต้น",
+ "The password is wrong. Try again." : "รหัสผ่านที่ไม่ถูกต้อง กรุณาลองอีกครั้ง",
+ "Android app" : "แอพฯ แอนดรอยด์",
+ "iOS app" : "แอพฯ IOS",
+ "Camera" : "กล้อง",
+ "Remove" : "ลบออก",
+ "[Unknown username]" : "[ไม่รู้จักชื่อผู้ใช้]"
+},
+"nplurals=1; plural=0;");
diff --git a/l10n/th.json b/l10n/th.json
new file mode 100644
index 000000000..c95314ca5
--- /dev/null
+++ b/l10n/th.json
@@ -0,0 +1,82 @@
+{ "translations": {
+ "File is too big" : "ไฟล์ใหญ่เกินไป",
+ "Invalid file provided" : "ระบุไฟล์ไม่ถูกต้อง",
+ "Invalid image" : "รูปภาพไม่ถูกต้อง",
+ "Unknown filetype" : "ชนิดไฟล์ที่ไม่รู้จัก",
+ "An error occurred. Please contact your admin." : "เกิดข้อผิดพลาด กรุณาติดต่อผู้ดูแลระบบของคุณ",
+ "Open settings" : "เปิดการตั้งค่า",
+ "Invalid date, date format must be YYYY-MM-DD" : "วันที่ไม่ถูกต้อง รูปแบบวันที่จะต้องเป็น YYYY-MM-DD",
+ "Conversation not found" : "ไม่พบการสนทนา",
+ "Everyone" : "ทุกคน",
+ "Save changes" : "บันทึกการเปลี่ยนแปลง",
+ "Saving …" : "กำลังบันทึก …",
+ "None" : "ไม่มี",
+ "User" : "User",
+ "Disabled" : "ปิดการใช้งาน",
+ "Users" : "ผู้ใช้งาน",
+ "Name" : "ชื่อ",
+ "All messages" : "ข้อความทั้งหมด",
+ "@-mentions only" : "@-เฉพาะการกล่าวถึง",
+ "Language" : "ภาษา",
+ "Country" : "ประเทศ",
+ "Status" : "สถานะ",
+ "Pending" : "อยู่ระหว่างดำเนินการ",
+ "Error" : "ข้อผิดพลาด",
+ "Saved" : "บันทึกแล้ว",
+ "OK" : "ตกลง",
+ "Copy link" : "คัดลอกลิงค์",
+ "Dismiss" : "ยกเลิก",
+ "Grid view" : "มุมมองแบบตาราง Grid",
+ "Back" : "ย้อนกลับ",
+ "Favorite" : "รายการโปรด",
+ "Restricted" : "ถูกจำกัด",
+ "Description" : "รายละเอียด",
+ "Notifications" : "การแจ้งเตือน",
+ "Password protection" : "Password protection",
+ "Enter a password" : "Enter a password",
+ "Save" : "บันทึก",
+ "Edit" : "แก้ไข",
+ "Delete" : "ลบ",
+ "Password" : "รหัสผ่าน",
+ "Login" : "Login",
+ "Nickname" : "ชื่อเล่น",
+ "Client ID" : "Client ID",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Add to favorites",
+ "Loading" : "Loading",
+ "Groups" : "กลุ่ม",
+ "Password protect" : "ป้องกันด้วยรหัสผ่าน",
+ "Add participants" : "เพิ่มผู้เข้าร่วม",
+ "Close" : "ปิด",
+ "Reply" : "ตอบกลับ",
+ "Today" : "วันนี้",
+ "Yesterday" : "เมื่อวานนี้",
+ "Invalid path selected" : "เลือกเส้นทางไม่ถูกต้อง",
+ "bot" : "บอต",
+ "guest" : "ผู้เยี่ยมชม",
+ "Searching …" : "กำลังค้นหา …",
+ "No results" : "ไม่มีผลลัพธ์",
+ "Add users or groups" : "Add users or groups",
+ "Chat" : "แชท",
+ "Details" : "รายละเอียด",
+ "Settings" : "ตั้งค่า",
+ "Privacy" : "ความเป็นส่วนตัว",
+ "Keyboard shortcuts" : "ปุ่มลัด",
+ "Search" : "Search",
+ "Send" : "ส่ง",
+ "Media" : "สื่อ",
+ "Files" : "ไฟล์",
+ "Locations" : "สถานที่",
+ "Audio" : "เสียง",
+ "Other" : "อื่น ๆ",
+ "Do not disturb" : "ห้ามรบกวน",
+ "Away" : "ไม่อยู่",
+ "Default" : "ค่าเริ่มต้น",
+ "The password is wrong. Try again." : "รหัสผ่านที่ไม่ถูกต้อง กรุณาลองอีกครั้ง",
+ "Android app" : "แอพฯ แอนดรอยด์",
+ "iOS app" : "แอพฯ IOS",
+ "Camera" : "กล้อง",
+ "Remove" : "ลบออก",
+ "[Unknown username]" : "[ไม่รู้จักชื่อผู้ใช้]"
+},"pluralForm" :"nplurals=1; plural=0;"
+} \ No newline at end of file
diff --git a/l10n/tr.js b/l10n/tr.js
index 2eefd34e4..bf2799be9 100644
--- a/l10n/tr.js
+++ b/l10n/tr.js
@@ -1039,13 +1039,7 @@ OC.L10N.register(
"Settings" : "Ayarlar",
"Shared items" : "Paylaşılmış ögeler",
"Participants ({count})" : "Katılımcılar ({count})",
- "Media" : "Ortam",
- "Files" : "Dosyalar",
- "Deck cards" : "Tahta kartları",
- "Voice messages" : "Sesli iletiler",
- "Locations" : "Konumlar",
- "Audio" : "Ses",
- "Other" : "Diğer",
+ "Projects" : "Projeler",
"Show all media" : "Tüm ortamları görüntüle",
"Show all files" : "Tüm dosyaları görüntüle",
"Show all deck cards" : "Tüm tahta kartlarını görüntüle",
@@ -1053,7 +1047,6 @@ OC.L10N.register(
"Show all locations" : "Tüm konumları görüntüle",
"Show all audio" : "Tüm sesleri görüntüle",
"Show all other" : "Tüm diğerlerini görüntüle",
- "Projects" : "Projeler",
"Meeting ID: {meetingId}" : "Toplantı kodu: {meetingId}",
"Your PIN: {attendeePin}" : "PIN kodunuz: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Görüntülenecek ad: <strong>{name}</strong>",
@@ -1063,6 +1056,7 @@ OC.L10N.register(
"Sounds" : "Sesler",
"Play sounds when participants join or leave a call" : "Katılımcılar görüşmeye girdiğinde ya da çıktığında ses çalınsın",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "Üreticinin sınırlamaları nedeniyle, sesler şu anda Safari web tarayıcısı, iPad ve iPhone aygıtlarında çalınamıyor. ",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "Sohbet ve çağrı bildirimlerinin kişisel ayarlar bölümünden belirlenebilen sesleri.",
"Keyboard shortcuts" : "Kısayol tuşları",
"Speed up your Talk experience with these quick shortcuts." : "Şu kısayol tuşlarını kullanarak Talk deneyiminizi hızlandırabilirsiniz.",
"Focus the chat input" : "Sohbet girişine odaklan",
@@ -1123,6 +1117,13 @@ OC.L10N.register(
"Error while accessing microphone" : "Mikrofon erişilirken sorun çıktı",
"Access to camera is only possible with HTTPS" : "Kameraya yalnız HTTPS üzerinden erişilebilir",
"An error occurred while fetching the participants" : "Katılımcılar alınırken bir sorun çıktı",
+ "Media" : "Ortam",
+ "Files" : "Dosyalar",
+ "Deck cards" : "Tahta kartları",
+ "Voice messages" : "Sesli iletiler",
+ "Locations" : "Konumlar",
+ "Audio" : "Ses",
+ "Other" : "Diğer",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk güncellendi. Lütfen sayfayı yeniden yükleyin",
"Do not disturb" : "Rahatsız etmeyin",
"Away" : "Uzakta",
@@ -1131,6 +1132,7 @@ OC.L10N.register(
"Not enough free space to upload file \"{fileName}\"" : "\"{fileName}\" dosyasını yüklemek için yeterli boş alan yok",
"Error while uploading file \"{fileName}\"" : "\"{fileName}\" dosyası yüklenirken sorun çıktı",
"An error happened when trying to share your file" : "Dosyanız paylaşılmaya çalışılırken bir sorun çıktı",
+ "{guest} (guest)" : "{guest} (konuk)",
"Could not post message: {errorMessage}" : "İleti gönderilemedi: {errorMessage}",
"Failed to add reaction" : "Tepki eklenemedi",
"Failed to remove reaction" : "Tepki silinemedi",
diff --git a/l10n/tr.json b/l10n/tr.json
index 6ccc2b8b0..c7cbf70e2 100644
--- a/l10n/tr.json
+++ b/l10n/tr.json
@@ -1037,13 +1037,7 @@
"Settings" : "Ayarlar",
"Shared items" : "Paylaşılmış ögeler",
"Participants ({count})" : "Katılımcılar ({count})",
- "Media" : "Ortam",
- "Files" : "Dosyalar",
- "Deck cards" : "Tahta kartları",
- "Voice messages" : "Sesli iletiler",
- "Locations" : "Konumlar",
- "Audio" : "Ses",
- "Other" : "Diğer",
+ "Projects" : "Projeler",
"Show all media" : "Tüm ortamları görüntüle",
"Show all files" : "Tüm dosyaları görüntüle",
"Show all deck cards" : "Tüm tahta kartlarını görüntüle",
@@ -1051,7 +1045,6 @@
"Show all locations" : "Tüm konumları görüntüle",
"Show all audio" : "Tüm sesleri görüntüle",
"Show all other" : "Tüm diğerlerini görüntüle",
- "Projects" : "Projeler",
"Meeting ID: {meetingId}" : "Toplantı kodu: {meetingId}",
"Your PIN: {attendeePin}" : "PIN kodunuz: {attendeePin}",
"Display name: <strong>{name}</strong>" : "Görüntülenecek ad: <strong>{name}</strong>",
@@ -1061,6 +1054,7 @@
"Sounds" : "Sesler",
"Play sounds when participants join or leave a call" : "Katılımcılar görüşmeye girdiğinde ya da çıktığında ses çalınsın",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "Üreticinin sınırlamaları nedeniyle, sesler şu anda Safari web tarayıcısı, iPad ve iPhone aygıtlarında çalınamıyor. ",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "Sohbet ve çağrı bildirimlerinin kişisel ayarlar bölümünden belirlenebilen sesleri.",
"Keyboard shortcuts" : "Kısayol tuşları",
"Speed up your Talk experience with these quick shortcuts." : "Şu kısayol tuşlarını kullanarak Talk deneyiminizi hızlandırabilirsiniz.",
"Focus the chat input" : "Sohbet girişine odaklan",
@@ -1121,6 +1115,13 @@
"Error while accessing microphone" : "Mikrofon erişilirken sorun çıktı",
"Access to camera is only possible with HTTPS" : "Kameraya yalnız HTTPS üzerinden erişilebilir",
"An error occurred while fetching the participants" : "Katılımcılar alınırken bir sorun çıktı",
+ "Media" : "Ortam",
+ "Files" : "Dosyalar",
+ "Deck cards" : "Tahta kartları",
+ "Voice messages" : "Sesli iletiler",
+ "Locations" : "Konumlar",
+ "Audio" : "Ses",
+ "Other" : "Diğer",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk güncellendi. Lütfen sayfayı yeniden yükleyin",
"Do not disturb" : "Rahatsız etmeyin",
"Away" : "Uzakta",
@@ -1129,6 +1130,7 @@
"Not enough free space to upload file \"{fileName}\"" : "\"{fileName}\" dosyasını yüklemek için yeterli boş alan yok",
"Error while uploading file \"{fileName}\"" : "\"{fileName}\" dosyası yüklenirken sorun çıktı",
"An error happened when trying to share your file" : "Dosyanız paylaşılmaya çalışılırken bir sorun çıktı",
+ "{guest} (guest)" : "{guest} (konuk)",
"Could not post message: {errorMessage}" : "İleti gönderilemedi: {errorMessage}",
"Failed to add reaction" : "Tepki eklenemedi",
"Failed to remove reaction" : "Tepki silinemedi",
diff --git a/l10n/uk.js b/l10n/uk.js
index 72963587a..0e7d08c7d 100644
--- a/l10n/uk.js
+++ b/l10n/uk.js
@@ -22,6 +22,11 @@ OC.L10N.register(
"You joined the conversation" : "Ви приєдналися до розмови",
"You missed a call from {user}" : "Ви пропустили виклик від {user}",
"Talk to %s" : "Спілкуватися з %s",
+ "File is too big" : "Файл занадто великий",
+ "Invalid file provided" : "Надано невірний файл",
+ "Invalid image" : "Невірне зображення",
+ "Unknown filetype" : "Невідомий тип файлу",
+ "An error occurred. Please contact your admin." : "Виникла помилка. Будь ласка, зв'яжіться з вашим адміністратором.",
"Write to conversation" : "Написати у розмові",
"Click the button below to join." : "Натисніть на кнопку, щоб приєднатися",
"Join »%s«" : "Приєднатися »%s«",
@@ -65,12 +70,14 @@ OC.L10N.register(
"Blocked" : "Заблоковано",
"Delete this server" : "Вилучити цей сервер",
"Saved" : "Збережено",
+ "OK" : "Гаразд",
"Copy link" : "Скопіювати посилання",
"Waiting for others to join the call …" : "Чекаємо, доки хтось приєднається до виклику...",
"Share this link to invite others!" : "Поділіться цим посиланням з тими, кого бажаєте запросити!",
"Dismiss" : "Припинити",
"Show your screen" : "Демонстрація екрану",
"Stop screensharing" : "Припинити демонстрацію екрану",
+ "More actions" : "Більше дій",
"No audio" : "Вимкнути мікрофон",
"Mute audio" : "Вимкнути мікрофон (m)",
"Unmute audio" : "Увімкнути мікрофон",
@@ -90,6 +97,9 @@ OC.L10N.register(
"Drop your files to upload" : "Пересуньте файли сюди для завантаження",
"Call in progress" : "Триває виклик",
"Favorite" : "Улюблений",
+ "Restricted" : "Обмежена",
+ "Description" : "Опис",
+ "Notifications" : "Сповіщення",
"Leave conversation" : "Залишити спілкування",
"Delete conversation" : "Вилучити розмову",
"Do you really want to delete \"{displayName}\"?" : "Дійсно вилучити \"{displayName}\"?",
@@ -98,10 +108,13 @@ OC.L10N.register(
"Enable lobby" : "Увімкнути схвалення входу",
"Save" : "Зберегти",
"Edit" : "Редагувати",
+ "More information" : "Докладно",
+ "Delete" : "Вилучити",
"Password" : "Пароль",
"Login" : "Login",
"Nickname" : "Прізвисько",
"Client ID" : "Ідентифікатор клієнта",
+ "Calls" : "Виклики",
"Remove from favorites" : "Вилучено з улюбленого",
"Add to favorites" : "Додати до улюбленого",
"Loading" : "Завантаження",
@@ -117,6 +130,7 @@ OC.L10N.register(
"Search conversations or users" : "Пошук розмов та учасників",
"You are currently waiting in the lobby" : "Чекаємо на схвалення доступу",
"Reply" : "Відповісти",
+ "Contact" : "Контакт",
"Today" : "Сьогодні",
"Yesterday" : "Вчора",
"Share files to the conversation" : "Поділитися файлами під час розмови",
@@ -136,7 +150,10 @@ OC.L10N.register(
"Add users or circles" : "Додати користувачів або кола",
"Participants" : "Учасники",
"Chat" : "Чат",
+ "Details" : "Деталі",
"Settings" : "Налаштування",
+ "Projects" : "Проєкти",
+ "Privacy" : "Конфіденційність",
"Keyboard shortcuts" : "Гарячі клавіші",
"Search" : "Пошук",
"Start call" : "Почати виклик",
@@ -146,6 +163,13 @@ OC.L10N.register(
"Say hi to your friends and colleagues!" : "Привітайтеся з вашими друзями та колегами!",
"Join a conversation or start a new one!" : "Приєднайтеся до розмови або почніть нову!",
"Join a conversation or start a new one" : "Приєднайтеся до розмови або почніть нову",
+ "Media" : "Медіа",
+ "Files" : "Робота з файлами",
+ "Locations" : "Розташування",
+ "Audio" : "Аудіо",
+ "Other" : "Інші",
+ "Do not disturb" : "Не турбувати",
+ "Away" : "Піти",
"Error while sharing file" : "Помилка під час надання спільного доступу до файлу",
"Default" : "За замовчуванням",
"Access to microphone & camera is only possible with HTTPS" : "Доступ до мікрофона та камери можливий лише через безпечний протокол https.",
diff --git a/l10n/uk.json b/l10n/uk.json
index 3d6b037cf..05bfa4bae 100644
--- a/l10n/uk.json
+++ b/l10n/uk.json
@@ -20,6 +20,11 @@
"You joined the conversation" : "Ви приєдналися до розмови",
"You missed a call from {user}" : "Ви пропустили виклик від {user}",
"Talk to %s" : "Спілкуватися з %s",
+ "File is too big" : "Файл занадто великий",
+ "Invalid file provided" : "Надано невірний файл",
+ "Invalid image" : "Невірне зображення",
+ "Unknown filetype" : "Невідомий тип файлу",
+ "An error occurred. Please contact your admin." : "Виникла помилка. Будь ласка, зв'яжіться з вашим адміністратором.",
"Write to conversation" : "Написати у розмові",
"Click the button below to join." : "Натисніть на кнопку, щоб приєднатися",
"Join »%s«" : "Приєднатися »%s«",
@@ -63,12 +68,14 @@
"Blocked" : "Заблоковано",
"Delete this server" : "Вилучити цей сервер",
"Saved" : "Збережено",
+ "OK" : "Гаразд",
"Copy link" : "Скопіювати посилання",
"Waiting for others to join the call …" : "Чекаємо, доки хтось приєднається до виклику...",
"Share this link to invite others!" : "Поділіться цим посиланням з тими, кого бажаєте запросити!",
"Dismiss" : "Припинити",
"Show your screen" : "Демонстрація екрану",
"Stop screensharing" : "Припинити демонстрацію екрану",
+ "More actions" : "Більше дій",
"No audio" : "Вимкнути мікрофон",
"Mute audio" : "Вимкнути мікрофон (m)",
"Unmute audio" : "Увімкнути мікрофон",
@@ -88,6 +95,9 @@
"Drop your files to upload" : "Пересуньте файли сюди для завантаження",
"Call in progress" : "Триває виклик",
"Favorite" : "Улюблений",
+ "Restricted" : "Обмежена",
+ "Description" : "Опис",
+ "Notifications" : "Сповіщення",
"Leave conversation" : "Залишити спілкування",
"Delete conversation" : "Вилучити розмову",
"Do you really want to delete \"{displayName}\"?" : "Дійсно вилучити \"{displayName}\"?",
@@ -96,10 +106,13 @@
"Enable lobby" : "Увімкнути схвалення входу",
"Save" : "Зберегти",
"Edit" : "Редагувати",
+ "More information" : "Докладно",
+ "Delete" : "Вилучити",
"Password" : "Пароль",
"Login" : "Login",
"Nickname" : "Прізвисько",
"Client ID" : "Ідентифікатор клієнта",
+ "Calls" : "Виклики",
"Remove from favorites" : "Вилучено з улюбленого",
"Add to favorites" : "Додати до улюбленого",
"Loading" : "Завантаження",
@@ -115,6 +128,7 @@
"Search conversations or users" : "Пошук розмов та учасників",
"You are currently waiting in the lobby" : "Чекаємо на схвалення доступу",
"Reply" : "Відповісти",
+ "Contact" : "Контакт",
"Today" : "Сьогодні",
"Yesterday" : "Вчора",
"Share files to the conversation" : "Поділитися файлами під час розмови",
@@ -134,7 +148,10 @@
"Add users or circles" : "Додати користувачів або кола",
"Participants" : "Учасники",
"Chat" : "Чат",
+ "Details" : "Деталі",
"Settings" : "Налаштування",
+ "Projects" : "Проєкти",
+ "Privacy" : "Конфіденційність",
"Keyboard shortcuts" : "Гарячі клавіші",
"Search" : "Пошук",
"Start call" : "Почати виклик",
@@ -144,6 +161,13 @@
"Say hi to your friends and colleagues!" : "Привітайтеся з вашими друзями та колегами!",
"Join a conversation or start a new one!" : "Приєднайтеся до розмови або почніть нову!",
"Join a conversation or start a new one" : "Приєднайтеся до розмови або почніть нову",
+ "Media" : "Медіа",
+ "Files" : "Робота з файлами",
+ "Locations" : "Розташування",
+ "Audio" : "Аудіо",
+ "Other" : "Інші",
+ "Do not disturb" : "Не турбувати",
+ "Away" : "Піти",
"Error while sharing file" : "Помилка під час надання спільного доступу до файлу",
"Default" : "За замовчуванням",
"Access to microphone & camera is only possible with HTTPS" : "Доступ до мікрофона та камери можливий лише через безпечний протокол https.",
diff --git a/l10n/vi.js b/l10n/vi.js
index 819cd604a..9f73411b0 100644
--- a/l10n/vi.js
+++ b/l10n/vi.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"_%n other_::_%n others_" : ["%n khác"],
"{actor} invited you to {call}" : "{actor} mời bạn tham dự {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Bạn đã được mời vào <strong>cuộc trò chuyện</strong> hoặc có 1 <strong>cuộc gọi</strong>",
+ "Other activities" : "Hoạt động khác",
"Talk" : "Trò chuyện",
"Guest" : "Khách",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Chào mừng bạn đến với vWorkspaceTalk!\nTrong cuộc trò chuyện này, bạn sẽ được thông báo về các tính năng mới có trong vWorkspace Talk.",
@@ -363,6 +364,7 @@ OC.L10N.register(
"Testing whether the TURN server returns ICE candidates" : "Kiểm tra xem máy chủ TURN có trả về các ứng viên ICE hay không",
"Test this server" : "Kiểm tra máy chủ này",
"TURN servers" : "Máy chủ TURN",
+ "OK" : "OK",
"{nickName} raised their hand." : "{nickName} giơ tay.",
"A participant raised their hand." : "Một người tham gia giơ tay.",
"Previous page of videos" : "Trang trước của video",
@@ -427,8 +429,10 @@ OC.L10N.register(
"Drop your files to upload" : "Thả tệp của bạn để tải lên",
"Call in progress" : "Cuộc gọi đang chờ",
"Favorite" : "Ưa thích",
+ "Restricted" : "Bị giới hạn",
"Conversation settings" : "Cài đặt cuộc trò chuyện",
"Description" : "Mô tả",
+ "Notifications" : "Thông báo",
"Guests access" : "Khách truy cập",
"Meeting settings" : "Cài đặt cuộc họp",
"Danger zone" : "Khu vực nguy hiểm",
@@ -528,6 +532,7 @@ OC.L10N.register(
"not running, check Matterbridge log" : "không chạy, kiểm tra nhật kí Matterbridge",
"not running" : "không chạy",
"Bridge saved" : "Cầu nối đã được lưu",
+ "Calls" : "Cuộc gọi",
"Allow participants to join from a phone." : "Cho phép tham gia từ điện thoại.",
"Enable SIP dial-in" : "Bật quay số SIP",
"SIP dial-in is now enabled" : "Quay số SIP hiện đã được bật",
@@ -595,6 +600,7 @@ OC.L10N.register(
"Mark as unread" : "Đánh dấu là chưa đọc",
"Go to file" : "Tới tập tin",
"Message link copied to clipboard." : "Đã sao chép liên kết tin nhắn vào khay nhớ tạm.",
+ "Contact" : "Liên hệ",
"{stack} in {board}" : "{stack} trong {board}",
"Deck Card" : "Thẻ bài",
"Scroll to bottom" : "Cuộn xuống dưới cùng",
@@ -645,6 +651,8 @@ OC.L10N.register(
"Chat" : "Trò chuyện",
"Details" : "Chi tiết",
"Settings" : "Thiết lập",
+ "Projects" : "Dự án",
+ "Show all files" : "Hiện tất cả tệp",
"Meeting ID: {meetingId}" : "Mã cuộc họp: {meetingId}",
"Your PIN: {attendeePin}" : "Mã PIN của bạn: {attendeePin}",
"Attachments folder" : "Thư mục đính kèm",
@@ -703,6 +711,11 @@ OC.L10N.register(
"Error while accessing microphone" : "Lỗi khi truy cập micrô",
"Access to camera is only possible with HTTPS" : "Chỉ có thể truy cập vào camera với HTTPS",
"An error occurred while fetching the participants" : "Đã xảy ra lỗi khi tìm nạp những người tham gia",
+ "Media" : "Phương tiện",
+ "Files" : "Tệp",
+ "Locations" : "Các địa điểm",
+ "Audio" : "Âm thanh",
+ "Other" : "Khác",
"Nextcloud Talk was updated, please reload the page" : "vWorkspace Talk đã được cập nhật, vui lòng tải lại trang",
"Do not disturb" : "Đừng làm phiền",
"Away" : "Tạm vắng",
@@ -791,6 +804,7 @@ OC.L10N.register(
"Video on and off" : "Bật và tắt video",
"Choose in which folder attachments should be saved." : "Chọn các tệp đính kèm thư mục sẽ được lưu.",
"Exit fullscreen (f)" : "Thoát chế độ toàn màn hình (f)",
- "Fullscreen (f)" : "Toàn màn hình (f)"
+ "Fullscreen (f)" : "Toàn màn hình (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Đặt mức thông báo cho cuộc trò chuyện hiện tại. Điều này sẽ chỉ ảnh hưởng đến các thông báo bạn nhận được."
},
"nplurals=1; plural=0;");
diff --git a/l10n/vi.json b/l10n/vi.json
index feaefeead..5587fc442 100644
--- a/l10n/vi.json
+++ b/l10n/vi.json
@@ -10,6 +10,7 @@
"_%n other_::_%n others_" : ["%n khác"],
"{actor} invited you to {call}" : "{actor} mời bạn tham dự {call}",
"You were invited to a <strong>conversation</strong> or had a <strong>call</strong>" : "Bạn đã được mời vào <strong>cuộc trò chuyện</strong> hoặc có 1 <strong>cuộc gọi</strong>",
+ "Other activities" : "Hoạt động khác",
"Talk" : "Trò chuyện",
"Guest" : "Khách",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "Chào mừng bạn đến với vWorkspaceTalk!\nTrong cuộc trò chuyện này, bạn sẽ được thông báo về các tính năng mới có trong vWorkspace Talk.",
@@ -361,6 +362,7 @@
"Testing whether the TURN server returns ICE candidates" : "Kiểm tra xem máy chủ TURN có trả về các ứng viên ICE hay không",
"Test this server" : "Kiểm tra máy chủ này",
"TURN servers" : "Máy chủ TURN",
+ "OK" : "OK",
"{nickName} raised their hand." : "{nickName} giơ tay.",
"A participant raised their hand." : "Một người tham gia giơ tay.",
"Previous page of videos" : "Trang trước của video",
@@ -425,8 +427,10 @@
"Drop your files to upload" : "Thả tệp của bạn để tải lên",
"Call in progress" : "Cuộc gọi đang chờ",
"Favorite" : "Ưa thích",
+ "Restricted" : "Bị giới hạn",
"Conversation settings" : "Cài đặt cuộc trò chuyện",
"Description" : "Mô tả",
+ "Notifications" : "Thông báo",
"Guests access" : "Khách truy cập",
"Meeting settings" : "Cài đặt cuộc họp",
"Danger zone" : "Khu vực nguy hiểm",
@@ -526,6 +530,7 @@
"not running, check Matterbridge log" : "không chạy, kiểm tra nhật kí Matterbridge",
"not running" : "không chạy",
"Bridge saved" : "Cầu nối đã được lưu",
+ "Calls" : "Cuộc gọi",
"Allow participants to join from a phone." : "Cho phép tham gia từ điện thoại.",
"Enable SIP dial-in" : "Bật quay số SIP",
"SIP dial-in is now enabled" : "Quay số SIP hiện đã được bật",
@@ -593,6 +598,7 @@
"Mark as unread" : "Đánh dấu là chưa đọc",
"Go to file" : "Tới tập tin",
"Message link copied to clipboard." : "Đã sao chép liên kết tin nhắn vào khay nhớ tạm.",
+ "Contact" : "Liên hệ",
"{stack} in {board}" : "{stack} trong {board}",
"Deck Card" : "Thẻ bài",
"Scroll to bottom" : "Cuộn xuống dưới cùng",
@@ -643,6 +649,8 @@
"Chat" : "Trò chuyện",
"Details" : "Chi tiết",
"Settings" : "Thiết lập",
+ "Projects" : "Dự án",
+ "Show all files" : "Hiện tất cả tệp",
"Meeting ID: {meetingId}" : "Mã cuộc họp: {meetingId}",
"Your PIN: {attendeePin}" : "Mã PIN của bạn: {attendeePin}",
"Attachments folder" : "Thư mục đính kèm",
@@ -701,6 +709,11 @@
"Error while accessing microphone" : "Lỗi khi truy cập micrô",
"Access to camera is only possible with HTTPS" : "Chỉ có thể truy cập vào camera với HTTPS",
"An error occurred while fetching the participants" : "Đã xảy ra lỗi khi tìm nạp những người tham gia",
+ "Media" : "Phương tiện",
+ "Files" : "Tệp",
+ "Locations" : "Các địa điểm",
+ "Audio" : "Âm thanh",
+ "Other" : "Khác",
"Nextcloud Talk was updated, please reload the page" : "vWorkspace Talk đã được cập nhật, vui lòng tải lại trang",
"Do not disturb" : "Đừng làm phiền",
"Away" : "Tạm vắng",
@@ -789,6 +802,7 @@
"Video on and off" : "Bật và tắt video",
"Choose in which folder attachments should be saved." : "Chọn các tệp đính kèm thư mục sẽ được lưu.",
"Exit fullscreen (f)" : "Thoát chế độ toàn màn hình (f)",
- "Fullscreen (f)" : "Toàn màn hình (f)"
+ "Fullscreen (f)" : "Toàn màn hình (f)",
+ "Set the notification level for the current conversation. This will affect only the notifications you receive." : "Đặt mức thông báo cho cuộc trò chuyện hiện tại. Điều này sẽ chỉ ảnh hưởng đến các thông báo bạn nhận được."
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/l10n/zh_CN.js b/l10n/zh_CN.js
index 29f8a006d..993e259b4 100644
--- a/l10n/zh_CN.js
+++ b/l10n/zh_CN.js
@@ -894,6 +894,7 @@ OC.L10N.register(
"No search results" : "无搜索结果",
"Groups" : "分组",
"Circles" : "圈子",
+ "Unread mentions" : "未读的提及",
"Talk settings" : "Talk 设置",
"Users, groups and circles" : "用户、群组和圈子",
"Users and groups" : "用户和群组",
@@ -1029,6 +1030,8 @@ OC.L10N.register(
"Details" : "详情",
"Settings" : "设置",
"Participants ({count})" : "参与者数量 ({count})",
+ "Projects" : "项目",
+ "Show all files" : "显示所有文件",
"Meeting ID: {meetingId}" : "会议 ID:{meetingId}",
"Your PIN: {attendeePin}" : "你的 PIN 码:{attendeePin}",
"Attachments folder" : "附件文件夹",
@@ -1097,6 +1100,11 @@ OC.L10N.register(
"Error while accessing microphone" : "访问麦克风时出错",
"Access to camera is only possible with HTTPS" : "摄像头只能通过 HTTPS 协议访问",
"An error occurred while fetching the participants" : "获取参与者时出错",
+ "Media" : "媒体文件",
+ "Files" : "文件",
+ "Locations" : "地点",
+ "Audio" : "音频",
+ "Other" : "其他",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk已更新,请重新加载页面",
"Do not disturb" : "请勿打扰",
"Away" : "离开",
diff --git a/l10n/zh_CN.json b/l10n/zh_CN.json
index bdd5fa9f3..4ae81331e 100644
--- a/l10n/zh_CN.json
+++ b/l10n/zh_CN.json
@@ -892,6 +892,7 @@
"No search results" : "无搜索结果",
"Groups" : "分组",
"Circles" : "圈子",
+ "Unread mentions" : "未读的提及",
"Talk settings" : "Talk 设置",
"Users, groups and circles" : "用户、群组和圈子",
"Users and groups" : "用户和群组",
@@ -1027,6 +1028,8 @@
"Details" : "详情",
"Settings" : "设置",
"Participants ({count})" : "参与者数量 ({count})",
+ "Projects" : "项目",
+ "Show all files" : "显示所有文件",
"Meeting ID: {meetingId}" : "会议 ID:{meetingId}",
"Your PIN: {attendeePin}" : "你的 PIN 码:{attendeePin}",
"Attachments folder" : "附件文件夹",
@@ -1095,6 +1098,11 @@
"Error while accessing microphone" : "访问麦克风时出错",
"Access to camera is only possible with HTTPS" : "摄像头只能通过 HTTPS 协议访问",
"An error occurred while fetching the participants" : "获取参与者时出错",
+ "Media" : "媒体文件",
+ "Files" : "文件",
+ "Locations" : "地点",
+ "Audio" : "音频",
+ "Other" : "其他",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk已更新,请重新加载页面",
"Do not disturb" : "请勿打扰",
"Away" : "离开",
diff --git a/l10n/zh_HK.js b/l10n/zh_HK.js
index 63b1cb6f7..36493d53f 100644
--- a/l10n/zh_HK.js
+++ b/l10n/zh_HK.js
@@ -1039,13 +1039,7 @@ OC.L10N.register(
"Settings" : "設定",
"Shared items" : "分享項目",
"Participants ({count})" : "參與者 ({count})",
- "Media" : "多媒體",
- "Files" : "檔案",
- "Deck cards" : "看板卡片",
- "Voice messages" : "語音留言",
- "Locations" : "地點",
- "Audio" : "音頻",
- "Other" : "其它",
+ "Projects" : "專案項目",
"Show all media" : "顯示所有媒體",
"Show all files" : "顯示所有檔案",
"Show all deck cards" : "顯示所有卡片",
@@ -1053,7 +1047,6 @@ OC.L10N.register(
"Show all locations" : "顯示所有位置",
"Show all audio" : "顯示所有音頻",
"Show all other" : "顯示所有其他",
- "Projects" : "專案項目",
"Meeting ID: {meetingId}" : "會議 ID:{meetingId}",
"Your PIN: {attendeePin}" : "您的PIN:{attendeePin}",
"Display name: <strong>{name}</strong>" : "顯示名稱:<strong>{name}</strong>",
@@ -1063,6 +1056,7 @@ OC.L10N.register(
"Sounds" : "聲音 ",
"Play sounds when participants join or leave a call" : "參與者加入或離開通話時播放聲音",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "由於製造商的技術限制,當前無法在 Safari 瀏覽器以及 iPad 和 iPhone 裝置中播放聲音。",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "可以在個人設置中調整聊天和通話通告的聲音。",
"Keyboard shortcuts" : "鍵盤快捷鍵",
"Speed up your Talk experience with these quick shortcuts." : "這些快速捷徑可加快您的 Talk 體驗。",
"Focus the chat input" : "關注聊天輸入字段",
@@ -1123,6 +1117,13 @@ OC.L10N.register(
"Error while accessing microphone" : "存取米高風時發生錯誤",
"Access to camera is only possible with HTTPS" : "只有使用 HTTPS 才能存取相機",
"An error occurred while fetching the participants" : "擷取參與者時發生錯誤",
+ "Media" : "多媒體",
+ "Files" : "檔案",
+ "Deck cards" : "看板卡片",
+ "Voice messages" : "語音留言",
+ "Locations" : "地點",
+ "Audio" : "音頻",
+ "Other" : "其它",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk 已更新,請重新加載頁面",
"Do not disturb" : "請勿打擾",
"Away" : "離開",
@@ -1131,6 +1132,7 @@ OC.L10N.register(
"Not enough free space to upload file \"{fileName}\"" : "空間不足,不能上傳檔案 \"{fileName}\"",
"Error while uploading file \"{fileName}\"" : "上傳檔案時發生錯誤 \"{fileName}\"",
"An error happened when trying to share your file" : "分享檔案時發生錯誤",
+ "{guest} (guest)" : "{guest}(訪客)",
"Could not post message: {errorMessage}" : "無法發佈訊息:{errorMessage}",
"Failed to add reaction" : "添加反應失敗",
"Failed to remove reaction" : "移除反應失敗",
diff --git a/l10n/zh_HK.json b/l10n/zh_HK.json
index 6538c80a6..0c10c6d48 100644
--- a/l10n/zh_HK.json
+++ b/l10n/zh_HK.json
@@ -1037,13 +1037,7 @@
"Settings" : "設定",
"Shared items" : "分享項目",
"Participants ({count})" : "參與者 ({count})",
- "Media" : "多媒體",
- "Files" : "檔案",
- "Deck cards" : "看板卡片",
- "Voice messages" : "語音留言",
- "Locations" : "地點",
- "Audio" : "音頻",
- "Other" : "其它",
+ "Projects" : "專案項目",
"Show all media" : "顯示所有媒體",
"Show all files" : "顯示所有檔案",
"Show all deck cards" : "顯示所有卡片",
@@ -1051,7 +1045,6 @@
"Show all locations" : "顯示所有位置",
"Show all audio" : "顯示所有音頻",
"Show all other" : "顯示所有其他",
- "Projects" : "專案項目",
"Meeting ID: {meetingId}" : "會議 ID:{meetingId}",
"Your PIN: {attendeePin}" : "您的PIN:{attendeePin}",
"Display name: <strong>{name}</strong>" : "顯示名稱:<strong>{name}</strong>",
@@ -1061,6 +1054,7 @@
"Sounds" : "聲音 ",
"Play sounds when participants join or leave a call" : "參與者加入或離開通話時播放聲音",
"Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer." : "由於製造商的技術限制,當前無法在 Safari 瀏覽器以及 iPad 和 iPhone 裝置中播放聲音。",
+ "Sounds for chat and call notifications can be adjusted in the personal settings." : "可以在個人設置中調整聊天和通話通告的聲音。",
"Keyboard shortcuts" : "鍵盤快捷鍵",
"Speed up your Talk experience with these quick shortcuts." : "這些快速捷徑可加快您的 Talk 體驗。",
"Focus the chat input" : "關注聊天輸入字段",
@@ -1121,6 +1115,13 @@
"Error while accessing microphone" : "存取米高風時發生錯誤",
"Access to camera is only possible with HTTPS" : "只有使用 HTTPS 才能存取相機",
"An error occurred while fetching the participants" : "擷取參與者時發生錯誤",
+ "Media" : "多媒體",
+ "Files" : "檔案",
+ "Deck cards" : "看板卡片",
+ "Voice messages" : "語音留言",
+ "Locations" : "地點",
+ "Audio" : "音頻",
+ "Other" : "其它",
"Nextcloud Talk was updated, please reload the page" : "Nextcloud Talk 已更新,請重新加載頁面",
"Do not disturb" : "請勿打擾",
"Away" : "離開",
@@ -1129,6 +1130,7 @@
"Not enough free space to upload file \"{fileName}\"" : "空間不足,不能上傳檔案 \"{fileName}\"",
"Error while uploading file \"{fileName}\"" : "上傳檔案時發生錯誤 \"{fileName}\"",
"An error happened when trying to share your file" : "分享檔案時發生錯誤",
+ "{guest} (guest)" : "{guest}(訪客)",
"Could not post message: {errorMessage}" : "無法發佈訊息:{errorMessage}",
"Failed to add reaction" : "添加反應失敗",
"Failed to remove reaction" : "移除反應失敗",
diff --git a/l10n/zh_TW.js b/l10n/zh_TW.js
index 389782f78..6bcf3f888 100644
--- a/l10n/zh_TW.js
+++ b/l10n/zh_TW.js
@@ -11,6 +11,7 @@ OC.L10N.register(
"You attended a call with {user1}, {user2}, {user3}, {user4} and {user5}" : "您加入了與{user1},{user2},{user3},{user4}及{user5}之間的通話",
"_%n other_::_%n others_" : ["及另外%n位其他人"],
"{actor} invited you to {call}" : "{actor} 要請你加入{call}",
+ "Other activities" : "其它活動",
"Talk" : "交談",
"Guest" : "訪客",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "歡迎來到Nextcloud Talk!\n在此對話中,您將了解關於Nextcloud Talk中可用的新功能。 ",
@@ -31,9 +32,16 @@ OC.L10N.register(
"You started a call" : "您發起了一通話",
"You left the call" : "你離開了通話",
"An administrator locked the conversation" : "管理員鎖定了對話",
+ "File is too big" : "檔案太大",
+ "Invalid file provided" : "提供的檔案無效",
+ "Invalid image" : "圖片無效",
+ "Unknown filetype" : "未知的檔案類型",
+ "An error occurred. Please contact your admin." : "發生錯誤,請聯絡管理員。",
"Join call" : "加入通話",
"Open settings" : "開啟設定",
+ "Conversations" : "對話",
"Andorra" : "安道爾",
+ "United Arab Emirates" : "阿拉伯聯合大公國",
"Afghanistan" : "阿富汗",
"Antigua and Barbuda" : "安提瓜和巴布達",
"Anguilla" : "安圭拉",
@@ -46,6 +54,7 @@ OC.L10N.register(
"Austria" : "奧地利",
"Australia" : "澳大利亞",
"Aruba" : "阿路巴",
+ "Åland Islands" : "奧蘭群島",
"Azerbaijan" : "亞塞拜然",
"Bosnia and Herzegovina" : "波希尼亞及赫塞哥維那",
"Barbados" : "巴貝多",
@@ -56,6 +65,7 @@ OC.L10N.register(
"Bahrain" : "巴林",
"Burundi" : "蒲隆地",
"Benin" : "貝南",
+ "Saint Barthélemy" : "聖巴瑟米",
"Bermuda" : "百慕達",
"Brunei Darussalam" : "汶萊",
"Bonaire, Sint Eustatius and Saba" : "荷蘭加勒比區",
@@ -71,6 +81,7 @@ OC.L10N.register(
"Central African Republic" : "中非共和國",
"Congo" : "剛果",
"Switzerland" : "瑞士",
+ "Côte d'Ivoire" : "象牙海岸",
"Cook Islands" : "科克群島",
"Chile" : "智利",
"Cameroon" : "喀麥隆",
@@ -79,6 +90,7 @@ OC.L10N.register(
"Costa Rica" : "哥斯大黎加",
"Cuba" : "古巴",
"Cabo Verde" : "維德角共和國",
+ "Curaçao" : "古拉索",
"Christmas Island" : "聖誕島領地",
"Cyprus" : "塞浦路斯",
"Czechia" : "捷克",
@@ -91,6 +103,7 @@ OC.L10N.register(
"Ecuador" : "厄瓜多爾",
"Estonia" : "愛沙尼亞",
"Egypt" : "埃及",
+ "Western Sahara" : "西撒哈拉",
"Eritrea" : "厄利垂亞",
"Spain" : "西班牙",
"Ethiopia" : "衣索匹亞",
@@ -100,6 +113,7 @@ OC.L10N.register(
"Faroe Islands" : "法羅群島",
"France" : "法國",
"Gabon" : "加彭",
+ "United Kingdom of Great Britain and Northern Ireland" : "大不列顛暨北愛爾蘭聯合王國",
"Grenada" : "格瑞那達",
"Georgia" : "喬治亞",
"French Guiana" : "法屬圭亞那",
@@ -142,6 +156,7 @@ OC.L10N.register(
"Kiribati" : "基里巴斯共和國",
"Comoros" : "科摩羅",
"Saint Kitts and Nevis" : "聖克里斯多福及尼維斯",
+ "Korea, Republic of" : "韓國",
"Kuwait" : "科威特",
"Cayman Islands" : "開曼群島",
"Kazakhstan" : "哈薩克",
@@ -158,6 +173,7 @@ OC.L10N.register(
"Libya" : "利比亞",
"Morocco" : "摩洛哥",
"Monaco" : "摩納哥",
+ "Moldova, Republic of" : "摩爾多瓦共和國",
"Montenegro" : "蒙特內哥羅",
"Saint Martin (French part)" : "聖馬丁島(法國)",
"Madagascar" : "馬達加斯加",
@@ -205,6 +221,7 @@ OC.L10N.register(
"Palau" : "帕勞",
"Paraguay" : "巴拉圭",
"Qatar" : "卡達",
+ "Réunion" : "留尼旺",
"Romania" : "羅馬尼亞",
"Serbia" : "塞爾維亞",
"Russian Federation" : "俄羅斯",
@@ -229,21 +246,43 @@ OC.L10N.register(
"El Salvador" : "薩爾瓦多",
"Sint Maarten (Dutch part)" : "荷屬聖馬丁",
"Syrian Arab Republic" : "敘利亞",
+ "Eswatini" : "史瓦帝尼",
+ "Turks and Caicos Islands" : "土克凱可群島",
"Chad" : "查德",
"French Southern Territories" : "法屬南部和南極領地",
"Togo" : "多哥",
"Thailand" : "泰國",
"Tajikistan" : "塔吉克斯坦",
+ "Tokelau" : "托克勞",
"Timor-Leste" : "東帝汶",
+ "Turkmenistan" : "土庫曼",
+ "Tunisia" : "突尼西亞",
+ "Tonga" : "東加",
+ "Turkey" : "土耳其",
+ "Trinidad and Tobago" : "千里達及托巴哥",
+ "Tuvalu" : "吐瓦魯",
"Taiwan, Province of China" : "台灣,中華民國",
"Tanzania, United Republic of" : "坦尚尼亞",
+ "Ukraine" : "烏克蘭",
+ "Uganda" : "烏干達",
+ "United States Minor Outlying Islands" : "美國本土外小島嶼",
+ "United States of America" : "美利堅合眾國",
+ "Uruguay" : "烏拉圭",
+ "Uzbekistan" : "烏茲別克",
"Holy See" : "聖座",
"Saint Vincent and the Grenadines" : "聖文森及格瑞那丁",
+ "Viet Nam" : "越南",
+ "Vanuatu" : "萬那杜",
+ "Wallis and Futuna" : "瓦利斯和富圖那",
"Samoa" : "薩摩亞",
+ "Yemen" : "葉門",
"Mayotte" : "馬約特",
"South Africa" : "南非",
+ "Zambia" : "尚比亞",
+ "Zimbabwe" : "辛巴威",
"Invalid date, date format must be YYYY-MM-DD" : "無效的日期,需為 YYYY-MM-DD 格式",
"Leave call" : "離開通話",
+ "Request password" : "請求密碼",
"Limit to groups" : "限制給特定群組",
"Everyone" : "所有人",
"Save changes" : "儲存變更",
@@ -257,6 +296,7 @@ OC.L10N.register(
"Beta" : "Beta 測試版",
"Name" : "名稱",
"General settings" : "一般設定",
+ "All messages" : "所有訊息",
"Off" : "關閉",
"Language" : "語言",
"Country" : "國家",
@@ -269,49 +309,75 @@ OC.L10N.register(
"Expired" : "已過期",
"Validate SSL certificate" : "驗證 SSL憑證",
"Saved" : "儲存",
+ "OK" : "確定",
+ "Checking …" : "檢查中 ...",
"Copy link" : "複製連結",
"Waiting for others to join the call …" : "等待其他人加入通話...",
"Dismiss" : "取消",
+ "More actions" : "更多動作",
"Mute audio" : "靜音",
"Disable video" : "停用視訊",
"Grid view" : "網格檢視",
"Back" : "返回",
"You" : "您",
+ "Drop your files to upload" : "拖曳您的檔案以上傳",
"Favorite" : "我的最愛",
+ "Restricted" : "受限",
+ "Description" : "描述",
+ "Notifications" : "通知",
"Leave conversation" : "離開對話",
"Delete conversation" : "刪除對話",
+ "Allow guests" : "允許訪客",
"Password protection" : "密碼保護",
"Enter a password" : "輸入密碼",
+ "Enable lobby" : "啟用大廳",
"Save" : "儲存",
"Edit" : "編輯",
+ "More information" : "更多資訊",
"Delete" : "刪除",
"Password" : "密碼",
"API token" : "API token",
"Login" : "帳號",
"Nickname" : "暱稱",
"Client ID" : "客戶端ID",
+ "Calls" : "通話",
+ "Mark as read" : "標為已讀",
"Remove from favorites" : "取消我的最愛",
"Add to favorites" : "加到我的最愛",
+ "No matches" : "沒有符合的",
"Loading" : "載入中",
"Groups" : "群組",
+ "Circles" : "圈子",
"Create a new group conversation" : "建立新群組對話",
"Password protect" : "密碼防護",
+ "Add participants" : "新增成員",
"Close" : "關閉",
"Conversation name" : "對話名稱",
+ "Message sent" : "已傳送郵件",
"Reply" : "回覆",
+ "Contact" : "聯絡人",
"Today" : "今天",
"Yesterday" : "昨天",
+ "Record voice message" : "錄製語音訊息",
+ "Upload new files" : "上傳新檔案",
+ "Share from Files" : "從「檔案」分享",
"Send message" : "傳送訊息",
"File to share" : "要分享的檔案",
"Invalid path selected" : "所選的路徑無效",
"moderator" : "主持人",
"guest" : "訪客",
+ "Demote from moderator" : "取消主持人資格",
+ "Add users" : "新增使用者",
"Searching …" : "正在搜尋……",
"No results" : "沒有符合搜尋的項目",
"Add users or groups" : "增加使用者或者群組",
"Participants" : "參與者",
"Chat" : "聊天",
+ "Details" : "詳細資訊",
"Settings" : "設定",
+ "Projects" : "專案",
+ "Show all files" : "顯示全部檔案",
+ "Privacy" : "隱私",
"Keyboard shortcuts" : "快速鍵",
"Search" : "搜尋",
"Start call" : "通話",
@@ -319,7 +385,16 @@ OC.L10N.register(
"Send" : "傳送",
"Say hi to your friends and colleagues!" : "跟大家打招呼",
"Start a conversation" : "新對話",
+ "You were mentioned" : "您被提及",
"Join a conversation or start a new one" : "加入一個對話或者開一個新的",
+ "Media" : "多媒體",
+ "Files" : "檔案",
+ "Locations" : "地點",
+ "Audio" : "音樂",
+ "Other" : "其他",
+ "Do not disturb" : "請勿打擾",
+ "Away" : "外出",
+ "Error while sharing file" : "分享檔案時發生錯誤",
"Default" : "預設",
"The password is wrong. Try again." : "密碼錯誤,請重試",
"Android app" : "安卓應用",
diff --git a/l10n/zh_TW.json b/l10n/zh_TW.json
index 32aac3d71..0eac3abb1 100644
--- a/l10n/zh_TW.json
+++ b/l10n/zh_TW.json
@@ -9,6 +9,7 @@
"You attended a call with {user1}, {user2}, {user3}, {user4} and {user5}" : "您加入了與{user1},{user2},{user3},{user4}及{user5}之間的通話",
"_%n other_::_%n others_" : ["及另外%n位其他人"],
"{actor} invited you to {call}" : "{actor} 要請你加入{call}",
+ "Other activities" : "其它活動",
"Talk" : "交談",
"Guest" : "訪客",
"Welcome to Nextcloud Talk!\nIn this conversation you will be informed about new features available in Nextcloud Talk." : "歡迎來到Nextcloud Talk!\n在此對話中,您將了解關於Nextcloud Talk中可用的新功能。 ",
@@ -29,9 +30,16 @@
"You started a call" : "您發起了一通話",
"You left the call" : "你離開了通話",
"An administrator locked the conversation" : "管理員鎖定了對話",
+ "File is too big" : "檔案太大",
+ "Invalid file provided" : "提供的檔案無效",
+ "Invalid image" : "圖片無效",
+ "Unknown filetype" : "未知的檔案類型",
+ "An error occurred. Please contact your admin." : "發生錯誤,請聯絡管理員。",
"Join call" : "加入通話",
"Open settings" : "開啟設定",
+ "Conversations" : "對話",
"Andorra" : "安道爾",
+ "United Arab Emirates" : "阿拉伯聯合大公國",
"Afghanistan" : "阿富汗",
"Antigua and Barbuda" : "安提瓜和巴布達",
"Anguilla" : "安圭拉",
@@ -44,6 +52,7 @@
"Austria" : "奧地利",
"Australia" : "澳大利亞",
"Aruba" : "阿路巴",
+ "Åland Islands" : "奧蘭群島",
"Azerbaijan" : "亞塞拜然",
"Bosnia and Herzegovina" : "波希尼亞及赫塞哥維那",
"Barbados" : "巴貝多",
@@ -54,6 +63,7 @@
"Bahrain" : "巴林",
"Burundi" : "蒲隆地",
"Benin" : "貝南",
+ "Saint Barthélemy" : "聖巴瑟米",
"Bermuda" : "百慕達",
"Brunei Darussalam" : "汶萊",
"Bonaire, Sint Eustatius and Saba" : "荷蘭加勒比區",
@@ -69,6 +79,7 @@
"Central African Republic" : "中非共和國",
"Congo" : "剛果",
"Switzerland" : "瑞士",
+ "Côte d'Ivoire" : "象牙海岸",
"Cook Islands" : "科克群島",
"Chile" : "智利",
"Cameroon" : "喀麥隆",
@@ -77,6 +88,7 @@
"Costa Rica" : "哥斯大黎加",
"Cuba" : "古巴",
"Cabo Verde" : "維德角共和國",
+ "Curaçao" : "古拉索",
"Christmas Island" : "聖誕島領地",
"Cyprus" : "塞浦路斯",
"Czechia" : "捷克",
@@ -89,6 +101,7 @@
"Ecuador" : "厄瓜多爾",
"Estonia" : "愛沙尼亞",
"Egypt" : "埃及",
+ "Western Sahara" : "西撒哈拉",
"Eritrea" : "厄利垂亞",
"Spain" : "西班牙",
"Ethiopia" : "衣索匹亞",
@@ -98,6 +111,7 @@
"Faroe Islands" : "法羅群島",
"France" : "法國",
"Gabon" : "加彭",
+ "United Kingdom of Great Britain and Northern Ireland" : "大不列顛暨北愛爾蘭聯合王國",
"Grenada" : "格瑞那達",
"Georgia" : "喬治亞",
"French Guiana" : "法屬圭亞那",
@@ -140,6 +154,7 @@
"Kiribati" : "基里巴斯共和國",
"Comoros" : "科摩羅",
"Saint Kitts and Nevis" : "聖克里斯多福及尼維斯",
+ "Korea, Republic of" : "韓國",
"Kuwait" : "科威特",
"Cayman Islands" : "開曼群島",
"Kazakhstan" : "哈薩克",
@@ -156,6 +171,7 @@
"Libya" : "利比亞",
"Morocco" : "摩洛哥",
"Monaco" : "摩納哥",
+ "Moldova, Republic of" : "摩爾多瓦共和國",
"Montenegro" : "蒙特內哥羅",
"Saint Martin (French part)" : "聖馬丁島(法國)",
"Madagascar" : "馬達加斯加",
@@ -203,6 +219,7 @@
"Palau" : "帕勞",
"Paraguay" : "巴拉圭",
"Qatar" : "卡達",
+ "Réunion" : "留尼旺",
"Romania" : "羅馬尼亞",
"Serbia" : "塞爾維亞",
"Russian Federation" : "俄羅斯",
@@ -227,21 +244,43 @@
"El Salvador" : "薩爾瓦多",
"Sint Maarten (Dutch part)" : "荷屬聖馬丁",
"Syrian Arab Republic" : "敘利亞",
+ "Eswatini" : "史瓦帝尼",
+ "Turks and Caicos Islands" : "土克凱可群島",
"Chad" : "查德",
"French Southern Territories" : "法屬南部和南極領地",
"Togo" : "多哥",
"Thailand" : "泰國",
"Tajikistan" : "塔吉克斯坦",
+ "Tokelau" : "托克勞",
"Timor-Leste" : "東帝汶",
+ "Turkmenistan" : "土庫曼",
+ "Tunisia" : "突尼西亞",
+ "Tonga" : "東加",
+ "Turkey" : "土耳其",
+ "Trinidad and Tobago" : "千里達及托巴哥",
+ "Tuvalu" : "吐瓦魯",
"Taiwan, Province of China" : "台灣,中華民國",
"Tanzania, United Republic of" : "坦尚尼亞",
+ "Ukraine" : "烏克蘭",
+ "Uganda" : "烏干達",
+ "United States Minor Outlying Islands" : "美國本土外小島嶼",
+ "United States of America" : "美利堅合眾國",
+ "Uruguay" : "烏拉圭",
+ "Uzbekistan" : "烏茲別克",
"Holy See" : "聖座",
"Saint Vincent and the Grenadines" : "聖文森及格瑞那丁",
+ "Viet Nam" : "越南",
+ "Vanuatu" : "萬那杜",
+ "Wallis and Futuna" : "瓦利斯和富圖那",
"Samoa" : "薩摩亞",
+ "Yemen" : "葉門",
"Mayotte" : "馬約特",
"South Africa" : "南非",
+ "Zambia" : "尚比亞",
+ "Zimbabwe" : "辛巴威",
"Invalid date, date format must be YYYY-MM-DD" : "無效的日期,需為 YYYY-MM-DD 格式",
"Leave call" : "離開通話",
+ "Request password" : "請求密碼",
"Limit to groups" : "限制給特定群組",
"Everyone" : "所有人",
"Save changes" : "儲存變更",
@@ -255,6 +294,7 @@
"Beta" : "Beta 測試版",
"Name" : "名稱",
"General settings" : "一般設定",
+ "All messages" : "所有訊息",
"Off" : "關閉",
"Language" : "語言",
"Country" : "國家",
@@ -267,49 +307,75 @@
"Expired" : "已過期",
"Validate SSL certificate" : "驗證 SSL憑證",
"Saved" : "儲存",
+ "OK" : "確定",
+ "Checking …" : "檢查中 ...",
"Copy link" : "複製連結",
"Waiting for others to join the call …" : "等待其他人加入通話...",
"Dismiss" : "取消",
+ "More actions" : "更多動作",
"Mute audio" : "靜音",
"Disable video" : "停用視訊",
"Grid view" : "網格檢視",
"Back" : "返回",
"You" : "您",
+ "Drop your files to upload" : "拖曳您的檔案以上傳",
"Favorite" : "我的最愛",
+ "Restricted" : "受限",
+ "Description" : "描述",
+ "Notifications" : "通知",
"Leave conversation" : "離開對話",
"Delete conversation" : "刪除對話",
+ "Allow guests" : "允許訪客",
"Password protection" : "密碼保護",
"Enter a password" : "輸入密碼",
+ "Enable lobby" : "啟用大廳",
"Save" : "儲存",
"Edit" : "編輯",
+ "More information" : "更多資訊",
"Delete" : "刪除",
"Password" : "密碼",
"API token" : "API token",
"Login" : "帳號",
"Nickname" : "暱稱",
"Client ID" : "客戶端ID",
+ "Calls" : "通話",
+ "Mark as read" : "標為已讀",
"Remove from favorites" : "取消我的最愛",
"Add to favorites" : "加到我的最愛",
+ "No matches" : "沒有符合的",
"Loading" : "載入中",
"Groups" : "群組",
+ "Circles" : "圈子",
"Create a new group conversation" : "建立新群組對話",
"Password protect" : "密碼防護",
+ "Add participants" : "新增成員",
"Close" : "關閉",
"Conversation name" : "對話名稱",
+ "Message sent" : "已傳送郵件",
"Reply" : "回覆",
+ "Contact" : "聯絡人",
"Today" : "今天",
"Yesterday" : "昨天",
+ "Record voice message" : "錄製語音訊息",
+ "Upload new files" : "上傳新檔案",
+ "Share from Files" : "從「檔案」分享",
"Send message" : "傳送訊息",
"File to share" : "要分享的檔案",
"Invalid path selected" : "所選的路徑無效",
"moderator" : "主持人",
"guest" : "訪客",
+ "Demote from moderator" : "取消主持人資格",
+ "Add users" : "新增使用者",
"Searching …" : "正在搜尋……",
"No results" : "沒有符合搜尋的項目",
"Add users or groups" : "增加使用者或者群組",
"Participants" : "參與者",
"Chat" : "聊天",
+ "Details" : "詳細資訊",
"Settings" : "設定",
+ "Projects" : "專案",
+ "Show all files" : "顯示全部檔案",
+ "Privacy" : "隱私",
"Keyboard shortcuts" : "快速鍵",
"Search" : "搜尋",
"Start call" : "通話",
@@ -317,7 +383,16 @@
"Send" : "傳送",
"Say hi to your friends and colleagues!" : "跟大家打招呼",
"Start a conversation" : "新對話",
+ "You were mentioned" : "您被提及",
"Join a conversation or start a new one" : "加入一個對話或者開一個新的",
+ "Media" : "多媒體",
+ "Files" : "檔案",
+ "Locations" : "地點",
+ "Audio" : "音樂",
+ "Other" : "其他",
+ "Do not disturb" : "請勿打擾",
+ "Away" : "外出",
+ "Error while sharing file" : "分享檔案時發生錯誤",
"Default" : "預設",
"The password is wrong. Try again." : "密碼錯誤,請重試",
"Android app" : "安卓應用",
diff --git a/lib/Capabilities.php b/lib/Capabilities.php
index 50dad5816..aa613833d 100644
--- a/lib/Capabilities.php
+++ b/lib/Capabilities.php
@@ -101,6 +101,7 @@ class Capabilities implements IPublicCapability {
'conversation-permissions',
'rich-object-list-media',
'rich-object-delete',
+ 'chat-permission',
],
'config' => [
'attachments' => [
diff --git a/lib/Chat/SystemMessage/Listener.php b/lib/Chat/SystemMessage/Listener.php
index 6190c1e48..e8a50724c 100644
--- a/lib/Chat/SystemMessage/Listener.php
+++ b/lib/Chat/SystemMessage/Listener.php
@@ -77,281 +77,307 @@ class Listener implements IEventListener {
}
public static function register(IEventDispatcher $dispatcher): void {
- $dispatcher->addListener(Room::EVENT_BEFORE_SESSION_JOIN_CALL, static function (ModifyParticipantEvent $event) {
- $room = $event->getRoom();
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- /** @var ParticipantService $participantService */
- $participantService = \OC::$server->get(ParticipantService::class);
+ $dispatcher->addListener(Room::EVENT_BEFORE_SESSION_JOIN_CALL, self::class . '::sendSystemMessageAboutBeginOfCall');
+ $dispatcher->addListener(Room::EVENT_AFTER_SESSION_LEAVE_CALL, self::class . '::sendSystemMessageAboutCallLeft');
+ $dispatcher->addListener(Room::EVENT_AFTER_ROOM_CREATE, self::class . '::sendSystemMessageAboutConversationCreated');
+ $dispatcher->addListener(Room::EVENT_AFTER_NAME_SET, self::class . '::sendSystemMessageAboutConversationRenamed');
+ $dispatcher->addListener(Room::EVENT_AFTER_DESCRIPTION_SET, self::class . '::sendSystemMessageAboutRoomDescriptionChanges');
+ $dispatcher->addListener(Room::EVENT_AFTER_PASSWORD_SET, self::class . '::sendSystemMessageAboutRoomPassword');
+ $dispatcher->addListener(Room::EVENT_AFTER_TYPE_SET, self::class . '::sendSystemGuestPermissionsMessage');
+ $dispatcher->addListener(Room::EVENT_AFTER_READONLY_SET, self::class . '::sendSystemReadOnlyMessage');
+ $dispatcher->addListener(Room::EVENT_AFTER_LISTABLE_SET, self::class . '::sendSystemListableMessage');
+ $dispatcher->addListener(Room::EVENT_AFTER_LOBBY_STATE_SET, self::class . '::sendSystemLobbyMessage');
+ $dispatcher->addListener(Room::EVENT_AFTER_USERS_ADD, self::class . '::addSystemMessageUserAdded');
+ $dispatcher->addListener(Room::EVENT_AFTER_USER_REMOVE, self::class . '::sendSystemMessageUserRemoved');
+ $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_TYPE_SET, self::class . '::sendSystemMessageAboutPromoteOrDemoteModerator');
+ $dispatcher->addListener('OCP\Share::postShare', self::class . '::fixMimeTypeOfVoiceMessage');
+ $dispatcher->addListener(RoomShareProvider::EVENT_SHARE_FILE_AGAIN, self::class . '::fixMimeTypeOfVoiceMessage');
+ }
- if ($participantService->hasActiveSessionsInCall($room)) {
- $listener->sendSystemMessage($room, 'call_joined', [], $event->getParticipant());
- } else {
- $listener->sendSystemMessage($room, 'call_started', [], $event->getParticipant());
- }
- });
- $dispatcher->addListener(Room::EVENT_AFTER_SESSION_LEAVE_CALL, static function (ModifyParticipantEvent $event) {
- if ($event instanceof ModifyEveryoneEvent) {
- // No individual system message if the call is ended for everyone
- return;
- }
+ public static function sendSystemMessageAboutBeginOfCall(ModifyParticipantEvent $event): void {
+ $room = $event->getRoom();
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
+ /** @var ParticipantService $participantService */
+ $participantService = \OC::$server->get(ParticipantService::class);
- if ($event->getNewValue() === $event->getOldValue()) {
- return;
- }
+ if ($participantService->hasActiveSessionsInCall($room)) {
+ $listener->sendSystemMessage($room, 'call_joined', [], $event->getParticipant());
+ } else {
+ $listener->sendSystemMessage($room, 'call_started', [], $event->getParticipant());
+ }
+ }
- $room = $event->getRoom();
+ public static function sendSystemMessageAboutCallLeft(ModifyParticipantEvent $event): void {
+ if ($event instanceof ModifyEveryoneEvent) {
+ // No individual system message if the call is ended for everyone
+ return;
+ }
- $session = $event->getParticipant()->getSession();
- if (!$session instanceof Session) {
- // This happens in case the user was kicked/lobbied
- return;
- }
+ if ($event->getNewValue() === $event->getOldValue()) {
+ return;
+ }
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
+ $room = $event->getRoom();
- $listener->sendSystemMessage($room, 'call_left', [], $event->getParticipant());
- });
+ $session = $event->getParticipant()->getSession();
+ if (!$session instanceof Session) {
+ // This happens in case the user was kicked/lobbied
+ return;
+ }
- $dispatcher->addListener(Room::EVENT_AFTER_ROOM_CREATE, static function (RoomEvent $event) {
- $room = $event->getRoom();
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
- $listener->sendSystemMessage($room, 'conversation_created');
- });
- $dispatcher->addListener(Room::EVENT_AFTER_NAME_SET, static function (ModifyRoomEvent $event) {
- if ($event->getOldValue() === '' ||
- $event->getNewValue() === '') {
- return;
- }
+ $listener->sendSystemMessage($room, 'call_left', [], $event->getParticipant());
+ }
- $room = $event->getRoom();
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
+ public static function sendSystemMessageAboutConversationCreated(RoomEvent $event): void {
+ $room = $event->getRoom();
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
+
+ $listener->sendSystemMessage($room, 'conversation_created');
+ }
- $listener->sendSystemMessage($room, 'conversation_renamed', [
- 'newName' => $event->getNewValue(),
- 'oldName' => $event->getOldValue(),
+ public static function sendSystemMessageAboutConversationRenamed(ModifyRoomEvent $event): void {
+ if ($event->getOldValue() === '' ||
+ $event->getNewValue() === '') {
+ return;
+ }
+
+ $room = $event->getRoom();
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
+
+ $listener->sendSystemMessage($room, 'conversation_renamed', [
+ 'newName' => $event->getNewValue(),
+ 'oldName' => $event->getOldValue(),
+ ]);
+ }
+
+ public static function sendSystemMessageAboutRoomDescriptionChanges(ModifyRoomEvent $event): void {
+ $room = $event->getRoom();
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
+
+ if ($event->getNewValue() !== '') {
+ $listener->sendSystemMessage($room, 'description_set', [
+ 'newDescription' => $event->getNewValue(),
]);
- });
- $dispatcher->addListener(Room::EVENT_AFTER_DESCRIPTION_SET, static function (ModifyRoomEvent $event) {
- $room = $event->getRoom();
+ } else {
+ $listener->sendSystemMessage($room, 'description_removed');
+ }
+ }
+
+ public static function sendSystemMessageAboutRoomPassword(ModifyRoomEvent $event): void {
+ $room = $event->getRoom();
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
+
+ if ($event->getNewValue() !== '') {
+ $listener->sendSystemMessage($room, 'password_set');
+ } else {
+ $listener->sendSystemMessage($room, 'password_removed');
+ }
+ }
+
+ public static function sendSystemGuestPermissionsMessage(ModifyRoomEvent $event): void {
+ $room = $event->getRoom();
+
+ if ($event->getOldValue() === Room::TYPE_ONE_TO_ONE) {
+ return;
+ }
+
+ if ($event->getNewValue() === Room::TYPE_PUBLIC) {
/** @var self $listener */
$listener = \OC::$server->get(self::class);
-
- if ($event->getNewValue() !== '') {
- $listener->sendSystemMessage($room, 'description_set', [
- 'newDescription' => $event->getNewValue(),
- ]);
- } else {
- $listener->sendSystemMessage($room, 'description_removed');
- }
- });
- $dispatcher->addListener(Room::EVENT_AFTER_PASSWORD_SET, static function (ModifyRoomEvent $event) {
- $room = $event->getRoom();
+ $listener->sendSystemMessage($room, 'guests_allowed');
+ } elseif ($event->getNewValue() === Room::TYPE_GROUP) {
/** @var self $listener */
$listener = \OC::$server->get(self::class);
+ $listener->sendSystemMessage($room, 'guests_disallowed');
+ }
+ }
- if ($event->getNewValue() !== '') {
- $listener->sendSystemMessage($room, 'password_set');
- } else {
- $listener->sendSystemMessage($room, 'password_removed');
- }
- });
- $dispatcher->addListener(Room::EVENT_AFTER_TYPE_SET, static function (ModifyRoomEvent $event) {
- $room = $event->getRoom();
+ public static function sendSystemReadOnlyMessage(ModifyRoomEvent $event): void {
+ $room = $event->getRoom();
- if ($event->getOldValue() === Room::TYPE_ONE_TO_ONE) {
- return;
- }
+ if ($room->getType() === Room::TYPE_CHANGELOG) {
+ return;
+ }
- if ($event->getNewValue() === Room::TYPE_PUBLIC) {
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- $listener->sendSystemMessage($room, 'guests_allowed');
- } elseif ($event->getNewValue() === Room::TYPE_GROUP) {
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- $listener->sendSystemMessage($room, 'guests_disallowed');
- }
- });
- $dispatcher->addListener(Room::EVENT_AFTER_READONLY_SET, static function (ModifyRoomEvent $event) {
- $room = $event->getRoom();
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
- if ($room->getType() === Room::TYPE_CHANGELOG) {
- return;
- }
+ if ($event->getNewValue() === Room::READ_ONLY) {
+ $listener->sendSystemMessage($room, 'read_only');
+ } elseif ($event->getNewValue() === Room::READ_WRITE) {
+ $listener->sendSystemMessage($room, 'read_only_off');
+ }
+ }
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
+ public static function sendSystemListableMessage(ModifyRoomEvent $event): void {
+ $room = $event->getRoom();
- if ($event->getNewValue() === Room::READ_ONLY) {
- $listener->sendSystemMessage($room, 'read_only');
- } elseif ($event->getNewValue() === Room::READ_WRITE) {
- $listener->sendSystemMessage($room, 'read_only_off');
- }
- });
- $dispatcher->addListener(Room::EVENT_AFTER_LISTABLE_SET, static function (ModifyRoomEvent $event) {
- $room = $event->getRoom();
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
+ if ($event->getNewValue() === Room::LISTABLE_NONE) {
+ $listener->sendSystemMessage($room, 'listable_none');
+ } elseif ($event->getNewValue() === Room::LISTABLE_USERS) {
+ $listener->sendSystemMessage($room, 'listable_users');
+ } elseif ($event->getNewValue() === Room::LISTABLE_ALL) {
+ $listener->sendSystemMessage($room, 'listable_all');
+ }
+ }
- if ($event->getNewValue() === Room::LISTABLE_NONE) {
- $listener->sendSystemMessage($room, 'listable_none');
- } elseif ($event->getNewValue() === Room::LISTABLE_USERS) {
- $listener->sendSystemMessage($room, 'listable_users');
- } elseif ($event->getNewValue() === Room::LISTABLE_ALL) {
- $listener->sendSystemMessage($room, 'listable_all');
- }
- });
- $dispatcher->addListener(Room::EVENT_AFTER_LOBBY_STATE_SET, static function (ModifyLobbyEvent $event) {
- if ($event->getNewValue() === $event->getOldValue()) {
- return;
- }
+ public static function sendSystemLobbyMessage(ModifyLobbyEvent $event): void {
+ if ($event->getNewValue() === $event->getOldValue()) {
+ return;
+ }
- $room = $event->getRoom();
+ $room = $event->getRoom();
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
- if ($event->isTimerReached()) {
- $listener->sendSystemMessage($room, 'lobby_timer_reached');
- } elseif ($event->getNewValue() === Webinary::LOBBY_NONE) {
- $listener->sendSystemMessage($room, 'lobby_none');
- } elseif ($event->getNewValue() === Webinary::LOBBY_NON_MODERATORS) {
- $listener->sendSystemMessage($room, 'lobby_non_moderators');
- }
- });
+ if ($event->isTimerReached()) {
+ $listener->sendSystemMessage($room, 'lobby_timer_reached');
+ } elseif ($event->getNewValue() === Webinary::LOBBY_NONE) {
+ $listener->sendSystemMessage($room, 'lobby_none');
+ } elseif ($event->getNewValue() === Webinary::LOBBY_NON_MODERATORS) {
+ $listener->sendSystemMessage($room, 'lobby_non_moderators');
+ }
+ }
- $dispatcher->addListener(Room::EVENT_AFTER_USERS_ADD, static function (AddParticipantsEvent $event) {
- $room = $event->getRoom();
- if ($room->getType() === Room::TYPE_ONE_TO_ONE) {
- return;
- }
+ public static function addSystemMessageUserAdded(AddParticipantsEvent $event): void {
+ $room = $event->getRoom();
+ if ($room->getType() === Room::TYPE_ONE_TO_ONE) {
+ return;
+ }
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
+
+ $participants = $event->getParticipants();
- $participants = $event->getParticipants();
-
- foreach ($participants as $participant) {
- if ($participant['actorType'] !== 'users') {
- continue;
- }
-
- $participantType = null;
- if (isset($participant['participantType'])) {
- $participantType = $participant['participantType'];
- }
-
- $userJoinedFileRoom = $room->getObjectType() === 'file' && $participantType !== Participant::USER_SELF_JOINED;
-
- // add a message "X joined the conversation", whenever user $userId:
- if (
- // - has joined a file room but not through a public link
- $userJoinedFileRoom
- // - has been added by another user (and not when creating a conversation)
- || $listener->getUserId() !== $participant['actorId']
- // - has joined a listable room on their own
- || $participantType === Participant::USER) {
- $comment = $listener->sendSystemMessage(
- $room,
- 'user_added',
- ['user' => $participant['actorId']],
- null,
- $event->shouldSkipLastMessageUpdate()
- );
-
- $event->setLastMessage($comment);
- }
+ foreach ($participants as $participant) {
+ if ($participant['actorType'] !== 'users') {
+ continue;
}
- });
- $dispatcher->addListener(Room::EVENT_AFTER_USER_REMOVE, static function (RemoveUserEvent $event) {
- $room = $event->getRoom();
- if ($room->getType() === Room::TYPE_ONE_TO_ONE) {
- return;
+ $participantType = null;
+ if (isset($participant['participantType'])) {
+ $participantType = $participant['participantType'];
}
- if ($event->getReason() === Room::PARTICIPANT_LEFT
- && $event->getParticipant()->getAttendee()->getParticipantType() === Participant::USER_SELF_JOINED) {
- // Self-joined user closes the tab/window or leaves via the menu
- return;
+ $userJoinedFileRoom = $room->getObjectType() === 'file' && $participantType !== Participant::USER_SELF_JOINED;
+
+ // add a message "X joined the conversation", whenever user $userId:
+ if (
+ // - has joined a file room but not through a public link
+ $userJoinedFileRoom
+ // - has been added by another user (and not when creating a conversation)
+ || $listener->getUserId() !== $participant['actorId']
+ // - has joined a listable room on their own
+ || $participantType === Participant::USER) {
+ $comment = $listener->sendSystemMessage(
+ $room,
+ 'user_added',
+ ['user' => $participant['actorId']],
+ null,
+ $event->shouldSkipLastMessageUpdate()
+ );
+
+ $event->setLastMessage($comment);
}
+ }
+ }
+
+ public static function sendSystemMessageUserRemoved(RemoveUserEvent $event): void {
+ $room = $event->getRoom();
+ if ($room->getType() === Room::TYPE_ONE_TO_ONE) {
+ return;
+ }
+
+ if ($event->getReason() === Room::PARTICIPANT_LEFT
+ && $event->getParticipant()->getAttendee()->getParticipantType() === Participant::USER_SELF_JOINED) {
+ // Self-joined user closes the tab/window or leaves via the menu
+ return;
+ }
+
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
+ $listener->sendSystemMessage($room, 'user_removed', ['user' => $event->getUser()->getUID()]);
+ }
+
+ public static function sendSystemMessageAboutPromoteOrDemoteModerator(ModifyParticipantEvent $event): void {
+ $room = $event->getRoom();
+ $attendee = $event->getParticipant()->getAttendee();
+
+ if ($attendee->getActorType() !== Attendee::ACTOR_USERS && $attendee->getActorType() !== Attendee::ACTOR_GUESTS) {
+ return;
+ }
+
+ if ($event->getNewValue() === Participant::MODERATOR) {
/** @var self $listener */
$listener = \OC::$server->get(self::class);
- $listener->sendSystemMessage($room, 'user_removed', ['user' => $event->getUser()->getUID()]);
- });
- $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_TYPE_SET, static function (ModifyParticipantEvent $event) {
- $room = $event->getRoom();
- $attendee = $event->getParticipant()->getAttendee();
-
- if ($attendee->getActorType() !== Attendee::ACTOR_USERS && $attendee->getActorType() !== Attendee::ACTOR_GUESTS) {
- return;
- }
-
- if ($event->getNewValue() === Participant::MODERATOR) {
+ $listener->sendSystemMessage($room, 'moderator_promoted', ['user' => $attendee->getActorId()]);
+ } elseif ($event->getNewValue() === Participant::USER) {
+ if ($event->getOldValue() === Participant::USER_SELF_JOINED) {
/** @var self $listener */
$listener = \OC::$server->get(self::class);
- $listener->sendSystemMessage($room, 'moderator_promoted', ['user' => $attendee->getActorId()]);
- } elseif ($event->getNewValue() === Participant::USER) {
- if ($event->getOldValue() === Participant::USER_SELF_JOINED) {
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- $listener->sendSystemMessage($room, 'user_added', ['user' => $attendee->getActorId()]);
- } else {
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- $listener->sendSystemMessage($room, 'moderator_demoted', ['user' => $attendee->getActorId()]);
- }
- } elseif ($event->getNewValue() === Participant::GUEST_MODERATOR) {
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- $listener->sendSystemMessage($room, 'guest_moderator_promoted', ['session' => $attendee->getActorId()]);
- } elseif ($event->getNewValue() === Participant::GUEST) {
+ $listener->sendSystemMessage($room, 'user_added', ['user' => $attendee->getActorId()]);
+ } else {
/** @var self $listener */
$listener = \OC::$server->get(self::class);
- $listener->sendSystemMessage($room, 'guest_moderator_demoted', ['session' => $attendee->getActorId()]);
+ $listener->sendSystemMessage($room, 'moderator_demoted', ['user' => $attendee->getActorId()]);
}
- });
- $listener = function (GenericEvent $event): void {
- /** @var IShare $share */
- $share = $event->getSubject();
-
- if ($share->getShareType() !== IShare::TYPE_ROOM) {
- return;
- }
-
+ } elseif ($event->getNewValue() === Participant::GUEST_MODERATOR) {
/** @var self $listener */
$listener = \OC::$server->get(self::class);
+ $listener->sendSystemMessage($room, 'guest_moderator_promoted', ['session' => $attendee->getActorId()]);
+ } elseif ($event->getNewValue() === Participant::GUEST) {
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
+ $listener->sendSystemMessage($room, 'guest_moderator_demoted', ['session' => $attendee->getActorId()]);
+ }
+ }
- /** @var Manager $manager */
- $manager = \OC::$server->get(Manager::class);
+ /**
+ * @param GenericEvent|Event $event
+ * @return void
+ */
+ public static function fixMimeTypeOfVoiceMessage($event): void {
+ /** @var IShare $share */
+ $share = $event->getSubject();
- $room = $manager->getRoomByToken($share->getSharedWith());
- $metaData = \OC::$server->getRequest()->getParam('talkMetaData') ?? '';
- $metaData = json_decode($metaData, true);
- $metaData = is_array($metaData) ? $metaData : [];
+ if ($share->getShareType() !== IShare::TYPE_ROOM) {
+ return;
+ }
+
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
+
+ /** @var Manager $manager */
+ $manager = \OC::$server->get(Manager::class);
- if (isset($metaData['messageType']) && $metaData['messageType'] === 'voice-message') {
- if ($share->getNode()->getMimeType() !== 'audio/mpeg'
- && $share->getNode()->getMimeType() !== 'audio/wav') {
- unset($metaData['messageType']);
- }
+ $room = $manager->getRoomByToken($share->getSharedWith());
+ $metaData = \OC::$server->getRequest()->getParam('talkMetaData') ?? '';
+ $metaData = json_decode($metaData, true);
+ $metaData = is_array($metaData) ? $metaData : [];
+
+ if (isset($metaData['messageType']) && $metaData['messageType'] === 'voice-message') {
+ if ($share->getNode()->getMimeType() !== 'audio/mpeg'
+ && $share->getNode()->getMimeType() !== 'audio/wav') {
+ unset($metaData['messageType']);
}
- $metaData['mimeType'] = $share->getNode()->getMimeType();
-
- $listener->sendSystemMessage($room, 'file_shared', ['share' => $share->getId(), 'metaData' => $metaData]);
- };
- /**
- * @psalm-suppress UndefinedClass
- */
- $dispatcher->addListener('OCP\Share::postShare', $listener);
- $dispatcher->addListener(RoomShareProvider::class . '::' . 'share_file_again', $listener);
+ }
+ $metaData['mimeType'] = $share->getNode()->getMimeType();
+
+ $listener->sendSystemMessage($room, 'file_shared', ['share' => $share->getId(), 'metaData' => $metaData]);
}
public function handle(Event $event): void {
diff --git a/lib/Collaboration/Collaborators/RoomPlugin.php b/lib/Collaboration/Collaborators/RoomPlugin.php
index ea9e92d8e..cc03429fe 100644
--- a/lib/Collaboration/Collaborators/RoomPlugin.php
+++ b/lib/Collaboration/Collaborators/RoomPlugin.php
@@ -25,6 +25,8 @@ declare(strict_types=1);
namespace OCA\Talk\Collaboration\Collaborators;
use OCA\Talk\Manager;
+use OCA\Talk\Model\Attendee;
+use OCA\Talk\Participant;
use OCA\Talk\Room;
use OCP\Collaboration\Collaborators\ISearchPlugin;
use OCP\Collaboration\Collaborators\ISearchResult;
@@ -62,6 +64,12 @@ class RoomPlugin implements ISearchPlugin {
continue;
}
+ $participant = $room->getParticipant($userId, false);
+ if (!$participant instanceof Participant || !($participant->getPermissions() & Attendee::PERMISSIONS_CHAT)) {
+ // No chat permissions is like read-only
+ continue;
+ }
+
if (stripos($room->getDisplayName($userId), $search) !== false) {
$item = $this->roomToSearchResultItem($room, $userId);
diff --git a/lib/Command/ActiveCalls.php b/lib/Command/ActiveCalls.php
index a4ddf508d..48d75c15a 100644
--- a/lib/Command/ActiveCalls.php
+++ b/lib/Command/ActiveCalls.php
@@ -39,9 +39,11 @@ class ActiveCalls extends Base {
}
protected function configure(): void {
+ parent::configure();
+
$this
->setName('talk:active-calls')
- ->setDescription('Allows you to check if calls are currently in process');
+ ->setDescription('Allows you to check if calls are currently in process') ;
}
protected function execute(InputInterface $input, OutputInterface $output): int {
@@ -56,7 +58,12 @@ class ActiveCalls extends Base {
$result->closeCursor();
if ($numCalls === 0) {
- $output->writeln('<info>No calls in progress</info>');
+ if ($input->getOption('output') === 'plain') {
+ $output->writeln('<info>No calls in progress</info>');
+ } else {
+ $data = ['calls' => 0, 'participants' => 0];
+ $this->writeArrayInOutputFormat($input, $output, $data);
+ }
return 0;
}
@@ -70,7 +77,13 @@ class ActiveCalls extends Base {
$numParticipants = (int) $result->fetchColumn();
$result->closeCursor();
- $output->writeln(sprintf('<error>There are currently %1$d calls in progress with %2$d participants</error>', $numCalls, $numParticipants));
+
+ if ($input->getOption('output') === 'plain') {
+ $output->writeln(sprintf('<error>There are currently %1$d calls in progress with %2$d participants</error>', $numCalls, $numParticipants));
+ } else {
+ $data = ['calls' => $numCalls, 'participants' => $numParticipants];
+ $this->writeArrayInOutputFormat($input, $output, $data);
+ }
return 1;
}
}
diff --git a/lib/Controller/ChatController.php b/lib/Controller/ChatController.php
index da4acde02..8e508d0b0 100644
--- a/lib/Controller/ChatController.php
+++ b/lib/Controller/ChatController.php
@@ -180,6 +180,7 @@ class ChatController extends AEnvironmentAwareController {
* @PublicPage
* @RequireParticipant
* @RequireReadWriteConversation
+ * @RequirePermissions(permissions=chat)
* @RequireModeratorOrNoLobby
*
* Sends a new chat message to the given room.
@@ -235,6 +236,7 @@ class ChatController extends AEnvironmentAwareController {
* @PublicPage
* @RequireParticipant
* @RequireReadWriteConversation
+ * @RequirePermissions(permissions=chat)
* @RequireModeratorOrNoLobby
*
* Sends a rich-object to the given room.
@@ -423,8 +425,8 @@ class ChatController extends AEnvironmentAwareController {
// As per "section 10.3.5 of RFC 2616" entity headers shall be
// stripped out on 304: https://stackoverflow.com/a/17822709
$response->setStatus(Http::STATUS_OK);
+ $response->addHeader('X-Chat-Last-Common-Read', $newLastCommonRead);
}
- $response->addHeader('X-Chat-Last-Common-Read', $newLastCommonRead);
}
return $response;
}
@@ -554,7 +556,7 @@ class ChatController extends AEnvironmentAwareController {
// Inject the reactions self into the $messages array
foreach ($reactionsById as $messageId => $reactions) {
- if (isset($messages[$commentIdToIndex[$messageId]])) {
+ if (isset($commentIdToIndex[$messageId]) && isset($messages[$commentIdToIndex[$messageId]])) {
$messages[$commentIdToIndex[$messageId]]['reactionsSelf'] = $reactions;
}
@@ -575,6 +577,7 @@ class ChatController extends AEnvironmentAwareController {
* @NoAdminRequired
* @RequireParticipant
* @RequireReadWriteConversation
+ * @RequirePermissions(permissions=chat)
* @RequireModeratorOrNoLobby
*
* @param int $messageId
@@ -725,7 +728,6 @@ class ChatController extends AEnvironmentAwareController {
/**
* @PublicPage
* @RequireParticipant
- * @RequireReadWriteConversation
* @RequireModeratorOrNoLobby
*
* @param int $limit
@@ -778,7 +780,6 @@ class ChatController extends AEnvironmentAwareController {
/**
* @PublicPage
* @RequireParticipant
- * @RequireReadWriteConversation
* @RequireModeratorOrNoLobby
*
* @param string $objectType
@@ -827,6 +828,7 @@ class ChatController extends AEnvironmentAwareController {
* @PublicPage
* @RequireParticipant
* @RequireReadWriteConversation
+ * @RequirePermissions(permissions=chat)
* @RequireModeratorOrNoLobby
*
* @param string $search
diff --git a/lib/Controller/ReactionController.php b/lib/Controller/ReactionController.php
index d55be4dbc..d99553914 100644
--- a/lib/Controller/ReactionController.php
+++ b/lib/Controller/ReactionController.php
@@ -45,9 +45,10 @@ class ReactionController extends AEnvironmentAwareController {
}
/**
- * @NoAdminRequired
+ * @PublicPage
* @RequireParticipant
* @RequireReadWriteConversation
+ * @RequirePermissions(permissions=chat)
* @RequireModeratorOrNoLobby
*
* @param int $messageId for reaction
@@ -75,9 +76,10 @@ class ReactionController extends AEnvironmentAwareController {
}
/**
- * @NoAdminRequired
+ * @PublicPage
* @RequireParticipant
* @RequireReadWriteConversation
+ * @RequirePermissions(permissions=chat)
* @RequireModeratorOrNoLobby
*
* @param int $messageId for reaction
@@ -103,9 +105,8 @@ class ReactionController extends AEnvironmentAwareController {
}
/**
- * @NoAdminRequired
+ * @PublicPage
* @RequireParticipant
- * @RequireReadWriteConversation
* @RequireModeratorOrNoLobby
*
* @param int $messageId for reaction
diff --git a/lib/Events/AlreadySharedEvent.php b/lib/Events/AlreadySharedEvent.php
new file mode 100644
index 000000000..665e65a03
--- /dev/null
+++ b/lib/Events/AlreadySharedEvent.php
@@ -0,0 +1,45 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2022, Vitor Mattos <vitor@php.rio>
+ *
+ * @author Vitor Mattos <vitor@php.rio>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\Talk\Events;
+
+use OCP\EventDispatcher\Event;
+
+class AlreadySharedEvent extends Event {
+ private $subject;
+ public function __construct($subject = null) {
+ $this->subject = $subject;
+ }
+
+ /**
+ * Getter for subject property.
+ *
+ * @return mixed
+ */
+ public function getSubject() {
+ return $this->subject;
+ }
+}
diff --git a/lib/Exceptions/PermissionsException.php b/lib/Exceptions/PermissionsException.php
new file mode 100644
index 000000000..3677eb0d0
--- /dev/null
+++ b/lib/Exceptions/PermissionsException.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2020 Julien Veyssier <eneiluj@posteo.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\Talk\Exceptions;
+
+class PermissionsException extends \Exception {
+}
diff --git a/lib/Listener/RestrictStartingCalls.php b/lib/Listener/RestrictStartingCalls.php
index ed041ef0c..59e95639c 100644
--- a/lib/Listener/RestrictStartingCalls.php
+++ b/lib/Listener/RestrictStartingCalls.php
@@ -42,18 +42,16 @@ class RestrictStartingCalls {
}
public static function register(IEventDispatcher $dispatcher): void {
- $dispatcher->addListener(Room::EVENT_BEFORE_SESSION_JOIN_CALL, static function (ModifyParticipantEvent $event) {
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- $listener->checkStartCallPermissions($event);
- }, 1000);
+ $dispatcher->addListener(Room::EVENT_BEFORE_SESSION_JOIN_CALL, [self::class, 'checkStartCallPermissions'], 1000);
}
/**
* @param ModifyParticipantEvent $event
* @throws ForbiddenException
*/
- public function checkStartCallPermissions(ModifyParticipantEvent $event): void {
+ public static function checkStartCallPermissions(ModifyParticipantEvent $event): void {
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
$room = $event->getRoom();
$participant = $event->getParticipant();
@@ -63,7 +61,7 @@ class RestrictStartingCalls {
return;
}
- if (!$participant->canStartCall($this->config) && !$this->participantService->hasActiveSessionsInCall($room)) {
+ if (!$participant->canStartCall($listener->config) && !$listener->participantService->hasActiveSessionsInCall($room)) {
throw new ForbiddenException('Can not start a call');
}
}
diff --git a/lib/Middleware/InjectionMiddleware.php b/lib/Middleware/InjectionMiddleware.php
index 18d98b1ac..0671aac8c 100644
--- a/lib/Middleware/InjectionMiddleware.php
+++ b/lib/Middleware/InjectionMiddleware.php
@@ -25,6 +25,7 @@ namespace OCA\Talk\Middleware;
use OCA\Talk\Controller\AEnvironmentAwareController;
use OCA\Talk\Exceptions\ParticipantNotFoundException;
+use OCA\Talk\Exceptions\PermissionsException;
use OCA\Talk\Exceptions\RoomNotFoundException;
use OCA\Talk\Manager;
use OCA\Talk\Middleware\Exceptions\LobbyException;
@@ -108,6 +109,11 @@ class InjectionMiddleware extends Middleware {
if ($this->reflector->hasAnnotation('RequireModeratorOrNoLobby')) {
$this->checkLobbyState($controller);
}
+
+ $requiredPermissions = $this->reflector->getAnnotationParameter('RequirePermissions', 'permissions');
+ if ($requiredPermissions) {
+ $this->checkPermissions($controller, $requiredPermissions);
+ }
}
/**
@@ -190,6 +196,24 @@ class InjectionMiddleware extends Middleware {
/**
* @param AEnvironmentAwareController $controller
+ * @throws PermissionsException
+ */
+ protected function checkPermissions(AEnvironmentAwareController $controller, string $permissions): void {
+ $textPermissions = explode(',', $permissions);
+ $participant = $controller->getParticipant();
+ if (!$participant instanceof Participant) {
+ throw new PermissionsException();
+ }
+
+ foreach ($textPermissions as $textPermission) {
+ if ($textPermission === 'chat' && !($participant->getPermissions() & Attendee::PERMISSIONS_CHAT)) {
+ throw new PermissionsException();
+ }
+ }
+ }
+
+ /**
+ * @param AEnvironmentAwareController $controller
* @throws LobbyException
*/
protected function checkLobbyState(AEnvironmentAwareController $controller): void {
@@ -238,7 +262,8 @@ class InjectionMiddleware extends Middleware {
}
if ($exception instanceof NotAModeratorException ||
- $exception instanceof ReadOnlyException) {
+ $exception instanceof ReadOnlyException ||
+ $exception instanceof PermissionsException) {
if ($controller instanceof OCSController) {
throw new OCSException('', Http::STATUS_FORBIDDEN);
}
diff --git a/lib/Migration/Version14000Date20220330141646.php b/lib/Migration/Version14000Date20220330141647.php
index 4277b878d..61681dffd 100644
--- a/lib/Migration/Version14000Date20220330141646.php
+++ b/lib/Migration/Version14000Date20220330141647.php
@@ -34,7 +34,7 @@ use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
-class Version14000Date20220330141646 extends SimpleMigrationStep {
+class Version14000Date20220330141647 extends SimpleMigrationStep {
protected IDBConnection $connection;
public function __construct(IDBConnection $connection) {
@@ -97,7 +97,9 @@ class Version14000Date20220330141646 extends SimpleMigrationStep {
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
- // FIXME need to loop over all chat messages :(
+ $sql = $this->connection->getDatabasePlatform()
+ ->getTruncateTableSQL('`*PREFIX*talk_attachments`');
+ $this->connection->executeQuery($sql);
$insert = $this->connection->getQueryBuilder();
$insert->insert('talk_attachments')
@@ -129,7 +131,7 @@ class Version14000Date20220330141646 extends SimpleMigrationStep {
protected function chunkedWriting(IQueryBuilder $insert, IQueryBuilder $select, int $offset): int {
$select->setParameter('offset', $offset);
- $attachments = [];
+ $attachments = $sharesWithoutMimetype = [];
$result = $select->executeQuery();
while ($row = $result->fetch()) {
$attachment = [
@@ -166,11 +168,14 @@ class Version14000Date20220330141646 extends SimpleMigrationStep {
} elseif (str_starts_with($mimetype, 'image/') || str_starts_with($mimetype, 'video/')) {
$attachment['object_type'] = Attachment::TYPE_MEDIA;
} else {
+ if ($mimetype === '' && isset($parameters['share'])) {
+ $sharesWithoutMimetype[(int) $parameters['share']] = (int) $row['id'];
+ }
$attachment['object_type'] = Attachment::TYPE_FILE;
}
}
- $attachments[] = $attachment;
+ $attachments[(int) $row['id']] = $attachment;
}
$result->closeCursor();
@@ -178,6 +183,19 @@ class Version14000Date20220330141646 extends SimpleMigrationStep {
return 0;
}
+ $mimetypes = $this->getMimetypeFromFileCache(array_keys($sharesWithoutMimetype));
+ foreach ($mimetypes as $shareId => $mimetype) {
+ if (!isset($attachments[$sharesWithoutMimetype[$shareId]])) {
+ continue;
+ }
+
+ if (str_starts_with($mimetype, 'audio/')) {
+ $attachments[$sharesWithoutMimetype[$shareId]]['object_type'] = Attachment::TYPE_AUDIO;
+ } elseif (str_starts_with($mimetype, 'image/') || str_starts_with($mimetype, 'video/')) {
+ $attachments[$sharesWithoutMimetype[$shareId]]['object_type'] = Attachment::TYPE_MEDIA;
+ }
+ }
+
$this->connection->beginTransaction();
foreach ($attachments as $attachment) {
$insert
@@ -195,4 +213,22 @@ class Version14000Date20220330141646 extends SimpleMigrationStep {
return end($attachments)['message_id'];
}
+
+ protected function getMimetypeFromFileCache(array $shareIds): array {
+ $mimetype = [];
+
+ $query = $this->connection->getQueryBuilder();
+ $query->select('s.id', 'm.mimetype')
+ ->from('share', 's')
+ ->leftJoin('s', 'filecache', 'f', $query->expr()->eq('s.file_source', 'f.fileid'))
+ ->leftJoin('f', 'mimetypes', 'm', $query->expr()->eq('f.mimetype', 'm.id'))
+ ->where($query->expr()->in('s.id', $query->createNamedParameter($shareIds, IQueryBuilder::PARAM_INT_ARRAY)));
+ $result = $query->executeQuery();
+ while ($row = $result->fetch()) {
+ $mimetype[$row['id']] = $row['mimetype'];
+ }
+ $result->closeCursor();
+
+ return $mimetype;
+ }
}
diff --git a/lib/Migration/Version15000Date20220427183026.php b/lib/Migration/Version15000Date20220427183026.php
new file mode 100644
index 000000000..37c0d3a50
--- /dev/null
+++ b/lib/Migration/Version15000Date20220427183026.php
@@ -0,0 +1,113 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Talk\Migration;
+
+use Closure;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\SimpleMigrationStep;
+
+class Version15000Date20220427183026 extends SimpleMigrationStep {
+ protected IDBConnection $connection;
+
+ public function __construct(IDBConnection $connection) {
+ $this->connection = $connection;
+ }
+
+ /**
+ * Update existing permissions by adding the chat permissions when set to none default
+ *
+ * @param IOutput $output
+ * @param Closure $schemaClosure The `\Closure` returns a `\OCP\DB\ISchemaWrapper`
+ * @param array $options
+ */
+ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
+ $update = $this->connection->getQueryBuilder();
+ $update->update('talk_rooms')
+ ->set('default_permissions', $update->func()->add(
+ 'default_permissions',
+ $update->createNamedParameter(128, IQueryBuilder::PARAM_INT) // Attendee::PERMISSION_CHAT
+ ))
+ ->where($update->expr()->neq('default_permissions', $update->createNamedParameter(0, IQueryBuilder::PARAM_INT))) // Attendee::PERMISSIONS_DEFAULT
+ ->andWhere(
+ $update->expr()->neq(
+ $update->expr()->castColumn(
+ $update->expr()->bitwiseAnd(
+ 'default_permissions',
+ 128 // Attendee::PERMISSION_CHAT
+ ),
+ IQueryBuilder::PARAM_INT
+ ),
+ $update->createNamedParameter(128, IQueryBuilder::PARAM_INT) // Attendee::PERMISSION_CHAT
+ )
+ );
+ $update->executeStatement();
+
+ $update = $this->connection->getQueryBuilder();
+ $update->update('talk_rooms')
+ ->set('call_permissions', $update->func()->add(
+ 'call_permissions',
+ $update->createNamedParameter(128, IQueryBuilder::PARAM_INT) // Attendee::PERMISSION_CHAT
+ ))
+ ->where($update->expr()->neq('call_permissions', $update->createNamedParameter(0, IQueryBuilder::PARAM_INT))) // Attendee::PERMISSIONS_DEFAULT
+ ->andWhere(
+ $update->expr()->neq(
+ $update->expr()->castColumn(
+ $update->expr()->bitwiseAnd(
+ 'call_permissions',
+ 128 // Attendee::PERMISSION_CHAT
+ ),
+ IQueryBuilder::PARAM_INT
+ ),
+ $update->createNamedParameter(128, IQueryBuilder::PARAM_INT) // Attendee::PERMISSION_CHAT
+ )
+ );
+ $update->executeStatement();
+
+ $update = $this->connection->getQueryBuilder();
+ $update->update('talk_attendees')
+ ->set('permissions', $update->func()->add(
+ 'permissions',
+ $update->createNamedParameter(128, IQueryBuilder::PARAM_INT) // Attendee::PERMISSION_CHAT
+ ))
+ ->where($update->expr()->neq('permissions', $update->createNamedParameter(0, IQueryBuilder::PARAM_INT))) // Attendee::PERMISSIONS_DEFAULT
+ ->andWhere(
+ $update->expr()->neq(
+ $update->expr()->castColumn(
+ $update->expr()->bitwiseAnd(
+ 'permissions',
+ 128 // Attendee::PERMISSION_CHAT
+ ),
+ IQueryBuilder::PARAM_INT
+ ),
+ $update->createNamedParameter(128, IQueryBuilder::PARAM_INT) // Attendee::PERMISSION_CHAT
+ )
+ );
+ $update->executeStatement();
+ }
+}
diff --git a/lib/Model/Attendee.php b/lib/Model/Attendee.php
index 32c03f666..cabda580f 100644
--- a/lib/Model/Attendee.php
+++ b/lib/Model/Attendee.php
@@ -78,6 +78,7 @@ class Attendee extends Entity {
public const PERMISSIONS_PUBLISH_AUDIO = 16;
public const PERMISSIONS_PUBLISH_VIDEO = 32;
public const PERMISSIONS_PUBLISH_SCREEN = 64;
+ public const PERMISSIONS_CHAT = 128;
public const PERMISSIONS_MAX_DEFAULT = // Max int (when all permissions are granted as default)
self::PERMISSIONS_CALL_START
| self::PERMISSIONS_CALL_JOIN
@@ -85,6 +86,7 @@ class Attendee extends Entity {
| self::PERMISSIONS_PUBLISH_AUDIO
| self::PERMISSIONS_PUBLISH_VIDEO
| self::PERMISSIONS_PUBLISH_SCREEN
+ | self::PERMISSIONS_CHAT
;
public const PERMISSIONS_MAX_CUSTOM = self::PERMISSIONS_MAX_DEFAULT | self::PERMISSIONS_CUSTOM; // Max int (when all permissions are granted as custom)
diff --git a/lib/Share/RoomShareProvider.php b/lib/Share/RoomShareProvider.php
index 28dbfef15..24b1aa82d 100644
--- a/lib/Share/RoomShareProvider.php
+++ b/lib/Share/RoomShareProvider.php
@@ -29,11 +29,12 @@ declare(strict_types=1);
namespace OCA\Talk\Share;
use OC\Files\Cache\Cache;
+use OCA\Talk\Events\AlreadySharedEvent;
use OCA\Talk\Events\RoomEvent;
use OCA\Talk\Exceptions\ParticipantNotFoundException;
use OCA\Talk\Exceptions\RoomNotFoundException;
use OCA\Talk\Manager;
-use OCA\Talk\Participant;
+use OCA\Talk\Model\Attendee;
use OCA\Talk\Room;
use OCA\Talk\Service\ParticipantService;
use OCP\AppFramework\Utility\ITimeFactory;
@@ -50,8 +51,6 @@ use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager as IShareManager;
use OCP\Share\IShare;
use OCP\Share\IShareProvider;
-use Symfony\Component\EventDispatcher\EventDispatcherInterface;
-use Symfony\Component\EventDispatcher\GenericEvent;
/**
* Share provider for room shares.
@@ -71,10 +70,12 @@ class RoomShareProvider implements IShareProvider {
public const TALK_FOLDER = '/Talk';
public const TALK_FOLDER_PLACEHOLDER = '/{TALK_PLACEHOLDER}';
+ public const EVENT_SHARE_FILE_AGAIN = self::class . '::shareFileAgain';
+
private IDBConnection $dbConnection;
private ISecureRandom $secureRandom;
private IShareManager $shareManager;
- private EventDispatcherInterface $dispatcher;
+ private IEventDispatcher $dispatcher;
private Manager $manager;
private ParticipantService $participantService;
protected ITimeFactory $timeFactory;
@@ -85,7 +86,7 @@ class RoomShareProvider implements IShareProvider {
IDBConnection $connection,
ISecureRandom $secureRandom,
IShareManager $shareManager,
- EventDispatcherInterface $dispatcher,
+ IEventDispatcher $dispatcher,
Manager $manager,
ParticipantService $participantService,
ITimeFactory $timeFactory,
@@ -142,18 +143,23 @@ class RoomShareProvider implements IShareProvider {
}
try {
- $room->getParticipant($share->getSharedBy(), false);
+ $participant = $room->getParticipant($share->getSharedBy(), false);
} catch (ParticipantNotFoundException $e) {
// If the sharer is not a participant of the room even if the room
// exists the error is still "Room not found".
throw new GenericShareException('Room not found', $this->l->t('Conversation not found'), 404);
}
+ if (!($participant->getPermissions() & Attendee::PERMISSIONS_CHAT)) {
+ // No chat permissions is like read-only
+ throw new GenericShareException('Room not found', $this->l->t('Conversation not found'), 404);
+ }
+
$existingShares = $this->getSharesByPath($share->getNode());
foreach ($existingShares as $existingShare) {
if ($existingShare->getSharedWith() === $share->getSharedWith()) {
// FIXME Should be moved away from GenericEvent as soon as OCP\Share20\IManager did move too
- $this->dispatcher->dispatch(self::class . '::' . 'share_file_again', new GenericEvent($existingShare));
+ $this->dispatcher->dispatch(self::EVENT_SHARE_FILE_AGAIN, new AlreadySharedEvent($existingShare));
throw new GenericShareException('Already shared', $this->l->t('Path is already shared with this room'), 403);
}
}
diff --git a/lib/Signaling/Listener.php b/lib/Signaling/Listener.php
index 26af22371..899932108 100644
--- a/lib/Signaling/Listener.php
+++ b/lib/Signaling/Listener.php
@@ -54,312 +54,315 @@ class Listener {
}
protected static function registerInternalSignaling(IEventDispatcher $dispatcher): void {
- $listener = static function (RoomEvent $event): void {
- if (!self::isUsingInternalSignaling()) {
- return;
- }
+ $dispatcher->addListener(Room::EVENT_AFTER_ROOM_CONNECT, [self::class, 'refreshParticipantListUsingRoomEvent']);
+ $dispatcher->addListener(Room::EVENT_AFTER_GUEST_CONNECT, [self::class, 'refreshParticipantListUsingRoomEvent']);
+ $dispatcher->addListener(Room::EVENT_AFTER_SESSION_JOIN_CALL, [self::class, 'refreshParticipantListUsingRoomEvent']);
+ $dispatcher->addListener(Room::EVENT_AFTER_SESSION_UPDATE_CALL_FLAGS, [self::class, 'refreshParticipantListUsingRoomEvent']);
+ $dispatcher->addListener(Room::EVENT_AFTER_SESSION_LEAVE_CALL, [self::class, 'refreshParticipantListUsingRoomEvent']);
+ $dispatcher->addListener(Room::EVENT_AFTER_PERMISSIONS_SET, [self::class, 'refreshParticipantListUsingRoomEvent']);
+ $dispatcher->addListener(GuestManager::EVENT_AFTER_NAME_UPDATE, [self::class, 'refreshParticipantListUsingRoomEvent']);
+ $dispatcher->addListener(Room::EVENT_BEFORE_ROOM_DELETE, [self::class, 'refreshParticipantListUsingRoomEvent']);
+
+ $dispatcher->addListener(Room::EVENT_BEFORE_USER_REMOVE, [self::class, 'refreshParticipantListUsingParticipantEvent']);
+ $dispatcher->addListener(Room::EVENT_BEFORE_PARTICIPANT_REMOVE, [self::class, 'refreshParticipantListUsingParticipantEvent']);
+ $dispatcher->addListener(Room::EVENT_BEFORE_ROOM_DISCONNECT, [self::class, 'refreshParticipantListUsingParticipantEvent']);
+ $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_PERMISSIONS_SET, [self::class, 'refreshParticipantListUsingParticipantEvent']);
+ }
- /** @var Messages $messages */
- $messages = \OC::$server->get(Messages::class);
- $messages->addMessageForAllParticipants($event->getRoom(), 'refresh-participant-list');
- };
- $dispatcher->addListener(Room::EVENT_AFTER_ROOM_CONNECT, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_GUEST_CONNECT, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_SESSION_JOIN_CALL, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_SESSION_UPDATE_CALL_FLAGS, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_SESSION_LEAVE_CALL, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_PERMISSIONS_SET, $listener);
- $dispatcher->addListener(GuestManager::EVENT_AFTER_NAME_UPDATE, $listener);
-
- $listener = static function (ParticipantEvent $event): void {
- if (!self::isUsingInternalSignaling()) {
- return;
- }
+ protected static function registerExternalSignaling(IEventDispatcher $dispatcher): void {
+ $dispatcher->addListener(Room::EVENT_AFTER_USERS_ADD, [self::class, 'notifyAfterUsersAdd']);
+ $dispatcher->addListener(Room::EVENT_AFTER_NAME_SET, [self::class, 'notifyAfterRoomSettingsChanged']);
+ $dispatcher->addListener(Room::EVENT_AFTER_DESCRIPTION_SET, [self::class, 'notifyAfterRoomSettingsChanged']);
+ $dispatcher->addListener(Room::EVENT_AFTER_PASSWORD_SET, [self::class, 'notifyAfterRoomSettingsChanged']);
+ $dispatcher->addListener(Room::EVENT_AFTER_TYPE_SET, [self::class, 'notifyAfterRoomSettingsChanged']);
+ $dispatcher->addListener(Room::EVENT_AFTER_READONLY_SET, [self::class, 'notifyAfterRoomSettingsChanged']);
+ $dispatcher->addListener(Room::EVENT_AFTER_LISTABLE_SET, [self::class, 'notifyAfterRoomSettingsChanged']);
+ $dispatcher->addListener(Room::EVENT_AFTER_LOBBY_STATE_SET, [self::class, 'notifyAfterRoomSettingsChanged']);
+ $dispatcher->addListener(Room::EVENT_AFTER_SIP_ENABLED_SET, [self::class, 'notifyAfterRoomSettingsChanged']);
+ // TODO remove handler with "roomModified" in favour of handler with
+ // "participantsModified" once the clients no longer expect a
+ // "roomModified" message for participant type changes.
+ $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_TYPE_SET, [self::class, 'notifyAfterRoomSettingsChanged']);
+ $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_TYPE_SET, [self::class, 'notifyAfterParticipantTypeAndPermissionsSet']);
+ $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_PERMISSIONS_SET, [self::class, 'notifyAfterParticipantTypeAndPermissionsSet']);
+ $dispatcher->addListener(Room::EVENT_AFTER_PERMISSIONS_SET, [self::class, 'notifyAfterPermissionSet']);
+ $dispatcher->addListener(Room::EVENT_BEFORE_ROOM_DELETE, [self::class, 'notifyBeforeRoomDeleted']);
+ $dispatcher->addListener(Room::EVENT_AFTER_USER_REMOVE, [self::class, 'notifyAfterUserRemoved']);
+ $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_REMOVE, [self::class, 'notifyAfterParticipantRemoved']);
+ $dispatcher->addListener(Room::EVENT_AFTER_ROOM_DISCONNECT, [self::class, 'notifyAfterRoomDisconected']);
+ $dispatcher->addListener(Room::EVENT_AFTER_SESSION_JOIN_CALL, [self::class, 'notifyAfterJoinUpdateAndLeave']);
+ $dispatcher->addListener(Room::EVENT_AFTER_SESSION_UPDATE_CALL_FLAGS, [self::class, 'notifyAfterJoinUpdateAndLeave']);
+ $dispatcher->addListener(Room::EVENT_AFTER_SESSION_LEAVE_CALL, [self::class, 'notifyAfterJoinUpdateAndLeave']);
+ $dispatcher->addListener(Room::EVENT_AFTER_END_CALL_FOR_EVERYONE, [self::class, 'sendEndCallForEveryone']);
+ $dispatcher->addListener(Room::EVENT_AFTER_GUESTS_CLEAN, [self::class, 'notifyParticipantsAfterGuestClean']);
+ $dispatcher->addListener(GuestManager::EVENT_AFTER_NAME_UPDATE, [self::class, 'notifyParticipantsAfterNameUpdated']);
+ $dispatcher->addListener(ChatManager::EVENT_AFTER_MESSAGE_SEND, [self::class, 'notifyUsersViaExternalSignalingToRefreshTheChat']);
+ $dispatcher->addListener(ChatManager::EVENT_AFTER_SYSTEM_MESSAGE_SEND, [self::class, 'notifyUsersViaExternalSignalingToRefreshTheChat']);
+ $dispatcher->addListener(ChatManager::EVENT_AFTER_MULTIPLE_SYSTEM_MESSAGE_SEND, [self::class, 'notifyUsersViaExternalSignalingToRefreshTheChat']);
+ }
- $room = $event->getRoom();
-
- /** @var Messages $messages */
- $messages = \OC::$server->get(Messages::class);
- $messages->addMessageForAllParticipants($room, 'refresh-participant-list');
- };
- $dispatcher->addListener(Room::EVENT_BEFORE_USER_REMOVE, $listener);
- $dispatcher->addListener(Room::EVENT_BEFORE_PARTICIPANT_REMOVE, $listener);
- $dispatcher->addListener(Room::EVENT_BEFORE_ROOM_DISCONNECT, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_PERMISSIONS_SET, $listener);
-
- $listener = static function (RoomEvent $event): void {
- $room = $event->getRoom();
- if (!self::isUsingInternalSignaling()) {
- return;
- }
+ public static function refreshParticipantListUsingRoomEvent(RoomEvent $event): void {
+ if (!self::isUsingInternalSignaling()) {
+ return;
+ }
- /** @var Messages $messages */
- $messages = \OC::$server->get(Messages::class);
- $messages->addMessageForAllParticipants($room, 'refresh-participant-list');
- };
- $dispatcher->addListener(Room::EVENT_BEFORE_ROOM_DELETE, $listener);
+ /** @var Messages $messages */
+ $messages = \OC::$server->get(Messages::class);
+ $messages->addMessageForAllParticipants($event->getRoom(), 'refresh-participant-list');
}
- protected static function registerExternalSignaling(IEventDispatcher $dispatcher): void {
- $dispatcher->addListener(Room::EVENT_AFTER_USERS_ADD, static function (AddParticipantsEvent $event) {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ public static function refreshParticipantListUsingParticipantEvent(ParticipantEvent $event): void {
+ if (!self::isUsingInternalSignaling()) {
+ return;
+ }
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
+ /** @var Messages $messages */
+ $messages = \OC::$server->get(Messages::class);
+ $messages->addMessageForAllParticipants($event->getRoom(), 'refresh-participant-list');
+ }
- $notifier->roomInvited($event->getRoom(), $event->getParticipants());
- });
- $listener = static function (RoomEvent $event): void {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ public static function notifyAfterUsersAdd(AddParticipantsEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
-
- $notifier->roomModified($event->getRoom());
- };
- $dispatcher->addListener(Room::EVENT_AFTER_NAME_SET, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_DESCRIPTION_SET, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_PASSWORD_SET, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_TYPE_SET, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_READONLY_SET, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_LISTABLE_SET, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_LOBBY_STATE_SET, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_SIP_ENABLED_SET, $listener);
- // TODO remove handler with "roomModified" in favour of handler with
- // "participantsModified" once the clients no longer expect a
- // "roomModified" message for participant type changes.
- $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_TYPE_SET, $listener);
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
- $listener = static function (ModifyParticipantEvent $event): void {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ $notifier->roomInvited($event->getRoom(), $event->getParticipants());
+ }
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
+ public static function notifyAfterRoomSettingsChanged(RoomEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
- $sessionIds = [];
- // If the participant is not active in the room the "participants"
- // request will be sent anyway, although with an empty "changed"
- // property.
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
- /** @var SessionService $sessionService */
- $sessionService = \OC::$server->get(SessionService::class);
- $sessions = $sessionService->getAllSessionsForAttendee($event->getParticipant()->getAttendee());
- foreach ($sessions as $session) {
- $sessionIds[] = $session->getSessionId();
- }
+ $notifier->roomModified($event->getRoom());
+ }
- $notifier->participantsModified($event->getRoom(), $sessionIds);
- };
- $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_TYPE_SET, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_PERMISSIONS_SET, $listener);
+ public static function notifyAfterParticipantTypeAndPermissionsSet(ModifyParticipantEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
- $dispatcher->addListener(Room::EVENT_AFTER_PERMISSIONS_SET, static function (RoomEvent $event) {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
-
- $sessionIds = [];
-
- // Setting the room permissions resets the permissions of all
- // participants, even those with custom attendee permissions.
-
- // FIXME This approach does not scale, as the update message for all
- // the sessions in a conversation can exceed the allowed size of the
- // request in conversations with a large number of participants.
- // However, note that a single message with the general permissions
- // to be set on all participants can not be sent either, as the
- // general permissions could be overriden by custom attendee
- // permissions in specific participants.
-
- /** @var ParticipantService $participantService */
- $participantService = \OC::$server->get(ParticipantService::class);
- $participants = $participantService->getSessionsAndParticipantsForRoom($event->getRoom());
- foreach ($participants as $participant) {
- $session = $participant->getSession();
- if ($session) {
- $sessionIds[] = $session->getSessionId();
- }
- }
+ $sessionIds = [];
+ // If the participant is not active in the room the "participants"
+ // request will be sent anyway, although with an empty "changed"
+ // property.
- $notifier->participantsModified($event->getRoom(), $sessionIds);
- });
+ /** @var SessionService $sessionService */
+ $sessionService = \OC::$server->get(SessionService::class);
+ $sessions = $sessionService->getAllSessionsForAttendee($event->getParticipant()->getAttendee());
+ foreach ($sessions as $session) {
+ $sessionIds[] = $session->getSessionId();
+ }
- $dispatcher->addListener(Room::EVENT_BEFORE_ROOM_DELETE, static function (RoomEvent $event) {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ $notifier->participantsModified($event->getRoom(), $sessionIds);
+ }
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
- /** @var ParticipantService $participantService */
- $participantService = \OC::$server->get(ParticipantService::class);
-
- $room = $event->getRoom();
- $notifier->roomDeleted($room, $participantService->getParticipantUserIds($room));
- });
- $dispatcher->addListener(Room::EVENT_AFTER_USER_REMOVE, static function (RemoveUserEvent $event) {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ public static function notifyAfterPermissionSet(RoomEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
- $notifier->roomsDisinvited($event->getRoom(), [$event->getUser()->getUID()]);
- });
- $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_REMOVE, static function (RemoveParticipantEvent $event) {
- if (self::isUsingInternalSignaling()) {
- return;
+ $sessionIds = [];
+
+ // Setting the room permissions resets the permissions of all
+ // participants, even those with custom attendee permissions.
+
+ // FIXME This approach does not scale, as the update message for all
+ // the sessions in a conversation can exceed the allowed size of the
+ // request in conversations with a large number of participants.
+ // However, note that a single message with the general permissions
+ // to be set on all participants can not be sent either, as the
+ // general permissions could be overriden by custom attendee
+ // permissions in specific participants.
+
+ /** @var ParticipantService $participantService */
+ $participantService = \OC::$server->get(ParticipantService::class);
+ $participants = $participantService->getSessionsAndParticipantsForRoom($event->getRoom());
+ foreach ($participants as $participant) {
+ $session = $participant->getSession();
+ if ($session) {
+ $sessionIds[] = $session->getSessionId();
}
+ }
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
+ $notifier->participantsModified($event->getRoom(), $sessionIds);
+ }
- $sessionIds = [];
+ public static function notifyBeforeRoomDeleted(RoomEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
- /** @var SessionService $sessionService */
- $sessionService = \OC::$server->get(SessionService::class);
- $sessions = $sessionService->getAllSessionsForAttendee($event->getParticipant()->getAttendee());
- foreach ($sessions as $session) {
- $sessionIds[] = $session->getSessionId();
- }
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
+ /** @var ParticipantService $participantService */
+ $participantService = \OC::$server->get(ParticipantService::class);
- if ($event->getParticipant()->getSession()) {
- $sessionIds[] = $event->getParticipant()->getSession()->getSessionId();
- $notifier->roomSessionsRemoved($event->getRoom(), $sessionIds);
- }
+ $room = $event->getRoom();
+ $notifier->roomDeleted($room, $participantService->getParticipantUserIds($room));
+ }
- if (!empty($sessionIds)) {
- $notifier->roomSessionsRemoved($event->getRoom(), $sessionIds);
- }
- });
- $dispatcher->addListener(Room::EVENT_AFTER_ROOM_DISCONNECT, static function (ParticipantEvent $event) {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ public static function notifyAfterUserRemoved(RemoveUserEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
-
- $sessionIds = [];
- if ($event->getParticipant()->getSession()) {
- // Only for guests and self-joined users disconnecting is "leaving" and therefor should trigger a disinvite
- $attendeeParticipantType = $event->getParticipant()->getAttendee()->getParticipantType();
- if ($attendeeParticipantType === Participant::GUEST
- || $attendeeParticipantType === Participant::GUEST_MODERATOR) {
- $sessionIds[] = $event->getParticipant()->getSession()->getSessionId();
- $notifier->roomSessionsRemoved($event->getRoom(), $sessionIds);
- }
- if ($attendeeParticipantType === Participant::USER_SELF_JOINED) {
- $notifier->roomsDisinvited($event->getRoom(), [$event->getParticipant()->getAttendee()->getActorId()]);
- }
- }
- });
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
- $listener = static function (ModifyParticipantEvent $event): void {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ $notifier->roomsDisinvited($event->getRoom(), [$event->getUser()->getUID()]);
+ }
- if ($event instanceof ModifyEveryoneEvent) {
- // If everyone is disconnected, we will not do O(n) requests.
- // Instead, the listener of Room::EVENT_AFTER_END_CALL_FOR_EVERYONE
- // will send all sessions to the HPB with 1 request.
- return;
- }
+ public static function notifyAfterParticipantRemoved(RemoveParticipantEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
+
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
+ $sessionIds = [];
- $sessionIds = [];
+ /** @var SessionService $sessionService */
+ $sessionService = \OC::$server->get(SessionService::class);
+ $sessions = $sessionService->getAllSessionsForAttendee($event->getParticipant()->getAttendee());
+ foreach ($sessions as $session) {
+ $sessionIds[] = $session->getSessionId();
+ }
- /** @var SessionService $sessionService */
- $sessionService = \OC::$server->get(SessionService::class);
- $sessions = $sessionService->getAllSessionsForAttendee($event->getParticipant()->getAttendee());
- foreach ($sessions as $session) {
- $sessionIds[] = $session->getSessionId();
- }
+ if ($event->getParticipant()->getSession()) {
+ $sessionIds[] = $event->getParticipant()->getSession()->getSessionId();
+ $notifier->roomSessionsRemoved($event->getRoom(), $sessionIds);
+ }
- if (!empty($sessionIds)) {
- $notifier->roomInCallChanged(
- $event->getRoom(),
- $event->getNewValue(),
- $sessionIds
- );
+ if (!empty($sessionIds)) {
+ $notifier->roomSessionsRemoved($event->getRoom(), $sessionIds);
+ }
+ }
+
+ public static function notifyAfterRoomDisconected(ParticipantEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
+
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
+
+ $sessionIds = [];
+ if ($event->getParticipant()->getSession()) {
+ // Only for guests and self-joined users disconnecting is "leaving" and therefor should trigger a disinvite
+ $attendeeParticipantType = $event->getParticipant()->getAttendee()->getParticipantType();
+ if ($attendeeParticipantType === Participant::GUEST
+ || $attendeeParticipantType === Participant::GUEST_MODERATOR) {
+ $sessionIds[] = $event->getParticipant()->getSession()->getSessionId();
+ $notifier->roomSessionsRemoved($event->getRoom(), $sessionIds);
}
- };
- $dispatcher->addListener(Room::EVENT_AFTER_SESSION_JOIN_CALL, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_SESSION_UPDATE_CALL_FLAGS, $listener);
- $dispatcher->addListener(Room::EVENT_AFTER_SESSION_LEAVE_CALL, $listener);
-
- $dispatcher->addListener(Room::EVENT_AFTER_END_CALL_FOR_EVERYONE, static function (EndCallForEveryoneEvent $event): void {
- if (self::isUsingInternalSignaling()) {
- return;
+ if ($attendeeParticipantType === Participant::USER_SELF_JOINED) {
+ $notifier->roomsDisinvited($event->getRoom(), [$event->getParticipant()->getAttendee()->getActorId()]);
}
+ }
+ }
- $sessionIds = $event->getSessionIds();
+ public static function notifyAfterJoinUpdateAndLeave(ModifyParticipantEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
- if (empty($sessionIds)) {
- return;
- }
+ if ($event instanceof ModifyEveryoneEvent) {
+ // If everyone is disconnected, we will not do O(n) requests.
+ // Instead, the listener of Room::EVENT_AFTER_END_CALL_FOR_EVERYONE
+ // will send all sessions to the HPB with 1 request.
+ return;
+ }
+
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
+
+ $sessionIds = [];
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
+ /** @var SessionService $sessionService */
+ $sessionService = \OC::$server->get(SessionService::class);
+ $sessions = $sessionService->getAllSessionsForAttendee($event->getParticipant()->getAttendee());
+ foreach ($sessions as $session) {
+ $sessionIds[] = $session->getSessionId();
+ }
+ if (!empty($sessionIds)) {
$notifier->roomInCallChanged(
$event->getRoom(),
$event->getNewValue(),
$sessionIds
);
- });
+ }
+ }
- $dispatcher->addListener(Room::EVENT_AFTER_GUESTS_CLEAN, static function (RoomEvent $event) {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ public static function sendEndCallForEveryone(EndCallForEveryoneEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
+ $sessionIds = $event->getSessionIds();
- // TODO: The list of removed session ids should be passed through the event
- // so the signaling server can optimize forwarding the message.
- $sessionIds = [];
- $notifier->participantsModified($event->getRoom(), $sessionIds);
- });
- $dispatcher->addListener(GuestManager::EVENT_AFTER_NAME_UPDATE, static function (ModifyParticipantEvent $event) {
- if (self::isUsingInternalSignaling()) {
- return;
- }
+ if (empty($sessionIds)) {
+ return;
+ }
- /** @var BackendNotifier $notifier */
- $notifier = \OC::$server->get(BackendNotifier::class);
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
- $sessionIds = [];
+ $notifier->roomInCallChanged(
+ $event->getRoom(),
+ $event->getNewValue(),
+ $sessionIds
+ );
+ }
- /** @var SessionService $sessionService */
- $sessionService = \OC::$server->get(SessionService::class);
- $sessions = $sessionService->getAllSessionsForAttendee($event->getParticipant()->getAttendee());
- foreach ($sessions as $session) {
- $sessionIds[] = $session->getSessionId();
- }
+ public static function notifyParticipantsAfterGuestClean(RoomEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
- if (!empty($sessionIds)) {
- $notifier->participantsModified($event->getRoom(), $sessionIds);
- }
- });
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
- $dispatcher->addListener(ChatManager::EVENT_AFTER_MESSAGE_SEND, [self::class, 'notifyUsersViaExternalSignalingToRefreshTheChat']);
- $dispatcher->addListener(ChatManager::EVENT_AFTER_SYSTEM_MESSAGE_SEND, [self::class, 'notifyUsersViaExternalSignalingToRefreshTheChat']);
- $dispatcher->addListener(ChatManager::EVENT_AFTER_MULTIPLE_SYSTEM_MESSAGE_SEND, [self::class, 'notifyUsersViaExternalSignalingToRefreshTheChat']);
+ // TODO: The list of removed session ids should be passed through the event
+ // so the signaling server can optimize forwarding the message.
+ $sessionIds = [];
+ $notifier->participantsModified($event->getRoom(), $sessionIds);
+ }
+
+ public static function notifyParticipantsAfterNameUpdated(ModifyParticipantEvent $event): void {
+ if (self::isUsingInternalSignaling()) {
+ return;
+ }
+
+ /** @var BackendNotifier $notifier */
+ $notifier = \OC::$server->get(BackendNotifier::class);
+
+ $sessionIds = [];
+
+ /** @var SessionService $sessionService */
+ $sessionService = \OC::$server->get(SessionService::class);
+ $sessions = $sessionService->getAllSessionsForAttendee($event->getParticipant()->getAttendee());
+ foreach ($sessions as $session) {
+ $sessionIds[] = $session->getSessionId();
+ }
+
+ if (!empty($sessionIds)) {
+ $notifier->participantsModified($event->getRoom(), $sessionIds);
+ }
}
public static function notifyUsersViaExternalSignalingToRefreshTheChat(ChatEvent $event): void {
diff --git a/lib/Status/Listener.php b/lib/Status/Listener.php
index 4bf4e7ffe..80b8722aa 100644
--- a/lib/Status/Listener.php
+++ b/lib/Status/Listener.php
@@ -43,32 +43,24 @@ class Listener {
}
public static function register(IEventDispatcher $dispatcher): void {
- $dispatcher->addListener(Room::EVENT_BEFORE_SESSION_JOIN_CALL, static function (ModifyParticipantEvent $event) {
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- $listener->setUserStatus($event);
- });
+ $dispatcher->addListener(Room::EVENT_BEFORE_SESSION_JOIN_CALL, [self::class, 'setUserStatus']);
- $dispatcher->addListener(Room::EVENT_AFTER_SESSION_LEAVE_CALL, static function (ModifyParticipantEvent $event) {
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- $listener->revertUserStatus($event);
- });
+ $dispatcher->addListener(Room::EVENT_AFTER_SESSION_LEAVE_CALL, [self::class, 'revertUserStatus']);
- $dispatcher->addListener(Room::EVENT_AFTER_END_CALL_FOR_EVERYONE, static function (EndCallForEveryoneEvent $event) {
- /** @var self $listener */
- $listener = \OC::$server->get(self::class);
- $listener->revertUserStatusOnEndCallForEveryone($event);
- });
+ $dispatcher->addListener(Room::EVENT_AFTER_END_CALL_FOR_EVERYONE, [self::class, 'revertUserStatusOnEndCallForEveryone']);
}
- public function setUserStatus(ModifyParticipantEvent $event): void {
+ public static function setUserStatus(ModifyParticipantEvent $event): void {
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
if ($event->getParticipant()->getAttendee()->getActorType() === Attendee::ACTOR_USERS) {
- $this->statusManager->setUserStatus($event->getParticipant()->getAttendee()->getActorId(), 'call', IUserStatus::AWAY, true);
+ $listener->statusManager->setUserStatus($event->getParticipant()->getAttendee()->getActorId(), 'call', IUserStatus::AWAY, true);
}
}
- public function revertUserStatus(ModifyParticipantEvent $event): void {
+ public static function revertUserStatus(ModifyParticipantEvent $event): void {
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
if ($event instanceof ModifyEveryoneEvent) {
// Do not revert the status with 3 queries per user.
// We will update it in one go at the end.
@@ -76,14 +68,16 @@ class Listener {
}
if ($event->getParticipant()->getAttendee()->getActorType() === Attendee::ACTOR_USERS) {
- $this->statusManager->revertUserStatus($event->getParticipant()->getAttendee()->getActorId(), 'call', IUserStatus::AWAY);
+ $listener->statusManager->revertUserStatus($event->getParticipant()->getAttendee()->getActorId(), 'call', IUserStatus::AWAY);
}
}
- public function revertUserStatusOnEndCallForEveryone(EndCallForEveryoneEvent $event): void {
+ public static function revertUserStatusOnEndCallForEveryone(EndCallForEveryoneEvent $event): void {
+ /** @var self $listener */
+ $listener = \OC::$server->get(self::class);
$userIds = $event->getUserIds();
if (!empty($userIds)) {
- $this->statusManager->revertMultipleUserStatus($userIds, 'call', IUserStatus::AWAY);
+ $listener->statusManager->revertMultipleUserStatus($userIds, 'call', IUserStatus::AWAY);
}
}
}
diff --git a/package-lock.json b/package-lock.json
index 003ab7be4..9bff9427a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,7 +18,7 @@
"@nextcloud/event-bus": "^2.1.1",
"@nextcloud/initial-state": "^1.2.1",
"@nextcloud/l10n": "^1.4.1",
- "@nextcloud/moment": "^1.2.0",
+ "@nextcloud/moment": "^1.2.1",
"@nextcloud/paths": "^2.1.0",
"@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^5.3.0",
@@ -54,7 +54,7 @@
"vue-shortkey": "^3.1.7",
"vue2-leaflet": "^2.7.1",
"vuex": "^3.6.2",
- "webdav": "^4.8.0",
+ "webdav": "^4.9.0",
"webrtc-adapter": "^8.1.1",
"webrtcsupport": "^2.2.0",
"wildemitter": "^1.2.1",
@@ -2744,14 +2744,14 @@
}
},
"node_modules/@nextcloud/moment": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@nextcloud/moment/-/moment-1.2.0.tgz",
- "integrity": "sha512-HOnZqoYQg0eOQW369s5v7jZWmRNYCsadHnVjN+DSXQQ1n4fHKmr0EkdOFHJu1Br5Rd6Fxi4wRw7E7pD1CVZmgA==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@nextcloud/moment/-/moment-1.2.1.tgz",
+ "integrity": "sha512-v/yfrZ4Jo8YM1v0DLXKjRLwKOhzE4Y6DcgyZAM1vJ5jOMvkHpICuTDJRw8oOtrr/1H6FqI6EMZcYogeGD+rwSA==",
"dependencies": {
- "@nextcloud/l10n": "1.4.1",
- "core-js": "3.18.2",
+ "@nextcloud/l10n": "^1.4.1",
+ "core-js": "^3.21.1",
"jed": "^1.1.1",
- "moment": "2.29.1",
+ "moment": "^2.29.2",
"node-gettext": "^3.0.0"
}
},
@@ -6224,11 +6224,11 @@
"dev": true
},
"node_modules/axios": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
- "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
+ "version": "0.26.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
+ "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
"dependencies": {
- "follow-redirects": "^1.14.4"
+ "follow-redirects": "^1.14.8"
}
},
"node_modules/babel-code-frame": {
@@ -8306,9 +8306,9 @@
}
},
"node_modules/core-js": {
- "version": "3.18.2",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.2.tgz",
- "integrity": "sha512-zNhPOUoSgoizoSQFdX1MeZO16ORRb9FFQLts8gSYbZU5FcgXhp24iMWMxnOQo5uIaIG7/6FA/IqJPwev1o9ZXQ==",
+ "version": "3.22.2",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.2.tgz",
+ "integrity": "sha512-Z5I2vzDnEIqO2YhELVMFcL1An2CIsFe9Q7byZhs8c/QxummxZlAHw33TUHbIte987LkisOgL0LwQ1P9D6VISnA==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@@ -16273,9 +16273,9 @@
"dev": true
},
"node_modules/moment": {
- "version": "2.29.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
- "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
+ "version": "2.29.3",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
+ "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==",
"engines": {
"node": "*"
}
@@ -22353,22 +22353,41 @@
}
},
"node_modules/webdav": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/webdav/-/webdav-4.8.0.tgz",
- "integrity": "sha512-CVJvxu0attEfoQUKraDiNh3uMjNPNl+BY0pbcKbyc/X+8IXDnqAT4tT4Ge12w+j49fYuVpFVkpEGwBZabv7Uhw==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/webdav/-/webdav-4.9.0.tgz",
+ "integrity": "sha512-pMuRtZcjBk3i6q1iY5wBHdablKftoBfhrQEWWEejSh2LXgd0J6VE5V0c1tUlMrFHaVDx8iCoB9kupNzy8SMC4A==",
"dependencies": {
- "axios": "^0.24.0",
+ "axios": "^0.26.1",
"base-64": "^1.0.0",
"fast-xml-parser": "^3.19.0",
"he": "^1.2.0",
"hot-patcher": "^0.5.0",
"layerr": "^0.1.2",
"md5": "^2.3.0",
- "minimatch": "^3.0.4",
+ "minimatch": "^5.0.1",
"nested-property": "^4.0.0",
"path-posix": "^1.0.0",
"url-join": "^4.0.1",
- "url-parse": "^1.5.3"
+ "url-parse": "^1.5.10"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/webdav/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/webdav/node_modules/minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
@@ -26525,14 +26544,14 @@
}
},
"@nextcloud/moment": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@nextcloud/moment/-/moment-1.2.0.tgz",
- "integrity": "sha512-HOnZqoYQg0eOQW369s5v7jZWmRNYCsadHnVjN+DSXQQ1n4fHKmr0EkdOFHJu1Br5Rd6Fxi4wRw7E7pD1CVZmgA==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@nextcloud/moment/-/moment-1.2.1.tgz",
+ "integrity": "sha512-v/yfrZ4Jo8YM1v0DLXKjRLwKOhzE4Y6DcgyZAM1vJ5jOMvkHpICuTDJRw8oOtrr/1H6FqI6EMZcYogeGD+rwSA==",
"requires": {
- "@nextcloud/l10n": "1.4.1",
- "core-js": "3.18.2",
+ "@nextcloud/l10n": "^1.4.1",
+ "core-js": "^3.21.1",
"jed": "^1.1.1",
- "moment": "2.29.1",
+ "moment": "^2.29.2",
"node-gettext": "^3.0.0"
}
},
@@ -29234,11 +29253,11 @@
"dev": true
},
"axios": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
- "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
+ "version": "0.26.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
+ "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
"requires": {
- "follow-redirects": "^1.14.4"
+ "follow-redirects": "^1.14.8"
}
},
"babel-code-frame": {
@@ -30948,9 +30967,9 @@
}
},
"core-js": {
- "version": "3.18.2",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.2.tgz",
- "integrity": "sha512-zNhPOUoSgoizoSQFdX1MeZO16ORRb9FFQLts8gSYbZU5FcgXhp24iMWMxnOQo5uIaIG7/6FA/IqJPwev1o9ZXQ=="
+ "version": "3.22.2",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.2.tgz",
+ "integrity": "sha512-Z5I2vzDnEIqO2YhELVMFcL1An2CIsFe9Q7byZhs8c/QxummxZlAHw33TUHbIte987LkisOgL0LwQ1P9D6VISnA=="
},
"core-js-compat": {
"version": "3.13.0",
@@ -37168,9 +37187,9 @@
"dev": true
},
"moment": {
- "version": "2.29.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
- "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
+ "version": "2.29.3",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
+ "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw=="
},
"mrmime": {
"version": "1.0.0",
@@ -42075,22 +42094,40 @@
}
},
"webdav": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/webdav/-/webdav-4.8.0.tgz",
- "integrity": "sha512-CVJvxu0attEfoQUKraDiNh3uMjNPNl+BY0pbcKbyc/X+8IXDnqAT4tT4Ge12w+j49fYuVpFVkpEGwBZabv7Uhw==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/webdav/-/webdav-4.9.0.tgz",
+ "integrity": "sha512-pMuRtZcjBk3i6q1iY5wBHdablKftoBfhrQEWWEejSh2LXgd0J6VE5V0c1tUlMrFHaVDx8iCoB9kupNzy8SMC4A==",
"requires": {
- "axios": "^0.24.0",
+ "axios": "^0.26.1",
"base-64": "^1.0.0",
"fast-xml-parser": "^3.19.0",
"he": "^1.2.0",
"hot-patcher": "^0.5.0",
"layerr": "^0.1.2",
"md5": "^2.3.0",
- "minimatch": "^3.0.4",
+ "minimatch": "^5.0.1",
"nested-property": "^4.0.0",
"path-posix": "^1.0.0",
"url-join": "^4.0.1",
- "url-parse": "^1.5.3"
+ "url-parse": "^1.5.10"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
}
},
"webidl-conversions": {
diff --git a/package.json b/package.json
index bc85e426d..2aa060a86 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,7 @@
"@nextcloud/event-bus": "^2.1.1",
"@nextcloud/initial-state": "^1.2.1",
"@nextcloud/l10n": "^1.4.1",
- "@nextcloud/moment": "^1.2.0",
+ "@nextcloud/moment": "^1.2.1",
"@nextcloud/paths": "^2.1.0",
"@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^5.3.0",
@@ -62,7 +62,7 @@
"vue-shortkey": "^3.1.7",
"vue2-leaflet": "^2.7.1",
"vuex": "^3.6.2",
- "webdav": "^4.8.0",
+ "webdav": "^4.9.0",
"webrtc-adapter": "^8.1.1",
"webrtcsupport": "^2.2.0",
"wildemitter": "^1.2.1",
diff --git a/src/__mocks__/attachmediastream.js b/src/__mocks__/attachmediastream.js
new file mode 100644
index 000000000..74178ed27
--- /dev/null
+++ b/src/__mocks__/attachmediastream.js
@@ -0,0 +1,17 @@
+/**
+ * Basic "attachmediastream" implementation without using "webrtc-adapter", as
+ * "browserDetails" is null in unit tests.
+ *
+ * @param {MediaStream} stream the stream to attach
+ * @param {HTMLElement} element the element to attach the stream to
+ * @param {object} options ignored
+ */
+export default function(stream, element, options) {
+ if (!element) {
+ element = document.createElement(options.audio ? 'audio' : 'video')
+ }
+
+ element.srcObject = stream
+
+ return element
+}
diff --git a/src/components/AvatarWrapper/AvatarWrapper.vue b/src/components/AvatarWrapper/AvatarWrapper.vue
index 9f66580ad..ce9bcf668 100644
--- a/src/components/AvatarWrapper/AvatarWrapper.vue
+++ b/src/components/AvatarWrapper/AvatarWrapper.vue
@@ -139,18 +139,11 @@ export default {
}
.offline .avatar-wrapper .avatardiv {
- background: rgba(255, 255, 255, .4) !important;
+ background: rgba(var(--color-main-background-rgb), .4) !important;
::v-deep > img {
opacity: .4 !important;
}
}
-body.theme--dark {
- .offline .avatar-wrapper .avatardiv {
- background: rgba(0, 0, 0, .4) !important;
- margin-top: -4px;
- }
-}
-
</style>
diff --git a/src/components/CallView/CallView.vue b/src/components/CallView/CallView.vue
index 98b87f163..b34a17707 100644
--- a/src/components/CallView/CallView.vue
+++ b/src/components/CallView/CallView.vue
@@ -141,6 +141,7 @@ import { loadState } from '@nextcloud/initial-state'
import Grid from './Grid/Grid'
import { SIMULCAST } from '../../constants'
import { localMediaModel, localCallParticipantModel, callParticipantCollection } from '../../utils/webrtc/index'
+import RemoteVideoBlocker from '../../utils/webrtc/RemoteVideoBlocker'
import { fetchPeers } from '../../services/callsService'
import { showMessage } from '@nextcloud/dialogs'
import EmptyCallView from './shared/EmptyCallView'
@@ -212,7 +213,7 @@ export default {
callParticipantModelsWithVideo() {
return this.callParticipantModels.filter(callParticipantModel => {
return callParticipantModel.attributes.videoAvailable
- && this.sharedDatas[callParticipantModel.attributes.peerId].videoEnabled
+ && this.sharedDatas[callParticipantModel.attributes.peerId].remoteVideoBlocker.isVideoEnabled()
&& (typeof callParticipantModel.attributes.stream === 'object')
})
},
@@ -404,7 +405,6 @@ export default {
callParticipantCollection.on('remove', this._lowerHandWhenParticipantLeaves)
- subscribe('talk:video:toggled', this.handleToggleVideo)
subscribe('switch-screen-to-id', this._switchScreenToId)
},
beforeDestroy() {
@@ -412,7 +412,6 @@ export default {
callParticipantCollection.off('remove', this._lowerHandWhenParticipantLeaves)
- unsubscribe('talk:video:toggled', this.handleToggleVideo)
unsubscribe('switch-screen-to-id', this._switchScreenToId)
},
methods: {
@@ -454,7 +453,7 @@ export default {
addedModels.forEach(addedModel => {
const sharedData = {
promoted: false,
- videoEnabled: true,
+ remoteVideoBlocker: new RemoteVideoBlocker(addedModel),
screenVisible: false,
}
@@ -646,11 +645,6 @@ export default {
}
}, 1500),
- // Toggles videos on and off
- handleToggleVideo({ peerId, value }) {
- this.sharedDatas[peerId].videoEnabled = value
- },
-
adjustSimulcastQuality() {
this.callParticipantModels.forEach(callParticipantModel => {
this.adjustSimulcastQualityForParticipant(callParticipantModel)
diff --git a/src/components/CallView/Grid/Grid.vue b/src/components/CallView/Grid/Grid.vue
index c7fe91e73..63496c808 100644
--- a/src/components/CallView/Grid/Grid.vue
+++ b/src/components/CallView/Grid/Grid.vue
@@ -584,7 +584,11 @@ export default {
placeholderSharedData() {
return {
- videoEnabled: true,
+ videoEnabled: {
+ isVideoEnabled() {
+ return true
+ },
+ },
screenVisible: false,
}
},
diff --git a/src/components/CallView/shared/Video.spec.js b/src/components/CallView/shared/Video.spec.js
new file mode 100644
index 000000000..224a96521
--- /dev/null
+++ b/src/components/CallView/shared/Video.spec.js
@@ -0,0 +1,1147 @@
+/**
+ *
+ * @copyright Copyright (c) 2022, Daniel Calviño Sánchez (danxuliu@gmail.com)
+ *
+ * @license AGPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+import Vuex from 'vuex'
+import { createLocalVue, shallowMount } from '@vue/test-utils'
+import { cloneDeep } from 'lodash'
+import storeConfig from '../../../store/storeConfig'
+
+import EmitterMixin from '../../../utils/EmitterMixin'
+import CallParticipantModel from '../../../utils/webrtc/models/CallParticipantModel'
+
+import Video from './Video'
+
+describe('Video.vue', () => {
+ let localVue
+ let store
+ let testStoreConfig
+
+ let callParticipantModel
+
+ function PeerMock() {
+ this._superEmitterMixin()
+
+ this.id = 'theId'
+ this.nick = 'The nick'
+ this.pc = {
+ connectionState: 'new',
+ iceConnectionState: 'new',
+ signalingState: 'stable',
+ }
+ }
+ PeerMock.prototype._setIceConnectionState = function(iceConnectionState) {
+ this.pc.iceConnectionState = iceConnectionState
+ this._trigger('extendedIceConnectionStateChange', [iceConnectionState])
+ }
+ PeerMock.prototype._setSignalingState = function(signalingState) {
+ this.pc.signalingState = signalingState
+ this._trigger('signalingStateChange', [signalingState])
+ }
+ EmitterMixin.apply(PeerMock.prototype)
+ // Override _trigger from EmitterMixin, as it includes "this" as the first
+ // argument.
+ PeerMock.prototype._trigger = function(event, args) {
+ let handlers = this._handlers[event]
+ if (!handlers) {
+ return
+ }
+
+ if (!args) {
+ args = []
+ }
+
+ handlers = handlers.slice(0)
+ for (let i = 0; i < handlers.length; i++) {
+ const handler = handlers[i]
+ handler.apply(handler, args)
+ }
+ }
+
+ beforeEach(() => {
+ localVue = createLocalVue()
+ localVue.use(Vuex)
+
+ testStoreConfig = cloneDeep(storeConfig)
+ store = new Vuex.Store(testStoreConfig)
+
+ const webRtcMock = {
+ on: jest.fn(),
+ off: jest.fn(),
+ }
+ callParticipantModel = new CallParticipantModel({
+ peerId: 'theId',
+ webRtc: webRtcMock,
+ })
+ })
+
+ describe('connection state feedback', () => {
+ const connectionMessage = {
+ NOT_ESTABLISHED: 'Connection could not be established. Trying again …',
+ NOT_ESTABLISHED_NOT_RETRYING: 'Connection could not be established …',
+ LOST: 'Connection lost. Trying to reconnect …',
+ LOST_NOT_RETRYING: 'Connection was lost and could not be re-established …',
+ PROBLEMS: 'Connection problems …',
+ NONE: null,
+ }
+
+ let wrapper
+
+ // "setupWrapper()" needs to be called right before checking the wrapper
+ // to ensure that the component state is updated. If the wrapper is
+ // created at the beginning of each test "await Vue.nextTick()" would
+ // need to be called instead (and for that the tests would need to be
+ // async).
+ function setupWrapper() {
+ wrapper = shallowMount(Video, {
+ localVue,
+ store,
+ propsData: {
+ model: callParticipantModel,
+ token: 'theToken',
+ sharedData: {
+ remoteVideoBlocker: {
+ increaseVisibleCounter: jest.fn(),
+ },
+ promoted: false,
+ },
+ },
+ })
+ }
+
+ function assertConnectionMessageLabel(expectedText) {
+ const connectionMessageLabel = wrapper.find('.connection-message')
+ if (expectedText) {
+ expect(connectionMessageLabel.exists()).toBe(true)
+ expect(connectionMessageLabel.text()).toBe(expectedText)
+ } else {
+ expect(connectionMessageLabel.exists()).toBe(false)
+ }
+ }
+
+ function assertLoadingIconIsShown(expected) {
+ const loadingIcon = wrapper.find('.icon-loading')
+ expect(loadingIcon.exists()).toBe(expected)
+ }
+
+ function assertNotConnected(expected) {
+ const notConnected = wrapper.find('.not-connected')
+ expect(notConnected.exists()).toBe(expected)
+ }
+
+ test('participant just created', () => {
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('no peer', () => {
+ callParticipantModel.setPeer(null)
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ describe('original connection', () => {
+ let peerMock
+
+ beforeEach(() => {
+ peerMock = new PeerMock()
+ callParticipantModel.setPeer(peerMock)
+ })
+
+ test('peer just set', () => {
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('sending offer', () => {
+ peerMock._setSignalingState('have-local-offer')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('receiving offer', () => {
+ peerMock._setSignalingState('have-remote-offer')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('negotiation finished', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('establishing connection', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('connection established', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('connection established (completed)', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('completed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('disconnected', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected without ever connecting', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected long', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('disconnected')
+ // Custom event emitted when there is no HPB and the connection
+ // has been disconnected for a few seconds
+ peerMock._trigger('extendedIceConnectionStateChange', ['disconnected-long'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected long without ever connecting', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('disconnected')
+ // Custom event emitted when there is no HPB and the connection
+ // has been disconnected for a few seconds
+ peerMock._trigger('extendedIceConnectionStateChange', ['disconnected-long'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed without ever connecting', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+ })
+
+ describe('renegotiation', () => {
+ let peerMock
+
+ beforeEach(() => {
+ peerMock = new PeerMock()
+ callParticipantModel.setPeer(peerMock)
+ })
+
+ test('started after connection established', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setSignalingState('have-remote-offer')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('started after connection established and then finished', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('started before disconnected', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ // FIXME The message should be "PROBLEMS" rather than "LOST", as
+ // the negotiation is not caused by the disconnection itself.
+ // However it does not seem to be an easy way to do it right
+ // now.
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('started before disconnected and then finished', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setSignalingState('stable')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('started after disconnected', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setSignalingState('have-remote-offer')
+
+ setupWrapper()
+
+ // FIXME The message should be "PROBLEMS" rather than "LOST", as
+ // the negotiation is not caused by the disconnection itself.
+ // However it does not seem to be an easy way to do it right
+ // now.
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('started after disconnected and then finished', () => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+ })
+
+ describe('reconnection after no original connection', () => {
+ let newPeerMock
+
+ beforeEach(() => {
+ callParticipantModel.setPeer(null)
+
+ newPeerMock = new PeerMock()
+ callParticipantModel.setPeer(newPeerMock)
+ })
+
+ test('peer just set', () => {
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('sending offer', () => {
+ newPeerMock._setSignalingState('have-local-offer')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('receiving offer', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('negotiation finished', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('establishing connection', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('connection established', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('connection established (completed)', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('completed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('disconnected', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected without ever connecting', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected long', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('disconnected')
+ // Custom event emitted when there is no HPB and the connection
+ // has been disconnected for a few seconds
+ newPeerMock._trigger('extendedIceConnectionStateChange', ['disconnected-long'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected long without ever connecting', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('disconnected')
+ // Custom event emitted when there is no HPB and the connection
+ // has been disconnected for a few seconds
+ newPeerMock._trigger('extendedIceConnectionStateChange', ['disconnected-long'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('disconnected')
+ newPeerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed without ever connecting', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+ })
+
+ describe('reconnection', () => {
+ let peerMock
+ let newPeerMock
+
+ beforeEach(() => {
+ peerMock = new PeerMock()
+ callParticipantModel.setPeer(peerMock)
+
+ newPeerMock = new PeerMock()
+ })
+
+ describe('without having been connected', () => {
+ beforeEach(() => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('failed')
+
+ callParticipantModel.setPeer(newPeerMock)
+ })
+
+ test('peer just set', () => {
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('sending offer', () => {
+ newPeerMock._setSignalingState('have-local-offer')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('receiving offer', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('negotiation finished', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('establishing connection', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('connection established', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('disconnected', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected without ever connecting', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected long', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('disconnected')
+ // Custom event emitted when there is no HPB and the
+ // connection has been disconnected for a few seconds
+ newPeerMock._trigger('extendedIceConnectionStateChange', ['disconnected-long'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected long without ever connecting', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('disconnected')
+ // Custom event emitted when there is no HPB and the
+ // connection has been disconnected for a few seconds
+ newPeerMock._trigger('extendedIceConnectionStateChange', ['disconnected-long'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('disconnected')
+ newPeerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed without ever connecting', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed without ever connecting and not retrying', () => {
+ newPeerMock._setSignalingState('have-remote-offer')
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('failed')
+ // Custom event emitted when there is no HPB and the
+ // connection has failed several times in a row
+ newPeerMock._trigger('extendedIceConnectionStateChange', ['failed-no-restart'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NOT_ESTABLISHED_NOT_RETRYING)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(true)
+ })
+ })
+
+ describe('after having been connected', () => {
+ beforeEach(() => {
+ peerMock._setSignalingState('have-remote-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ })
+
+ describe('without HPB', () => {
+ test('ICE restarted after disconnected long (no HPB)', () => {
+ peerMock._setIceConnectionState('disconnected')
+ // Custom event emitted when there is no HPB and the connection
+ // has been disconnected for a few seconds
+ peerMock._trigger('extendedIceConnectionStateChange', ['disconnected-long'])
+ peerMock._setSignalingState('have-local-offer')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('ICE restarted after failed (no HPB)', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('negotiation finished', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('establishing connection', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('connection established', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('connection established (completed)', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('completed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('disconnected', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected without connecting the second time', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected long', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('disconnected')
+ // Custom event emitted when there is no HPB and the connection
+ // has been disconnected for a few seconds
+ peerMock._trigger('extendedIceConnectionStateChange', ['disconnected-long'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected long without connecting the second time', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('disconnected')
+ // Custom event emitted when there is no HPB and the connection
+ // has been disconnected for a few seconds
+ peerMock._trigger('extendedIceConnectionStateChange', ['disconnected-long'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('connected')
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed without connecting the second time', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed without connecting the second time and not retrying', () => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+ peerMock._setSignalingState('have-local-offer')
+ peerMock._setSignalingState('stable')
+ peerMock._setIceConnectionState('checking')
+ peerMock._setIceConnectionState('failed')
+ // Custom event emitted when there is no HPB and the
+ // connection has failed several times in a row
+ peerMock._trigger('extendedIceConnectionStateChange', ['failed-no-restart'])
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST_NOT_RETRYING)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(true)
+ })
+ })
+
+ describe('with HPB', () => {
+ beforeEach(() => {
+ peerMock._setIceConnectionState('disconnected')
+ peerMock._setIceConnectionState('failed')
+
+ callParticipantModel.setPeer(newPeerMock)
+
+ newPeerMock._setSignalingState('have-remote-offer')
+ })
+
+ test('requested renegotiation after connection failed', () => {
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('negotiation finished', () => {
+ newPeerMock._setSignalingState('stable')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('establishing connection', () => {
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('connection established', () => {
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('connection established (completed)', () => {
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('completed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.NONE)
+ assertLoadingIconIsShown(false)
+ assertNotConnected(false)
+ })
+
+ test('disconnected', () => {
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.PROBLEMS)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('disconnected without connecting the second time', () => {
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('disconnected')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed', () => {
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('connected')
+ newPeerMock._setIceConnectionState('disconnected')
+ newPeerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+
+ test('failed without connecting the second time', () => {
+ newPeerMock._setSignalingState('stable')
+ newPeerMock._setIceConnectionState('checking')
+ newPeerMock._setIceConnectionState('failed')
+
+ setupWrapper()
+
+ assertConnectionMessageLabel(connectionMessage.LOST)
+ assertLoadingIconIsShown(true)
+ assertNotConnected(true)
+ })
+ })
+ })
+ })
+ })
+})
diff --git a/src/components/CallView/shared/Video.vue b/src/components/CallView/shared/Video.vue
index 617417a01..e1d792bec 100644
--- a/src/components/CallView/shared/Video.vue
+++ b/src/components/CallView/shared/Video.vue
@@ -180,12 +180,12 @@ export default {
return this.model.attributes.connectedAtLeastOnce
},
- isNotConnected() {
- return this.model.attributes.connectionState !== ConnectionState.CONNECTED && this.model.attributes.connectionState !== ConnectionState.COMPLETED
+ isConnected() {
+ return this.model.attributes.connectionState === ConnectionState.CONNECTED || this.model.attributes.connectionState === ConnectionState.COMPLETED
},
isLoading() {
- return this.isNotConnected && this.model.attributes.connectionState !== ConnectionState.FAILED_NO_RESTART
+ return !this.isConnected && this.model.attributes.connectionState !== ConnectionState.FAILED_NO_RESTART
},
isDisconnected() {
@@ -204,11 +204,15 @@ export default {
* received yet). Similarly both "negotiating" and "connecting" need to
* be checked, as the negotiation will start before the connection
* attempt is started.
+ *
+ * If the negotiation is done while there is still a connection it is
+ * not regarded as reconnecting, as in that case it is a renegotiation
+ * to update the current connection.
*/
isReconnecting() {
return this.model.attributes.connectionState === ConnectionState.FAILED
|| (!this.model.attributes.initialConnection
- && (this.model.attributes.negotiating || this.model.attributes.connecting))
+ && ((this.model.attributes.negotiating && !this.isConnected) || this.model.attributes.connecting))
},
isNoLongerTryingToReconnect() {
@@ -242,7 +246,7 @@ export default {
containerClass() {
return {
'videoContainer-dummy': this.placeholderForPromoted,
- 'not-connected': !this.placeholderForPromoted && this.isNotConnected,
+ 'not-connected': !this.placeholderForPromoted && !this.isConnected,
speaking: !this.placeholderForPromoted && this.model.attributes.speaking,
promoted: !this.placeholderForPromoted && this.sharedData.promoted && !this.isGrid,
'video-container-grid': this.isGrid,
@@ -371,7 +375,7 @@ export default {
},
hasVideo() {
- return this.model.attributes.videoAvailable && this.sharedData.videoEnabled && (typeof this.model.attributes.stream === 'object')
+ return !this.model.attributes.videoBlocked && this.model.attributes.videoAvailable && this.sharedData.remoteVideoBlocker.isVideoEnabled() && (typeof this.model.attributes.stream === 'object')
},
hasSelectedVideo() {
@@ -469,10 +473,16 @@ export default {
},
mounted() {
+ this.sharedData.remoteVideoBlocker.increaseVisibleCounter()
+
// Set initial state
this._setStream(this.model.attributes.stream)
},
+ destroyed() {
+ this.sharedData.remoteVideoBlocker.decreaseVisibleCounter()
+ },
+
methods: {
_setStream(stream) {
diff --git a/src/components/CallView/shared/VideoBottomBar.vue b/src/components/CallView/shared/VideoBottomBar.vue
index ca4b23477..74baadec2 100644
--- a/src/components/CallView/shared/VideoBottomBar.vue
+++ b/src/components/CallView/shared/VideoBottomBar.vue
@@ -200,11 +200,11 @@ export default {
},
showVideoButton() {
- return this.sharedData.videoEnabled
+ return this.sharedData.remoteVideoBlocker.isVideoEnabled()
},
videoButtonTooltip() {
- if (this.sharedData.videoEnabled) {
+ if (this.sharedData.remoteVideoBlocker.isVideoEnabled()) {
return t('spreed', 'Disable video')
}
@@ -220,7 +220,7 @@ export default {
},
showNameIndicator() {
- return !this.model.attributes.videoAvailable || !this.sharedData.videoEnabled || this.showVideoOverlay || this.isSelected || this.isPromoted || this.isSpeaking
+ return !this.model.attributes.videoAvailable || !this.sharedData.remoteVideoBlocker.isVideoEnabled() || this.showVideoOverlay || this.isSelected || this.isPromoted || this.isSpeaking
},
boldenNameIndicator() {
@@ -255,10 +255,7 @@ export default {
},
toggleVideo() {
- emit('talk:video:toggled', {
- peerId: this.model.attributes.peerId,
- value: !this.sharedData.videoEnabled,
- })
+ this.sharedData.remoteVideoBlocker.setVideoEnabled(!this.sharedData.remoteVideoBlocker.isVideoEnabled())
},
switchToScreen() {
diff --git a/src/components/ConversationSettings/Matterbridge/BridgePart.vue b/src/components/ConversationSettings/Matterbridge/BridgePart.vue
index 295d7fec6..19dde6197 100644
--- a/src/components/ConversationSettings/Matterbridge/BridgePart.vue
+++ b/src/components/ConversationSettings/Matterbridge/BridgePart.vue
@@ -204,14 +204,10 @@ h3 {
margin: 14px 10px 0 14px;
width: 16px;
height: 16px;
+ filter: var(--background-invert-if-dark);
}
}
-body.theme--dark .icon-service {
- -webkit-filter: invert(1);
- filter: invert(1);
-}
-
input {
background-size: 16px;
background-position: 14px;
diff --git a/src/components/ConversationSettings/Matterbridge/MatterbridgeSettings.vue b/src/components/ConversationSettings/Matterbridge/MatterbridgeSettings.vue
index 76e5e89cb..68ea5e038 100644
--- a/src/components/ConversationSettings/Matterbridge/MatterbridgeSettings.vue
+++ b/src/components/ConversationSettings/Matterbridge/MatterbridgeSettings.vue
@@ -630,11 +630,7 @@ export default {
width: 16px !important;
height: 16px !important;
margin-right: 10px;
-}
-
-body.theme--dark .icon-multiselect-service {
- -webkit-filter: invert(1);
- filter: invert(1);
+ filter: var(--background-invert-if-dark);
}
.matterbridge-settings {
diff --git a/src/components/MessagesList/MessagesGroup/Message/Message.spec.js b/src/components/MessagesList/MessagesGroup/Message/Message.spec.js
index 69cd66042..d9ec96590 100644
--- a/src/components/MessagesList/MessagesGroup/Message/Message.spec.js
+++ b/src/components/MessagesList/MessagesGroup/Message/Message.spec.js
@@ -3,7 +3,7 @@ import { createLocalVue, mount, shallowMount } from '@vue/test-utils'
import { cloneDeep } from 'lodash'
import { EventBus } from '../../../../services/EventBus'
import storeConfig from '../../../../store/storeConfig'
-import { CONVERSATION, ATTENDEE } from '../../../../constants'
+import { CONVERSATION, ATTENDEE, PARTICIPANT } from '../../../../constants'
// Components
import Check from 'vue-material-design-icons/Check'
@@ -50,6 +50,7 @@ describe('Message.vue', () => {
lastCommonReadMessage: 0,
type: CONVERSATION.TYPE.GROUP,
readOnly: CONVERSATION.STATE.READ_WRITE,
+ permissions: PARTICIPANT.PERMISSIONS.MAX_DEFAULT,
}
testStoreConfig = cloneDeep(storeConfig)
@@ -806,6 +807,38 @@ describe('Message.vue', () => {
expect(reactionButtons.wrappers[1].text()).toBe('👍 7')
})
+ test('shows reaction buttons with the right emoji count but without emoji placeholder when no chat permission', () => {
+ const conversationProps = {
+ token: TOKEN,
+ lastCommonReadMessage: 0,
+ type: CONVERSATION.TYPE.GROUP,
+ readOnly: CONVERSATION.STATE.READ_WRITE,
+ permissions: PARTICIPANT.PERMISSIONS.MAX_DEFAULT - PARTICIPANT.PERMISSIONS.CHAT,
+ }
+ testStoreConfig.modules.conversationsStore.getters.conversation
+ = jest.fn().mockReturnValue((token) => conversationProps)
+ store = new Store(testStoreConfig)
+
+ const wrapper = shallowMount(Message, {
+ localVue,
+ store,
+ propsData: messageProps,
+ })
+
+ const reactionsBar = wrapper.find('.message-body__reactions')
+
+ // Array of buttons
+ const reactionButtons = reactionsBar.findAll('.reaction-button')
+
+ // Number of buttons, 2 passed into the getter and 1 is the emoji
+ // picker
+ expect(reactionButtons.length).toBe(2)
+
+ // Text of the buttons
+ expect(reactionButtons.wrappers[0].text()).toBe('❤️ 1')
+ expect(reactionButtons.wrappers[1].text()).toBe('👍 7')
+ })
+
test('dispatches store action upon picking an emoji from the emojipicker', () => {
const addReactionToMessageAction = jest.fn()
const userHasReactedGetter = jest.fn().mockReturnValue(() => false)
diff --git a/src/components/MessagesList/MessagesGroup/Message/Message.vue b/src/components/MessagesList/MessagesGroup/Message/Message.vue
index 612b8de11..4769068ec 100644
--- a/src/components/MessagesList/MessagesGroup/Message/Message.vue
+++ b/src/components/MessagesList/MessagesGroup/Message/Message.vue
@@ -136,7 +136,10 @@ the main body of the message as well as a quote.
</Popover>
<!-- More reactions picker -->
- <EmojiPicker :per-line="5" :container="`#message_${id}`" @select="handleReactionClick">
+ <EmojiPicker v-if="canReact"
+ :per-line="5"
+ :container="`#message_${id}`"
+ @select="handleReactionClick">
<button class="reaction-button">
<EmoticonOutline :size="15" />
</button>
@@ -190,6 +193,7 @@ import EmojiPicker from '@nextcloud/vue/dist/Components/EmojiPicker'
import EmoticonOutline from 'vue-material-design-icons/EmoticonOutline.vue'
import Popover from '@nextcloud/vue/dist/Components/Popover'
import { showError, showSuccess, showWarning, TOAST_DEFAULT_TIMEOUT } from '@nextcloud/dialogs'
+import { ATTENDEE, CONVERSATION, PARTICIPANT } from '../../../../constants'
export default {
name: 'Message',
@@ -571,6 +575,10 @@ export default {
return this.$store.getters.hasReactions(this.token, this.id)
},
+ canReact() {
+ return this.conversation.readOnly !== CONVERSATION.STATE.READ_ONLY && (this.conversation.permissions & PARTICIPANT.PERMISSIONS.CHAT) !== 0
+ },
+
simpleReactions() {
return this.messageObject.reactions
},
@@ -656,7 +664,8 @@ export default {
async getReactions() {
if (this.detailedReactionsLoading) {
- // FIXME not sure how to await the other execution
+ // A parallel request is already doing this
+ return
}
try {
@@ -677,6 +686,11 @@ export default {
},
async handleReactionClick(clickedEmoji) {
+ if (!this.canReact) {
+ showError(t('spreed', 'No permission to post reactions in this conversation'))
+ return
+ }
+
// Check if current user has already added this reaction to the message
if (!this.userHasReacted(clickedEmoji)) {
this.$store.dispatch('addReactionToMessage', {
@@ -738,12 +752,26 @@ export default {
&& list[item].actorId === this.$store.getters.getActorId()) {
summary.unshift(t('spreed', 'You'))
} else {
- summary.push(list[item].actorDisplayName)
+ summary.push(this.getDisplayNameForReaction(list[item]))
}
}
return summary.join(', ')
},
+
+ getDisplayNameForReaction(reaction) {
+ const displayName = reaction.actorDisplayName.trim()
+
+ if (reaction.actorType === ATTENDEE.ACTOR_TYPE.GUESTS) {
+ return this.$store.getters.getGuestNameWithGuestSuffix(this.token, reaction.actorId)
+ }
+
+ if (displayName === '') {
+ return t('spreed', 'Deleted user')
+ }
+
+ return displayName
+ },
},
}
</script>
diff --git a/src/components/MessagesList/MessagesGroup/Message/MessageButtonsBar/MessageButtonsBar.vue b/src/components/MessagesList/MessagesGroup/Message/MessageButtonsBar/MessageButtonsBar.vue
index b1381dc1b..db707c06f 100644
--- a/src/components/MessagesList/MessagesGroup/Message/MessageButtonsBar/MessageButtonsBar.vue
+++ b/src/components/MessagesList/MessagesGroup/Message/MessageButtonsBar/MessageButtonsBar.vue
@@ -326,7 +326,7 @@ export default {
},
acceptsReactions() {
- return !this.isConversationReadOnly && !this.isDeletedMessage
+ return !this.isConversationReadOnly && !this.isDeletedMessage && (this.conversation.permissions & PARTICIPANT.PERMISSIONS.CHAT) !== 0
},
messageActions() {
diff --git a/src/components/MessagesList/MessagesGroup/Message/MessagePart/Contact.vue b/src/components/MessagesList/MessagesGroup/Message/MessagePart/Contact.vue
index a894954db..a3d5a17ff 100644
--- a/src/components/MessagesList/MessagesGroup/Message/MessagePart/Contact.vue
+++ b/src/components/MessagesList/MessagesGroup/Message/MessagePart/Contact.vue
@@ -100,6 +100,7 @@ export default {
.contact {
display: flex;
transition: box-shadow 0.1s ease-in-out;
+ border: 1px solid var(--color-border);
box-shadow: 0 0 2px 0 var(--color-box-shadow);
border-radius: var(--border-radius-large);
font-size: 100%;
@@ -137,11 +138,6 @@ export default {
margin-left: 12px;
}
}
-
- // Dark theme
- body.dark &, body.theme--dark & {
- border: 2px solid var(--color-border);
- }
}
.icon-contacts {
diff --git a/src/components/MessagesList/MessagesGroup/Message/MessagePart/DeckCard.vue b/src/components/MessagesList/MessagesGroup/Message/MessagePart/DeckCard.vue
index 26ec2187c..e77000425 100644
--- a/src/components/MessagesList/MessagesGroup/Message/MessagePart/DeckCard.vue
+++ b/src/components/MessagesList/MessagesGroup/Message/MessagePart/DeckCard.vue
@@ -93,6 +93,7 @@ export default {
.deck-card {
display: flex;
transition: box-shadow 0.1s ease-in-out;
+ border: 1px solid var(--color-border);
box-shadow: 0 0 2px 0 var(--color-box-shadow);
border-radius: var(--border-radius-large);
font-size: 100%;
@@ -126,10 +127,6 @@ export default {
white-space: nowrap;
text-overflow: ellipsis;
}
- // Dark theme
- body.dark &, body.theme--dark & {
- border: 2px solid var(--color-border);
- }
}
.icon-deck {
diff --git a/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue b/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue
index 09cda5d64..553b675bd 100644
--- a/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue
+++ b/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue
@@ -295,7 +295,7 @@ export default {
classes += 'preview '
}
- if (this.failed || this.previewType === PREVIEW_TYPE.MIME_ICON) {
+ if (this.failed || this.previewType === PREVIEW_TYPE.MIME_ICON || this.rowLayout) {
classes += 'mimeicon'
}
return classes
@@ -323,7 +323,7 @@ export default {
if (this.previewType === PREVIEW_TYPE.TEMPORARY) {
return this.localUrl
}
- if (this.previewType === PREVIEW_TYPE.MIME_ICON) {
+ if (this.previewType === PREVIEW_TYPE.MIME_ICON || this.rowLayout) {
return OC.MimeType.getIconUrl(this.mimetype)
}
// whether to embed/render the file directly
diff --git a/src/components/NewMessageForm/NewMessageForm.vue b/src/components/NewMessageForm/NewMessageForm.vue
index 0942e316e..cbf96fc9a 100644
--- a/src/components/NewMessageForm/NewMessageForm.vue
+++ b/src/components/NewMessageForm/NewMessageForm.vue
@@ -132,7 +132,7 @@ import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import EmojiPicker from '@nextcloud/vue/dist/Components/EmojiPicker'
import { EventBus } from '../../services/EventBus'
import { shareFile } from '../../services/filesSharingServices'
-import { CONVERSATION } from '../../constants'
+import { CONVERSATION, PARTICIPANT } from '../../constants'
import Paperclip from 'vue-material-design-icons/Paperclip'
import EmoticonOutline from 'vue-material-design-icons/EmoticonOutline'
import Send from 'vue-material-design-icons/Send'
@@ -197,13 +197,19 @@ export default {
return this.conversation.readOnly === CONVERSATION.STATE.READ_ONLY
},
+ noChatPermission() {
+ return (this.conversation.permissions & PARTICIPANT.PERMISSIONS.CHAT) === 0
+ },
+
disabled() {
- return this.isReadOnly || !this.currentConversationIsJoined || this.isRecordingAudio
+ return this.isReadOnly || this.noChatPermission || this.isReadOnly || !this.currentConversationIsJoined || this.isRecordingAudio
},
placeholderText() {
if (this.isReadOnly) {
return t('spreed', 'This conversation has been locked')
+ } else if (this.noChatPermission) {
+ return t('spreed', 'No permission to post messages in this conversation')
} else if (!this.currentConversationIsJoined) {
return t('spreed', 'Joining conversation …')
} else {
diff --git a/src/components/PermissionsEditor/PermissionsEditor.vue b/src/components/PermissionsEditor/PermissionsEditor.vue
index c3fe2e9be..137d36909 100644
--- a/src/components/PermissionsEditor/PermissionsEditor.vue
+++ b/src/components/PermissionsEditor/PermissionsEditor.vue
@@ -37,6 +37,11 @@
class="checkbox">
{{ t('spreed', 'Skip the lobby') }}
</CheckboxRadioSwitch>
+ <CheckboxRadioSwitch ref="chatMessagesAndReactions"
+ :checked.sync="chatMessagesAndReactions"
+ class="checkbox">
+ {{ t('spreed', 'Can post messages and reactions') }}
+ </CheckboxRadioSwitch>
<CheckboxRadioSwitch ref="publishAudio"
:checked.sync="publishAudio"
class="checkbox">
@@ -125,6 +130,8 @@ export default {
callStart: false,
// Permission to bypass the lobby
lobbyIgnore: false,
+ // Permission to post messages and reactions
+ chatMessagesAndReactions: false,
// Permission to enable the microphone
publishAudio: false,
// Permission to enable the camera
@@ -164,6 +171,7 @@ export default {
formPermissions() {
return (this.callStart ? PERMISSIONS.CALL_START : 0)
| (this.lobbyIgnore ? PERMISSIONS.LOBBY_IGNORE : 0)
+ | (this.chatMessagesAndReactions ? PERMISSIONS.CHAT : 0)
| (this.publishAudio ? PERMISSIONS.PUBLISH_AUDIO : 0)
| (this.publishVideo ? PERMISSIONS.PUBLISH_VIDEO : 0)
| (this.publishScreen ? PERMISSIONS.PUBLISH_SCREEN : 0)
@@ -177,6 +185,7 @@ export default {
submitButtonDisabled() {
return (!!(this.permissionsWithDefault & PERMISSIONS.CALL_START)) === this.callStart
&& !!(this.permissionsWithDefault & PERMISSIONS.LOBBY_IGNORE) === this.lobbyIgnore
+ && !!(this.permissionsWithDefault & PERMISSIONS.CHAT) === this.chatMessagesAndReactions
&& !!(this.permissionsWithDefault & PERMISSIONS.PUBLISH_AUDIO) === this.publishAudio
&& !!(this.permissionsWithDefault & PERMISSIONS.PUBLISH_VIDEO) === this.publishVideo
&& !!(this.permissionsWithDefault & PERMISSIONS.PUBLISH_SCREEN) === this.publishScreen
@@ -197,6 +206,7 @@ export default {
writePermissionsToComponent(permissions) {
permissions & PERMISSIONS.CALL_START ? this.callStart = true : this.callStart = false
permissions & PERMISSIONS.LOBBY_IGNORE ? this.lobbyIgnore = true : this.lobbyIgnore = false
+ permissions & PERMISSIONS.CHAT ? this.chatMessagesAndReactions = true : this.chatMessagesAndReactions = false
permissions & PERMISSIONS.PUBLISH_AUDIO ? this.publishAudio = true : this.publishAudio = false
permissions & PERMISSIONS.PUBLISH_VIDEO ? this.publishVideo = true : this.publishVideo = false
permissions & PERMISSIONS.PUBLISH_SCREEN ? this.publishScreen = true : this.publishScreen = false
diff --git a/src/components/RightSidebar/RightSidebar.vue b/src/components/RightSidebar/RightSidebar.vue
index f53ee577c..05a477ce1 100644
--- a/src/components/RightSidebar/RightSidebar.vue
+++ b/src/components/RightSidebar/RightSidebar.vue
@@ -242,6 +242,18 @@ export default {
}
},
+ showChatInSidebar(chatInSidebar) {
+ if (chatInSidebar) {
+ this.activeTab = 'chat'
+ } else if (this.activeTab === 'chat') {
+ if (this.conversation.type === CONVERSATION.TYPE.ONE_TO_ONE) {
+ this.activeTab = 'shared-items'
+ } else {
+ this.activeTab = 'participants'
+ }
+ }
+ },
+
token() {
if (this.$refs.participantsTab) {
this.$refs.participantsTab.$el.scrollTop = 0
diff --git a/src/components/RightSidebar/SharedItems/SharedItems.vue b/src/components/RightSidebar/SharedItems/SharedItems.vue
index 072e268e4..d2c848804 100644
--- a/src/components/RightSidebar/SharedItems/SharedItems.vue
+++ b/src/components/RightSidebar/SharedItems/SharedItems.vue
@@ -20,48 +20,26 @@
-->
<template>
- <div class="shared-items">
- <AppNavigationCaption :title="title" />
- <div class="files" :class="{'files__list' : isList}">
- <template v-for="file in itemsToDisplay">
- <FilePreview :key="file.id"
- :small-preview="isList"
- :row-layout="isList"
- :is-shared-items-tab="true"
- v-bind="file.messageParameters.file" />
- </template>
- </div>
- <Button v-if="hasMore"
- type="tertiary"
- class="shared-items__more"
- :wide="true"
- @click="handleCaptionClick">
- <template #icon>
- <DotsHorizontal :size="20"
- decorative
- title="" />
- </template>
- {{ buttonTitle }}
- </Button>
+ <div class="shared-items" :class="{'shared-items__list' : isList}">
+ <template v-for="file in itemsToDisplay">
+ <FilePreview :key="file.id"
+ :small-preview="isList"
+ :row-layout="isList"
+ :is-shared-items-tab="true"
+ v-bind="file.messageParameters.file" />
+ </template>
</div>
</template>
<script>
-import Button from '@nextcloud/vue/dist/Components/Button'
import FilePreview from '../../MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue'
-import DotsHorizontal from 'vue-material-design-icons/DotsHorizontal.vue'
-import AppNavigationCaption from '@nextcloud/vue/dist/Components/AppNavigationCaption'
-import { showMessage } from '@nextcloud/dialogs'
import { SHARED_ITEM } from '../../../constants'
export default {
name: 'SharedItems',
components: {
- Button,
FilePreview,
- DotsHorizontal,
- AppNavigationCaption,
},
props: {
@@ -74,51 +52,17 @@ export default {
type: Object,
required: true,
},
+
+ // Limits the amount of items displayed
+ limit: {
+ type: Boolean,
+ default: false,
+ },
},
computed: {
itemsToDisplay() {
- return Object.values(this.items).reverse().slice(0, 6)
- },
-
- title() {
- switch (this.type) {
- case SHARED_ITEM.TYPES.MEDIA:
- return t('spreed', 'Media')
- case SHARED_ITEM.TYPES.FILE:
- return t('spreed', 'Files')
- case SHARED_ITEM.TYPES.DECK_CARD:
- return t('spreed', 'Deck cards')
- case SHARED_ITEM.TYPES.VOICE:
- return t('spreed', 'Voice messages')
- case SHARED_ITEM.TYPES.LOCATION:
- return t('spreed', 'Locations')
- case SHARED_ITEM.TYPES.AUDIO:
- return t('spreed', 'Audio')
- case SHARED_ITEM.TYPES.OTHER:
- default:
- return t('spreed', 'Other')
- }
- },
-
- buttonTitle() {
- switch (this.type) {
- case SHARED_ITEM.TYPES.MEDIA:
- return t('spreed', 'Show all media')
- case SHARED_ITEM.TYPES.FILE:
- return t('spreed', 'Show all files')
- case SHARED_ITEM.TYPES.DECK_CARD:
- return t('spreed', 'Show all deck cards')
- case SHARED_ITEM.TYPES.VOICE:
- return t('spreed', 'Show all voice messages')
- case SHARED_ITEM.TYPES.LOCATION:
- return t('spreed', 'Show all locations')
- case SHARED_ITEM.TYPES.AUDIO:
- return t('spreed', 'Show all audio')
- case SHARED_ITEM.TYPES.OTHER:
- default:
- return t('spreed', 'Show all other')
- }
+ return this.limit ? Object.values(this.items).reverse().slice(0, 6) : Object.values(this.items).reverse()
},
isList() {
@@ -131,26 +75,16 @@ export default {
return true
}
},
-
- hasMore() {
- return Object.values(this.items).length > 6
- },
- },
-
- methods: {
- handleCaptionClick() {
- showMessage('Screenshot feature only. Implementation of the real feature will come soon! 😎')
- console.debug('Show more')
- },
},
}
</script>
<style lang="scss" scoped>
-.files {
+.shared-items {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr;
+ margin-bottom: 16px;
grid-gap: 4px;
&__list {
display: flex;
@@ -158,11 +92,4 @@ export default {
}
}
-
-.shared-items {
- margin-bottom: 16px;
- &__more {
- margin-top: 8px;
- }
-}
</style>
diff --git a/src/components/RightSidebar/SharedItems/SharedItemsBrowser/SharedItemsBrowser.vue b/src/components/RightSidebar/SharedItems/SharedItemsBrowser/SharedItemsBrowser.vue
new file mode 100644
index 000000000..f32e4914b
--- /dev/null
+++ b/src/components/RightSidebar/SharedItems/SharedItemsBrowser/SharedItemsBrowser.vue
@@ -0,0 +1,173 @@
+<!--
+ - @copyright Copyright (c) 2022 Marco Ambrosini <marcoambrosini@pm.me>
+ -
+ - @author Marco Ambrosini <marcoambrosini@pm.me>
+ -
+ - @license GNU AGPL version 3 or any later version
+ -
+ - This program is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU Affero General Public License as
+ - published by the Free Software Foundation, either version 3 of the
+ - License, or (at your option) any later version.
+ -
+ - This program is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU Affero General Public License for more details.
+ -
+ - You should have received a copy of the GNU Affero General Public License
+ - along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+
+<template>
+ <Modal size="large" :container="container" v-on="$listeners">
+ <div class="shared-items-browser">
+ <div class="shared-items-browser__navigation">
+ <template v-for="type in sharedItemsOrder">
+ <Button v-if="sharedItems[type]"
+ :key="type"
+ :class="{'active' : activeTab === type}"
+ type="tertiary"
+ @click="handleTabClick(type)">
+ {{ getTitle(type) }}
+ </Button>
+ </template>
+ </div>
+ <div ref="scroller" class="shared-items-browser__content" @scroll="debounceHandleScroll">
+ <SharedItems :type="activeTab"
+ :items="sharedItems[activeTab]" />
+ </div>
+ </div>
+ </Modal>
+</template>
+
+<script>
+import Modal from '@nextcloud/vue/dist/Components/Modal'
+import Button from '@nextcloud/vue/dist/Components/Button'
+import SharedItems from '../SharedItems.vue'
+import sharedItems from '../../../../mixins/sharedItems'
+import debounce from 'debounce'
+
+export default {
+ name: 'SharedItemsBrowser',
+
+ components: {
+ Modal,
+ Button,
+ SharedItems,
+ },
+
+ mixins: [sharedItems],
+
+ props: {
+ sharedItems: {
+ type: Object,
+ required: true,
+ },
+
+ activeTab: {
+ type: String,
+ required: true,
+ },
+ },
+
+ data() {
+ return {
+ firstItemsLoaded: {},
+ isRequestingMoreItems: {},
+ hasFetchedAllItems: {},
+ }
+ },
+
+ computed: {
+ scroller() {
+ return this.$refs.scroller
+ },
+
+ token() {
+ return this.$store.getters.getToken()
+ },
+
+ container() {
+ return this.$store.getters.getMainContainerSelector()
+ },
+ },
+
+ watch: {
+ activeTab(newType) {
+ this.firstFetchItems(newType)
+ },
+ },
+
+ mounted() {
+ this.firstFetchItems(this.activeTab)
+ },
+
+ methods: {
+ handleTabClick(type) {
+ this.$emit('update:active-tab', type)
+ },
+
+ firstFetchItems(type) {
+ if (!this.firstItemsLoaded?.[type]) {
+ this.fetchItems(type)
+ this.firstItemsLoaded[type] = true
+ }
+ },
+
+ fetchItems(type) {
+ this.isRequestingMoreItems[this.activeTab] = true
+ const hasMoreItems = this.$store.dispatch('getSharedItems', {
+ token: this.token,
+ type,
+ })
+ if (hasMoreItems === false) {
+ this.hasFetchedAllItems[this.activeTab] = true
+ }
+ this.isRequestingMoreItems[this.activeTab] = false
+ },
+
+ debounceHandleScroll: debounce(function() {
+ this.handleScroll()
+ }, 50),
+
+ async handleScroll() {
+ const scrollHeight = this.scroller.scrollHeight
+ const scrollTop = this.scroller.scrollTop
+ const containerHeight = this.scroller.clientHeight
+ if ((scrollHeight - scrollTop - containerHeight < 300) && !this.isRequestingMoreItems?.[this.activeTab] && !this.hasFetchedAllItems?.[this.activeTab]) {
+ this.fetchItems(this.activeTab)
+ }
+ },
+ },
+}
+</script>
+
+<style lang="scss" scoped>
+.shared-items-browser {
+ width: 100%;
+ height: 100%;
+ position:relative;
+ display: flex;
+ flex-direction: column;
+ &__navigation {
+ display: flex;
+ gap: 8px;
+ padding: 16px;
+ flex-wrap: wrap;
+ justify-content: center;
+ }
+ &__content {
+ overflow-y: auto;
+ overflow-x: hidden;
+ margin: 0 12px;
+ }
+}
+
+::v-deep .button-vue {
+ border-radius: var(--border-radius-large);
+ &.active {
+ background-color: var(--color-primary-element-hover);
+ }
+}
+</style>
diff --git a/src/components/RightSidebar/SharedItems/SharedItemsTab.vue b/src/components/RightSidebar/SharedItems/SharedItemsTab.vue
index d3ee8db57..6403ecc0f 100644
--- a/src/components/RightSidebar/SharedItems/SharedItemsTab.vue
+++ b/src/components/RightSidebar/SharedItems/SharedItemsTab.vue
@@ -22,16 +22,34 @@
<template>
<div v-if="!loading && active">
<template v-for="type in sharedItemsOrder">
- <SharedItems v-if="sharedItems[type]"
- :key="type"
- :type="type"
- :items="sharedItems[type]" />
+ <div v-if="sharedItems[type]" :key="type">
+ <AppNavigationCaption :title="getTitle(type)" />
+ <SharedItems :type="type"
+ :limit="true"
+ :items="sharedItems[type]" />
+ <Button v-if="hasMore(sharedItems[type])"
+ type="tertiary-no-background"
+ class="more"
+ :wide="true"
+ @click="showMore(type)">
+ <template #icon>
+ <DotsHorizontal :size="20"
+ decorative
+ title="" />
+ </template>
+ {{ getButtonTitle(type) }}
+ </Button>
+ </div>
</template>
<AppNavigationCaption :title="t('spreed', 'Projects')" />
<CollectionList v-if="getUserId && token"
:id="token"
type="room"
:name="conversation.displayName" />
+ <SharedItemsBrowser v-if="showSharedItemsBrowser"
+ :shared-items="sharedItems"
+ :active-tab.sync="browserActiveTab"
+ @close="showSharedItemsBrowser = false" />
</div>
</template>
@@ -40,6 +58,10 @@ import { CollectionList } from 'nextcloud-vue-collections'
import SharedItems from './SharedItems'
import { SHARED_ITEM } from '../../../constants'
import AppNavigationCaption from '@nextcloud/vue/dist/Components/AppNavigationCaption'
+import SharedItemsBrowser from './SharedItemsBrowser/SharedItemsBrowser.vue'
+import DotsHorizontal from 'vue-material-design-icons/DotsHorizontal.vue'
+import Button from '@nextcloud/vue/dist/Components/Button'
+import sharedItems from '../../../mixins/sharedItems'
export default {
@@ -49,8 +71,13 @@ export default {
SharedItems,
CollectionList,
AppNavigationCaption,
+ SharedItemsBrowser,
+ DotsHorizontal,
+ Button,
},
+ mixins: [sharedItems],
+
props: {
active: {
@@ -59,6 +86,13 @@ export default {
},
},
+ data() {
+ return {
+ showSharedItemsBrowser: false,
+ browserActiveTab: '',
+ }
+ },
+
computed: {
getUserId() {
return this.$store.getters.getUserId()
@@ -79,12 +113,6 @@ export default {
sharedItems() {
return this.$store.getters.sharedItems(this.token)
},
-
- // Defines the order of the sections
- sharedItemsOrder() {
- // FIXME restore when non files work return [SHARED_ITEM.TYPES.MEDIA, SHARED_ITEM.TYPES.FILE, SHARED_ITEM.TYPES.VOICE, SHARED_ITEM.TYPES.AUDIO, SHARED_ITEM.TYPES.LOCATION, SHARED_ITEM.TYPES.DECK_CARD, SHARED_ITEM.TYPES.OTHER]
- return [SHARED_ITEM.TYPES.MEDIA, SHARED_ITEM.TYPES.FILE, SHARED_ITEM.TYPES.VOICE, SHARED_ITEM.TYPES.AUDIO]
- },
},
watch: {
@@ -99,6 +127,43 @@ export default {
getSharedItemsOverview() {
this.$store.dispatch('getSharedItemsOverview', { token: this.token })
},
+
+ hasMore(items) {
+ return Object.values(items).length > 6
+ },
+
+ showMore(type) {
+ this.browserActiveTab = type
+ this.showSharedItemsBrowser = true
+ },
+
+ getButtonTitle(type) {
+ switch (type) {
+ case SHARED_ITEM.TYPES.MEDIA:
+ return t('spreed', 'Show all media')
+ case SHARED_ITEM.TYPES.FILE:
+ return t('spreed', 'Show all files')
+ case SHARED_ITEM.TYPES.DECK_CARD:
+ return t('spreed', 'Show all deck cards')
+ case SHARED_ITEM.TYPES.VOICE:
+ return t('spreed', 'Show all voice messages')
+ case SHARED_ITEM.TYPES.LOCATION:
+ return t('spreed', 'Show all locations')
+ case SHARED_ITEM.TYPES.AUDIO:
+ return t('spreed', 'Show all audio')
+ case SHARED_ITEM.TYPES.OTHER:
+ default:
+ return t('spreed', 'Show all other')
+ }
+ },
},
}
</script>
+
+<style lang="scss" scoped>
+
+.more {
+ margin-top: 8px;
+}
+
+</style>
diff --git a/src/components/SettingsDialog/SettingsDialog.vue b/src/components/SettingsDialog/SettingsDialog.vue
index 6dc398a98..e5f695f36 100644
--- a/src/components/SettingsDialog/SettingsDialog.vue
+++ b/src/components/SettingsDialog/SettingsDialog.vue
@@ -62,6 +62,13 @@
@change="togglePlaySounds">
<label for="play_sounds">{{ t('spreed', 'Play sounds when participants join or leave a call') }}</label>
<em>{{ t('spreed', 'Sounds can currently not be played in Safari browser and iPad and iPhone devices due to technical restrictions by the manufacturer.') }}</em>
+
+ <a :href="settingsUrl"
+ target="_blank"
+ rel="noreferrer nofollow"
+ class="external">
+ {{ t('spreed', 'Sounds for chat and call notifications can be adjusted in the personal settings.') }} ↗
+ </a>
</AppSettingsSection>
<AppSettingsSection :title="t('spreed', 'Keyboard shortcuts')">
<em>{{ t('spreed', 'Speed up your Talk experience with these quick shortcuts.') }}</em>
@@ -125,6 +132,7 @@
</template>
<script>
+import { generateUrl } from '@nextcloud/router'
import { getFilePickerBuilder, showError, showSuccess } from '@nextcloud/dialogs'
import { PRIVACY } from '../../constants'
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
@@ -180,6 +188,10 @@ export default {
readStatusPrivacy() {
return this.$store.getters.getReadStatusPrivacy()
},
+
+ settingsUrl() {
+ return generateUrl('/settings/user/notifications')
+ },
},
mounted() {
diff --git a/src/constants.js b/src/constants.js
index f9d72765f..c54a6a5a4 100644
--- a/src/constants.js
+++ b/src/constants.js
@@ -100,8 +100,9 @@ export const PARTICIPANT = {
PUBLISH_AUDIO: 16,
PUBLISH_VIDEO: 32,
PUBLISH_SCREEN: 64,
- MAX_DEFAULT: 126,
- MAX_CUSTOM: 127,
+ CHAT: 128,
+ MAX_DEFAULT: 254,
+ MAX_CUSTOM: 255,
},
}
export const SHARED_ITEM = {
diff --git a/src/mixins/sharedItems.js b/src/mixins/sharedItems.js
new file mode 100644
index 000000000..5569733ae
--- /dev/null
+++ b/src/mixins/sharedItems.js
@@ -0,0 +1,57 @@
+/**
+ * @copyright Copyright (c) 2022 Marco Ambrosini <marcoambrosini@pm.me>
+ *
+ * @author Marco Ambrosini <marcoambrosini@pm.me>
+ *
+ * @license AGPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+import { SHARED_ITEM } from '../constants'
+
+const sharedItems = {
+ computed: {
+ // Defines the order of the sections
+ sharedItemsOrder() {
+ // FIXME restore when non files work return [SHARED_ITEM.TYPES.MEDIA, SHARED_ITEM.TYPES.FILE, SHARED_ITEM.TYPES.VOICE, SHARED_ITEM.TYPES.AUDIO, SHARED_ITEM.TYPES.LOCATION, SHARED_ITEM.TYPES.DECK_CARD, SHARED_ITEM.TYPES.OTHER]
+ return [SHARED_ITEM.TYPES.MEDIA, SHARED_ITEM.TYPES.FILE, SHARED_ITEM.TYPES.VOICE, SHARED_ITEM.TYPES.AUDIO]
+ },
+ },
+
+ methods: {
+ getTitle(type) {
+ switch (type) {
+ case SHARED_ITEM.TYPES.MEDIA:
+ return t('spreed', 'Media')
+ case SHARED_ITEM.TYPES.FILE:
+ return t('spreed', 'Files')
+ case SHARED_ITEM.TYPES.DECK_CARD:
+ return t('spreed', 'Deck cards')
+ case SHARED_ITEM.TYPES.VOICE:
+ return t('spreed', 'Voice messages')
+ case SHARED_ITEM.TYPES.LOCATION:
+ return t('spreed', 'Locations')
+ case SHARED_ITEM.TYPES.AUDIO:
+ return t('spreed', 'Audio')
+ case SHARED_ITEM.TYPES.OTHER:
+ default:
+ return t('spreed', 'Other')
+ }
+ },
+ },
+}
+
+export default sharedItems
diff --git a/src/services/conversationSharedItemsService.js b/src/services/sharedItemsService.js
index a0537ecf9..a0537ecf9 100644
--- a/src/services/conversationSharedItemsService.js
+++ b/src/services/sharedItemsService.js
diff --git a/src/store/guestNameStore.js b/src/store/guestNameStore.js
index 94f39acc5..48da79d9d 100644
--- a/src/store/guestNameStore.js
+++ b/src/store/guestNameStore.js
@@ -39,6 +39,14 @@ const getters = {
}
return t('spreed', 'Guest')
},
+
+ getGuestNameWithGuestSuffix: (state, getters) => (token, actorId) => {
+ const displayName = getters.getGuestName(token, actorId)
+ if (displayName === t('spreed', 'Guest')) {
+ return displayName
+ }
+ return t('spreed', '{guest} (guest)', { guest: displayName })
+ },
}
const mutations = {
diff --git a/src/store/conversationSharedItemsStore.js b/src/store/sharedItemsStore.js
index 9242dd0c8..b5ce88754 100644
--- a/src/store/conversationSharedItemsStore.js
+++ b/src/store/sharedItemsStore.js
@@ -21,7 +21,7 @@
*/
import Vue from 'vue'
-import { getSharedItemsOverview, getSharedItems } from '../services/conversationSharedItemsService'
+import { getSharedItemsOverview, getSharedItems } from '../services/sharedItemsService'
import { SHARED_ITEM } from '../constants'
const getItemTypeFromMessage = function(message) {
@@ -120,19 +120,19 @@ const actions = {
return false
}
- const limit = 100
+ const limit = 20
const lastKnownMessageId = Math.min.apply(Math, Object.keys(state.sharedItemsByConversationAndType[token][type]))
try {
const response = await getSharedItems(token, type, lastKnownMessageId, limit)
const messages = response.data.ocs.data
const hasMore = messages.length >= limit
-
// loop over the response elements and add them to the store
for (const message in messages) {
+
commit('addSharedItemMessage', {
token,
type,
- message,
+ message: messages[message],
})
}
return hasMore
diff --git a/src/store/storeConfig.js b/src/store/storeConfig.js
index 9f5fbe9c1..121f3cdcf 100644
--- a/src/store/storeConfig.js
+++ b/src/store/storeConfig.js
@@ -39,7 +39,7 @@ import uiModeStore from './uiModeStore'
import windowVisibilityStore from './windowVisibilityStore'
import messageActionsStore from './messageActionsStore'
import reactionsStore from './reactionsStore'
-import conversationSharedItemStore from './conversationSharedItemsStore'
+import sharedItemStore from './sharedItemsStore'
export default {
modules: {
@@ -62,7 +62,7 @@ export default {
windowVisibilityStore,
messageActionsStore,
reactionsStore,
- conversationSharedItemStore,
+ sharedItemStore,
},
mutations: {},
diff --git a/src/utils/signaling.js b/src/utils/signaling.js
index 6b6fbab32..c0d1fbb52 100644
--- a/src/utils/signaling.js
+++ b/src/utils/signaling.js
@@ -1292,7 +1292,7 @@ Signaling.Standalone.prototype.processRoomParticipantsEvent = function(data) {
}
}
-Signaling.Standalone.prototype.requestOffer = function(sessionid, roomType) {
+Signaling.Standalone.prototype.requestOffer = function(sessionid, roomType, sid = undefined) {
if (!this.hasFeature('mcu')) {
console.warn("Can't request an offer without a MCU.")
return
@@ -1302,7 +1302,7 @@ Signaling.Standalone.prototype.requestOffer = function(sessionid, roomType) {
// Got a user object.
sessionid = sessionid.sessionId || sessionid.sessionid
}
- console.debug('Request offer from', sessionid)
+ console.debug('Request offer from', sessionid, sid)
this.doSend({
type: 'message',
message: {
@@ -1313,6 +1313,7 @@ Signaling.Standalone.prototype.requestOffer = function(sessionid, roomType) {
data: {
type: 'requestoffer',
roomType,
+ sid,
},
},
})
diff --git a/src/utils/webrtc/RemoteVideoBlocker.js b/src/utils/webrtc/RemoteVideoBlocker.js
new file mode 100644
index 000000000..2a8a65cbd
--- /dev/null
+++ b/src/utils/webrtc/RemoteVideoBlocker.js
@@ -0,0 +1,131 @@
+/**
+ *
+ * @copyright Copyright (c) 2022, Daniel Calviño Sánchez (danxuliu@gmail.com)
+ *
+ * @license AGPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * Helper to block the remote video when not needed.
+ *
+ * A remote video is not needed if the local user explicitly disabled it
+ * (independently of whether the remote user (and thus owner of the remote
+ * video) has it enabled or not) or if it is not visible.
+ *
+ * The remote video is not immediately hidden when no longer visible; a few
+ * seconds are waited to avoid blocking and unblocking on layout changes.
+ *
+ * "increaseVisibleCounter()" can be called several times by the same view, but
+ * "decreaseVisibleCounter()" must have been called a corresponding number of
+ * times once the view is destroyed.
+ *
+ * A single RemoteVideoBlocker is assumed to be associated with its
+ * CallParticipantModel, and it is also assumed to be the only element blocking
+ * and unblocking the video. Otherwise the result is undefined.
+ *
+ * Note that the RemoteVideoBlocker can be used on participants that do not have
+ * a video at all (for example, because they do not have a camera or they do not
+ * have video permissions). In that case the CallParticipantModel will block the
+ * video if needed if it becomes available.
+ *
+ * @param {object} callParticipantModel the model to block/unblock the video on.
+ */
+export default function RemoteVideoBlocker(callParticipantModel) {
+ this._model = callParticipantModel
+
+ // Keep track of the blocked state here, as the Peer object may not block
+ // the video if some features are missing, and even if the video is blocked
+ // the attribute will not be updated right away but once the renegotiation
+ // is done.
+ this._blocked = false
+
+ this._enabled = true
+ this._visibleCounter = 1
+
+ this._blockVideoTimeout = null
+
+ // Block by default if not shown after creation.
+ this.decreaseVisibleCounter()
+}
+
+RemoteVideoBlocker.prototype = {
+
+ isVideoEnabled() {
+ return this._enabled
+ },
+
+ setVideoEnabled(enabled) {
+ this._enabled = enabled
+
+ const hadBlockVideoTimeout = this._blockVideoTimeout
+
+ clearTimeout(this._blockVideoTimeout)
+ this._blockVideoTimeout = null
+
+ if (!this._visibleCounter && !hadBlockVideoTimeout) {
+ return
+ }
+
+ this._setVideoBlocked(!enabled)
+ },
+
+ increaseVisibleCounter() {
+ this._visibleCounter++
+
+ clearTimeout(this._blockVideoTimeout)
+ this._blockVideoTimeout = null
+
+ if (!this._enabled) {
+ return
+ }
+
+ this._setVideoBlocked(false)
+ },
+
+ decreaseVisibleCounter() {
+ if (this._visibleCounter <= 0) {
+ console.error('Visible counter decreased when not visible')
+
+ return
+ }
+
+ this._visibleCounter--
+
+ if (this._visibleCounter > 0 || !this._enabled) {
+ return
+ }
+
+ clearTimeout(this._blockVideoTimeout)
+
+ this._blockVideoTimeout = setTimeout(() => {
+ this._setVideoBlocked(true)
+
+ this._blockVideoTimeout = null
+ }, 5000)
+ },
+
+ _setVideoBlocked(blocked) {
+ if (this._blocked === blocked) {
+ return
+ }
+
+ this._blocked = blocked
+
+ this._model.setVideoBlocked(blocked)
+ },
+
+}
diff --git a/src/utils/webrtc/RemoteVideoBlocker.spec.js b/src/utils/webrtc/RemoteVideoBlocker.spec.js
new file mode 100644
index 000000000..700b2918b
--- /dev/null
+++ b/src/utils/webrtc/RemoteVideoBlocker.spec.js
@@ -0,0 +1,336 @@
+/**
+ *
+ * @copyright Copyright (c) 2022, Daniel Calviño Sánchez (danxuliu@gmail.com)
+ *
+ * @license AGPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+import RemoteVideoBlocker from './RemoteVideoBlocker'
+
+describe('RemoteVideoBlocker', () => {
+ let callParticipantModel
+ let remoteVideoBlocker
+
+ beforeEach(() => {
+ jest.useFakeTimers()
+
+ callParticipantModel = {
+ setVideoBlocked: jest.fn()
+ }
+
+ remoteVideoBlocker = new RemoteVideoBlocker(callParticipantModel)
+ })
+
+ test('blocks the video by default if not shown in some seconds', () => {
+ jest.advanceTimersByTime(4000)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(0)
+
+ jest.advanceTimersByTime(1000)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+
+ describe('set video enabled', () => {
+ test('immediately blocks the video', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+
+ remoteVideoBlocker.setVideoEnabled(false)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(false)
+ })
+ test('immediately unblocks the video', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+
+ remoteVideoBlocker.setVideoEnabled(false)
+ remoteVideoBlocker.setVideoEnabled(true)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(2)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenNthCalledWith(2, false)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+ })
+
+ describe('set video visible', () => {
+ test('does nothing if shown', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(0)
+ expect(remoteVideoBlocker._visibleCounter).toBe(1)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+
+ test('does nothing if hidden without showing first', () => {
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(remoteVideoBlocker._visibleCounter).toBe(0)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+
+ test('blocks the video after some seconds when hidden', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.advanceTimersByTime(4000)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(0)
+
+ jest.advanceTimersByTime(1000)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+ expect(remoteVideoBlocker._visibleCounter).toBe(0)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+
+ test('does nothing if shown again before blocking', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.advanceTimersByTime(4000)
+
+ remoteVideoBlocker.increaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(0)
+ expect(remoteVideoBlocker._visibleCounter).toBe(1)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+
+ test('immediately unblocks the video after showing', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ remoteVideoBlocker.increaseVisibleCounter()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(2)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenNthCalledWith(2, false)
+ expect(remoteVideoBlocker._visibleCounter).toBe(1)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+
+ test('does nothing if not fully hidden', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(0)
+ expect(remoteVideoBlocker._visibleCounter).toBe(2)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+ })
+
+ describe('set video enabled and visible', () => {
+ test('immediately blocks the video if disabled when visible', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+
+ remoteVideoBlocker.setVideoEnabled(false)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(false)
+ })
+
+ test('immediately blocks the video if disabled before blocking after hidden', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.advanceTimersByTime(4000)
+
+ remoteVideoBlocker.setVideoEnabled(false)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(false)
+ })
+
+ test('blocks the video after some seconds if hidden when enabled', () => {
+ remoteVideoBlocker.setVideoEnabled(true)
+
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.advanceTimersByTime(4000)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(0)
+
+ jest.advanceTimersByTime(1000)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+
+ test('does nothing if disabled when hidden', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ remoteVideoBlocker.setVideoEnabled(false)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(false)
+ })
+
+ test('does nothing if enabled when hidden', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ remoteVideoBlocker.setVideoEnabled(false)
+ remoteVideoBlocker.setVideoEnabled(true)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+
+ test('does nothing if hidden when disabled', () => {
+ remoteVideoBlocker.setVideoEnabled(false)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(false)
+ })
+
+ test('does nothing if shown when disabled', () => {
+ remoteVideoBlocker.setVideoEnabled(false)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(false)
+ })
+
+ test('immediately unblocks the video if enabled after showing', () => {
+ remoteVideoBlocker.setVideoEnabled(false)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.increaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+
+ remoteVideoBlocker.setVideoEnabled(true)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(2)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenNthCalledWith(2, false)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+
+ test('immediately unblocks the video if shown after enabled', () => {
+ remoteVideoBlocker.increaseVisibleCounter()
+ remoteVideoBlocker.decreaseVisibleCounter()
+
+ jest.runAllTimers()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledWith(true)
+
+ remoteVideoBlocker.setVideoEnabled(false)
+ remoteVideoBlocker.setVideoEnabled(true)
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(1)
+
+ remoteVideoBlocker.increaseVisibleCounter()
+
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenCalledTimes(2)
+ expect(callParticipantModel.setVideoBlocked).toHaveBeenNthCalledWith(2, false)
+
+ expect(remoteVideoBlocker.isVideoEnabled()).toBe(true)
+ })
+ })
+})
diff --git a/src/utils/webrtc/models/CallParticipantModel.js b/src/utils/webrtc/models/CallParticipantModel.js
index 354067454..6362e14e3 100644
--- a/src/utils/webrtc/models/CallParticipantModel.js
+++ b/src/utils/webrtc/models/CallParticipantModel.js
@@ -65,6 +65,9 @@ export default function CallParticipantModel(options) {
audioElement: null,
audioAvailable: undefined,
speaking: undefined,
+ // "videoBlocked" is "true" only if the video is blocked and it would
+ // have been available in the remote peer if not blocked.
+ videoBlocked: undefined,
videoAvailable: undefined,
screen: null,
// The audio element is part of the model to ensure that it can be
@@ -89,6 +92,7 @@ export default function CallParticipantModel(options) {
this._handleSignalingStateChangeBound = this._handleSignalingStateChange.bind(this)
this._handleChannelMessageBound = this._handleChannelMessage.bind(this)
this._handleRaisedHandBound = this._handleRaisedHand.bind(this)
+ this._handleRemoteVideoBlockedBound = this._handleRemoteVideoBlocked.bind(this)
this._webRtc.on('peerStreamAdded', this._handlePeerStreamAddedBound)
this._webRtc.on('peerStreamRemoved', this._handlePeerStreamRemovedBound)
@@ -105,6 +109,7 @@ CallParticipantModel.prototype = {
if (this.get('peer')) {
this.get('peer').off('extendedIceConnectionStateChange', this._handleExtendedIceConnectionStateChangeBound)
this.get('peer').off('signalingStateChange', this._handleSignalingStateChangeBound)
+ this.get('peer').off('remoteVideoBlocked', this._handleRemoteVideoBlockedBound)
}
this._webRtc.off('peerStreamAdded', this._handlePeerStreamAddedBound)
@@ -249,6 +254,7 @@ CallParticipantModel.prototype = {
if (this.get('peer')) {
this.get('peer').off('extendedIceConnectionStateChange', this._handleExtendedIceConnectionStateChangeBound)
this.get('peer').off('signalingStateChange', this._handleSignalingStateChangeBound)
+ this.get('peer').off('remoteVideoBlocked', this._handleRemoteVideoBlockedBound)
}
this.set('peer', peer)
@@ -261,6 +267,7 @@ CallParticipantModel.prototype = {
this.set('audioAvailable', false)
this.set('speaking', false)
this.set('videoAvailable', false)
+ this.set('videoBlocked', false)
return
}
@@ -275,9 +282,19 @@ CallParticipantModel.prototype = {
}
this._handleSignalingStateChange(this.get('peer').pc.signalingState)
this._handlePeerStreamAdded(this.get('peer'))
+ this._handleRemoteVideoBlocked(undefined)
this.get('peer').on('extendedIceConnectionStateChange', this._handleExtendedIceConnectionStateChangeBound)
this.get('peer').on('signalingStateChange', this._handleSignalingStateChangeBound)
+ this.get('peer').on('remoteVideoBlocked', this._handleRemoteVideoBlockedBound)
+
+ // Set expected state in Peer object.
+ if (this._simulcastVideoQuality !== undefined) {
+ this.setSimulcastVideoQuality(this._simulcastVideoQuality)
+ }
+ if (this._videoBlocked !== undefined) {
+ this.setVideoBlocked(this._videoBlocked)
+ }
},
_handleExtendedIceConnectionStateChange(extendedIceConnectionState) {
@@ -363,6 +380,11 @@ CallParticipantModel.prototype = {
// Reset state that depends on the screen Peer object.
this._handlePeerStreamAdded(this.get('screenPeer'))
+
+ // Set expected state in screen Peer object.
+ if (this._simulcastScreenQuality !== undefined) {
+ this.setSimulcastScreenQuality(this._simulcastScreenQuality)
+ }
},
setUserId(userId) {
@@ -373,7 +395,25 @@ CallParticipantModel.prototype = {
this.set('nextcloudSessionId', nextcloudSessionId)
},
+ setVideoBlocked(videoBlocked) {
+ // Store value to be able to apply it again if a new Peer object is set.
+ this._videoBlocked = videoBlocked
+
+ if (!this.get('peer')) {
+ return
+ }
+
+ this.get('peer').setRemoteVideoBlocked(videoBlocked)
+ },
+
+ _handleRemoteVideoBlocked(remoteVideoBlocked) {
+ this.set('videoBlocked', remoteVideoBlocked)
+ },
+
setSimulcastVideoQuality(simulcastVideoQuality) {
+ // Store value to be able to apply it again if a new Peer object is set.
+ this._simulcastVideoQuality = simulcastVideoQuality
+
if (!this.get('peer') || !this.get('peer').enableSimulcast) {
return
}
@@ -383,6 +423,10 @@ CallParticipantModel.prototype = {
},
setSimulcastScreenQuality(simulcastScreenQuality) {
+ // Store value to be able to apply it again if a new screen Peer object
+ // is set.
+ this._simulcastScreenQuality = simulcastScreenQuality
+
if (!this.get('screenPeer') || !this.get('screenPeer').enableSimulcast) {
return
}
diff --git a/src/utils/webrtc/simplewebrtc/peer.js b/src/utils/webrtc/simplewebrtc/peer.js
index 6d64b20a4..6b0a987a8 100644
--- a/src/utils/webrtc/simplewebrtc/peer.js
+++ b/src/utils/webrtc/simplewebrtc/peer.js
@@ -31,6 +31,7 @@ function Peer(options) {
this.oneway = options.oneway || false
this.sharemyscreen = options.sharemyscreen || false
this.stream = options.stream
+ this.receiverOnly = options.receiverOnly
this.sendVideoIfAvailable = options.sendVideoIfAvailable === undefined ? true : options.sendVideoIfAvailable
this.enableDataChannels = options.enableDataChannels === undefined ? this.parent.config.enableDataChannels : options.enableDataChannels
this.enableSimulcast = options.enableSimulcast === undefined ? this.parent.config.enableSimulcast : options.enableSimulcast
@@ -418,12 +419,49 @@ Peer.prototype.offer = function(options) {
Peer.prototype.handleOffer = function(offer) {
this.pc.setRemoteDescription(offer).then(function() {
+ this._blockRemoteVideoIfNeeded()
+
this.answer()
}.bind(this)).catch(function(error) {
console.warn('setRemoteDescription for offer failed: ', error)
})
}
+/**
+ * Blocks remote video based on "_remoteVideoShouldBeBlocked".
+ *
+ * 'remoteVideoBlocked' is emitted if the blocked state changes.
+ *
+ * Currently remote video can be blocked only when the HPB is used, so this
+ * method should be called immediately before creating the answer (the answer
+ * must be created in the same "tick" that this method is called).
+ *
+ * Note that if the transceiver direction changes after creating the answer but
+ * before setting it as the local description the "negotiationneeded" event will
+ * be automatically emitted again.
+ */
+Peer.prototype._blockRemoteVideoIfNeeded = function() {
+ const remoteVideoWasBlocked = this._remoteVideoBlocked
+
+ this._remoteVideoBlocked = undefined
+
+ this.pc.getTransceivers().forEach(transceiver => {
+ if (transceiver.mid === 'video' && !transceiver.stopped) {
+ if (this._remoteVideoShouldBeBlocked) {
+ transceiver.direction = 'inactive'
+
+ this._remoteVideoBlocked = true
+ } else {
+ this._remoteVideoBlocked = false
+ }
+ }
+ })
+
+ if (remoteVideoWasBlocked !== this._remoteVideoBlocked) {
+ this.emit('remoteVideoBlocked', this._remoteVideoBlocked)
+ }
+}
+
Peer.prototype.answer = function() {
this.pc.createAnswer().then(function(answer) {
this.pc.setLocalDescription(answer).then(function() {
@@ -816,6 +854,36 @@ Peer.prototype.handleLocalTrackEnabledChanged = function(track, stream) {
}
}
+Peer.prototype.setRemoteVideoBlocked = function(remoteVideoBlocked) {
+ // If the HPB is not used or if it is used and this is a sender peer the
+ // remote video can not be blocked.
+ // Besides that the remote video is not blocked either if the signaling
+ // server does not support updating the subscribers; in that case a new
+ // connection would need to be established and due to this the audio would
+ // be interrupted during the connection change.
+ if (!this.receiverOnly || !this.parent.config.connection.hasFeature('update-sdp')) {
+ return
+ }
+
+ this._remoteVideoShouldBeBlocked = remoteVideoBlocked
+
+ // The "negotiationneeded" event is emitted if needed based on the direction
+ // changes.
+ // Note that there will be a video transceiver even if the remote
+ // participant is sending a null video track (either because there is a
+ // camera but the video is disabled or because the camera was removed during
+ // the call), so a renegotiation could be needed also in that case.
+ this.pc.getTransceivers().forEach(transceiver => {
+ if (transceiver.mid === 'video' && !transceiver.stopped) {
+ if (remoteVideoBlocked) {
+ transceiver.direction = 'inactive'
+ } else {
+ transceiver.direction = 'recvonly'
+ }
+ }
+ })
+}
+
Peer.prototype.handleRemoteStreamAdded = function(event) {
const self = this
if (this.stream) {
diff --git a/src/utils/webrtc/webrtc.js b/src/utils/webrtc/webrtc.js
index ec2c54d77..c5b97f7ab 100644
--- a/src/utils/webrtc/webrtc.js
+++ b/src/utils/webrtc/webrtc.js
@@ -367,6 +367,10 @@ function usersChanged(signaling, newUsers, disconnectedSessionIds) {
// TODO(jojo): Already create peer object to avoid duplicate offers.
signaling.requestOffer(user, 'video')
+ // Clearing the previous delayedConnectionToPeer should not be
+ // needed here, but just in case.
+ clearInterval(delayedConnectionToPeer[user.sessionId])
+
delayedConnectionToPeer[user.sessionId] = setInterval(function() {
console.debug('No offer received for new peer, request offer again')
@@ -781,6 +785,8 @@ export default function initWebRtc(signaling, _callParticipantCollection, _local
signaling.requestOffer(peer.id, 'video')
+ clearInterval(delayedConnectionToPeer[peer.id])
+
delayedConnectionToPeer[peer.id] = setInterval(function() {
console.debug('No offer received, request offer again', peer)
@@ -926,6 +932,41 @@ export default function initWebRtc(signaling, _callParticipantCollection, _local
*/
function setHandlerForNegotiationNeeded(peer) {
peer.pc.addEventListener('negotiationneeded', function() {
+ // When the HPB is used and the negotiation is needed for a receiver
+ // peer (for example, to block the received video) there is no need
+ // to force a full reconnection, it is enough to reconnect only that
+ // peer.
+ if (signaling.hasFeature('mcu') && peer.id !== signaling.getSessionId()) {
+ // If possible update connection rather than creating a new one.
+ let update = signaling.hasFeature('update-sdp')
+
+ // Create a connection if the current one has failed, as it
+ // would require an ICE restart rather than update to recover.
+ if (update && (peer.pc.iceConnectionState === 'failed' || peer.pc.connectionState === 'failed')) {
+ update = false
+ }
+
+ // If the connection needs to be updated but a new connection
+ // (or another update) is already pending ignore the new update.
+ // If a new connection needs to be created rather than updated
+ // then force it even if there is another one already pending.
+ if (update && delayedConnectionToPeer[peer.id]) {
+ return
+ }
+
+ signaling.requestOffer(peer.id, 'video', update ? peer.sid : undefined)
+
+ clearInterval(delayedConnectionToPeer[peer.id])
+
+ delayedConnectionToPeer[peer.id] = setInterval(function() {
+ console.debug('No offer received, request offer again' + update ? '(update)' : '', peer)
+
+ signaling.requestOffer(peer.id, 'video', update ? peer.sid : undefined)
+ }, 10000)
+
+ return
+ }
+
// Negotiation needed will be first triggered before the connection
// is established, but forcing a reconnection should be done only
// once the connection was established.
diff --git a/tests/integration/features/bootstrap/FeatureContext.php b/tests/integration/features/bootstrap/FeatureContext.php
index fd722589a..992fa9ddd 100644
--- a/tests/integration/features/bootstrap/FeatureContext.php
+++ b/tests/integration/features/bootstrap/FeatureContext.php
@@ -63,6 +63,7 @@ class FeatureContext implements Context, SnippetAcceptingContext {
'A' => 16, // PERMISSIONS_PUBLISH_AUDIO
'V' => 32, // PERMISSIONS_PUBLISH_VIDEO
'P' => 64, // PERMISSIONS_PUBLISH_SCREEN
+ 'M' => 128, // PERMISSIONS_CHAT
];
/** @var string */
@@ -2300,6 +2301,7 @@ class FeatureContext implements Context, SnippetAcceptingContext {
$result = array_map(static function ($reaction, $list) use ($expected): array {
$list = array_map(function ($reaction) {
unset($reaction['timestamp']);
+ $reaction['actorId'] = ($reaction['actorType'] === 'guests') ? self::$sessionIdToUser[$reaction['actorId']] : (string) $reaction['actorId'];
return $reaction;
}, $list);
Assert::assertArrayHasKey($reaction, $expected, 'Not expected reaction: ' . $reaction);
diff --git a/tests/integration/features/chat/delete.feature b/tests/integration/features/chat/delete.feature
index 518c0f173..288429771 100644
--- a/tests/integration/features/chat/delete.feature
+++ b/tests/integration/features/chat/delete.feature
@@ -47,6 +47,22 @@ Feature: chat/reply
Then user "participant1" received a system messages in room "group room" to delete "Message 1"
Then user "participant2" received a system messages in room "group room" to delete "Message 1"
+ Scenario: user cannot delete without chat permission
+ Given user "participant1" creates room "group room" (v4)
+ | roomType | 2 |
+ | roomName | room |
+ And user "participant1" adds user "participant2" to room "group room" with 200 (v4)
+ And user "participant2" sends message "Message 1" to room "group room" with 201
+ Then user "participant1" sees the following messages in room "group room" with 200
+ | room | actorType | actorId | actorDisplayName | message | messageParameters | parentMessage |
+ | group room | users | participant2 | participant2-displayname | Message 1 | [] | |
+ # Removing chat permission only
+ Then user "participant1" sets permissions for "participant2" in room "group room" to "CSJLAVP" with 200 (v4)
+ And user "participant2" deletes message "Message 1" from room "group room" with 403
+ Then user "participant1" sees the following messages in room "group room" with 200
+ | room | actorType | actorId | actorDisplayName | message | messageParameters | parentMessage |
+ | group room | users | participant2 | participant2-displayname | Message 1 | [] | |
+
Scenario: moderator deletes other user message
Given user "participant1" creates room "group room" (v4)
| roomType | 2 |
diff --git a/tests/integration/features/chat/file-share.feature b/tests/integration/features/chat/file-share.feature
index cb35a4d16..caae8ffae 100644
--- a/tests/integration/features/chat/file-share.feature
+++ b/tests/integration/features/chat/file-share.feature
@@ -1,6 +1,7 @@
Feature: chat/public
Background:
Given user "participant1" exists
+ Given user "participant2" exists
Scenario: Share a file to a chat
Given user "participant1" creates room "public room" (v4)
@@ -11,6 +12,18 @@ Feature: chat/public
| room | actorType | actorId | actorDisplayName | message | messageParameters |
| public room | users | participant1 | participant1-displayname | {file} | "IGNORE" |
+ Scenario: Can not share a file without chat permission
+ Given user "participant1" creates room "public room" (v4)
+ | roomType | 3 |
+ | roomName | room |
+ And user "participant1" adds user "participant2" to room "public room" with 200 (v4)
+ # Removing chat permission only
+ Then user "participant1" sets permissions for "participant2" in room "public room" to "CSJLAVP" with 200 (v4)
+ When user "participant2" shares "welcome.txt" with room "public room"
+ And the OCS status code should be 404
+ Then user "participant1" sees the following messages in room "public room" with 200
+ | room | actorType | actorId | actorDisplayName | message | messageParameters |
+
Scenario: Delete share a file message from a chat
Given user "participant1" creates room "public room" (v4)
| roomType | 3 |
@@ -23,3 +36,19 @@ Feature: chat/public
Then user "participant1" sees the following messages in room "public room" with 200
| room | actorType | actorId | actorDisplayName | message | messageParameters |
| public room | users | participant1 | participant1-displayname | Message deleted by you | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"}} |
+
+ Scenario: Can not delete a share file message without chat permission
+ Given user "participant1" creates room "public room" (v4)
+ | roomType | 3 |
+ | roomName | room |
+ And user "participant1" adds user "participant2" to room "public room" with 200 (v4)
+ When user "participant2" shares "welcome.txt" with room "public room"
+ Then user "participant1" sees the following messages in room "public room" with 200
+ | room | actorType | actorId | actorDisplayName | message | messageParameters |
+ | public room | users | participant2 | participant2-displayname | {file} | "IGNORE" |
+ # Removing chat permission only
+ Then user "participant1" sets permissions for "participant2" in room "public room" to "CSJLAVP" with 200 (v4)
+ And user "participant2" deletes message "shared::file::welcome.txt" from room "public room" with 403
+ Then user "participant1" sees the following messages in room "public room" with 200
+ | room | actorType | actorId | actorDisplayName | message | messageParameters |
+ | public room | users | participant2 | participant2-displayname | {file} | "IGNORE" |
diff --git a/tests/integration/features/chat/group.feature b/tests/integration/features/chat/group.feature
index 255258450..9021ce8c9 100644
--- a/tests/integration/features/chat/group.feature
+++ b/tests/integration/features/chat/group.feature
@@ -24,6 +24,18 @@ Feature: chat/group
| room | actorType | actorId | actorDisplayName | message | messageParameters |
| group room | users | participant2 | participant2-displayname | Message 1 | [] |
+ Scenario: invited user can not send without chat permissions
+ Given user "participant1" creates room "group room" (v4)
+ | roomType | 2 |
+ | invite | attendees1 |
+ # Removing chat permission only
+ Then user "participant1" sets permissions for "participant2" in room "group room" to "CSJLAVP" with 200 (v4)
+ When user "participant2" sends message "Message 1" to room "group room" with 403
+ When user "participant1" sends message "Message 2" to room "group room" with 201
+ Then user "participant2" sees the following messages in room "group room" with 200
+ | room | actorType | actorId | actorDisplayName | message | messageParameters |
+ | group room | users | participant1 | participant1-displayname | Message 2 | [] |
+
Scenario: not invited user can not send nor receive chat messages to nor from group room
Given user "participant1" creates room "group room" (v4)
| roomType | 2 |
diff --git a/tests/integration/features/chat/public.feature b/tests/integration/features/chat/public.feature
index d0617b456..7f3391ec9 100644
--- a/tests/integration/features/chat/public.feature
+++ b/tests/integration/features/chat/public.feature
@@ -23,6 +23,19 @@ Feature: chat/public
| room | actorType | actorId | actorDisplayName | message | messageParameters |
| public room | users | participant2 | participant2-displayname | Message 1 | [] |
+ Scenario: invited user can not send without chat permissions
+ Given user "participant1" creates room "public room" (v4)
+ | roomType | 3 |
+ | roomName | room |
+ And user "participant1" adds user "participant2" to room "public room" with 200 (v4)
+ # Removing chat permission only
+ Then user "participant1" sets permissions for "participant2" in room "public room" to "CSJLAVP" with 200 (v4)
+ When user "participant2" sends message "Message 1" to room "public room" with 403
+ When user "participant1" sends message "Message 2" to room "public room" with 201
+ Then user "participant2" sees the following messages in room "public room" with 200
+ | room | actorType | actorId | actorDisplayName | message | messageParameters |
+ | public room | users | participant1 | participant1-displayname | Message 2 | [] |
+
Scenario: not invited but joined user can send and receive chat messages to and from public room
Given user "participant1" creates room "public room" (v4)
| roomType | 3 |
diff --git a/tests/integration/features/chat/rich-object-share.feature b/tests/integration/features/chat/rich-object-share.feature
index 467a72501..7cc083b3a 100644
--- a/tests/integration/features/chat/rich-object-share.feature
+++ b/tests/integration/features/chat/rich-object-share.feature
@@ -1,6 +1,7 @@
Feature: chat/public
Background:
Given user "participant1" exists
+ Given user "participant2" exists
Scenario: Share a rich object to a chat
Given user "participant1" creates room "public room" (v4)
@@ -11,6 +12,17 @@ Feature: chat/public
| room | actorType | actorId | actorDisplayName | message | messageParameters |
| public room | users | participant1 | participant1-displayname | {object} | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"},"object":{"name":"Another room","call-type":"group","type":"call","id":"R4nd0mT0k3n"}} |
+ Scenario: Can not share without chat permission
+ Given user "participant1" creates room "public room" (v4)
+ | roomType | 3 |
+ | roomName | room |
+ And user "participant1" adds user "participant2" to room "public room" with 200 (v4)
+ # Removing chat permission only
+ Then user "participant1" sets permissions for "participant2" in room "public room" to "CSJLAVP" with 200 (v4)
+ When user "participant2" shares rich-object "call" "R4nd0mT0k3n" '{"name":"Another room","call-type":"group"}' to room "public room" with 403 (v1)
+ Then user "participant1" sees the following messages in room "public room" with 200
+ | room | actorType | actorId | actorDisplayName | message | messageParameters |
+
Scenario: Delete a rich object from a chat
Given user "participant1" creates room "public room" (v4)
| roomType | 3 |
@@ -21,6 +33,19 @@ Feature: chat/public
| room | actorType | actorId | actorDisplayName | message | messageParameters | parentMessage |
| public room | users | participant1 | participant1-displayname | Message deleted by you | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"}} | |
+ Scenario: Can not delete without chat permission
+ Given user "participant1" creates room "public room" (v4)
+ | roomType | 3 |
+ | roomName | room |
+ And user "participant1" adds user "participant2" to room "public room" with 200 (v4)
+ When user "participant2" shares rich-object "call" "R4nd0mT0k3n" '{"name":"Another room","call-type":"group"}' to room "public room" with 201 (v1)
+ # Removing chat permission only
+ Then user "participant1" sets permissions for "participant2" in room "public room" to "CSJLAVP" with 200 (v4)
+ And user "participant2" deletes message "shared::call::R4nd0mT0k3n" from room "public room" with 403
+ Then user "participant1" sees the following messages in room "public room" with 200
+ | room | actorType | actorId | actorDisplayName | message | messageParameters |
+ | public room | users | participant2 | participant2-displayname | {object} | {"actor":{"type":"user","id":"participant2","name":"participant2-displayname"},"object":{"name":"Another room","call-type":"group","type":"call","id":"R4nd0mT0k3n"}} |
+
Scenario: Share an invalid rich object to a chat
Given user "participant1" creates room "public room" (v4)
| roomType | 3 |
diff --git a/tests/integration/features/conversation-2/set-participant-permissions.feature b/tests/integration/features/conversation-2/set-participant-permissions.feature
index 7f0beb3cd..8126acbb1 100644
--- a/tests/integration/features/conversation-2/set-participant-permissions.feature
+++ b/tests/integration/features/conversation-2/set-participant-permissions.feature
@@ -16,12 +16,12 @@ Feature: set-publishing-permissions
And user "moderator" sets permissions for "moderator" in room "one-to-one room" to "S" with 400 (v4)
Then user "owner" sees the following attendees in room "one-to-one room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
And user "moderator" sees the following attendees in room "one-to-one room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
Scenario: owner can set permissions in group room
Given user "owner" creates room "group room" (v4)
@@ -36,18 +36,18 @@ Feature: set-publishing-permissions
And user "owner" sets permissions for "invited user" in room "group room" to "S" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
And user "moderator" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
And user "invited user" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
Scenario: moderator can set permissions in group room
@@ -63,18 +63,18 @@ Feature: set-publishing-permissions
And user "owner" sets permissions for "invited user" in room "group room" to "S" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
And user "moderator" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
And user "invited user" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
Scenario: others can not set permissions in group room
@@ -98,19 +98,19 @@ Feature: set-publishing-permissions
And user "guest not joined" sets permissions for "invited user" in room "group room" to "S" with 404 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
- | users | invited user | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
+ | users | invited user | SJAVPM |
And user "moderator" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
- | users | invited user | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
+ | users | invited user | SJAVPM |
And user "invited user" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
- | users | invited user | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
+ | users | invited user | SJAVPM |
Scenario: owner can set permissions in public room
Given user "owner" creates room "public room" (v4)
@@ -132,43 +132,43 @@ Feature: set-publishing-permissions
And user "owner" sets permissions for "guest" in room "public room" to "S" with 200 (v4)
Then user "owner" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "moderator" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "invited user" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "not invited but joined user" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "guest moderator" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
Scenario: moderator can set permissions in public room
@@ -191,43 +191,43 @@ Feature: set-publishing-permissions
And user "moderator" sets permissions for "guest" in room "public room" to "S" with 200 (v4)
Then user "owner" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "moderator" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "invited user" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "not invited but joined user" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "guest moderator" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
# Guests can not fetch the participant list
@@ -252,43 +252,43 @@ Feature: set-publishing-permissions
And user "guest moderator" sets permissions for "guest" in room "public room" to "S" with 200 (v4)
Then user "owner" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "moderator" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "invited user" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "not invited but joined user" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
And user "guest moderator" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
| users | not invited but joined user | CS |
- | guests | "guest moderator" | SJLAVP |
+ | guests | "guest moderator" | SJLAVPM |
| guests | "guest" | CS |
# Guests can not fetch the participant list
@@ -338,44 +338,44 @@ Feature: set-publishing-permissions
And user "guest not joined" sets permissions for "guest" in room "public room" to "S" with 404 (v4)
Then user "owner" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
- | users | invited user | SJAVP |
- | users | not invited but joined user | SJAVP |
- | guests | "guest moderator" | SJLAVP |
- | guests | "guest" | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
+ | users | invited user | SJAVPM |
+ | users | not invited but joined user | SJAVPM |
+ | guests | "guest moderator" | SJLAVPM |
+ | guests | "guest" | SJAVPM |
And user "moderator" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
- | users | invited user | SJAVP |
- | users | not invited but joined user | SJAVP |
- | guests | "guest moderator" | SJLAVP |
- | guests | "guest" | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
+ | users | invited user | SJAVPM |
+ | users | not invited but joined user | SJAVPM |
+ | guests | "guest moderator" | SJLAVPM |
+ | guests | "guest" | SJAVPM |
And user "invited user" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
- | users | invited user | SJAVP |
- | users | not invited but joined user | SJAVP |
- | guests | "guest moderator" | SJLAVP |
- | guests | "guest" | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
+ | users | invited user | SJAVPM |
+ | users | not invited but joined user | SJAVPM |
+ | guests | "guest moderator" | SJLAVPM |
+ | guests | "guest" | SJAVPM |
And user "not invited but joined user" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
- | users | invited user | SJAVP |
- | users | not invited but joined user | SJAVP |
- | guests | "guest moderator" | SJLAVP |
- | guests | "guest" | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
+ | users | invited user | SJAVPM |
+ | users | not invited but joined user | SJAVPM |
+ | guests | "guest moderator" | SJLAVPM |
+ | guests | "guest" | SJAVPM |
And user "guest moderator" sees the following attendees in room "public room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
- | users | invited user | SJAVP |
- | users | not invited but joined user | SJAVP |
- | guests | "guest moderator" | SJLAVP |
- | guests | "guest" | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
+ | users | invited user | SJAVPM |
+ | users | not invited but joined user | SJAVPM |
+ | guests | "guest moderator" | SJLAVPM |
+ | guests | "guest" | SJAVPM |
# Guests can not fetch the participant list
Scenario: participants can not set permissions in room for a share
@@ -402,14 +402,14 @@ Feature: set-publishing-permissions
And user "guest" sets permissions for "guest" in room "file last share room" to "S" with 403 (v4)
Then user "owner of file" sees the following attendees in room "file last share room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner of file | SJAVP |
- | users | user with access to file | SJAVP |
- | guests | "guest" | SJAVP |
+ | users | owner of file | SJAVPM |
+ | users | user with access to file | SJAVPM |
+ | guests | "guest" | SJAVPM |
And user "user with access to file" sees the following attendees in room "file last share room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner of file | SJAVP |
- | users | user with access to file | SJAVP |
- | guests | "guest" | SJAVP |
+ | users | owner of file | SJAVPM |
+ | users | user with access to file | SJAVPM |
+ | guests | "guest" | SJAVPM |
# This does not make much sense, but there is no real need to block it either.
Scenario: owner can set permissions in a password request room
@@ -427,5 +427,5 @@ Feature: set-publishing-permissions
And user "owner of file" sets permissions for "guest" in room "password request for last share room" to "S" with 200 (v4)
Then user "owner of file" sees the following attendees in room "password request for last share room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner of file | SJLAVP |
+ | users | owner of file | SJLAVPM |
| guests | "guest" | CS |
diff --git a/tests/integration/features/conversation-2/set-permissions.feature b/tests/integration/features/conversation-2/set-permissions.feature
index c04b4f021..6cf6c4919 100644
--- a/tests/integration/features/conversation-2/set-permissions.feature
+++ b/tests/integration/features/conversation-2/set-permissions.feature
@@ -13,26 +13,26 @@ Feature: set-publishing-permissions
And user "owner" adds user "invited user" to room "group room" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
- | users | invited user | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
+ | users | invited user | SJAVPM |
When user "owner" sets default permissions for room "group room" to "S" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CS |
When user "moderator" sets default permissions for room "group room" to "AV" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CAV |
When user "invited user" sets default permissions for room "group room" to "D" with 403 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CAV |
Scenario: Owner and moderators can set call permissions users can not
@@ -47,8 +47,8 @@ Feature: set-publishing-permissions
When user "invited user" sets call permissions for room "group room" to "D" with 403 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | moderator | SJLAVP |
+ | users | owner | SJLAVPM |
+ | users | moderator | SJLAVPM |
| users | invited user | CAV |
Scenario: User setting over call setting over conversation setting over default
@@ -59,33 +59,33 @@ Feature: set-publishing-permissions
When user "owner" sets default permissions for room "group room" to "S" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
+ | users | owner | SJLAVPM |
| users | invited user | CS |
When user "owner" sets call permissions for room "group room" to "A" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
+ | users | owner | SJLAVPM |
| users | invited user | CA |
And user "owner" sets permissions for "invited user" in room "group room" to "V" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
+ | users | owner | SJLAVPM |
| users | invited user | CV |
And user "owner" sets permissions for "invited user" in room "group room" to "D" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
+ | users | owner | SJLAVPM |
| users | invited user | CA |
When user "owner" sets call permissions for room "group room" to "D" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
+ | users | owner | SJLAVPM |
| users | invited user | CS |
When user "owner" sets default permissions for room "group room" to "D" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions |
- | users | owner | SJLAVP |
- | users | invited user | SJAVP |
+ | users | owner | SJLAVPM |
+ | users | invited user | SJAVPM |
@@ -97,12 +97,12 @@ Feature: set-publishing-permissions
And user "owner" sets permissions for "invited user" in room "group room" to "V" with 200 (v4)
And user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions | attendeePermissions |
- | users | owner | SJLAVP | D |
+ | users | owner | SJLAVPM | D |
| users | invited user | CV | CV |
When user "owner" sets call permissions for room "group room" to "A" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions | attendeePermissions |
- | users | owner | SJLAVP | D |
+ | users | owner | SJLAVPM | D |
| users | invited user | CA | D |
Scenario: setting default permissions resets participant permissions
@@ -113,12 +113,12 @@ Feature: set-publishing-permissions
And user "owner" sets permissions for "invited user" in room "group room" to "V" with 200 (v4)
And user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions | attendeePermissions |
- | users | owner | SJLAVP | D |
+ | users | owner | SJLAVPM | D |
| users | invited user | CV | CV |
When user "owner" sets default permissions for room "group room" to "A" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions | attendeePermissions |
- | users | owner | SJLAVP | D |
+ | users | owner | SJLAVPM | D |
| users | invited user | CA | D |
Scenario: setting default permissions does not reset call permissions
@@ -129,10 +129,10 @@ Feature: set-publishing-permissions
And user "owner" sets call permissions for room "group room" to "V" with 200 (v4)
And user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions | attendeePermissions |
- | users | owner | SJLAVP | D |
+ | users | owner | SJLAVPM | D |
| users | invited user | CV | D |
When user "owner" sets default permissions for room "group room" to "A" with 200 (v4)
Then user "owner" sees the following attendees in room "group room" with 200 (v4)
| actorType | actorId | permissions | attendeePermissions |
- | users | owner | SJLAVP | D |
+ | users | owner | SJLAVPM | D |
| users | invited user | CV | D |
diff --git a/tests/integration/features/reaction/react.feature b/tests/integration/features/reaction/react.feature
index 7c9613e8b..2bedf4ac1 100644
--- a/tests/integration/features/reaction/react.feature
+++ b/tests/integration/features/reaction/react.feature
@@ -25,17 +25,44 @@ Feature: reaction/react
| users | participant1 | participant1-displayname | 👍 |
| users | participant2 | participant2-displayname | 👍 |
And user "participant1" react with "🚀" on message "Message 1" to room "room" with 201
+ Then user "guest" joins room "room" with 200 (v4)
+ And user "guest" react with "👤" on message "Message 1" to room "room" with 201
Then user "participant1" sees the following messages in room "room" with 200
- | room | actorType | actorId | actorDisplayName | message | messageParameters | reactions | reactionsSelf |
- | room | users | participant1 | participant1-displayname | Message 1 | [] | {"👍":2,"🚀":1} | ["👍","🚀"] |
+ | room | actorType | actorId | actorDisplayName | message | messageParameters | reactions | reactionsSelf |
+ | room | users | participant1 | participant1-displayname | Message 1 | [] | {"👍":2,"👤":1,"🚀":1} | ["👍","🚀"] |
Then user "participant1" sees the following system messages in room "room" with 200
| room | actorType | actorId | actorDisplayName | systemMessage |
+ | room | guests | guest | | reaction |
| room | users | participant1 | participant1-displayname | reaction |
| room | users | participant1 | participant1-displayname | reaction |
| room | users | participant2 | participant2-displayname | reaction |
| room | users | participant1 | participant1-displayname | user_added |
| room | users | participant1 | participant1-displayname | conversation_created |
+ Scenario: React to message fails without chat permission
+ Given user "participant1" creates room "room" (v4)
+ | roomType | 3 |
+ | roomName | room |
+ And user "participant1" adds user "participant2" to room "room" with 200 (v4)
+ And user "participant1" sends message "Message 1" to room "room" with 201
+ And user "participant2" react with "👍" on message "Message 1" to room "room" with 201
+ | actorType | actorId | actorDisplayName | reaction |
+ | users | participant2 | participant2-displayname | 👍 |
+ Then user "participant1" sees the following system messages in room "room" with 200
+ | room | actorType | actorId | actorDisplayName | systemMessage |
+ | room | users | participant2 | participant2-displayname | reaction |
+ | room | users | participant1 | participant1-displayname | user_added |
+ | room | users | participant1 | participant1-displayname | conversation_created |
+ # Removing chat permission only
+ Then user "participant1" sets permissions for "participant2" in room "room" to "CSJLAVP" with 200 (v4)
+ When user "participant2" delete react with "👍" on message "Message 1" to room "room" with 403
+ And user "participant2" react with "💙" on message "Message 1" to room "room" with 403
+ And user "participant1" sees the following system messages in room "room" with 200
+ | room | actorType | actorId | actorDisplayName | systemMessage |
+ | room | users | participant2 | participant2-displayname | reaction |
+ | room | users | participant1 | participant1-displayname | user_added |
+ | room | users | participant1 | participant1-displayname | conversation_created |
+
Scenario: React two times to same message with the same reaction
Given user "participant1" creates room "room" (v4)
| roomType | 3 |
@@ -66,17 +93,24 @@ Feature: reaction/react
And user "participant2" react with "👍" on message "Message 1" to room "room" with 201
| actorType | actorId | actorDisplayName | reaction |
| users | participant2 | participant2-displayname | 👍 |
+ Then user "guest" joins room "room" with 200 (v4)
+ And user "guest" react with "👤" on message "Message 1" to room "room" with 201
Then user "participant1" sees the following messages in room "room" with 200
| room | actorType | actorId | actorDisplayName | message | messageParameters | reactions |
- | room | users | participant1 | participant1-displayname | Message 1 | [] | {"👍":1} |
+ | room | users | participant1 | participant1-displayname | Message 1 | [] | {"👤":1,"👍":1} |
And user "participant2" delete react with "👍" on message "Message 1" to room "room" with 200
| actorType | actorId | actorDisplayName | reaction |
+ | guests | guest | | 👤 |
+ And user "guest" delete react with "👤" on message "Message 1" to room "room" with 200
+ | actorType | actorId | actorDisplayName | reaction |
Then user "participant1" sees the following messages in room "room" with 200
| room | actorType | actorId | actorDisplayName | message | messageParameters | reactions |
| room | users | participant1 | participant1-displayname | Message 1 | [] | [] |
Then user "participant1" sees the following system messages in room "room" with 200
| room | actorType | actorId | actorDisplayName | systemMessage |
+ | room | guests | guest | | reaction_revoked |
| room | users | participant2 | participant2-displayname | reaction_revoked |
+ | room | guests | guest | | reaction_deleted |
| room | users | participant2 | participant2-displayname | reaction_deleted |
| room | users | participant1 | participant1-displayname | user_added |
| room | users | participant1 | participant1-displayname | conversation_created |
diff --git a/tests/php/CapabilitiesTest.php b/tests/php/CapabilitiesTest.php
index 2ebf6b006..b9ade2e0c 100644
--- a/tests/php/CapabilitiesTest.php
+++ b/tests/php/CapabilitiesTest.php
@@ -104,6 +104,7 @@ class CapabilitiesTest extends TestCase {
'conversation-permissions',
'rich-object-list-media',
'rich-object-delete',
+ 'chat-permission',
'reactions',
];
}
diff --git a/tests/php/Collaboration/Collaborators/RoomPluginTest.php b/tests/php/Collaboration/Collaborators/RoomPluginTest.php
index f96d23569..bb116ffd7 100644
--- a/tests/php/Collaboration/Collaborators/RoomPluginTest.php
+++ b/tests/php/Collaboration/Collaborators/RoomPluginTest.php
@@ -27,6 +27,8 @@ namespace OCA\Talk\Tests\php\Collaboration\Collaborators;
use OCA\Talk\Collaboration\Collaborators\RoomPlugin;
use OCA\Talk\Manager;
+use OCA\Talk\Model\Attendee;
+use OCA\Talk\Participant;
use OCA\Talk\Room;
use OCP\Collaboration\Collaborators\ISearchResult;
use OCP\Collaboration\Collaborators\SearchResultType;
@@ -65,8 +67,9 @@ class RoomPluginTest extends TestCase {
$this->plugin = new RoomPlugin($this->manager, $this->userSession);
}
- private function newRoom(int $type, string $token, string $name): Room {
+ private function newRoom(int $type, string $token, string $name, int $permissions = Attendee::PERMISSIONS_MAX_DEFAULT): Room {
$room = $this->createMock(Room::class);
+ $participant = $this->createMock(Participant::class);
$room->expects($this->any())
->method('getType')
@@ -80,6 +83,14 @@ class RoomPluginTest extends TestCase {
->method('getDisplayName')
->willReturn($name);
+ $room->expects($this->any())
+ ->method('getParticipant')
+ ->willReturn($participant);
+
+ $participant->expects($this->any())
+ ->method('getPermissions')
+ ->willReturn($permissions);
+
return $room;
}
@@ -116,6 +127,11 @@ class RoomPluginTest extends TestCase {
$this->newResult('Room name', 'roomToken')
], false],
+ // Chats without chat permission are not returned
+ ['room', 2, 0, [
+ $this->newRoom(Room::TYPE_GROUP, 'roomToken', 'Room name', Attendee::PERMISSIONS_MAX_DEFAULT ^ Attendee::PERMISSIONS_CHAT),
+ ], [], [], false],
+
// Search term with single exact match
['room name', 2, 0, [
$this->newRoom(Room::TYPE_GROUP, 'roomToken', 'Unmatched name'),
diff --git a/tests/php/Listener/RestrictStartingCallsTest.php b/tests/php/Listener/RestrictStartingCallsTest.php
index b94da5a55..2ffbe04ab 100644
--- a/tests/php/Listener/RestrictStartingCallsTest.php
+++ b/tests/php/Listener/RestrictStartingCallsTest.php
@@ -97,7 +97,9 @@ class RestrictStartingCallsTest extends TestCase {
$this->expectException(ForbiddenException::class);
}
+ $this->overwriteService(RestrictStartingCalls::class, $this->listener);
$this->listener->checkStartCallPermissions($event);
+ $this->restoreService(RestrictStartingCalls::class);
if (!$throws) {
self::assertTrue(true);
diff --git a/tests/psalm-baseline.xml b/tests/psalm-baseline.xml
index 1d44ea2cb..ea600086d 100644
--- a/tests/psalm-baseline.xml
+++ b/tests/psalm-baseline.xml
@@ -37,12 +37,6 @@
<code>getById</code>
</UndefinedInterfaceMethod>
</file>
- <file src="lib/Chat/SystemMessage/Listener.php">
- <InvalidArgument occurrences="2">
- <code>$listener</code>
- <code>$listener</code>
- </InvalidArgument>
- </file>
<file src="lib/Command/ActiveCalls.php">
<UndefinedClass occurrences="1">
<code>Base</code>
@@ -175,17 +169,19 @@
</MissingDependency>
</file>
<file src="lib/Controller/SettingsController.php">
+ <InvalidArgument occurrences="1">
+ <code>SharedStorage::class</code>
+ </InvalidArgument>
<MissingDependency occurrences="3">
<code>$this-&gt;rootFolder</code>
<code>IRootFolder</code>
<code>IRootFolder</code>
</MissingDependency>
- <InvalidArgument occurrences="1">
- <code>SharedStorage::class</code>
- </InvalidArgument>
</file>
<file src="lib/Controller/SignalingController.php">
- <UndefinedClass occurrences="1"/>
+ <UndefinedClass occurrences="1">
+ <code>ConnectException</code>
+ </UndefinedClass>
</file>
<file src="lib/Controller/TempAvatarController.php">
<UndefinedClass occurrences="1">
@@ -203,6 +199,9 @@
</UndefinedClass>
</file>
<file src="lib/Files/Util.php">
+ <InvalidArgument occurrences="1">
+ <code>SharedStorage::class</code>
+ </InvalidArgument>
<MissingDependency occurrences="5">
<code>$this-&gt;rootFolder</code>
<code>$this-&gt;rootFolder</code>
@@ -210,16 +209,23 @@
<code>IRootFolder</code>
<code>IRootFolder</code>
</MissingDependency>
- <InvalidArgument occurrences="1">
- <code>SharedStorage::class</code>
- </InvalidArgument>
</file>
<file src="lib/MatterbridgeManager.php">
<UndefinedClass occurrences="7">
+ <code>$this-&gt;tokenProvider</code>
+ <code>$this-&gt;tokenProvider</code>
+ <code>$this-&gt;tokenProvider</code>
+ <code>IAuthTokenProvider</code>
<code>IAuthTokenProvider</code>
<code>IToken</code>
+ <code>IToken</code>
</UndefinedClass>
</file>
+ <file src="lib/Middleware/InjectionMiddleware.php">
+ <UndefinedInterfaceMethod occurrences="1">
+ <code>getAnnotationParameter</code>
+ </UndefinedInterfaceMethod>
+ </file>
<file src="lib/Migration/Version2001Date20170707115443.php">
<InvalidArrayAccess occurrences="1">
<code>$return['num_rooms']</code>
@@ -257,10 +263,6 @@
</UndefinedClass>
</file>
<file src="lib/Share/RoomShareProvider.php">
- <InvalidArgument occurrences="2">
- <code>new GenericEvent($existingShare)</code>
- <code>self::class . '::' . 'share_file_again'</code>
- </InvalidArgument>
<UndefinedClass occurrences="1">
<code>Cache</code>
</UndefinedClass>