Merge branch 'master' into appecosystem-auth

This commit is contained in:
Andrey Borysenko 2023-08-10 17:21:35 +03:00 committed by GitHub
commit f7b2dc8ccc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
912 changed files with 16311 additions and 31820 deletions

1
.github/CODEOWNERS vendored
View file

@ -11,6 +11,7 @@
/apps/federation/appinfo/info.xml @datenangebot
/apps/files/appinfo/info.xml @skjnldsv @Pytal @ArtificialOwl @come-nc @artonge @icewind1991 @szaimen @susnux @Fenn-CS
/apps/files_external/appinfo/info.xml @icewind1991 @artonge
/apps/files_reminders/appinfo/info.xml @Pytal
/apps/files_sharing/appinfo/info.xml @skjnldsv @come-nc
/apps/files_trashbin/appinfo/info.xml @Pytal @icewind1991
/apps/files_versions/appinfo/info.xml @artonge @icewind1991

View file

@ -18,18 +18,23 @@ jobs:
steps:
- name: Add reaction on start
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
comment-id: ${{ github.event.comment.id }}
reaction-type: "+1"
reactions: "+1"
- name: Checkout the latest code
- name: Init branch
uses: xt0rted/pull-request-comment-branch@d97294d304604fa98a2600a6e2f916a84b596dc7 # v1
id: comment-branch
- name: Checkout ${{ steps.comment-branch.outputs.head_ref }}
uses: actions/checkout@v3
with:
fetch-depth: 0
token: ${{ secrets.COMMAND_BOT_PAT }}
ref: ${{ steps.comment-branch.outputs.head_ref }}
- name: Setup git
run: |
@ -46,10 +51,10 @@ jobs:
git push
- name: Add reaction on failure
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
if: failure()
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
comment-id: ${{ github.event.comment.id }}
reaction-type: "-1"
reactions: "-1"

29
.github/workflows/pr-feedback.yml vendored Normal file
View file

@ -0,0 +1,29 @@
name: 'Ask for feedback on PRs'
on:
schedule:
- cron: '30 1 * * *'
jobs:
pr-feedback:
runs-on: ubuntu-22.04
steps:
- name: The get-github-handles-from-website action
uses: marcelklehr/get-github-handles-from-website-action@a739600f6b91da4957f51db0792697afbb2f143c # v1.0.0
id: scrape
with:
website: 'https://nextcloud.com/team/'
- uses: marcelklehr/pr-feedback-action@601109aa729eb4c8d6d0ece7567b9d4901db4aef
with:
feedback-message: |
Hello there,
Thank you so much for taking the time and effort to create a pull request to our Nextcloud project.
We hope that the reviewing process is going smooth and is helpful for you. We want to ensure your pull request is reviewed to your satisfaction. If you have a moment, our community management team would very much appreciate your feedback on your experience with this PR reviewing process.
Your feedback is valuable to us as we continuously strive to improve our community developer experience. Please take a moment to complete our short survey by clicking on the following link: https://cloud.nextcloud.com/apps/forms/s/i9Ago4EQRZ7TWxjfmeEpPkf6
Thank you for contributing to Nextcloud and we hope to hear from you soon!
days-before-feedback: 14
start-date: "2023-07-10"
exempt-authors: "${{ steps.scrape.outputs.users }}"
exempt-bots: true

1
.gitignore vendored
View file

@ -24,6 +24,7 @@
!/apps/sharebymail
!/apps/encryption
!/apps/files_external
!/apps/files_reminders
!/apps/files_sharing
!/apps/files_trashbin
!/apps/files_versions

@ -1 +1 @@
Subproject commit 1ff71da76e24d442afab28586072409ef3b9660e
Subproject commit 7293b4ffe86c0b48c3172bd8f180a12e0907fd60

View file

@ -1,9 +1,7 @@
/**
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
* @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author John Molakvoæ <skjnldsv@protonmail.com>
* @author Roeland Jago Douma <roeland@famdouma.nl>
*
* @license AGPL-3.0-or-later
*
@ -21,3 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
export const loadState = function(app: string, key: string, fallback?: any) {
return fallback
}

View file

@ -2,6 +2,6 @@ OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "פיקוח / תיעוד",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "מספר יכולות תיעוד ל־Nextcloud כגון תיעוד גישה ליומן התיעוד או פעולות רגישות אחרות."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "מספק יכולות תיעוד ל־Nextcloud כגון תיעוד גישה ליומן התיעוד או פעולות רגישות אחרות."
},
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;");

View file

@ -1,5 +1,5 @@
{ "translations": {
"Auditing / Logging" : "פיקוח / תיעוד",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "מספר יכולות תיעוד ל־Nextcloud כגון תיעוד גישה ליומן התיעוד או פעולות רגישות אחרות."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "מספק יכולות תיעוד ל־Nextcloud כגון תיעוד גישה ליומן התיעוד או פעולות רגישות אחרות."
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"
}

View file

@ -0,0 +1,8 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "API فدراسیون ابری",
"Enable clouds to communicate with each other and exchange data" : "ابرها را فعال کنید تا با یکدیگر ارتباط برقرار کنند و داده ها را مبادله کنند",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation API نمونه های مختلف Nextcloud را قادر می سازد تا با یکدیگر ارتباط برقرار کرده و داده ها را مبادله کنند."
},
"nplurals=2; plural=(n > 1);");

View file

@ -0,0 +1,6 @@
{ "translations": {
"Cloud Federation API" : "API فدراسیون ابری",
"Enable clouds to communicate with each other and exchange data" : "ابرها را فعال کنید تا با یکدیگر ارتباط برقرار کنند و داده ها را مبادله کنند",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation API نمونه های مختلف Nextcloud را قادر می سازد تا با یکدیگر ارتباط برقرار کرده و داده ها را مبادله کنند."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}

View file

@ -0,0 +1,8 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "Cloud Federation API",
"Enable clouds to communicate with each other and exchange data" : "Cho phép các đám mây giao tiếp với nhau và trao đổi dữ liệu",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "API Cloud Federation cho phép các phiên bản Nextcloud khác nhau giao tiếp với nhau và trao đổi dữ liệu."
},
"nplurals=1; plural=0;");

View file

@ -0,0 +1,6 @@
{ "translations": {
"Cloud Federation API" : "Cloud Federation API",
"Enable clouds to communicate with each other and exchange data" : "Cho phép các đám mây giao tiếp với nhau và trao đổi dữ liệu",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "API Cloud Federation cho phép các phiên bản Nextcloud khác nhau giao tiếp với nhau và trao đổi dữ liệu."
},"pluralForm" :"nplurals=1; plural=0;"
}

View file

@ -19,6 +19,7 @@ OC.L10N.register(
"No comments yet, start the conversation!" : "Ingen kommentarer endnu, start samtalen!",
"No more messages" : "Ikke flere beskeder",
"Retry" : "Prøv igen",
"Failed to mark comments as read" : "Kunne ikke markere kommentarer som læst",
"Unable to load the comments list" : "Kan ikke indlæse kommentarlisten",
"_%n unread comment_::_%n unread comments_" : ["%n ulæst kommentar","%n ulæste kommentarer"],
"_1 new comment_::_{unread} new comments_" : ["1 ny kommentar","{unread} nye kommentarer"],

View file

@ -17,6 +17,7 @@
"No comments yet, start the conversation!" : "Ingen kommentarer endnu, start samtalen!",
"No more messages" : "Ikke flere beskeder",
"Retry" : "Prøv igen",
"Failed to mark comments as read" : "Kunne ikke markere kommentarer som læst",
"Unable to load the comments list" : "Kan ikke indlæse kommentarlisten",
"_%n unread comment_::_%n unread comments_" : ["%n ulæst kommentar","%n ulæste kommentarer"],
"_1 new comment_::_{unread} new comments_" : ["1 ny kommentar","{unread} nye kommentarer"],

View file

@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
"Comments" : "Các bình luận",
"Comments" : "Bình luận",
"You commented" : "Bạn đã bình luận",
"{author} commented" : "{author} đã bình luận",
"You commented on %1$s" : "Bạn đã bình luận về %1$s",
@ -19,6 +19,7 @@ OC.L10N.register(
"No comments yet, start the conversation!" : "Không có bình luận nào, bắt đầu cuộc hội thoại!",
"No more messages" : "Không có thêm tin nhắn",
"Retry" : "Thử lại",
"Failed to mark comments as read" : "Không thể đánh dấu bình luận là đã đọc",
"Unable to load the comments list" : "Không thể tải danh sách bình luận",
"_%n unread comment_::_%n unread comments_" : ["%n bình luận chưa đọc"],
"_1 new comment_::_{unread} new comments_" : ["{unread} bình luận mới"],

View file

@ -1,5 +1,5 @@
{ "translations": {
"Comments" : "Các bình luận",
"Comments" : "Bình luận",
"You commented" : "Bạn đã bình luận",
"{author} commented" : "{author} đã bình luận",
"You commented on %1$s" : "Bạn đã bình luận về %1$s",
@ -17,6 +17,7 @@
"No comments yet, start the conversation!" : "Không có bình luận nào, bắt đầu cuộc hội thoại!",
"No more messages" : "Không có thêm tin nhắn",
"Retry" : "Thử lại",
"Failed to mark comments as read" : "Không thể đánh dấu bình luận là đã đọc",
"Unable to load the comments list" : "Không thể tải danh sách bình luận",
"_%n unread comment_::_%n unread comments_" : ["%n bình luận chưa đọc"],
"_1 new comment_::_{unread} new comments_" : ["{unread} bình luận mới"],

View file

@ -91,12 +91,13 @@
<!-- Message content -->
<!-- The html is escaped and sanitized before rendering -->
<!-- eslint-disable-next-line vue/no-v-html-->
<!-- eslint-disable vue/no-v-html-->
<div v-else
:class="{'comment__message--expanded': expanded}"
class="comment__message"
@click="onExpand"
v-html="renderedContent" />
<!-- eslint-enable vue/no-v-html-->
</div>
</component>
</template>

View file

@ -22,9 +22,9 @@
-->
<template>
<div class="comments"
:class="{ 'icon-loading': isFirstLoading }"
v-observe-visibility="onVisibilityChange">
<div v-observe-visibility="onVisibilityChange"
class="comments"
:class="{ 'icon-loading': isFirstLoading }">
<!-- Editor -->
<Comment v-bind="editorData"
:auto-complete="autoComplete"
@ -37,7 +37,7 @@
<template v-if="!isFirstLoading">
<NcEmptyContent v-if="!hasComments && done"
class="comments__empty"
:title="t('comments', 'No comments yet, start the conversation!')">
:name="t('comments', 'No comments yet, start the conversation!')">
<template #icon>
<MessageReplyTextIcon />
</template>
@ -65,7 +65,7 @@
<!-- Error message -->
<template v-else-if="error">
<NcEmptyContent class="comments__error" :title="error">
<NcEmptyContent class="comments__error" :name="error">
<template #icon>
<AlertCircleOutlineIcon />
</template>
@ -191,8 +191,8 @@ export default {
/**
* Make sure we have all mentions as Array of objects
*
* @param {Array} mentions the mentions list
* @return {Object<string, object>}
* @param {any[]} mentions the mentions list
* @return {Record<string, object>}
*/
genMentionsData(mentions) {
Object.values(mentions)

View file

@ -0,0 +1,9 @@
OC.L10N.register(
"contactsinteraction",
{
"Recently contacted" : "اخیراً تماس گرفته شده است",
"Contacts Interaction" : "تعامل با مخاطبین",
"Manages interaction between users and contacts" : "تعامل بین کاربران و مخاطبین را مدیریت می کند.",
"Collect data about user and contacts interactions and provide an address book for the data" : "اطلاعات مربوط به تعاملات کاربر و مخاطبین را جمع آوری کنید و یک دفترچه آدرس برای داده ها تهیه کنید."
},
"nplurals=2; plural=(n > 1);");

View file

@ -0,0 +1,7 @@
{ "translations": {
"Recently contacted" : "اخیراً تماس گرفته شده است",
"Contacts Interaction" : "تعامل با مخاطبین",
"Manages interaction between users and contacts" : "تعامل بین کاربران و مخاطبین را مدیریت می کند.",
"Collect data about user and contacts interactions and provide an address book for the data" : "اطلاعات مربوط به تعاملات کاربر و مخاطبین را جمع آوری کنید و یک دفترچه آدرس برای داده ها تهیه کنید."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}

View file

@ -0,0 +1,9 @@
OC.L10N.register(
"contactsinteraction",
{
"Recently contacted" : "Liên hệ gần đây",
"Contacts Interaction" : "Liên hệ tương tác",
"Manages interaction between users and contacts" : "Quản lý tương tác giữa người dùng và liên hệ",
"Collect data about user and contacts interactions and provide an address book for the data" : "Thu thập dữ liệu về tương tác của người dùng và danh bạ, đồng thời cung cấp sổ địa chỉ cho dữ liệu"
},
"nplurals=1; plural=0;");

View file

@ -0,0 +1,7 @@
{ "translations": {
"Recently contacted" : "Liên hệ gần đây",
"Contacts Interaction" : "Liên hệ tương tác",
"Manages interaction between users and contacts" : "Quản lý tương tác giữa người dùng và liên hệ",
"Collect data about user and contacts interactions and provide an address book for the data" : "Thu thập dữ liệu về tương tác của người dùng và danh bạ, đồng thời cung cấp sổ địa chỉ cho dữ liệu"
},"pluralForm" :"nplurals=1; plural=0;"
}

View file

@ -3,6 +3,8 @@ OC.L10N.register(
{
"Dashboard" : "Dashboard",
"Dashboard app" : "Dashboard app",
"Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! Users can add the widgets they like and change the background to their liking." : "Start din dag informeret\n\nNextcloud Dashboard er dit udgangspunkt på dagen og giver dig en oversigt over dine kommende aftaler, hastemails, chatbeskeder, indgående billetter, seneste tweets og meget mere! Brugere kan tilføje widgets de kan lide og ændre baggrunden efter deres smag.",
"\"{title} icon\"" : "\"{title} ikon\"",
"Customize" : "Tilpas",
"Edit widgets" : "Redigér widgets",
"Get more widgets from the App Store" : "Få flere widgets fra App Store",

View file

@ -1,6 +1,8 @@
{ "translations": {
"Dashboard" : "Dashboard",
"Dashboard app" : "Dashboard app",
"Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! Users can add the widgets they like and change the background to their liking." : "Start din dag informeret\n\nNextcloud Dashboard er dit udgangspunkt på dagen og giver dig en oversigt over dine kommende aftaler, hastemails, chatbeskeder, indgående billetter, seneste tweets og meget mere! Brugere kan tilføje widgets de kan lide og ændre baggrunden efter deres smag.",
"\"{title} icon\"" : "\"{title} ikon\"",
"Customize" : "Tilpas",
"Edit widgets" : "Redigér widgets",
"Get more widgets from the App Store" : "Få flere widgets fra App Store",

28
apps/dashboard/l10n/vi.js Normal file
View file

@ -0,0 +1,28 @@
OC.L10N.register(
"dashboard",
{
"Dashboard" : "Tổng quan",
"Dashboard app" : "Ứng dụng Tổng quan",
"Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! Users can add the widgets they like and change the background to their liking." : "Bắt đầu ngày mới của bạn được thông báo\n\nBảng điều khiển Nextcloud là điểm khởi đầu trong ngày của bạn, cung cấp cho bạn cái nhìn tổng quan về các cuộc hẹn sắp tới, email khẩn cấp, tin nhắn trò chuyện, vé đến, tweet mới nhất và hơn thế nữa! Người dùng có thể thêm các widget mình thích và thay đổi nền theo ý thích.",
"\"{title} icon\"" : "\"{title} icon\"",
"Customize" : "Tuỳ chỉnh",
"Edit widgets" : "Chỉnh sửa widget",
"Get more widgets from the App Store" : "Tải thêm widget từ App Store",
"Weather service" : "Dịch vụ thời tiết",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Vì quyền riêng tư của bạn, dữ liệu thời tiết được yêu cầu bởi máy chủ Nextcloud thay mặt bạn để dịch vụ thời tiết không nhận được thông tin cá nhân.",
"Weather data from Met.no" : "Dữ liệu thời tiết từ Met.no",
"geocoding with Nominatim" : "mã hóa địa lý với Nominatim",
"elevation data from OpenTopoData" : "dữ liệu độ cao từ OpenTopoData",
"Weather" : "Thời tiết",
"Status" : "Trạng thái",
"Good morning" : "Chào buổi sáng",
"Good morning, {name}" : "Chào buổi sáng, {name}",
"Good afternoon" : "Chào buổi chiều",
"Good afternoon, {name}" : "Chào buổi chiều, {name}",
"Good evening" : "Chào buổi tối",
"Good evening, {name}" : "Chào buổi tối, {name}",
"Hello" : "Xin chào",
"Hello, {name}" : "Xin chào, {name}",
"Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Bắt đầu ngày mới của bạn\n\nBảng điều khiển Nextcloud là điểm khởi đầu trong ngày của bạn, cung cấp cho bạn\ntổng quan về các cuộc hẹn sắp tới của bạn, email khẩn cấp, tin nhắn trò chuyện,\nvé đến, tweet mới nhất và nhiều hơn nữa! Người dùng có thể thêm các widget\nhọ thích và thay đổi nền theo ý thích của họ."
},
"nplurals=1; plural=0;");

View file

@ -0,0 +1,26 @@
{ "translations": {
"Dashboard" : "Tổng quan",
"Dashboard app" : "Ứng dụng Tổng quan",
"Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! Users can add the widgets they like and change the background to their liking." : "Bắt đầu ngày mới của bạn được thông báo\n\nBảng điều khiển Nextcloud là điểm khởi đầu trong ngày của bạn, cung cấp cho bạn cái nhìn tổng quan về các cuộc hẹn sắp tới, email khẩn cấp, tin nhắn trò chuyện, vé đến, tweet mới nhất và hơn thế nữa! Người dùng có thể thêm các widget mình thích và thay đổi nền theo ý thích.",
"\"{title} icon\"" : "\"{title} icon\"",
"Customize" : "Tuỳ chỉnh",
"Edit widgets" : "Chỉnh sửa widget",
"Get more widgets from the App Store" : "Tải thêm widget từ App Store",
"Weather service" : "Dịch vụ thời tiết",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Vì quyền riêng tư của bạn, dữ liệu thời tiết được yêu cầu bởi máy chủ Nextcloud thay mặt bạn để dịch vụ thời tiết không nhận được thông tin cá nhân.",
"Weather data from Met.no" : "Dữ liệu thời tiết từ Met.no",
"geocoding with Nominatim" : "mã hóa địa lý với Nominatim",
"elevation data from OpenTopoData" : "dữ liệu độ cao từ OpenTopoData",
"Weather" : "Thời tiết",
"Status" : "Trạng thái",
"Good morning" : "Chào buổi sáng",
"Good morning, {name}" : "Chào buổi sáng, {name}",
"Good afternoon" : "Chào buổi chiều",
"Good afternoon, {name}" : "Chào buổi chiều, {name}",
"Good evening" : "Chào buổi tối",
"Good evening, {name}" : "Chào buổi tối, {name}",
"Hello" : "Xin chào",
"Hello, {name}" : "Xin chào, {name}",
"Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Bắt đầu ngày mới của bạn\n\nBảng điều khiển Nextcloud là điểm khởi đầu trong ngày của bạn, cung cấp cho bạn\ntổng quan về các cuộc hẹn sắp tới của bạn, email khẩn cấp, tin nhắn trò chuyện,\nvé đến, tweet mới nhất và nhiều hơn nữa! Người dùng có thể thêm các widget\nhọ thích và thay đổi nền theo ý thích của họ."
},"pluralForm" :"nplurals=1; plural=0;"
}

View file

@ -231,11 +231,15 @@
}
},
{
"name": "widgets",
"name": "widgets[]",
"in": "query",
"description": "Limit results to specific widgets",
"schema": {
"type": "string"
"type": "array",
"default": [],
"items": {
"type": "string"
}
}
},
{

View file

@ -2,6 +2,7 @@ OC.L10N.register(
"dav",
{
"Calendar" : "Kalender",
"To-dos" : "Opgaver",
"Personal" : "Personligt",
"{actor} created calendar {calendar}" : "{actor} oprettede kalenderen {calendar}",
"You created calendar {calendar}" : "Du oprettede kalenderen {calendar}",
@ -31,12 +32,27 @@ OC.L10N.register(
"You deleted event {event} from calendar {calendar}" : "Du slettede begivenheden {event} fra kalenderen {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} opdaterede begivenheden {event} i kalenderen {calendar}",
"You updated event {event} in calendar {calendar}" : "Du opdaterede begivenheden {event} i kalenderen {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} flyttede begivenhed {event} fra kalender {sourceCalendar} til kalender {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Du flyttede begivenhed {event} fra kalender {sourceCalendar} til kalender {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} gendannede begivenhed {event} i kalender {calendar}",
"You restored event {event} of calendar {calendar}" : "Du gendannede begivenhed {begivenhed} i kalender {kalender}",
"Busy" : "Optaget",
"{actor} created to-do {todo} in list {calendar}" : "{actor} oprettede en opgave {todo} i listen {calendar}",
"You created to-do {todo} in list {calendar}" : "Du oprettede opgaven {todo} i listen {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} slettede opgaven {todo} fra listen {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Du slettede opgaven {todo} fra listen {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} opdaterede opgaven {todo} i listen {calendar}",
"You updated to-do {todo} in list {calendar}" : "Du opdaterede opgaven {todo} i listen {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} løste opgaven {todo} i listen {calendar}",
"You solved to-do {todo} in list {calendar}" : "Du løste opgaven {todo} i listen {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} genåbnede opgaven {todo} i listen {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Du genåbnede opgaven {todo} i listen {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} flyttede opgave {event} fra liste {sourceCalendar} til liste {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Du flyttede opgave {event} fra liste {sourceCalendar} til liste {targetCalendar}",
"Calendar, contacts and tasks" : "Kalender, kontakter og opgaver",
"A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> er blevet ændret",
"A calendar <strong>event</strong> was modified" : "En kalender <strong>begivenhed</strong> er blevet ændret",
"A calendar <strong>to-do</strong> was modified" : "En kalender <strong>opgave</strong> blev ændret",
"Contact birthdays" : "Kontakt fødselsdag",
"Death of %s" : "Død af%s",
"Untitled calendar" : "Unanvngiven kalender",
@ -56,6 +72,17 @@ OC.L10N.register(
"Description: %s" : "Beskrivelse: %s",
"Where: %s" : "Hvor: %s",
"%1$s via %2$s" : "%1$s via %2$s",
"Cancelled: %1$s" : "Annulléret: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" er blevet annulleret",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s har accepteret din invitation",
"%1$s has tentatively accepted your invitation" : "%1$s har foreløbigt accepteret din invitation",
"%1$s has declined your invitation" : "%1$s har afvist din invitation",
"%1$s has responded to your invitation" : "%1$s har svaret på din invitation",
"Invitation updated: %1$s" : "Invitation opdateret: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s opdaterede begivenheden \"%2$s\"",
"Invitation: %1$s" : "Invitation: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s vil gerne invitere dig til \"%2$s\"",
"Organizer:" : "Arrangør:",
"Attendees:" : "Deltagere:",
"Title:" : "Titel:",
@ -65,17 +92,74 @@ OC.L10N.register(
"Accept" : "Accepter",
"Decline" : "Afvis",
"More options …" : "Flere indstillinger…",
"More options at %s" : "Flere muligheder på %s",
"Contacts" : "Kontakter",
"{actor} created address book {addressbook}" : "{actor} oprettede adressebog {addressbook}",
"You created address book {addressbook}" : "Du oprettede adressebog {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} slattede adressebog {addressbook}",
"You deleted address book {addressbook}" : "Du slettede adressebog {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} opdaterede adressebog {addressbook}",
"You updated address book {addressbook}" : "Du opdaterede adressebog {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} delte adressebog {addressbook} med dig",
"You shared address book {addressbook} with {user}" : "Du delte adressebog {addressbook} med {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} delte adressebog {addressbook} med {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} fjernede delingen af adressebog {addressbook} med dig",
"You unshared address book {addressbook} from {user}" : "Du fjernede delingen af adressebog {addressbook} med {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} fjernede delingen af adressebog {addressbook} med {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} fjernede delingen af adressebog {addressbook} med sig selv",
"You shared address book {addressbook} with group {group}" : "Du delte adressebog {addressbook} med gruppen {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} delte adressebog {addressbook} med gruppen {group}",
"You unshared address book {addressbook} from group {group}" : "Du fjernede delingen af adressebog {addressbook} fra gruppen {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} fjernede delingen af adressebog {addressbook} med gruppen {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} oprettede kontakten {card} i adressebog {addressbook}",
"You created contact {card} in address book {addressbook}" : "Du oprettede kontakten {card} i adressebog {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} slettede kontakten {card} i adressebog {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "Du slettede kontakten {card} i adressebog {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} opdaterede kontakten {card} i adressebog {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Du opdaterede kontakten {card} i adressebog {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "En <strong>kontakt</strong> eller <strong>adressebog</strong> blev ændret",
"Accounts" : "Konti",
"System address book which holds all accounts" : "Systemets adressebog, som indeholder alle konti",
"File is not updatable: %1$s" : "Filen kan ikke updateres: %1$s",
"Could not write to final file, canceled by hook" : "Kunne ikke skrive til den endelige fil, annulleret af hook",
"Could not write file contents" : "Kunne ikke skrive filindhold",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Fejl under kopiering af fil til placering (kopieret: %1$s, forventet filstørrelse: %2$s)",
"Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Forventede filstørrelse på %1$s, men læste (fra Nextcloud-klienten) og skrev (til Nextcloud-lageret) %2$s. Det kan enten være et netværksproblem på afsendersiden eller et problem med at skrive til lageret på serversiden.",
"Could not rename part file to final file, canceled by hook" : "Kunne ikke omdøbe delfilen til den endelige fil, annulleret af hook",
"Could not rename part file to final file" : "Delfilen kunne ikke omdøbes til den endelige fil",
"Failed to check file size: %1$s" : "Kunne ikke kontrollere filstørrelsen: %1$s",
"Could not open file" : "Kunne ikke åbne fil",
"Encryption not ready: %1$s" : "Kryptering ikke klar: %1$s",
"Failed to open file: %1$s" : "Kunne ikke åbne fil: %1$s",
"Failed to unlink: %1$s" : "Tilknytningen kunne ikke fjernes: %1$s",
"Invalid chunk name" : "Ugyldigt stykke navn",
"Could not rename part file assembled from chunks" : "Kunne ikke omdøbe delfilen samlet fra stykker",
"Failed to write file contents: %1$s" : "Kunne ikke skrive filindhold: %1$s",
"File not found: %1$s" : "Fil ikke fundet: %1$s",
"System is in maintenance mode." : "Systemet er i vedligeholdelsestilstand.",
"Upgrade needed" : "Opgradering er nødvendig",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Din %s skal konfigureres til at bruge HTTPS for at kunne bruge CalDAV og CardDAV med iOS/macOS.",
"Configures a CalDAV account" : "Konfigurerer en CalDAV-konto",
"Configures a CardDAV account" : "Konfigurerer en CardDAV-konto",
"Events" : "Begivenheder",
"Tasks" : "Opgaver",
"Untitled task" : "Unavngivet opgave",
"Completed on %s" : "Fuldført den %s",
"Due on %s by %s" : "Forfalder på %s til %s",
"Due on %s" : "Forfalder på %s",
"Migrated calendar (%1$s)" : "Migreret kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalendere indeholdende begivenheder, detaljer og deltagere",
"Contacts and groups" : "Kontakter og grupper",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "WebDAV endpoint",
"Availability" : "tilgængelighed",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Hvis du konfigurerer din arbejdstid, vil andre brugere se, når du er fraværende, når de booker et møde.",
"Time zone:" : "Tidszone:",
"to" : "til",
"Delete slot" : "Slet slot",
"No working hours set" : "Arbejdstider er ikke sat",
"Add slot" : "Tilføj slot",
"Monday" : "Mandag",
"Tuesday" : "Tirsdag",
"Wednesday" : "Onsdag",
@ -83,28 +167,28 @@ OC.L10N.register(
"Friday" : "Fredag",
"Saturday" : "Lørdag",
"Sunday" : "Søndag",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Indstil automatisk brugerstatus til \"Forstyr ikke\" uden for tilgængelighed for at slå alle notifikationer fra.",
"Save" : "Gem",
"Failed to load availability" : "Kunne ikke indlæse tilgængelighed",
"Saved availability" : "Gemt tilgængelighed",
"Failed to save availability" : "Kunne ikke gemme tilgængelighed",
"Calendar server" : "Kalenderserver",
"Send invitations to attendees" : "Send invitation til deltagere",
"Automatically generate a birthday calendar" : "Generer en fødselsdagskalender automatisk",
"Birthday calendars will be generated by a background job." : "Fødselsdagskalendere vil blive oprettet af et job, der kører i baggrunden.",
"Hence they will not be available immediately after enabling but will show up after some time." : "Derfor vil de ikke blive synlige med det samme efter aktivering, men vil vise sig efter noget tid.",
"Send notifications for events" : "Send meddelelser om begivenheder",
"Notifications are sent via background jobs, so these must occur often enough." : "Underretninger sendes via baggrundsjob, så disse skal ske ofte nok.",
"Send reminder notifications to calendar sharees as well" : "Send også påmindelsesmeddelelser til kalenderdelinger",
"Reminders are always sent to organizers and attendees." : "Påmindelser sendes altid til arrangører og deltagere.",
"Enable notifications for events via push" : "Aktiver notifikationer for begivenheder via push",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Installer også {calendarappstoreopen}Kalender-appen{linkclose}, eller {calendardocopen}tilslut dit skrivebord og din mobil til synkronisering ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Sørg for at konfigurere {emailopen}e-mail-serveren{linkclose} korrekt.",
"There was an error updating your attendance status." : "Der opstod en fejl under opdatering af din fremmødestatus.",
"Please contact the organizer directly." : "Kontakt venligst arrangøren direkte.",
"Are you accepting the invitation?" : "Accepter du invitationen?",
"Tentative" : "Foreløbig",
"Todos" : "Opgaver",
"{actor} created todo {todo} in list {calendar}" : "{actor} oprettede en opgave {todo} i listen {calendar}",
"You created todo {todo} in list {calendar}" : "Du oprettede opgaven {todo} i listen {calendar}",
"{actor} deleted todo {todo} from list {calendar}" : "{actor} slettede opgaven {todo} fra listen {calendar}",
"You deleted todo {todo} from list {calendar}" : "Du slettede opgaven {todo} fra listen {calendar}",
"{actor} updated todo {todo} in list {calendar}" : "{actor} opdaterede opgaven {todo} i listen {calendar}",
"You updated todo {todo} in list {calendar}" : "Du opdaterede opgaven {todo} i listen {calendar}",
"{actor} solved todo {todo} in list {calendar}" : "{actor} løste opgaven {todo} i listen {calendar}",
"You solved todo {todo} in list {calendar}" : "Du løste opgaven {todo} i listen {calendar}",
"{actor} reopened todo {todo} in list {calendar}" : "{actor} genåbnede opgaven {todo} i listen {calendar}",
"You reopened todo {todo} in list {calendar}" : "Du genåbnede opgaven {todo} i listen {calendar}",
"A calendar <strong>todo</strong> was modified" : "En kalender <strong>opgave</strong> blev ændret",
"Invitation canceled" : "Invitation annulleret",
"Invitation updated" : "Invitation opdateret ",
"Invitation" : "Invitation"
"Your attendance was updated successfully." : "Dit tilstedeværelse blev opdateret.",
"%1$s has responded your invitation" : "%1$s har besvaret din invitation"
},
"nplurals=2; plural=(n != 1);");

View file

@ -1,5 +1,6 @@
{ "translations": {
"Calendar" : "Kalender",
"To-dos" : "Opgaver",
"Personal" : "Personligt",
"{actor} created calendar {calendar}" : "{actor} oprettede kalenderen {calendar}",
"You created calendar {calendar}" : "Du oprettede kalenderen {calendar}",
@ -29,12 +30,27 @@
"You deleted event {event} from calendar {calendar}" : "Du slettede begivenheden {event} fra kalenderen {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} opdaterede begivenheden {event} i kalenderen {calendar}",
"You updated event {event} in calendar {calendar}" : "Du opdaterede begivenheden {event} i kalenderen {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} flyttede begivenhed {event} fra kalender {sourceCalendar} til kalender {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Du flyttede begivenhed {event} fra kalender {sourceCalendar} til kalender {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} gendannede begivenhed {event} i kalender {calendar}",
"You restored event {event} of calendar {calendar}" : "Du gendannede begivenhed {begivenhed} i kalender {kalender}",
"Busy" : "Optaget",
"{actor} created to-do {todo} in list {calendar}" : "{actor} oprettede en opgave {todo} i listen {calendar}",
"You created to-do {todo} in list {calendar}" : "Du oprettede opgaven {todo} i listen {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} slettede opgaven {todo} fra listen {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Du slettede opgaven {todo} fra listen {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} opdaterede opgaven {todo} i listen {calendar}",
"You updated to-do {todo} in list {calendar}" : "Du opdaterede opgaven {todo} i listen {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} løste opgaven {todo} i listen {calendar}",
"You solved to-do {todo} in list {calendar}" : "Du løste opgaven {todo} i listen {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} genåbnede opgaven {todo} i listen {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Du genåbnede opgaven {todo} i listen {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} flyttede opgave {event} fra liste {sourceCalendar} til liste {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Du flyttede opgave {event} fra liste {sourceCalendar} til liste {targetCalendar}",
"Calendar, contacts and tasks" : "Kalender, kontakter og opgaver",
"A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> er blevet ændret",
"A calendar <strong>event</strong> was modified" : "En kalender <strong>begivenhed</strong> er blevet ændret",
"A calendar <strong>to-do</strong> was modified" : "En kalender <strong>opgave</strong> blev ændret",
"Contact birthdays" : "Kontakt fødselsdag",
"Death of %s" : "Død af%s",
"Untitled calendar" : "Unanvngiven kalender",
@ -54,6 +70,17 @@
"Description: %s" : "Beskrivelse: %s",
"Where: %s" : "Hvor: %s",
"%1$s via %2$s" : "%1$s via %2$s",
"Cancelled: %1$s" : "Annulléret: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" er blevet annulleret",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s har accepteret din invitation",
"%1$s has tentatively accepted your invitation" : "%1$s har foreløbigt accepteret din invitation",
"%1$s has declined your invitation" : "%1$s har afvist din invitation",
"%1$s has responded to your invitation" : "%1$s har svaret på din invitation",
"Invitation updated: %1$s" : "Invitation opdateret: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s opdaterede begivenheden \"%2$s\"",
"Invitation: %1$s" : "Invitation: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s vil gerne invitere dig til \"%2$s\"",
"Organizer:" : "Arrangør:",
"Attendees:" : "Deltagere:",
"Title:" : "Titel:",
@ -63,17 +90,74 @@
"Accept" : "Accepter",
"Decline" : "Afvis",
"More options …" : "Flere indstillinger…",
"More options at %s" : "Flere muligheder på %s",
"Contacts" : "Kontakter",
"{actor} created address book {addressbook}" : "{actor} oprettede adressebog {addressbook}",
"You created address book {addressbook}" : "Du oprettede adressebog {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} slattede adressebog {addressbook}",
"You deleted address book {addressbook}" : "Du slettede adressebog {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} opdaterede adressebog {addressbook}",
"You updated address book {addressbook}" : "Du opdaterede adressebog {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} delte adressebog {addressbook} med dig",
"You shared address book {addressbook} with {user}" : "Du delte adressebog {addressbook} med {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} delte adressebog {addressbook} med {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} fjernede delingen af adressebog {addressbook} med dig",
"You unshared address book {addressbook} from {user}" : "Du fjernede delingen af adressebog {addressbook} med {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} fjernede delingen af adressebog {addressbook} med {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} fjernede delingen af adressebog {addressbook} med sig selv",
"You shared address book {addressbook} with group {group}" : "Du delte adressebog {addressbook} med gruppen {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} delte adressebog {addressbook} med gruppen {group}",
"You unshared address book {addressbook} from group {group}" : "Du fjernede delingen af adressebog {addressbook} fra gruppen {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} fjernede delingen af adressebog {addressbook} med gruppen {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} oprettede kontakten {card} i adressebog {addressbook}",
"You created contact {card} in address book {addressbook}" : "Du oprettede kontakten {card} i adressebog {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} slettede kontakten {card} i adressebog {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "Du slettede kontakten {card} i adressebog {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} opdaterede kontakten {card} i adressebog {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Du opdaterede kontakten {card} i adressebog {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "En <strong>kontakt</strong> eller <strong>adressebog</strong> blev ændret",
"Accounts" : "Konti",
"System address book which holds all accounts" : "Systemets adressebog, som indeholder alle konti",
"File is not updatable: %1$s" : "Filen kan ikke updateres: %1$s",
"Could not write to final file, canceled by hook" : "Kunne ikke skrive til den endelige fil, annulleret af hook",
"Could not write file contents" : "Kunne ikke skrive filindhold",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Fejl under kopiering af fil til placering (kopieret: %1$s, forventet filstørrelse: %2$s)",
"Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Forventede filstørrelse på %1$s, men læste (fra Nextcloud-klienten) og skrev (til Nextcloud-lageret) %2$s. Det kan enten være et netværksproblem på afsendersiden eller et problem med at skrive til lageret på serversiden.",
"Could not rename part file to final file, canceled by hook" : "Kunne ikke omdøbe delfilen til den endelige fil, annulleret af hook",
"Could not rename part file to final file" : "Delfilen kunne ikke omdøbes til den endelige fil",
"Failed to check file size: %1$s" : "Kunne ikke kontrollere filstørrelsen: %1$s",
"Could not open file" : "Kunne ikke åbne fil",
"Encryption not ready: %1$s" : "Kryptering ikke klar: %1$s",
"Failed to open file: %1$s" : "Kunne ikke åbne fil: %1$s",
"Failed to unlink: %1$s" : "Tilknytningen kunne ikke fjernes: %1$s",
"Invalid chunk name" : "Ugyldigt stykke navn",
"Could not rename part file assembled from chunks" : "Kunne ikke omdøbe delfilen samlet fra stykker",
"Failed to write file contents: %1$s" : "Kunne ikke skrive filindhold: %1$s",
"File not found: %1$s" : "Fil ikke fundet: %1$s",
"System is in maintenance mode." : "Systemet er i vedligeholdelsestilstand.",
"Upgrade needed" : "Opgradering er nødvendig",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Din %s skal konfigureres til at bruge HTTPS for at kunne bruge CalDAV og CardDAV med iOS/macOS.",
"Configures a CalDAV account" : "Konfigurerer en CalDAV-konto",
"Configures a CardDAV account" : "Konfigurerer en CardDAV-konto",
"Events" : "Begivenheder",
"Tasks" : "Opgaver",
"Untitled task" : "Unavngivet opgave",
"Completed on %s" : "Fuldført den %s",
"Due on %s by %s" : "Forfalder på %s til %s",
"Due on %s" : "Forfalder på %s",
"Migrated calendar (%1$s)" : "Migreret kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalendere indeholdende begivenheder, detaljer og deltagere",
"Contacts and groups" : "Kontakter og grupper",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "WebDAV endpoint",
"Availability" : "tilgængelighed",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Hvis du konfigurerer din arbejdstid, vil andre brugere se, når du er fraværende, når de booker et møde.",
"Time zone:" : "Tidszone:",
"to" : "til",
"Delete slot" : "Slet slot",
"No working hours set" : "Arbejdstider er ikke sat",
"Add slot" : "Tilføj slot",
"Monday" : "Mandag",
"Tuesday" : "Tirsdag",
"Wednesday" : "Onsdag",
@ -81,28 +165,28 @@
"Friday" : "Fredag",
"Saturday" : "Lørdag",
"Sunday" : "Søndag",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Indstil automatisk brugerstatus til \"Forstyr ikke\" uden for tilgængelighed for at slå alle notifikationer fra.",
"Save" : "Gem",
"Failed to load availability" : "Kunne ikke indlæse tilgængelighed",
"Saved availability" : "Gemt tilgængelighed",
"Failed to save availability" : "Kunne ikke gemme tilgængelighed",
"Calendar server" : "Kalenderserver",
"Send invitations to attendees" : "Send invitation til deltagere",
"Automatically generate a birthday calendar" : "Generer en fødselsdagskalender automatisk",
"Birthday calendars will be generated by a background job." : "Fødselsdagskalendere vil blive oprettet af et job, der kører i baggrunden.",
"Hence they will not be available immediately after enabling but will show up after some time." : "Derfor vil de ikke blive synlige med det samme efter aktivering, men vil vise sig efter noget tid.",
"Send notifications for events" : "Send meddelelser om begivenheder",
"Notifications are sent via background jobs, so these must occur often enough." : "Underretninger sendes via baggrundsjob, så disse skal ske ofte nok.",
"Send reminder notifications to calendar sharees as well" : "Send også påmindelsesmeddelelser til kalenderdelinger",
"Reminders are always sent to organizers and attendees." : "Påmindelser sendes altid til arrangører og deltagere.",
"Enable notifications for events via push" : "Aktiver notifikationer for begivenheder via push",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Installer også {calendarappstoreopen}Kalender-appen{linkclose}, eller {calendardocopen}tilslut dit skrivebord og din mobil til synkronisering ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Sørg for at konfigurere {emailopen}e-mail-serveren{linkclose} korrekt.",
"There was an error updating your attendance status." : "Der opstod en fejl under opdatering af din fremmødestatus.",
"Please contact the organizer directly." : "Kontakt venligst arrangøren direkte.",
"Are you accepting the invitation?" : "Accepter du invitationen?",
"Tentative" : "Foreløbig",
"Todos" : "Opgaver",
"{actor} created todo {todo} in list {calendar}" : "{actor} oprettede en opgave {todo} i listen {calendar}",
"You created todo {todo} in list {calendar}" : "Du oprettede opgaven {todo} i listen {calendar}",
"{actor} deleted todo {todo} from list {calendar}" : "{actor} slettede opgaven {todo} fra listen {calendar}",
"You deleted todo {todo} from list {calendar}" : "Du slettede opgaven {todo} fra listen {calendar}",
"{actor} updated todo {todo} in list {calendar}" : "{actor} opdaterede opgaven {todo} i listen {calendar}",
"You updated todo {todo} in list {calendar}" : "Du opdaterede opgaven {todo} i listen {calendar}",
"{actor} solved todo {todo} in list {calendar}" : "{actor} løste opgaven {todo} i listen {calendar}",
"You solved todo {todo} in list {calendar}" : "Du løste opgaven {todo} i listen {calendar}",
"{actor} reopened todo {todo} in list {calendar}" : "{actor} genåbnede opgaven {todo} i listen {calendar}",
"You reopened todo {todo} in list {calendar}" : "Du genåbnede opgaven {todo} i listen {calendar}",
"A calendar <strong>todo</strong> was modified" : "En kalender <strong>opgave</strong> blev ændret",
"Invitation canceled" : "Invitation annulleret",
"Invitation updated" : "Invitation opdateret ",
"Invitation" : "Invitation"
"Your attendance was updated successfully." : "Dit tilstedeværelse blev opdateret.",
"%1$s has responded your invitation" : "%1$s har besvaret din invitation"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -69,6 +69,7 @@ use OCA\DAV\Events\CardDeletedEvent;
use OCA\DAV\Events\CardUpdatedEvent;
use OCA\DAV\Events\SubscriptionCreatedEvent;
use OCA\DAV\Events\SubscriptionDeletedEvent;
use OCP\Accounts\UserUpdatedEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\Events\TrustedServerRemovedEvent;
use OCA\DAV\HookManager;
@ -224,13 +225,10 @@ class Application extends App implements IBootstrap {
}
});
$dispatcher->addListener('OC\AccountManager::userUpdated', function ($event) use ($container) {
if ($event instanceof GenericEvent) {
$user = $event->getSubject();
/** @var SyncService $syncService */
$syncService = $container->query(SyncService::class);
$syncService->updateUser($user);
}
$dispatcher->addListener(UserUpdatedEvent::class, function (UserUpdatedEvent $event) use ($container) {
/** @var SyncService $syncService */
$syncService = \OCP\Server::get(SyncService::class);
$syncService->updateUser($event->getUser());
});

View file

@ -1845,9 +1845,13 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
->andWhere($innerQuery->expr()->eq('op.calendartype',
$outerQuery->createNamedParameter(self::CALENDAR_TYPE_CALENDAR)));
$outerQuery->select('c.id', 'c.calendardata', 'c.componenttype', 'c.uid', 'c.uri')
->from('calendarobjects', 'c')
->where($outerQuery->expr()->isNull('deleted_at'));
// only return public items for shared calendars for now
if (isset($calendarInfo['{http://owncloud.org/ns}owner-principal']) === false || $calendarInfo['principaluri'] !== $calendarInfo['{http://owncloud.org/ns}owner-principal']) {
$innerQuery->andWhere($innerQuery->expr()->eq('c.classification',
$outerQuery->andWhere($outerQuery->expr()->eq('c.classification',
$outerQuery->createNamedParameter(self::CLASSIFICATION_PUBLIC)));
}
@ -1866,10 +1870,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$this->db->escapeLikeParameter($pattern) . '%')));
}
$outerQuery->select('c.id', 'c.calendardata', 'c.componenttype', 'c.uid', 'c.uri')
->from('calendarobjects', 'c')
->where($outerQuery->expr()->isNull('deleted_at'));
if (isset($options['timerange'])) {
if (isset($options['timerange']['start']) && $options['timerange']['start'] instanceof DateTimeInterface) {
$outerQuery->andWhere($outerQuery->expr()->gt('lastoccurence',

View file

@ -6,6 +6,7 @@ declare(strict_types=1);
* @copyright 2022 Anna Larch <anna.larch@gmx.net>
*
* @author Anna Larch <anna.larch@gmx.net>
* @author Richard Steinmetz <richard@steinmetz.cloud>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
@ -105,6 +106,40 @@ class IMipService {
return $newstring;
}
/**
* Like generateDiffString() but linkifies the property values if they are urls.
*/
private function generateLinkifiedDiffString(VEvent $vevent, VEvent $oldVEvent, string $property, string $default): ?string {
if (!isset($vevent->$property)) {
return $default;
}
/** @var string|null $newString */
$newString = $vevent->$property->getValue();
$oldString = isset($oldVEvent->$property) ? $oldVEvent->$property->getValue() : null;
if ($oldString !== $newString) {
return sprintf(
"<span style='text-decoration: line-through'>%s</span><br />%s",
$this->linkify($oldString) ?? $oldString ?? '',
$this->linkify($newString) ?? $newString ?? ''
);
}
return $this->linkify($newString) ?? $newString;
}
/**
* Convert a given url to a html link element or return null otherwise.
*/
private function linkify(?string $url): ?string {
if ($url === null) {
return null;
}
if (!str_starts_with($url, 'http://') && !str_starts_with($url, 'https://')) {
return null;
}
return sprintf('<a href="%1$s">%1$s</a>', htmlspecialchars($url));
}
/**
* @param VEvent $vEvent
* @param VEvent|null $oldVEvent
@ -121,11 +156,15 @@ class IMipService {
$data['meeting_url_html'] = self::readPropertyWithDefault($vEvent, 'URL', $defaultVal);
if (($locationHtml = $this->linkify($data['meeting_location'])) !== null) {
$data['meeting_location_html'] = $locationHtml;
}
if(!empty($oldVEvent)) {
$oldMeetingWhen = $this->generateWhenString($oldVEvent);
$data['meeting_title_html'] = $this->generateDiffString($vEvent, $oldVEvent, 'SUMMARY', $data['meeting_title']);
$data['meeting_description_html'] = $this->generateDiffString($vEvent, $oldVEvent, 'DESCRIPTION', $data['meeting_description']);
$data['meeting_location_html'] = $this->generateDiffString($vEvent, $oldVEvent, 'LOCATION', $data['meeting_location']);
$data['meeting_location_html'] = $this->generateLinkifiedDiffString($vEvent, $oldVEvent, 'LOCATION', $data['meeting_location']);
$oldUrl = self::readPropertyWithDefault($oldVEvent, 'URL', $defaultVal);
$data['meeting_url_html'] = !empty($oldUrl) && $oldUrl !== $data['meeting_url'] ? sprintf('<a href="%1$s">%1$s</a>', $oldUrl) : $data['meeting_url'];
@ -246,6 +285,7 @@ class IMipService {
$newDescription = isset($vEvent->DESCRIPTION) && (string)$vEvent->DESCRIPTION !== '' ? (string)$vEvent->DESCRIPTION : $defaultVal;
$newUrl = isset($vEvent->URL) && (string)$vEvent->URL !== '' ? sprintf('<a href="%1$s">%1$s</a>', $vEvent->URL) : $defaultVal;
$newLocation = isset($vEvent->LOCATION) && (string)$vEvent->LOCATION !== '' ? (string)$vEvent->LOCATION : $defaultVal;
$newLocationHtml = $this->linkify($newLocation) ?? $newLocation;
$data = [];
$data['meeting_when_html'] = $newMeetingWhen === '' ?: sprintf($strikethrough, $newMeetingWhen);
@ -256,7 +296,7 @@ class IMipService {
$data['meeting_description'] = $newDescription;
$data['meeting_url_html'] = $newUrl !== '' ? sprintf($strikethrough, $newUrl) : '';
$data['meeting_url'] = isset($vEvent->URL) ? (string)$vEvent->URL : '';
$data['meeting_location_html'] = $newLocation !== '' ? sprintf($strikethrough, $newLocation) : '';
$data['meeting_location_html'] = $newLocationHtml !== '' ? sprintf($strikethrough, $newLocationHtml) : '';
$data['meeting_location'] = $newLocation;
return $data;
}

View file

@ -46,6 +46,7 @@ use Psr\Log\LoggerInterface;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\IFile;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\PropPatch;
use Sabre\DAV\ServerPlugin;
@ -84,6 +85,16 @@ class FilesPlugin extends ServerPlugin {
public const SUBFOLDER_COUNT_PROPERTYNAME = '{http://nextcloud.org/ns}contained-folder-count';
public const SUBFILE_COUNT_PROPERTYNAME = '{http://nextcloud.org/ns}contained-file-count';
public const FILE_METADATA_SIZE = '{http://nextcloud.org/ns}file-metadata-size';
public const FILE_METADATA_GPS = '{http://nextcloud.org/ns}file-metadata-gps';
public const ALL_METADATA_PROPS = [
self::FILE_METADATA_SIZE => 'size',
self::FILE_METADATA_GPS => 'gps',
];
public const METADATA_MIMETYPES = [
'size' => 'image',
'gps' => 'image',
];
/** Reference to main server object */
private ?Server $server = null;
@ -418,26 +429,28 @@ class FilesPlugin extends ServerPlugin {
});
if ($this->config->getSystemValueBool('enable_file_metadata', true)) {
$propFind->handle(self::FILE_METADATA_SIZE, function () use ($node) {
if (!str_starts_with($node->getFileInfo()->getMimetype(), 'image')) {
return json_encode((object)[], JSON_THROW_ON_ERROR);
}
foreach (self::ALL_METADATA_PROPS as $prop => $meta) {
$propFind->handle($prop, function () use ($node, $meta) {
if ($node->getFileInfo()->getMimePart() !== self::METADATA_MIMETYPES[$meta]) {
return [];
}
if ($node->hasMetadata('size')) {
$sizeMetadata = $node->getMetadata('size');
} else {
// This code path should not be called since we try to preload
// the metadata when loading the folder or the search results
// in one go
$metadataManager = \OC::$server->get(IMetadataManager::class);
$sizeMetadata = $metadataManager->fetchMetadataFor('size', [$node->getId()])[$node->getId()];
if ($node->hasMetadata($meta)) {
$metadata = $node->getMetadata($meta);
} else {
// This code path should not be called since we try to preload
// the metadata when loading the folder or the search results
// in one go
$metadataManager = \OC::$server->get(IMetadataManager::class);
$metadata = $metadataManager->fetchMetadataFor($meta, [$node->getId()])[$node->getId()];
// TODO would be nice to display this in the profiler...
\OC::$server->get(LoggerInterface::class)->debug('Inefficient fetching of metadata');
}
// TODO would be nice to display this in the profiler...
\OC::$server->get(LoggerInterface::class)->debug('Inefficient fetching of metadata');
}
return $sizeMetadata->getValue();
});
return $metadata->getValue();
});
}
}
}
@ -452,27 +465,31 @@ class FilesPlugin extends ServerPlugin {
$requestProperties = $propFind->getRequestedProperties();
// TODO detect dynamically which metadata groups are requested and
// preload all of them and not just size
if ($this->config->getSystemValueBool('enable_file_metadata', true)
&& in_array(self::FILE_METADATA_SIZE, $requestProperties, true)) {
// Preloading of the metadata
$fileIds = [];
foreach ($node->getChildren() as $child) {
/** @var \OCP\Files\Node|Node $child */
if (str_starts_with($child->getFileInfo()->getMimeType(), 'image/')) {
/** @var File $child */
$fileIds[] = $child->getFileInfo()->getId();
if ($this->config->getSystemValueBool('enable_file_metadata', true)) {
$requestedMetaData = [];
foreach ($requestProperties as $requestProperty) {
if (isset(self::ALL_METADATA_PROPS[$requestProperty])) {
$requestedMetaData[] = self::ALL_METADATA_PROPS[$requestProperty];
}
}
$children = $node->getChildren();
// Preloading of the metadata
/** @var IMetaDataManager $metadataManager */
$metadataManager = \OC::$server->get(IMetadataManager::class);
$preloadedMetadata = $metadataManager->fetchMetadataFor('size', $fileIds);
foreach ($node->getChildren() as $child) {
/** @var \OCP\Files\Node|Node $child */
if (str_starts_with($child->getFileInfo()->getMimeType(), 'image')) {
/** @var File $child */
$child->setMetadata('size', $preloadedMetadata[$child->getFileInfo()->getId()]);
foreach ($requestedMetaData as $requestedMeta) {
$relevantMimeType = self::METADATA_MIMETYPES[$requestedMeta];
$childrenForMeta = array_filter($children, function (INode $child) use ($relevantMimeType) {
return $child instanceof File && $child->getFileInfo()->getMimePart() === $relevantMimeType;
});
$fileIds = array_map(function (File $child) {
return $child->getFileInfo()->getId();
}, $childrenForMeta);
$preloadedMetadata = $metadataManager->fetchMetadataFor($requestedMeta, $fileIds);
foreach ($childrenForMeta as $child) {
$child->setMetadata($requestedMeta, $preloadedMetadata[$child->getFileInfo()->getId()]);
}
}
}

View file

@ -168,7 +168,7 @@ class ChunkingV2Plugin extends ServerPlugin {
[$destinationDir, $destinationName] = Uri\split($this->uploadPath);
/** @var Directory $destinationParent */
$destinationParent = $this->server->tree->getNodeForPath($destinationDir);
$free = $storage->free_space($destinationParent->getInternalPath());
$free = $destinationParent->getNode()->getFreeSpace();
$newSize = $tempTargetFile->getSize() + $additionalSize;
if ($free >= 0 && ($tempTargetFile->getSize() > $free || $newSize > $free)) {
throw new InsufficientStorage("Insufficient space in $this->uploadPath");
@ -225,7 +225,7 @@ class ChunkingV2Plugin extends ServerPlugin {
foreach ($parts as $part) {
$size += $part['Size'];
}
$free = $storage->free_space($destinationParent->getInternalPath());
$free = $destinationParent->getNode()->getFreeSpace();
if ($free >= 0 && ($size > $free)) {
throw new InsufficientStorage("Insufficient space in $this->uploadPath");
}

View file

@ -1,5 +1,5 @@
<template>
<NcSettingsSection :title="$t('dav', 'Availability')"
<NcSettingsSection :name="$t('dav', 'Availability')"
:description="$t('dav', 'If you configure your working hours, other users will see when you are out of office when they book a meeting.')">
<div class="time-zone">
<strong>

View file

@ -1,5 +1,5 @@
<template>
<NcSettingsSection :title="$t('dav', 'Calendar server')"
<NcSettingsSection :name="$t('dav', 'Calendar server')"
:doc-url="userSyncCalendarsDocUrl">
<!-- Can use v-html as:
- $t passes the translated string through DOMPurify.sanitize,

View file

@ -4,11 +4,11 @@ exports[`CalDavSettings interactions 1`] = `
<div>
<div
class="settings-section settings-section--limit-width"
data-v-3896af2a=""
data-v-7c88e201=""
>
<h2
class="settings-section__title"
data-v-3896af2a=""
class="settings-section__name"
data-v-7c88e201=""
>
Calendar server
@ -16,7 +16,7 @@ exports[`CalDavSettings interactions 1`] = `
<a
aria-label="External documentation for Calendar server"
class="settings-section__info"
data-v-3896af2a=""
data-v-7c88e201=""
href="https://docs.nextcloud.com/server/23/go.php?to=user-sync-calendars"
rel="noreferrer nofollow"
role="note"
@ -26,7 +26,7 @@ exports[`CalDavSettings interactions 1`] = `
<span
aria-hidden="true"
class="material-design-icon help-circle-icon"
data-v-3896af2a=""
data-v-7c88e201=""
role="img"
>
<svg
@ -50,7 +50,7 @@ exports[`CalDavSettings interactions 1`] = `
<p
class="settings-hint"
data-v-3896af2a=""
data-v-7c88e201=""
>
Also install the
<a
@ -71,55 +71,66 @@ exports[`CalDavSettings interactions 1`] = `
</p>
<p
data-v-3896af2a=""
data-v-7c88e201=""
>
<span
class="checkbox-radio-switch checkbox-radio-switch-switch checkbox-radio-switch--checked"
data-v-3896af2a=""
data-v-781f2f28=""
data-v-7c88e201=""
data-v-dec41432=""
style="--icon-size: 36px;"
>
<input
class="checkbox-radio-switch__input"
data-v-dec41432=""
id="caldavSendInvitations"
type="checkbox"
value=""
/>
<label
class="checkbox-radio-switch__label"
data-v-781f2f28=""
data-v-dec41432=""
for="caldavSendInvitations"
>
<input
class="checkbox-radio-switch__input"
data-v-781f2f28=""
id="caldavSendInvitations"
type="checkbox"
value=""
/>
<div
class="checkbox-radio-switch__icon"
data-v-dec41432=""
>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon"
data-v-dec41432=""
role="img"
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
</div>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon"
data-v-781f2f28=""
role="img"
class="checkbox-radio-switch__label-text"
data-v-dec41432=""
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
Send invitations to attendees
</span>
</label>
</span>
<em
data-v-3896af2a=""
data-v-7c88e201=""
>
Please make sure to properly set up
<a
@ -132,55 +143,66 @@ exports[`CalDavSettings interactions 1`] = `
</p>
<p
data-v-3896af2a=""
data-v-7c88e201=""
>
<span
class="checkbox-radio-switch checkbox checkbox-radio-switch-switch checkbox-radio-switch--checked"
data-v-3896af2a=""
data-v-781f2f28=""
data-v-7c88e201=""
data-v-dec41432=""
style="--icon-size: 36px;"
>
<input
class="checkbox-radio-switch__input"
data-v-dec41432=""
id="caldavGenerateBirthdayCalendar"
type="checkbox"
value=""
/>
<label
class="checkbox-radio-switch__label"
data-v-781f2f28=""
data-v-dec41432=""
for="caldavGenerateBirthdayCalendar"
>
<input
class="checkbox-radio-switch__input"
data-v-781f2f28=""
id="caldavGenerateBirthdayCalendar"
type="checkbox"
value=""
/>
<div
class="checkbox-radio-switch__icon"
data-v-dec41432=""
>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon"
data-v-dec41432=""
role="img"
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
</div>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon"
data-v-781f2f28=""
role="img"
class="checkbox-radio-switch__label-text"
data-v-dec41432=""
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
Automatically generate a birthday calendar
</span>
</label>
</span>
<em
data-v-3896af2a=""
data-v-7c88e201=""
>
Birthday calendars will be generated by a background job.
@ -188,11 +210,11 @@ exports[`CalDavSettings interactions 1`] = `
</em>
<br
data-v-3896af2a=""
data-v-7c88e201=""
/>
<em
data-v-3896af2a=""
data-v-7c88e201=""
>
Hence they will not be available immediately after enabling but will show up after some time.
@ -201,55 +223,66 @@ exports[`CalDavSettings interactions 1`] = `
</p>
<p
data-v-3896af2a=""
data-v-7c88e201=""
>
<span
class="checkbox-radio-switch checkbox-radio-switch-switch checkbox-radio-switch--checked"
data-v-3896af2a=""
data-v-781f2f28=""
data-v-7c88e201=""
data-v-dec41432=""
style="--icon-size: 36px;"
>
<input
class="checkbox-radio-switch__input"
data-v-dec41432=""
id="caldavSendEventReminders"
type="checkbox"
value=""
/>
<label
class="checkbox-radio-switch__label"
data-v-781f2f28=""
data-v-dec41432=""
for="caldavSendEventReminders"
>
<input
class="checkbox-radio-switch__input"
data-v-781f2f28=""
id="caldavSendEventReminders"
type="checkbox"
value=""
/>
<div
class="checkbox-radio-switch__icon"
data-v-dec41432=""
>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon"
data-v-dec41432=""
role="img"
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
</div>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon"
data-v-781f2f28=""
role="img"
class="checkbox-radio-switch__label-text"
data-v-dec41432=""
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
Send notifications for events
</span>
</label>
</span>
<em
data-v-3896af2a=""
data-v-7c88e201=""
>
Please make sure to properly set up
<a
@ -261,11 +294,11 @@ exports[`CalDavSettings interactions 1`] = `
</em>
<br
data-v-3896af2a=""
data-v-7c88e201=""
/>
<em
data-v-3896af2a=""
data-v-7c88e201=""
>
Notifications are sent via background jobs, so these must occur often enough.
@ -275,55 +308,66 @@ exports[`CalDavSettings interactions 1`] = `
<p
class="indented"
data-v-3896af2a=""
data-v-7c88e201=""
>
<span
class="checkbox-radio-switch checkbox-radio-switch-switch checkbox-radio-switch--checked"
data-v-3896af2a=""
data-v-781f2f28=""
data-v-7c88e201=""
data-v-dec41432=""
style="--icon-size: 36px;"
>
<input
class="checkbox-radio-switch__input"
data-v-dec41432=""
id="caldavSendEventRemindersToSharedGroupMembers"
type="checkbox"
value=""
/>
<label
class="checkbox-radio-switch__label"
data-v-781f2f28=""
data-v-dec41432=""
for="caldavSendEventRemindersToSharedGroupMembers"
>
<input
class="checkbox-radio-switch__input"
data-v-781f2f28=""
id="caldavSendEventRemindersToSharedGroupMembers"
type="checkbox"
value=""
/>
<div
class="checkbox-radio-switch__icon"
data-v-dec41432=""
>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon"
data-v-dec41432=""
role="img"
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
</div>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon"
data-v-781f2f28=""
role="img"
class="checkbox-radio-switch__label-text"
data-v-dec41432=""
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
Send reminder notifications to calendar sharees as well
</span>
</label>
</span>
<em
data-v-3896af2a=""
data-v-7c88e201=""
>
Reminders are always sent to organizers and attendees.
@ -333,50 +377,61 @@ exports[`CalDavSettings interactions 1`] = `
<p
class="indented"
data-v-3896af2a=""
data-v-7c88e201=""
>
<span
class="checkbox-radio-switch checkbox-radio-switch-switch checkbox-radio-switch--checked"
data-v-3896af2a=""
data-v-781f2f28=""
data-v-7c88e201=""
data-v-dec41432=""
style="--icon-size: 36px;"
>
<input
class="checkbox-radio-switch__input"
data-v-dec41432=""
id="caldavSendEventRemindersPush"
type="checkbox"
value=""
/>
<label
class="checkbox-radio-switch__label"
data-v-781f2f28=""
data-v-dec41432=""
for="caldavSendEventRemindersPush"
>
<input
class="checkbox-radio-switch__input"
data-v-781f2f28=""
id="caldavSendEventRemindersPush"
type="checkbox"
value=""
/>
<div
class="checkbox-radio-switch__icon"
data-v-dec41432=""
>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon"
data-v-dec41432=""
role="img"
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
</div>
<span
aria-hidden="true"
class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon"
data-v-781f2f28=""
role="img"
class="checkbox-radio-switch__label-text"
data-v-dec41432=""
>
<svg
class="material-design-icon__svg"
fill="currentColor"
height="36"
viewBox="0 0 24 24"
width="36"
>
<path
d="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"
>
<!---->
</path>
</svg>
</span>
Enable notifications for events via push
</span>
</label>
</span>
</p>

View file

@ -29,10 +29,14 @@ OC.L10N.register(
"Missing Signature" : "Sinadura falta da",
"one-time password for server-side-encryption" : "aldi bateko pasahitzak zerbitzari-aldeko zifratzerako",
"Encryption password" : "Zifratze-pasahitza",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Administrazioak zerbitzariaren aldeko zifratzea gaitu da. Zure fitxategiak zifratu dira pasahitza hau erabiliz <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Administrazioak zerbitzariaren aldeko zifratzea gaitu da. Zure fitxategiak zifratu dira pasahitza hau erabiliz \"%s\".",
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Hasi saioa web-interfazean, joan zure ezarpen pertsonaletako \"Segurtasuna\" atalera eta eguneratu zure zifratze-pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko saio-hasierako pasahitza sartuz.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ezin izan da fitxategi hau deszifratu, ziur aski partekatutako fitxategia izango da. Mesedez, fitxategiaren jabeari berriz partekatzeko eska iezaiozu.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ezin da fitxategi hau irakurri, ziur aski partekatutako fitxategia izango da. Mesedez, fitxategiaren jabeari berriz partekatzeko eska iezaiozu.",
"Default encryption module" : "Zifratze-modulu lehenetsia",
"Default encryption module for server-side encryption" : "Lehenetsitako zifratze modulua zerbitzari aldeko zifratzerako",
"In order to use this encryption module you need to enable server-side encryption in the admin settings. Once enabled this module will encrypt all your files transparently. The encryption is based on AES 256 keys.\nThe module will not touch existing files, only new files will be encrypted after server-side encryption was enabled. It is also not possible to disable the encryption again and switch back to an unencrypted system.\nPlease read the documentation to know all implications before you decide to enable server-side encryption." : "Zifratze-modulu hau erabiltzeko, zerbitzariaren aldeko zifratzea gaitu behar duzu administratzailearen ezarpenetan. Gaituta dagoenean, modulu honek zure fitxategi guztiak garden zifratuko ditu. Zifratzea AES 256 gakoetan oinarritzen da.\nModuluak ez ditu lehendik dauden fitxategiak ukituko, zerbitzariaren aldeko zifratzea gaitu ondoren fitxategi berriak soilik zifratuko dira. Ezin da zifratzea berriro desgaitu eta zifratu gabeko sistema batera itzuli.\nIrakurri dokumentazioa ondorio guztiak ezagutzeko zerbitzariaren aldeko zifratzea gaitzea erabaki aurretik.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Enkriptatze aplikazioa gaituta dago, baina zure gakoak ez dira hasieratu, mesedez saioa itxi eta sar zaitez berriro",
"Encrypt the home storage" : "Zifratu etxe-biltegia",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aukera hau gaituz gero, biltegi orokorreko fitxategi guztiak zifratuko dira, bestela kanpo biltegian daudenak bakarrik zifratuko dira",
@ -61,6 +65,7 @@ OC.L10N.register(
"Hey there,\n\nThe administration enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.\n\n" : "Aupa,\n\nAdministrazioak zerbitzariaren aldeko enkriptatzea gaitu zuen. Zure fitxategiak \"1%s\" pasahitza erabiliz enkriptatu dira.\n\nMesedez, hasi saioa web-interfazean, joan zure ezarpen pertsonaletako \"Oinarrizko enkriptatze-modulua\" atalera eta eguneratu zure enkriptatze-pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko saio-hasierako pasahitza sartuz.\n\n",
"The share will expire on %s." : "Elkarbanaketa %s-n iraungiko da.",
"Cheers!" : "Ongi izan!",
"Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>" : "Kaixo,<br><br>administrazioak zerbitzariaren aldeko enkriptatzea gaitu du. Zure fitxategiak <strong>%s</strong>.<br><br>pasahitza erabiliz enkriptatu dira. Mesedez, hasi saioa web interfazean, joan zure ezarpen pertsonaletako \"Oinarrizko enkriptatze-modulua\" atalera eta eguneratu zure enkriptatze-pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko unean sartuz. saioa-pasahitza.<br><br>"
"Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>" : "Kaixo,<br><br>administrazioak zerbitzariaren aldeko enkriptatzea gaitu du. Zure fitxategiak <strong>%s</strong>.<br><br>pasahitza erabiliz enkriptatu dira. Mesedez, hasi saioa web interfazean, joan zure ezarpen pertsonaletako \"Oinarrizko enkriptatze-modulua\" atalera eta eguneratu zure enkriptatze-pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko unean sartuz. saioa-pasahitza.<br><br>",
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password." : "Hasi saioa web-interfazean, joan zure ezarpen pertsonaletako \"Segurtasuna\" atalera eta eguneratu zure zifratze pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko saio-hasierako pasahitza sartuz."
},
"nplurals=2; plural=(n != 1);");

View file

@ -27,10 +27,14 @@
"Missing Signature" : "Sinadura falta da",
"one-time password for server-side-encryption" : "aldi bateko pasahitzak zerbitzari-aldeko zifratzerako",
"Encryption password" : "Zifratze-pasahitza",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Administrazioak zerbitzariaren aldeko zifratzea gaitu da. Zure fitxategiak zifratu dira pasahitza hau erabiliz <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Administrazioak zerbitzariaren aldeko zifratzea gaitu da. Zure fitxategiak zifratu dira pasahitza hau erabiliz \"%s\".",
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Hasi saioa web-interfazean, joan zure ezarpen pertsonaletako \"Segurtasuna\" atalera eta eguneratu zure zifratze-pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko saio-hasierako pasahitza sartuz.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ezin izan da fitxategi hau deszifratu, ziur aski partekatutako fitxategia izango da. Mesedez, fitxategiaren jabeari berriz partekatzeko eska iezaiozu.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ezin da fitxategi hau irakurri, ziur aski partekatutako fitxategia izango da. Mesedez, fitxategiaren jabeari berriz partekatzeko eska iezaiozu.",
"Default encryption module" : "Zifratze-modulu lehenetsia",
"Default encryption module for server-side encryption" : "Lehenetsitako zifratze modulua zerbitzari aldeko zifratzerako",
"In order to use this encryption module you need to enable server-side encryption in the admin settings. Once enabled this module will encrypt all your files transparently. The encryption is based on AES 256 keys.\nThe module will not touch existing files, only new files will be encrypted after server-side encryption was enabled. It is also not possible to disable the encryption again and switch back to an unencrypted system.\nPlease read the documentation to know all implications before you decide to enable server-side encryption." : "Zifratze-modulu hau erabiltzeko, zerbitzariaren aldeko zifratzea gaitu behar duzu administratzailearen ezarpenetan. Gaituta dagoenean, modulu honek zure fitxategi guztiak garden zifratuko ditu. Zifratzea AES 256 gakoetan oinarritzen da.\nModuluak ez ditu lehendik dauden fitxategiak ukituko, zerbitzariaren aldeko zifratzea gaitu ondoren fitxategi berriak soilik zifratuko dira. Ezin da zifratzea berriro desgaitu eta zifratu gabeko sistema batera itzuli.\nIrakurri dokumentazioa ondorio guztiak ezagutzeko zerbitzariaren aldeko zifratzea gaitzea erabaki aurretik.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Enkriptatze aplikazioa gaituta dago, baina zure gakoak ez dira hasieratu, mesedez saioa itxi eta sar zaitez berriro",
"Encrypt the home storage" : "Zifratu etxe-biltegia",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aukera hau gaituz gero, biltegi orokorreko fitxategi guztiak zifratuko dira, bestela kanpo biltegian daudenak bakarrik zifratuko dira",
@ -59,6 +63,7 @@
"Hey there,\n\nThe administration enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.\n\n" : "Aupa,\n\nAdministrazioak zerbitzariaren aldeko enkriptatzea gaitu zuen. Zure fitxategiak \"1%s\" pasahitza erabiliz enkriptatu dira.\n\nMesedez, hasi saioa web-interfazean, joan zure ezarpen pertsonaletako \"Oinarrizko enkriptatze-modulua\" atalera eta eguneratu zure enkriptatze-pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko saio-hasierako pasahitza sartuz.\n\n",
"The share will expire on %s." : "Elkarbanaketa %s-n iraungiko da.",
"Cheers!" : "Ongi izan!",
"Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>" : "Kaixo,<br><br>administrazioak zerbitzariaren aldeko enkriptatzea gaitu du. Zure fitxategiak <strong>%s</strong>.<br><br>pasahitza erabiliz enkriptatu dira. Mesedez, hasi saioa web interfazean, joan zure ezarpen pertsonaletako \"Oinarrizko enkriptatze-modulua\" atalera eta eguneratu zure enkriptatze-pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko unean sartuz. saioa-pasahitza.<br><br>"
"Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>" : "Kaixo,<br><br>administrazioak zerbitzariaren aldeko enkriptatzea gaitu du. Zure fitxategiak <strong>%s</strong>.<br><br>pasahitza erabiliz enkriptatu dira. Mesedez, hasi saioa web interfazean, joan zure ezarpen pertsonaletako \"Oinarrizko enkriptatze-modulua\" atalera eta eguneratu zure enkriptatze-pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko unean sartuz. saioa-pasahitza.<br><br>",
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password." : "Hasi saioa web-interfazean, joan zure ezarpen pertsonaletako \"Segurtasuna\" atalera eta eguneratu zure zifratze pasahitza pasahitz hau \"Saio-hasteko pasahitz zaharra\" eremuan eta zure uneko saio-hasierako pasahitza sartuz."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -39,6 +39,7 @@ use OCA\Encryption\Users\Setup;
use OCA\Encryption\Util;
use OCP\Encryption\IManager;
use OCP\IConfig;
use Psr\Log\LoggerInterface;
class Application extends \OCP\AppFramework\App {
/**
@ -69,7 +70,7 @@ class Application extends \OCP\AppFramework\App {
$hookManager->registerHook([
new UserHooks($container->query(KeyManager::class),
$server->getUserManager(),
$server->getLogger(),
$server->get(LoggerInterface::class),
$container->query(Setup::class),
$server->getUserSession(),
$container->query(Util::class),
@ -93,15 +94,15 @@ class Application extends \OCP\AppFramework\App {
Encryption::DISPLAY_NAME,
function () use ($container) {
return new Encryption(
$container->query(Crypt::class),
$container->query(KeyManager::class),
$container->query(Util::class),
$container->query(Session::class),
$container->query(EncryptAll::class),
$container->query(DecryptAll::class),
$container->getServer()->getLogger(),
$container->getServer()->getL10N($container->getAppName())
);
$container->query(Crypt::class),
$container->query(KeyManager::class),
$container->query(Util::class),
$container->query(Session::class),
$container->query(EncryptAll::class),
$container->query(DecryptAll::class),
$container->getServer()->get(LoggerInterface::class),
$container->getServer()->getL10N($container->getAppName())
);
});
}
}

View file

@ -29,9 +29,9 @@ use OCA\Encryption\Util;
use OCP\Files\IRootFolder;
use OCP\HintException;
use OCP\IConfig;
use OCP\ILogger;
use OCP\IUser;
use OCP\IUserManager;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
@ -39,41 +39,16 @@ use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class FixEncryptedVersion extends Command {
/** @var IConfig */
private $config;
/** @var ILogger */
private $logger;
/** @var IRootFolder */
private $rootFolder;
/** @var IUserManager */
private $userManager;
/** @var Util */
private $util;
/** @var View */
private $view;
/** @var bool */
private $supportLegacy;
private bool $supportLegacy;
public function __construct(
IConfig $config,
ILogger $logger,
IRootFolder $rootFolder,
IUserManager $userManager,
Util $util,
View $view
private IConfig $config,
private LoggerInterface $logger,
private IRootFolder $rootFolder,
private IUserManager $userManager,
private Util $util,
private View $view,
) {
$this->config = $config;
$this->logger = $logger;
$this->rootFolder = $rootFolder;
$this->userManager = $userManager;
$this->util = $util;
$this->view = $view;
$this->supportLegacy = false;
parent::__construct();
@ -134,7 +109,7 @@ class FixEncryptedVersion extends Command {
return $this->runForUser($user, $pathOption, $output);
} elseif ($all) {
$result = 0;
$this->userManager->callForSeenUsers(function(IUser $user) use ($pathOption, $output, &$result) {
$this->userManager->callForSeenUsers(function (IUser $user) use ($pathOption, $output, &$result) {
$output->writeln("Processing files for " . $user->getUID());
$result = $this->runForUser($user->getUID(), $pathOption, $output);
return $result === 0;

View file

@ -40,8 +40,8 @@ use OCA\Encryption\Exceptions\MultiKeyEncryptException;
use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
use OCP\IUserSession;
use Psr\Log\LoggerInterface;
use phpseclib\Crypt\RC4;
/**
@ -83,40 +83,24 @@ class Crypt {
// default encoding format, old Nextcloud versions used base64
public const BINARY_ENCODING_FORMAT = 'binary';
/** @var ILogger */
private $logger;
private string $user;
/** @var string */
private $user;
private ?string $currentCipher = null;
/** @var IConfig */
private $config;
/** @var IL10N */
private $l;
/** @var string|null */
private $currentCipher;
/** @var bool */
private $supportLegacy;
private bool $supportLegacy;
/**
* Use the legacy base64 encoding instead of the more space-efficient binary encoding.
*/
private bool $useLegacyBase64Encoding;
/**
* @param ILogger $logger
* @param IUserSession $userSession
* @param IConfig $config
* @param IL10N $l
*/
public function __construct(ILogger $logger, IUserSession $userSession, IConfig $config, IL10N $l) {
$this->logger = $logger;
$this->user = $userSession && $userSession->isLoggedIn() ? $userSession->getUser()->getUID() : '"no user given"';
$this->config = $config;
$this->l = $l;
public function __construct(
private LoggerInterface $logger,
IUserSession $userSession,
private IConfig $config,
private IL10N $l,
) {
$this->user = $userSession->isLoggedIn() ? $userSession->getUser()->getUID() : '"no user given"';
$this->supportLegacy = $this->config->getSystemValueBool('encryption.legacy_format_support', false);
$this->useLegacyBase64Encoding = $this->config->getSystemValueBool('encryption.use_legacy_base64_encoding', false);
}
@ -127,15 +111,14 @@ class Crypt {
* @return array|bool
*/
public function createKeyPair() {
$log = $this->logger;
$res = $this->getOpenSSLPKey();
if (!$res) {
$log->error("Encryption Library couldn't generate users key-pair for {$this->user}",
$this->logger->error("Encryption Library couldn't generate users key-pair for {$this->user}",
['app' => 'encryption']);
if (openssl_error_string()) {
$log->error('Encryption library openssl_pkey_new() fails: ' . openssl_error_string(),
$this->logger->error('Encryption library openssl_pkey_new() fails: ' . openssl_error_string(),
['app' => 'encryption']);
}
} elseif (openssl_pkey_export($res,
@ -150,10 +133,10 @@ class Crypt {
'privateKey' => $privateKey
];
}
$log->error('Encryption library couldn\'t export users private key, please check your servers OpenSSL configuration.' . $this->user,
$this->logger->error('Encryption library couldn\'t export users private key, please check your servers OpenSSL configuration.' . $this->user,
['app' => 'encryption']);
if (openssl_error_string()) {
$log->error('Encryption Library:' . openssl_error_string(),
$this->logger->error('Encryption Library:' . openssl_error_string(),
['app' => 'encryption']);
}
@ -170,12 +153,7 @@ class Crypt {
return openssl_pkey_new($config);
}
/**
* get openSSL Config
*
* @return array
*/
private function getOpenSSLConfig() {
private function getOpenSSLConfig(): array {
$config = ['private_key_bits' => 4096];
$config = array_merge(
$config,
@ -236,14 +214,9 @@ class Crypt {
}
/**
* @param string $plainContent
* @param string $iv
* @param string $passPhrase
* @param string $cipher
* @return string
* @throws EncryptionFailedException
*/
private function encrypt($plainContent, $iv, $passPhrase = '', $cipher = self::DEFAULT_CIPHER) {
private function encrypt(string $plainContent, string $iv, string $passPhrase = '', string $cipher = self::DEFAULT_CIPHER): string {
$options = $this->useLegacyBase64Encoding ? 0 : OPENSSL_RAW_DATA;
$encryptedContent = openssl_encrypt($plainContent,
$cipher,
@ -264,10 +237,8 @@ class Crypt {
/**
* return cipher either from config.php or the default cipher defined in
* this class
*
* @return string
*/
private function getCachedCipher() {
private function getCachedCipher(): string {
if (isset($this->currentCipher)) {
return $this->currentCipher;
}
@ -333,21 +304,11 @@ class Crypt {
return self::LEGACY_CIPHER;
}
/**
* @param string $encryptedContent
* @param string $iv
* @return string
*/
private function concatIV($encryptedContent, $iv) {
private function concatIV(string $encryptedContent, string $iv): string {
return $encryptedContent . '00iv00' . $iv;
}
/**
* @param string $encryptedContent
* @param string $signature
* @return string
*/
private function concatSig($encryptedContent, $signature) {
private function concatSig(string $encryptedContent, string $signature): string {
return $encryptedContent . '00sig00' . $signature;
}
@ -355,21 +316,15 @@ class Crypt {
* Note: This is _NOT_ a padding used for encryption purposes. It is solely
* used to achieve the PHP stream size. It has _NOTHING_ to do with the
* encrypted content and is not used in any crypto primitive.
*
* @param string $data
* @return string
*/
private function addPadding($data) {
private function addPadding(string $data): string {
return $data . 'xxx';
}
/**
* generate password hash used to encrypt the users private key
*
* @param string $password
* @param string $cipher
* @param string $uid only used for user keys
* @return string
*/
protected function generatePasswordHash(string $password, string $cipher, string $uid = '', int $iterations = 600000): string {
$instanceId = $this->config->getSystemValue('instanceid');
@ -542,13 +497,9 @@ class Crypt {
/**
* remove padding
*
* @param string $padded
* @param bool $hasSignature did the block contain a signature, in this case we use a different padding
* @return string|false
*/
private function removePadding($padded, $hasSignature = false) {
private function removePadding(string $padded, bool $hasSignature = false): string|false {
if ($hasSignature === false && substr($padded, -2) === 'xx') {
return substr($padded, 0, -2);
} elseif ($hasSignature === true && substr($padded, -3) === 'xxx') {
@ -561,12 +512,8 @@ class Crypt {
* split meta data from encrypted file
* Note: for now, we assume that the meta data always start with the iv
* followed by the signature, if available
*
* @param string $catFile
* @param string $cipher
* @return array
*/
private function splitMetaData($catFile, $cipher) {
private function splitMetaData(string $catFile, string $cipher): array {
if ($this->hasSignature($catFile, $cipher)) {
$catFile = $this->removePadding($catFile, true);
$meta = substr($catFile, -93);
@ -591,12 +538,9 @@ class Crypt {
/**
* check if encrypted block is signed
*
* @param string $catFile
* @param string $cipher
* @return bool
* @throws GenericEncryptionException
*/
private function hasSignature($catFile, $cipher) {
private function hasSignature(string $catFile, string $cipher): bool {
$skipSignatureCheck = $this->config->getSystemValueBool('encryption_skip_signature_check', false);
$meta = substr($catFile, -93);
@ -617,12 +561,6 @@ class Crypt {
/**
* @param string $encryptedContent
* @param string $iv
* @param string $passPhrase
* @param string $cipher
* @param boolean $binaryEncoding
* @return string
* @throws DecryptionFailedException
*/
private function decrypt(string $encryptedContent, string $iv, string $passPhrase = '', string $cipher = self::DEFAULT_CIPHER, bool $binaryEncoding = false): string {
@ -669,10 +607,9 @@ class Crypt {
/**
* generate initialization vector
*
* @return string
* @throws GenericEncryptionException
*/
private function generateIv() {
private function generateIv(): string {
return random_bytes(16);
}

View file

@ -42,7 +42,7 @@ use OCA\Encryption\Session;
use OCA\Encryption\Util;
use OCP\Encryption\IEncryptionModule;
use OCP\IL10N;
use OCP\ILogger;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@ -50,11 +50,6 @@ class Encryption implements IEncryptionModule {
public const ID = 'OC_DEFAULT_MODULE';
public const DISPLAY_NAME = 'Default encryption module';
/**
* @var Crypt
*/
private $crypt;
/** @var string */
private $cipher;
@ -64,8 +59,7 @@ class Encryption implements IEncryptionModule {
/** @var string */
private $user;
/** @var array */
private $owner;
private array $owner;
/** @var string */
private $fileKey;
@ -73,76 +67,36 @@ class Encryption implements IEncryptionModule {
/** @var string */
private $writeCache;
/** @var KeyManager */
private $keyManager;
/** @var array */
private $accessList;
/** @var boolean */
private $isWriteOperation;
/** @var Util */
private $util;
/** @var Session */
private $session;
/** @var ILogger */
private $logger;
/** @var IL10N */
private $l;
/** @var EncryptAll */
private $encryptAll;
/** @var bool */
private $useMasterPassword;
/** @var DecryptAll */
private $decryptAll;
private bool $useMasterPassword;
private bool $useLegacyBase64Encoding = false;
/** @var int Current version of the file */
private $version = 0;
private int $version = 0;
private bool $useLegacyFileKey = true;
/** @var array remember encryption signature version */
private static $rememberVersion = [];
/**
*
* @param Crypt $crypt
* @param KeyManager $keyManager
* @param Util $util
* @param Session $session
* @param EncryptAll $encryptAll
* @param DecryptAll $decryptAll
* @param ILogger $logger
* @param IL10N $il10n
*/
public function __construct(Crypt $crypt,
KeyManager $keyManager,
Util $util,
Session $session,
EncryptAll $encryptAll,
DecryptAll $decryptAll,
ILogger $logger,
IL10N $il10n) {
$this->crypt = $crypt;
$this->keyManager = $keyManager;
$this->util = $util;
$this->session = $session;
$this->encryptAll = $encryptAll;
$this->decryptAll = $decryptAll;
$this->logger = $logger;
$this->l = $il10n;
public function __construct(
private Crypt $crypt,
private KeyManager $keyManager,
private Util $util,
private Session $session,
private EncryptAll $encryptAll,
private DecryptAll $decryptAll,
private LoggerInterface $logger,
private IL10N $l,
) {
$this->owner = [];
$this->useMasterPassword = $util->isMasterKeyEnabled();
$this->useMasterPassword = $this->util->isMasterKeyEnabled();
}
/**

View file

@ -36,87 +36,29 @@ use OCA\Encryption\Session;
use OCA\Encryption\Users\Setup;
use OCA\Encryption\Util;
use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\ILogger;
use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Util as OCUtil;
use Psr\Log\LoggerInterface;
class UserHooks implements IHook {
/**
* list of user for which we perform a password reset
* @var array
* @var array<string, true>
*/
protected static $passwordResetUsers = [];
protected static array $passwordResetUsers = [];
/**
* @var KeyManager
*/
private $keyManager;
/**
* @var IUserManager
*/
private $userManager;
/**
* @var ILogger
*/
private $logger;
/**
* @var Setup
*/
private $userSetup;
/**
* @var IUserSession
*/
private $userSession;
/**
* @var Util
*/
private $util;
/**
* @var Session
*/
private $session;
/**
* @var Recovery
*/
private $recovery;
/**
* @var Crypt
*/
private $crypt;
/**
* UserHooks constructor.
*
* @param KeyManager $keyManager
* @param IUserManager $userManager
* @param ILogger $logger
* @param Setup $userSetup
* @param IUserSession $userSession
* @param Util $util
* @param Session $session
* @param Crypt $crypt
* @param Recovery $recovery
*/
public function __construct(KeyManager $keyManager,
IUserManager $userManager,
ILogger $logger,
Setup $userSetup,
IUserSession $userSession,
Util $util,
Session $session,
Crypt $crypt,
Recovery $recovery) {
$this->keyManager = $keyManager;
$this->userManager = $userManager;
$this->logger = $logger;
$this->userSetup = $userSetup;
$this->userSession = $userSession;
$this->util = $util;
$this->session = $session;
$this->recovery = $recovery;
$this->crypt = $crypt;
public function __construct(
private KeyManager $keyManager,
private IUserManager $userManager,
private LoggerInterface $logger,
private Setup $userSetup,
private IUserSession $userSession,
private Util $util,
private Session $session,
private Crypt $crypt,
private Recovery $recovery,
) {
}
/**
@ -244,7 +186,6 @@ class UserHooks implements IHook {
* @return boolean|null
*/
public function setPassphrase($params) {
// if we are in the process to resetting a user password, we have nothing
// to do here
if (isset(self::$passwordResetUsers[$params['uid']])) {
@ -298,7 +239,6 @@ class UserHooks implements IHook {
|| !$this->keyManager->userHasKeys($userId)
|| !$this->util->userHasFiles($userId)
) {
// backup old keys
//$this->backupAllKeys('recovery');

View file

@ -39,106 +39,34 @@ use OCA\Encryption\Exceptions\PrivateKeyMissingException;
use OCA\Encryption\Exceptions\PublicKeyMissingException;
use OCP\Encryption\Keys\IStorage;
use OCP\IConfig;
use OCP\ILogger;
use OCP\IUserSession;
use OCP\Lock\ILockingProvider;
use Psr\Log\LoggerInterface;
class KeyManager {
/**
* @var Session
*/
protected $session;
/**
* @var IStorage
*/
private $keyStorage;
/**
* @var Crypt
*/
private $crypt;
/**
* @var string
*/
private $recoveryKeyId;
/**
* @var string
*/
private $publicShareKeyId;
/**
* @var string
*/
private $masterKeyId;
/**
* @var string UserID
*/
private $keyId;
/**
* @var string
*/
private $publicKeyId = 'publicKey';
/**
* @var string
*/
private $privateKeyId = 'privateKey';
private string $recoveryKeyId;
private string $publicShareKeyId;
private string $masterKeyId;
private string $keyId;
private string $publicKeyId = 'publicKey';
private string $privateKeyId = 'privateKey';
private string $shareKeyId = 'shareKey';
private string $fileKeyId = 'fileKey';
/**
* @var string
*/
private $shareKeyId = 'shareKey';
/**
* @var string
*/
private $fileKeyId = 'fileKey';
/**
* @var IConfig
*/
private $config;
/**
* @var ILogger
*/
private $log;
/**
* @var Util
*/
private $util;
/**
* @var ILockingProvider
*/
private $lockingProvider;
/**
* @param IStorage $keyStorage
* @param Crypt $crypt
* @param IConfig $config
* @param IUserSession $userSession
* @param Session $session
* @param ILogger $log
* @param Util $util
*/
public function __construct(
IStorage $keyStorage,
Crypt $crypt,
IConfig $config,
private IStorage $keyStorage,
private Crypt $crypt,
private IConfig $config,
IUserSession $userSession,
Session $session,
ILogger $log,
Util $util,
ILockingProvider $lockingProvider
private Session $session,
private LoggerInterface $logger,
private Util $util,
private ILockingProvider $lockingProvider,
) {
$this->util = $util;
$this->session = $session;
$this->keyStorage = $keyStorage;
$this->crypt = $crypt;
$this->config = $config;
$this->log = $log;
$this->lockingProvider = $lockingProvider;
$this->recoveryKeyId = $this->config->getAppValue('encryption',
'recoveryKeyId');
if (empty($this->recoveryKeyId)) {
$this->recoveryKeyId = 'recoveryKey_' . substr(md5(time()), 0, 8);
$this->recoveryKeyId = 'recoveryKey_' . substr(md5((string)time()), 0, 8);
$this->config->setAppValue('encryption',
'recoveryKeyId',
$this->recoveryKeyId);
@ -147,19 +75,18 @@ class KeyManager {
$this->publicShareKeyId = $this->config->getAppValue('encryption',
'publicShareKeyId');
if (empty($this->publicShareKeyId)) {
$this->publicShareKeyId = 'pubShare_' . substr(md5(time()), 0, 8);
$this->publicShareKeyId = 'pubShare_' . substr(md5((string)time()), 0, 8);
$this->config->setAppValue('encryption', 'publicShareKeyId', $this->publicShareKeyId);
}
$this->masterKeyId = $this->config->getAppValue('encryption',
'masterKeyId');
if (empty($this->masterKeyId)) {
$this->masterKeyId = 'master_' . substr(md5(time()), 0, 8);
$this->masterKeyId = 'master_' . substr(md5((string)time()), 0, 8);
$this->config->setAppValue('encryption', 'masterKeyId', $this->masterKeyId);
}
$this->keyId = $userSession->isLoggedIn() ? $userSession->getUser()->getUID() : false;
$this->log = $log;
}
/**
@ -223,10 +150,10 @@ class KeyManager {
}
$this->lockingProvider->releaseLock('encryption-generateMasterKey', ILockingProvider::LOCK_EXCLUSIVE);
} elseif (empty($publicMasterKey)) {
$this->log->error('A private master key is available but the public key could not be found. This should never happen.');
$this->logger->error('A private master key is available but the public key could not be found. This should never happen.');
return;
} elseif (empty($privateMasterKey)) {
$this->log->error('A public master key is available but the private key could not be found. This should never happen.');
$this->logger->error('A public master key is available but the private key could not be found. This should never happen.');
return;
}
@ -405,11 +332,13 @@ class KeyManager {
} catch (DecryptionFailedException $e) {
return false;
} catch (\Exception $e) {
$this->log->logException($e, [
'message' => 'Could not decrypt the private key from user "' . $uid . '"" during login. Assume password change on the user back-end.',
'level' => ILogger::WARN,
'app' => 'encryption',
]);
$this->logger->warning(
'Could not decrypt the private key from user "' . $uid . '"" during login. Assume password change on the user back-end.',
[
'app' => 'encryption',
'exception' => $e,
]
);
return false;
}

View file

@ -32,46 +32,21 @@ use OCA\Encryption\Util;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
use OCP\ISession;
use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Settings\ISettings;
use Psr\Log\LoggerInterface;
class Admin implements ISettings {
/** @var IL10N */
private $l;
/** @var ILogger */
private $logger;
/** @var IUserSession */
private $userSession;
/** @var IConfig */
private $config;
/** @var IUserManager */
private $userManager;
/** @var ISession */
private $session;
public function __construct(
IL10N $l,
ILogger $logger,
IUserSession $userSession,
IConfig $config,
IUserManager $userManager,
ISession $session
private IL10N $l,
private LoggerInterface $logger,
private IUserSession $userSession,
private IConfig $config,
private IUserManager $userManager,
private ISession $session
) {
$this->l = $l;
$this->logger = $logger;
$this->userSession = $userSession;
$this->config = $config;
$this->userManager = $userManager;
$this->session = $session;
}
/**
@ -87,7 +62,6 @@ class Admin implements ISettings {
$util = new Util(
new View(),
$crypt,
$this->logger,
$this->userSession,
$this->config,
$this->userManager);

View file

@ -29,59 +29,24 @@ namespace OCA\Encryption;
use OC\Files\View;
use OCA\Encryption\Crypto\Crypt;
use OCP\IConfig;
use OCP\ILogger;
use OCP\IUser;
use OCP\IUserManager;
use OCP\IUserSession;
use OCP\PreConditionNotMetException;
class Util {
/**
* @var View
*/
private $files;
/**
* @var Crypt
*/
private $crypt;
/**
* @var ILogger
*/
private $logger;
/**
* @var bool|IUser
*/
private $user;
/**
* @var IConfig
*/
private $config;
/**
* @var IUserManager
*/
private $userManager;
private IUser|false $user;
/**
* Util constructor.
*
* @param View $files
* @param Crypt $crypt
* @param ILogger $logger
* @param IUserSession $userSession
* @param IConfig $config
* @param IUserManager $userManager
*/
public function __construct(View $files,
Crypt $crypt,
ILogger $logger,
IUserSession $userSession,
IConfig $config,
IUserManager $userManager
public function __construct(
private View $files,
private Crypt $crypt,
IUserSession $userSession,
private IConfig $config,
private IUserManager $userManager,
) {
$this->files = $files;
$this->crypt = $crypt;
$this->logger = $logger;
$this->user = $userSession && $userSession->isLoggedIn() ? $userSession->getUser() : false;
$this->user = $userSession->isLoggedIn() ? $userSession->getUser() : false;
$this->config = $config;
$this->userManager = $userManager;
}
@ -132,10 +97,8 @@ class Util {
/**
* check if master key is enabled
*
* @return bool
*/
public function isMasterKeyEnabled() {
public function isMasterKeyEnabled(): bool {
$userMasterKey = $this->config->getAppValue('encryption', 'useMasterKey', '1');
return ($userMasterKey === '1');
}

View file

@ -24,6 +24,7 @@ namespace OCA\Encryption\Tests\Command;
use OC\Files\View;
use OCA\Encryption\Command\FixEncryptedVersion;
use OCA\Encryption\Util;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Tester\CommandTester;
use Test\TestCase;
use Test\Traits\EncryptionTrait;
@ -70,7 +71,7 @@ class FixEncryptedVersionTest extends TestCase {
$this->fixEncryptedVersion = new FixEncryptedVersion(
\OC::$server->getConfig(),
\OC::$server->getLogger(),
\OC::$server->get(LoggerInterface::class),
\OC::$server->getRootFolder(),
\OC::$server->getUserManager(),
$this->util,

View file

@ -29,12 +29,12 @@ namespace OCA\Encryption\Tests\Crypto;
use OCA\Encryption\Crypto\Crypt;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
use Psr\Log\LoggerInterface;
use OCP\IUserSession;
use Test\TestCase;
class CryptTest extends TestCase {
/** @var \OCP\ILogger|\PHPUnit\Framework\MockObject\MockObject */
/** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */
private $logger;
/** @var \OCP\IUserSession|\PHPUnit\Framework\MockObject\MockObject */
@ -52,7 +52,7 @@ class CryptTest extends TestCase {
protected function setUp(): void {
parent::setUp();
$this->logger = $this->getMockBuilder(ILogger::class)
$this->logger = $this->getMockBuilder(LoggerInterface::class)
->disableOriginalConstructor()
->getMock();
$this->logger->expects($this->any())

View file

@ -36,7 +36,7 @@ use OCA\Encryption\Session;
use OCA\Encryption\Util;
use OCP\Files\Storage;
use OCP\IL10N;
use OCP\ILogger;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Test\TestCase;
@ -63,7 +63,7 @@ class EncryptionTest extends TestCase {
/** @var \OCA\Encryption\Util|\PHPUnit\Framework\MockObject\MockObject */
private $utilMock;
/** @var \OCP\ILogger|\PHPUnit\Framework\MockObject\MockObject */
/** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */
private $loggerMock;
/** @var \OCP\IL10N|\PHPUnit\Framework\MockObject\MockObject */
@ -95,7 +95,7 @@ class EncryptionTest extends TestCase {
$this->decryptAllMock = $this->getMockBuilder(DecryptAll::class)
->disableOriginalConstructor()
->getMock();
$this->loggerMock = $this->getMockBuilder(ILogger::class)
$this->loggerMock = $this->getMockBuilder(LoggerInterface::class)
->disableOriginalConstructor()
->getMock();
$this->l10nMock = $this->getMockBuilder(IL10N::class)

View file

@ -34,7 +34,7 @@ use OCA\Encryption\Recovery;
use OCA\Encryption\Session;
use OCA\Encryption\Users\Setup;
use OCA\Encryption\Util;
use OCP\ILogger;
use Psr\Log\LoggerInterface;
use OCP\IUser;
use OCP\IUserManager;
use OCP\IUserSession;
@ -160,7 +160,6 @@ class UserHooksTest extends TestCase {
* @dataProvider dataTestPreSetPassphrase
*/
public function testPreSetPassphrase($canChange) {
/** @var UserHooks | \PHPUnit\Framework\MockObject\MockObject $instance */
$instance = $this->getMockBuilder(UserHooks::class)
->setConstructorArgs(
@ -332,7 +331,7 @@ class UserHooksTest extends TestCase {
protected function setUp(): void {
parent::setUp();
$this->loggerMock = $this->createMock(ILogger::class);
$this->loggerMock = $this->createMock(LoggerInterface::class);
$this->keyManagerMock = $this->getMockBuilder(KeyManager::class)
->disableOriginalConstructor()
->getMock();

View file

@ -41,7 +41,7 @@ use OCP\Encryption\Keys\IStorage;
use OCP\Files\Cache\ICache;
use OCP\Files\Storage;
use OCP\IConfig;
use OCP\ILogger;
use Psr\Log\LoggerInterface;
use OCP\IUserSession;
use OCP\Lock\ILockingProvider;
use OCP\Lock\LockedException;
@ -73,7 +73,7 @@ class KeyManagerTest extends TestCase {
/** @var \OCA\Encryption\Session|\PHPUnit\Framework\MockObject\MockObject */
private $sessionMock;
/** @var \OCP\ILogger|\PHPUnit\Framework\MockObject\MockObject */
/** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */
private $logMock;
/** @var \OCA\Encryption\Util|\PHPUnit\Framework\MockObject\MockObject */
@ -101,7 +101,7 @@ class KeyManagerTest extends TestCase {
$this->sessionMock = $this->getMockBuilder(Session::class)
->disableOriginalConstructor()
->getMock();
$this->logMock = $this->createMock(ILogger::class);
$this->logMock = $this->createMock(LoggerInterface::class);
$this->utilMock = $this->getMockBuilder(Util::class)
->disableOriginalConstructor()
->getMock();
@ -600,6 +600,9 @@ class KeyManagerTest extends TestCase {
)->setMethods(['getPublicMasterKey', 'setSystemPrivateKey', 'getMasterKeyPassword'])
->getMock();
$this->utilMock->expects($this->once())->method('isMasterKeyEnabled')
->willReturn(true);
$instance->expects($this->once())->method('getPublicMasterKey')
->willReturn($masterKey);
@ -645,6 +648,9 @@ class KeyManagerTest extends TestCase {
)->setMethods(['getPublicMasterKey', 'getPrivateMasterKey', 'setSystemPrivateKey', 'getMasterKeyPassword'])
->getMock();
$this->utilMock->expects($this->once())->method('isMasterKeyEnabled')
->willReturn(true);
$instance->expects($this->once())->method('getPublicMasterKey')
->willReturn('');
$instance->expects($this->once())->method('getPrivateMasterKey')

View file

@ -29,7 +29,7 @@ use OCA\Encryption\Settings\Admin;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
use Psr\Log\LoggerInterface;
use OCP\ISession;
use OCP\IUserManager;
use OCP\IUserSession;
@ -40,7 +40,7 @@ class AdminTest extends TestCase {
private $admin;
/** @var IL10N */
private $l;
/** @var ILogger */
/** @var LoggerInterface */
private $logger;
/** @var IUserSession */
private $userSession;
@ -55,7 +55,7 @@ class AdminTest extends TestCase {
parent::setUp();
$this->l = $this->getMockBuilder(IL10N::class)->getMock();
$this->logger = $this->getMockBuilder(ILogger::class)->getMock();
$this->logger = $this->getMockBuilder(LoggerInterface::class)->getMock();
$this->userSession = $this->getMockBuilder(IUserSession::class)->getMock();
$this->config = $this->getMockBuilder(IConfig::class)->getMock();
$this->userManager = $this->getMockBuilder(IUserManager::class)->getMock();

View file

@ -33,7 +33,6 @@ use OCA\Encryption\Util;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\Storage;
use OCP\IConfig;
use OCP\ILogger;
use OCP\IUser;
use OCP\IUserManager;
use OCP\IUserSession;
@ -89,8 +88,6 @@ class UtilTest extends TestCase {
$cryptMock = $this->getMockBuilder(Crypt::class)
->disableOriginalConstructor()
->getMock();
/** @var \OCP\ILogger $loggerMock */
$loggerMock = $this->createMock(ILogger::class);
$user = $this->createMock(IUser::class);
$user->expects($this->any())
@ -116,7 +113,7 @@ class UtilTest extends TestCase {
->method('setUserValue')
->willReturnCallback([$this, 'setValueTester']);
$this->instance = new Util($this->filesMock, $cryptMock, $loggerMock, $userSessionMock, $this->configMock, $this->userManagerMock);
$this->instance = new Util($this->filesMock, $cryptMock, $userSessionMock, $this->configMock, $this->userManagerMock);
}
/**

View file

@ -35,15 +35,20 @@ OC.L10N.register(
"Allow users on this server to receive group shares from other servers" : "Tillad brugere på denne server at modtage gruppedelinger fra andre servere",
"Search global and public address book for users" : "Søg global og offentlig adresse bog for brugere",
"Allow users to publish their data to a global and public address book" : "Tillad brugere at offentliggøre deres data til en global adressebog ",
"Unable to update federated files sharing config" : "Kan ikke opdatere fødereret fildelingskonfiguration",
"Federated Cloud" : "Federated Cloud",
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kan dele med alle, der bruger en Nextcloud-server eller andre Open Cloud Mesh (OCM)-kompatible servere og tjenester! Indsæt blot deres Federated Cloud ID i delingsdialogen. Det ligner person@cloud.example.com",
"Your Federated Cloud ID:" : "Din Federated Cloud ID:",
"Share it so your friends can share files with you:" : "Del så dine venner kan dele filer med dig:",
"Facebook" : "Facebook",
"Twitter" : "Twitter",
"Diaspora" : "Diaspora",
"Add to your website" : "Tilføj til dit websted",
"Share with me via Nextcloud" : "Del med mig gennem Nextcloud",
"HTML Code:" : "HTMLkode:",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Del med mig gennem min #Nextcloud Federated Cloud ID, se {url]",
"Share with me through my #Nextcloud Federated Cloud ID" : "Del med mig gennem min #Nextcloud Federated Cloud ID",
"Cloud ID copied to the clipboard" : "Cloud ID er kopieret til udklipsholderen.",
"Copy to clipboard" : "Kopier til udklipsholder",
"Clipboard is not available" : "Udklipsholderen er ikke tilgængelig",
"Copied!" : "Kopieret!",

View file

@ -33,15 +33,20 @@
"Allow users on this server to receive group shares from other servers" : "Tillad brugere på denne server at modtage gruppedelinger fra andre servere",
"Search global and public address book for users" : "Søg global og offentlig adresse bog for brugere",
"Allow users to publish their data to a global and public address book" : "Tillad brugere at offentliggøre deres data til en global adressebog ",
"Unable to update federated files sharing config" : "Kan ikke opdatere fødereret fildelingskonfiguration",
"Federated Cloud" : "Federated Cloud",
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kan dele med alle, der bruger en Nextcloud-server eller andre Open Cloud Mesh (OCM)-kompatible servere og tjenester! Indsæt blot deres Federated Cloud ID i delingsdialogen. Det ligner person@cloud.example.com",
"Your Federated Cloud ID:" : "Din Federated Cloud ID:",
"Share it so your friends can share files with you:" : "Del så dine venner kan dele filer med dig:",
"Facebook" : "Facebook",
"Twitter" : "Twitter",
"Diaspora" : "Diaspora",
"Add to your website" : "Tilføj til dit websted",
"Share with me via Nextcloud" : "Del med mig gennem Nextcloud",
"HTML Code:" : "HTMLkode:",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Del med mig gennem min #Nextcloud Federated Cloud ID, se {url]",
"Share with me through my #Nextcloud Federated Cloud ID" : "Del med mig gennem min #Nextcloud Federated Cloud ID",
"Cloud ID copied to the clipboard" : "Cloud ID er kopieret til udklipsholderen.",
"Copy to clipboard" : "Kopier til udklipsholder",
"Clipboard is not available" : "Udklipsholderen er ikke tilgængelig",
"Copied!" : "Kopieret!",

View file

@ -8,26 +8,52 @@ OC.L10N.register(
"Add remote share" : "افزودن هم‌رسانی دوردست",
"Invalid Federated Cloud ID" : "شناسهٔ ابری خودگردان نامعتبر",
"Server to server sharing is not enabled on this server" : "هم‌رسانی کارساز به کارساز روی این کارساز به کار نیفتاده",
"Couldn't establish a federated share." : "نمی توان یک سهم فدرال ایجاد کرد.",
"Couldn't establish a federated share, maybe the password was wrong." : "نمی‌توان یک اشتراک فدرال ایجاد کرد، شاید رمز عبور اشتباه بوده است.",
"Federated Share request sent, you will receive an invitation. Check your notifications." : "درخواست اشتراک فدرال ارسال شد، یک دعوت نامه دریافت خواهید کرد. اعلان های خود را بررسی کنید.",
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "نمی‌توان یک اشتراک فدرال ایجاد کرد، به نظر می‌رسد سروری که باید با آن فدرال شود خیلی قدیمی است (Nextcloud <= 9).",
"It is not allowed to send federated group shares from this server." : "ارسال اشتراک های گروه فدرال از این سرور مجاز نیست.",
"Sharing %1$s failed, because this item is already shared with user %2$s" : "هم‌رسانی %1$s شکست خورد، چرا که این مورد از پیش با کاربر%2$s هم رسانی شده بود",
"Not allowed to create a federated share with the same user" : "ایجاد یک هم‌رسانی خودگران با همان کاربر مجاز نیست",
"Federated shares require read permissions" : "سهام فدرال به مجوز خواندن نیاز دارد",
"File is already shared with %s" : "فایل قبلاً با به اشتراک گذاشته شده است%s",
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "اشتراک‌گذاری %1$s انجام نشد، پیدا نشد%2$s، شاید سرور در حال حاضر غیرقابل دسترسی باشد یا از گواهی امضا شده استفاده می‌کند.",
"Could not find share" : "نتوانست هم‌رسانی را بیابد",
"Federated sharing" : "هم‌رسانی خودگردان",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "شما {share} را به عنوان یک اشتراک راه دور از {user} دریافت کردید (از طرف {behalf})",
"You received {share} as a remote share from {user}" : "شما {share} را به عنوان اشتراک راه دور از {user} دریافت کردید",
"Accept" : "قبول",
"Decline" : "کاهش می یابد",
"Federated Cloud Sharing" : "هم‌رسانی ابری خودگردان",
"Sharing" : "هم‌رسانی",
"Federated file sharing" : "هم‌رسانی پروندهٔ خودگردان",
"Provide federated file sharing across servers" : "فراهم‌کنندهٔ هم‌رسانی پروندهٔ خودگردان میان کارسازها",
"Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing." : "نحوه اشتراک گذاری افراد بین سرورها را تنظیم کنید. این شامل اشتراک گذاری بین کاربران در این سرور نیز می شود، در صورتی که از اشتراک گذاری فدرال استفاده می کنند.",
"Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "به کاربران این سرور اجازه می‌دهد تا اشتراک‌ها را به سرورهای دیگر ارسال کنند (این گزینه همچنین به WebDAV اجازه دسترسی به اشتراک‌های عمومی را می‌دهد)",
"Allow users on this server to receive shares from other servers" : "به کاربران موجود در این سرور اجازه دهید از سرورهای دیگر اشتراک‌گذاری دریافت کنند",
"Allow users on this server to send shares to groups on other servers" : "به کاربران موجود در این سرور امکان ارسال اشتراک‌ها به گروه‌های موجود در سرورهای دیگر را بدهید",
"Allow users on this server to receive group shares from other servers" : "به کاربران این سرور اجازه دهید اشتراک‌های گروهی را از سرورهای دیگر دریافت کنند",
"Search global and public address book for users" : "کتاب آدرس عمومی و عمومی را برای کاربران جستجو کنید",
"Allow users to publish their data to a global and public address book" : "به کاربران اجازه دهید داده های خود را در یک دفترچه آدرس عمومی و عمومی منتشر کنند",
"Unable to update federated files sharing config" : "به‌روزرسانی پیکربندی اشتراک‌گذاری فایل‌های فدرال ممکن نیست",
"Federated Cloud" : "ابر خودگردان",
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "می‌توانید با هر کسی که از سرور Nextcloud یا سایر سرورها و سرویس‌های سازگار با Open Cloud Mesh (OCM) استفاده می‌کند، اشتراک‌گذاری کنید! فقط شناسه ابری فدرال آنها را در گفتگوی اشتراک گذاری قرار دهید. به نظر می رسد person@cloud.example.com",
"Your Federated Cloud ID:" : "شناسهٔ ابردی خودگردانتان:",
"Share it so your friends can share files with you:" : "آن را به اشتراک بگذارید تا دوستانتان بتوانند فایل ها را با شما به اشتراک بگذارند:",
"Facebook" : "فیس‌بوک",
"Twitter" : "توییتر",
"Diaspora" : "دیازپورا",
"Add to your website" : "افزودن به پایگاه وبتان",
"Share with me via Nextcloud" : "هم‌رسانی با من روی نسکت‌کلود",
"HTML Code:" : "کد HTML :",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید، به {url} مراجعه کنید",
"Share with me through my #Nextcloud Federated Cloud ID" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید",
"Cloud ID copied to the clipboard" : "Cloud ID در کلیپ بورد کپی شد",
"Copy to clipboard" : "رونوشت به تخته‌گیره",
"Clipboard is not available" : "تخته گیره موحود نیست",
"Copied!" : "رونوشت شد!"
"Copied!" : "رونوشت شد!",
"You received \"%3$s\" as a remote share from %4$s (%1$s) (on behalf of %5$s (%2$s))" : "شما \"%3$s\" را به عنوان یک اشتراک راه دور از %4$s(%1$s) (از طرف%5$s (%2$s)) دریافت کردید.",
"You received \"%3$s\" as a remote share from %4$s (%1$s)" : "شما \"%3$s\" را به عنوان یک اشتراک راه دور از %4$s(%1$s) دریافت کردید",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید، ببینید%s"
},
"nplurals=2; plural=(n > 1);");

View file

@ -6,26 +6,52 @@
"Add remote share" : "افزودن هم‌رسانی دوردست",
"Invalid Federated Cloud ID" : "شناسهٔ ابری خودگردان نامعتبر",
"Server to server sharing is not enabled on this server" : "هم‌رسانی کارساز به کارساز روی این کارساز به کار نیفتاده",
"Couldn't establish a federated share." : "نمی توان یک سهم فدرال ایجاد کرد.",
"Couldn't establish a federated share, maybe the password was wrong." : "نمی‌توان یک اشتراک فدرال ایجاد کرد، شاید رمز عبور اشتباه بوده است.",
"Federated Share request sent, you will receive an invitation. Check your notifications." : "درخواست اشتراک فدرال ارسال شد، یک دعوت نامه دریافت خواهید کرد. اعلان های خود را بررسی کنید.",
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "نمی‌توان یک اشتراک فدرال ایجاد کرد، به نظر می‌رسد سروری که باید با آن فدرال شود خیلی قدیمی است (Nextcloud <= 9).",
"It is not allowed to send federated group shares from this server." : "ارسال اشتراک های گروه فدرال از این سرور مجاز نیست.",
"Sharing %1$s failed, because this item is already shared with user %2$s" : "هم‌رسانی %1$s شکست خورد، چرا که این مورد از پیش با کاربر%2$s هم رسانی شده بود",
"Not allowed to create a federated share with the same user" : "ایجاد یک هم‌رسانی خودگران با همان کاربر مجاز نیست",
"Federated shares require read permissions" : "سهام فدرال به مجوز خواندن نیاز دارد",
"File is already shared with %s" : "فایل قبلاً با به اشتراک گذاشته شده است%s",
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "اشتراک‌گذاری %1$s انجام نشد، پیدا نشد%2$s، شاید سرور در حال حاضر غیرقابل دسترسی باشد یا از گواهی امضا شده استفاده می‌کند.",
"Could not find share" : "نتوانست هم‌رسانی را بیابد",
"Federated sharing" : "هم‌رسانی خودگردان",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "شما {share} را به عنوان یک اشتراک راه دور از {user} دریافت کردید (از طرف {behalf})",
"You received {share} as a remote share from {user}" : "شما {share} را به عنوان اشتراک راه دور از {user} دریافت کردید",
"Accept" : "قبول",
"Decline" : "کاهش می یابد",
"Federated Cloud Sharing" : "هم‌رسانی ابری خودگردان",
"Sharing" : "هم‌رسانی",
"Federated file sharing" : "هم‌رسانی پروندهٔ خودگردان",
"Provide federated file sharing across servers" : "فراهم‌کنندهٔ هم‌رسانی پروندهٔ خودگردان میان کارسازها",
"Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing." : "نحوه اشتراک گذاری افراد بین سرورها را تنظیم کنید. این شامل اشتراک گذاری بین کاربران در این سرور نیز می شود، در صورتی که از اشتراک گذاری فدرال استفاده می کنند.",
"Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "به کاربران این سرور اجازه می‌دهد تا اشتراک‌ها را به سرورهای دیگر ارسال کنند (این گزینه همچنین به WebDAV اجازه دسترسی به اشتراک‌های عمومی را می‌دهد)",
"Allow users on this server to receive shares from other servers" : "به کاربران موجود در این سرور اجازه دهید از سرورهای دیگر اشتراک‌گذاری دریافت کنند",
"Allow users on this server to send shares to groups on other servers" : "به کاربران موجود در این سرور امکان ارسال اشتراک‌ها به گروه‌های موجود در سرورهای دیگر را بدهید",
"Allow users on this server to receive group shares from other servers" : "به کاربران این سرور اجازه دهید اشتراک‌های گروهی را از سرورهای دیگر دریافت کنند",
"Search global and public address book for users" : "کتاب آدرس عمومی و عمومی را برای کاربران جستجو کنید",
"Allow users to publish their data to a global and public address book" : "به کاربران اجازه دهید داده های خود را در یک دفترچه آدرس عمومی و عمومی منتشر کنند",
"Unable to update federated files sharing config" : "به‌روزرسانی پیکربندی اشتراک‌گذاری فایل‌های فدرال ممکن نیست",
"Federated Cloud" : "ابر خودگردان",
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "می‌توانید با هر کسی که از سرور Nextcloud یا سایر سرورها و سرویس‌های سازگار با Open Cloud Mesh (OCM) استفاده می‌کند، اشتراک‌گذاری کنید! فقط شناسه ابری فدرال آنها را در گفتگوی اشتراک گذاری قرار دهید. به نظر می رسد person@cloud.example.com",
"Your Federated Cloud ID:" : "شناسهٔ ابردی خودگردانتان:",
"Share it so your friends can share files with you:" : "آن را به اشتراک بگذارید تا دوستانتان بتوانند فایل ها را با شما به اشتراک بگذارند:",
"Facebook" : "فیس‌بوک",
"Twitter" : "توییتر",
"Diaspora" : "دیازپورا",
"Add to your website" : "افزودن به پایگاه وبتان",
"Share with me via Nextcloud" : "هم‌رسانی با من روی نسکت‌کلود",
"HTML Code:" : "کد HTML :",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید، به {url} مراجعه کنید",
"Share with me through my #Nextcloud Federated Cloud ID" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید",
"Cloud ID copied to the clipboard" : "Cloud ID در کلیپ بورد کپی شد",
"Copy to clipboard" : "رونوشت به تخته‌گیره",
"Clipboard is not available" : "تخته گیره موحود نیست",
"Copied!" : "رونوشت شد!"
"Copied!" : "رونوشت شد!",
"You received \"%3$s\" as a remote share from %4$s (%1$s) (on behalf of %5$s (%2$s))" : "شما \"%3$s\" را به عنوان یک اشتراک راه دور از %4$s(%1$s) (از طرف%5$s (%2$s)) دریافت کردید.",
"You received \"%3$s\" as a remote share from %4$s (%1$s)" : "شما \"%3$s\" را به عنوان یک اشتراک راه دور از %4$s(%1$s) دریافت کردید",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید، ببینید%s"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}

View file

@ -21,7 +21,7 @@
-->
<template>
<NcSettingsSection :title="t('federatedfilesharing', 'Federated Cloud Sharing')"
<NcSettingsSection :name="t('federatedfilesharing', 'Federated Cloud Sharing')"
:description="t('federatedfilesharing', 'Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing.')"
:doc-url="sharingFederatedDocUrl">
<NcCheckboxRadioSwitch type="switch"

View file

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<NcSettingsSection :title="t('federatedfilesharing', 'Federated Cloud')"
<NcSettingsSection :name="t('federatedfilesharing', 'Federated Cloud')"
:description="t('federatedfilesharing', 'You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com')"
:doc-url="docUrlFederated">
<p class="cloud-id-text">

View file

@ -57,7 +57,6 @@ return array(
'OCA\\Files\\Event\\LoadSidebar' => $baseDir . '/../lib/Event/LoadSidebar.php',
'OCA\\Files\\Exception\\TransferOwnershipException' => $baseDir . '/../lib/Exception/TransferOwnershipException.php',
'OCA\\Files\\Helper' => $baseDir . '/../lib/Helper.php',
'OCA\\Files\\Listener\\LegacyLoadAdditionalScriptsAdapter' => $baseDir . '/../lib/Listener/LegacyLoadAdditionalScriptsAdapter.php',
'OCA\\Files\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php',
'OCA\\Files\\Listener\\RenderReferenceEventListener' => $baseDir . '/../lib/Listener/RenderReferenceEventListener.php',
'OCA\\Files\\Migration\\Version11301Date20191205150729' => $baseDir . '/../lib/Migration/Version11301Date20191205150729.php',

View file

@ -72,7 +72,6 @@ class ComposerStaticInitFiles
'OCA\\Files\\Event\\LoadSidebar' => __DIR__ . '/..' . '/../lib/Event/LoadSidebar.php',
'OCA\\Files\\Exception\\TransferOwnershipException' => __DIR__ . '/..' . '/../lib/Exception/TransferOwnershipException.php',
'OCA\\Files\\Helper' => __DIR__ . '/..' . '/../lib/Helper.php',
'OCA\\Files\\Listener\\LegacyLoadAdditionalScriptsAdapter' => __DIR__ . '/..' . '/../lib/Listener/LegacyLoadAdditionalScriptsAdapter.php',
'OCA\\Files\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php',
'OCA\\Files\\Listener\\RenderReferenceEventListener' => __DIR__ . '/..' . '/../lib/Listener/RenderReferenceEventListener.php',
'OCA\\Files\\Migration\\Version11301Date20191205150729' => __DIR__ . '/..' . '/../lib/Migration/Version11301Date20191205150729.php',

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["files.scss","../../../core/css/functions.scss"],"names":[],"mappings":"AAWA,SAEC,YACA,YACA,qBACA,WAED,oEACA,8BACA,kDAEC,+CAED,0BACC,oDAGD,mBACC,kBACA,aACA,SACA,4CACC,iBAIF,gBACC,aAGD,OACC,iBACA,YACA,aACA,aACA,mBAGD,6EAGC,yBACA,gCAID,kBACC,kBACA,WACA,gBACA,cACA,sBAEA,6CACC,aAGD,wBACC,wBACA,gBAEA,SAEA,WACA,cACA,0DAMD,wBACC,cACA,WAEA,mGAEC,8CAEA,6KACC,oCAKF,8DACC,oBAKH,yBACC,aAID,uCACC,cACA,WAGD,wBAGC,yBAEA,qBAGD,6FACC,+DAGD,iCACC,yDAGD,kFACC,0CAGD,4EACC,+DAID,gBCxEC,yCD2ED,iBC3EC,yCD8ED,oBC9EC,0CDiFD,qGCjFC,wCDuFD,0BCvFC,yCD0FD,2BC1FC,2CD6FD,mBC7FC,yCDgGD,2BChGC,4CDmGD,2BCnGC,0CDsGD,4BCtGC,4CD0GD,4CACC,WAGD,iCACC,WACA,YACA,eACA,SACA,eAGD,wCACC,aAGD,0CACC,WAGD,2BACC,YAED,4KAKC,+CAED,wMAKC,oDAGD,qCAEA,yDACC,oCAED,kCACC,iCACA,8BACA,4BACA,yBACA,mBAED,wGAIC,UACA,oCAGD,oBACC,oCAED,uBACC,6BAED,sBACC,cACA,aACA,YACA,sBACA,2BACA,sBACA,oCACC,kBAGF,kCACC,qBACA,mBAED,2BACC,eACA,iBAGD,uCACC,cAGD,yBACC,WACA,WACA,gBACA,qBACA,2BACA,WAED,wJAIC,kBAED,2CACC,eAED,4EAEC,mBAGD,kBAEC,4CACA,gBACA,mBAED,SACC,eACA,kBACA,+BACA,4BAED,qBACC,kBACA,aACA,UAGD,uBACC,kBACA,YAGD,0BACC,gBAED,uCACC,iBAED,8EAEC,2BACA,sBACA,kBAEA,gBAGD,qMAQC,gBACA,qPACC,MAIF,2BACC,0DACA,iBAGD,sDACC,iBAGD,+BACC,kBACA,aAED,kCACC,aAGD,0DAGC,WACA,kBAED,kDAEC,aACA,kBACA,2BACA,sBACA,YACA,iBACA,UAED,qCAEC,QACA,eACA,eACA,YAGA,8DACC,WAED,mEACC,WAGF,6BACC,qBACA,WACA,YACA,wBACA,2BACA,4BACA,gBACA,eACA,mCACA,eACA,kBACA,UAED,oCACC,eAID,2CACC,qCAGD,iDACC,qBACA,4BACA,YAED,uBACC,iBACA,kBACA,SAGD,6IACA,8FAEA,wCACC,kBACA,gBACA,uBACA,YAKA,kBACC,YACA,4BACC,QACA,YACA,aACA,gBACA,mBACA,uBACA,YACA,WACA,mBAID,+BACC,iBACA,aACA,uBACA,mBACA,kCACA,gBAEA,iDACC,iBACA,iBACA,wCACA,iCACA,oCACA,uBACA,mBACA,gBACA,uBACA,iBACA,kBAEA,uDACC,iBACA,sBAID,mEACC,gBAOL,iJAEC,wBAGD,mCACC,iCACA,8BACA,4BACA,yBAED,4BACC,WAGD,2CACC,uBACA,gBACA,kBACA,mBAKD,8BACC,kBACA,mBAEA,iBACA,OACA,SACA,YACA,cAEA,iBACA,eAEA,iBACA,oCACA,uBACA,mBAGD,mBACC,UAID,6DACC,WACA,eAID,iRAIC,UAID,0EACC,WAMA,wEACC,aAGD,oGACC,+CACA,wCACA,wBACA,yDACA,aAIF,oGAEC,mBAGD,+BACC,kBACA,WACA,eACA,gBACA,wJAGD,wFAEC,kBACA,UACA,YAGD,yCACC,qBACA,WAED,8CACC,kBACA,cACA,SACA,WACA,iBACA,kBACA,wDAEC,8CACA,8CACA,oBAEA,WACA,YACA,aACA,qBACA,uBAGF,8DACC,+CAGD,iDAGA,aACC,WAGD,iCACC,kBAID,mDAEC,gBAID,oCACC,qBACA,0BAGD,8EACC,0BAOA,kCACC,eAGD,sEACC,eAGD,sCACC,gBAIF,aACC,YACA,WACA,2BAGD,qCACC,wCAID,iBACI,kBACA,qBACA,sBAEJ,wBACI,aAEJ,mBACC,eACA,iBACA,iBAGD,0BACC,aAED,uBACC,kBACA,2BACA,mBAGD,8CACC,gBAIA,8BACC,eACA,iBACA,iBACA,WACA,2CACC,kBACA,0FAGC,kBACA,cACA,SACA,UACA,WACA,gBAED,mDACC,qBACA,sBAGF,0CACC,iBACA,oBACA,kBACA,mBAGA,oGACC,WAID,qIAEC,WAED,uDACC,WACA,0HACC,WAIH,wEACC,UAED,oCACC,+CACA,wCAGF,uGACC,WAED,wDACC,UAKF,4EACC,qBACA,eACA,gBACA,uBACA,sBACA,gBAGD,2CACC,yBAGD,yCACC,UAGD,kNAKC,UAGD,qCACC,gBAGD,0FAEC,WAGD,mDACC,eAGD,SACC,oCAGA,aAED,wCACC,WAEA,mBAKD,sBACC,aAED,2DAIC,+BAED,YACC,mBACA,mBACA,iBAED,wBACC,UAED,YACC,qBAGD,iBACC,WACA,aAED,6BACC,kBACA,mBACA,YAGA,gBAED,yBACC,kBAED,MACC,WACA,kBACA,MACA,OACA,QACA,SACA,8CACA,sCACA,wBACA,WACA,yBACA,8BACA,4BACA,6BACA,iCAED,kBACC,UAGD,aACC,gBACA,SACA,sBACA,eACA,gBACA,aAGA,oBACC,qBAKF,gBACC,sBACA,wBACA,gBACA,YACA,UACA,SACA,0DACA,WACA,yBACA,sBACA,qBACA,iBACA,aACA,MACA,kBAKE,0IACC,sBACA,qBACA,aACA,YACA,WACA,YACA,mBACA,uBAED,oFACC,aAQJ,0DACC,OAGD,6KAIC,qBACA,sBACA,0BAMA,sDACC,sBAED,yDACC,uDAIF,iJAGC,aAGD,oJAGC,WACA,YAGD,gCACC,kBAGD,YACC,mBAEA,uBACC,mCAIF,0DAEC,oCAED,qBACC,oCACA,4BACC,2BAIF,cACC,iBACA,kBACA,gBACA,6BACA,cACA,gBACA,YAEA,2BACC,aAGD,kCACC,UACA,kBACA,iBAIF,uBACC,oBACA,YACA,gBACA,+BACA,UACA,YACA,wBACA,sBAEA,6BACC,YAKA,oEACC,0BAIF,kCACC,WACA,mCAWA,kDACC,cACA,4CACA,0DACA,qDACC,WACA,YAMH,+CACC,aACA,+CACA,6BACA,aACA,cAGA,+DACC,cACA,kBACA,aACA,mCAEA,0fAKC,+BAEA,oxDAGC,+CAKH,kDACC,eACA,mBAGC,8EACC,YACA,eACA,kBACA,MAvDQ,MAwDR,OAxDQ,MAyDR,QAxDO,KAyDP,MACA,OACA,WAEA,yFACC,4BACA,6BACA,wBACA,SACA,mCACA,4BACA,2BAKA,wGACC,UACA,UACA,YAKH,uEACC,WACA,SACA,MACA,YAEA,YACA,gBAEA,kBAGD,iEACC,YACA,mCAIA,gBAKA,0BAEA,2EACC,aACA,YACA,iBACA,kBACA,iBACA,UAEA,0FACC,qBACA,kBACA,gBACA,uBACA,mBAED,kFACC,WACA,OACA,eAED,iFACC,WACA,OACA,eAID,sFACC,aAKF,8EACC,aAGD,8EACC,eACA,iBACA,aACA,mBACA,kBACA,QAEA,sFACC,QAxJK,KAyJL,WACA,YACA,aACA,mBACA,uBAGA,wGACC,aAQH,2GACC,yBAEA,6HACC,YACA,kBAIF,6GACC,yBAGD,6GACC,yBAIF,gEACC,iBACA,mCAEA,+EACC,WACA,cACA,YAMH,kHAEC,aAGD,sIAEC,kBACA,SACA,UACA,aACA,WAEA,kJACC,WACA,YACA,oBACA,QAzNO,KA0NP,kKACC,SACA,MA5NM,KA6NN,OA7NM,KAmOT,+DACC,OACA,YACA,aAGA,yFACC,gBACA,uBAMJ,+FACC,cAID,+CACC,aAEA,qEACC,qBACA,cAEA,aAEA,wEACC,iBAEA,iKAEC,aAGD,8EACI,cAQR,aACC,0DACA,YACA,SACA,aACA,WACA,YACA,mCACA,iCACA,YACA,gBAEA,uEAGC,UAGD,oEAEC,mEASF,cACC,eACA,MAOC,uGACC,gBAID,4EACC,WAKF,0BACC,kBACA,QACA,MAKF,gBACC,aAGD,8BACC,gBACA,sBACA,kBACA,kBACA,aACA,eACA,mBAEA,iCACC,WACA,eAGD,6DACC,aACA,YACA","file":"files.css"}
{"version":3,"sourceRoot":"","sources":["files.scss","../../../core/css/functions.scss"],"names":[],"mappings":"AAWA,SAEC,YACA,YACA,qBACA,WAED,oEACA,8BACA,kDAEC,+CAED,0BACC,oDAGD,mBACC,kBACA,aACA,SACA,4CACC,iBAIF,gBACC,aAGD,OACC,iBACA,YACA,aACA,aACA,mBAGD,6EAGC,yBACA,gCAID,kBACC,kBACA,WACA,gBACA,cACA,sBAEA,6CACC,aAGD,wBACC,wBACA,gBAEA,SAEA,WACA,cACA,0DAMD,wBACC,cACA,WAEA,mGAEC,8CAEA,6KACC,oCAKF,8DACC,oBAKH,yBACC,aAID,uCACC,cACA,WAGD,wBAGC,yBAEA,qBAGD,6FACC,+DAGD,iCACC,yDAGD,kFACC,0CAGD,4EACC,+DAID,gBCxEC,yCD2ED,iBC3EC,yCD8ED,oBC9EC,0CDiFD,qGCjFC,wCDuFD,0BCvFC,yCD0FD,2BC1FC,2CD6FD,mBC7FC,yCDgGD,2BChGC,4CDmGD,2BCnGC,0CDsGD,4BCtGC,4CD0GD,4CACC,WAGD,iCACC,WACA,YACA,eACA,SACA,eAGD,wCACC,aAGD,0CACC,WAGD,2BACC,YAED,4KAKC,+CAED,wMAKC,oDAGD,qCAEA,yDACC,oCAED,kCACC,iCACA,8BACA,4BACA,yBACA,mBAED,wGAIC,UACA,oCAGD,oBACC,oCAED,uBACC,6BAED,sBACC,cACA,aACA,YACA,sBACA,2BACA,sBACA,oCACC,kBAGF,kCACC,qBACA,mBAED,2BACC,eACA,iBAGD,uCACC,cAGD,yBACC,WACA,WACA,gBACA,qBACA,2BACA,WAED,wJAIC,kBAED,2CACC,eAED,4EAEC,mBAGD,kBAEC,4CACA,gBACA,mBAED,SACC,eACA,kBACA,+BACA,4BAED,qBACC,kBACA,aACA,UAGD,uBACC,kBACA,YAGD,0BACC,gBAED,uCACC,iBAED,8EAEC,2BACA,sBACA,kBAEA,gBAGD,qMAQC,gBACA,qPACC,MAIF,2BACC,0DACA,iBAGD,sDACC,iBAGD,+BACC,kBACA,aAED,kCACC,aAGD,0DAGC,WACA,kBAED,kDAEC,aACA,kBACA,2BACA,sBACA,YACA,iBACA,UAED,qCAEC,QACA,eACA,eACA,YAGA,8DACC,WAED,mEACC,WAGF,6BACC,qBACA,WACA,YACA,wBACA,2BACA,4BACA,gBACA,eACA,mCACA,eACA,kBACA,UAED,oCACC,eAID,2CACC,qCAGD,iDACC,qBACA,4BACA,YAED,uBACC,iBACA,kBACA,SAGD,6IACA,8FAEA,wCACC,kBACA,gBACA,uBACA,YAKA,kBACC,YACA,4BACC,QACA,YACA,aACA,gBACA,mBACA,uBACA,YACA,WACA,mBAID,+BACC,iBACA,aACA,uBACA,mBACA,kCACA,gBAEA,iDACC,iBACA,iBACA,wCACA,iCACA,oCACA,uBACA,mBACA,gBACA,uBACA,iBACA,kBAEA,uDACC,iBACA,sBAID,mEACC,gBAOL,iJAEC,wBAGD,mCACC,iCACA,8BACA,4BACA,yBAED,4BACC,WAGD,2CACC,uBACA,gBACA,kBACA,mBAKD,8BACC,kBACA,mBAEA,iBACA,OACA,SACA,YACA,cAEA,iBACA,eAEA,iBACA,oCACA,uBACA,mBAGD,mBACC,UAID,6DACC,WACA,eAID,iRAIC,UAID,0EACC,WAMA,wEACC,aAGD,oGACC,+CACA,wCACA,wBACA,yDACA,aAIF,oGAEC,mBAGD,+BACC,kBACA,WACA,eACA,gBACA,wJAGD,wFAEC,kBACA,UACA,YAGD,yCACC,qBACA,WAED,8CACC,kBACA,cACA,SACA,WACA,iBACA,kBACA,wDAEC,8CACA,8CACA,oBAEA,WACA,YACA,aACA,qBACA,uBAGF,8DACC,+CAGD,iDAGA,aACC,WAGD,iCACC,kBAID,mDAEC,gBAID,oCACC,qBACA,0BAGD,8EACC,0BAOA,kCACC,eAGD,sEACC,eAGD,sCACC,gBAIF,aACC,YACA,WACA,2BAKA,0EACC,wCAKF,iBACI,kBACA,qBACA,sBAEJ,wBACI,aAEJ,mBACC,eACA,iBACA,iBAGD,0BACC,aAED,uBACC,kBACA,2BACA,mBAGD,8CACC,gBAIA,8BACC,eACA,iBACA,iBACA,WACA,2CACC,kBACA,0FAGC,kBACA,cACA,SACA,UACA,WACA,gBAED,mDACC,qBACA,sBAGF,0CACC,iBACA,oBACA,kBACA,mBAGA,oGACC,WAID,qIAEC,WAED,uDACC,WACA,0HACC,WAIH,wEACC,UAED,oCACC,+CACA,wCAGF,uGACC,WAED,wDACC,UAKF,4EACC,qBACA,eACA,gBACA,uBACA,sBACA,gBAGD,2CACC,yBAGD,yCACC,UAGD,kNAKC,UAGD,qCACC,gBAGD,0FAEC,WAGD,mDACC,eAGD,SACC,oCAGA,aAED,wCACC,WAEA,mBAKD,sBACC,aAED,2DAIC,+BAED,YACC,mBACA,mBACA,iBAED,wBACC,UAED,YACC,qBAGD,iBACC,WACA,aAED,6BACC,kBACA,mBACA,YAGA,gBAED,yBACC,kBAED,MACC,WACA,kBACA,MACA,OACA,QACA,SACA,8CACA,sCACA,wBACA,WACA,yBACA,8BACA,4BACA,6BACA,iCAED,kBACC,UAGD,aACC,gBACA,SACA,sBACA,eACA,gBACA,aAGA,oBACC,qBAKF,gBACC,sBACA,wBACA,gBACA,YACA,UACA,SACA,0DACA,WACA,yBACA,sBACA,qBACA,iBACA,aACA,MACA,kBAKE,0IACC,sBACA,qBACA,aACA,YACA,WACA,YACA,mBACA,uBAED,oFACC,aAQJ,0DACC,OAGD,6KAIC,qBACA,sBACA,0BAMA,sDACC,sBAED,yDACC,uDAIF,iJAGC,aAGD,oJAGC,WACA,YAGD,gCACC,kBAGD,YACC,mBAEA,uBACC,mCAIF,0DAEC,oCAED,qBACC,oCACA,4BACC,2BAIF,cACC,iBACA,kBACA,gBACA,6BACA,cACA,gBACA,YAEA,2BACC,aAGD,kCACC,UACA,kBACA,iBAIF,uBACC,oBACA,YACA,gBACA,+BACA,UACA,YACA,wBACA,sBAEA,6BACC,YAKA,oEACC,0BAIF,kCACC,WACA,mCAWA,kDACC,cACA,4CACA,0DACA,qDACC,WACA,YAMH,+CACC,aACA,+CACA,6BACA,aACA,cAGA,+DACC,cACA,kBACA,aACA,mCAEA,0fAKC,+BAEA,oxDAGC,+CAKH,kDACC,eACA,mBAGC,8EACC,YACA,eACA,kBACA,MAvDQ,MAwDR,OAxDQ,MAyDR,QAxDO,KAyDP,MACA,OACA,WAEA,yFACC,4BACA,6BACA,wBACA,SACA,mCACA,4BACA,2BAKA,wGACC,UACA,UACA,YAKH,uEACC,WACA,SACA,MACA,YAEA,YACA,gBAEA,kBAGD,iEACC,YACA,mCAIA,gBAKA,0BAEA,2EACC,aACA,YACA,iBACA,kBACA,iBACA,UAEA,0FACC,qBACA,kBACA,gBACA,uBACA,mBAED,kFACC,WACA,OACA,eAED,iFACC,WACA,OACA,eAID,sFACC,aAKF,8EACC,aAGD,8EACC,eACA,iBACA,aACA,mBACA,kBACA,QAEA,sFACC,QAxJK,KAyJL,WACA,YACA,aACA,mBACA,uBAGA,wGACC,aAQH,2GACC,yBAEA,6HACC,YACA,kBAIF,6GACC,yBAGD,6GACC,yBAIF,gEACC,iBACA,mCAEA,+EACC,WACA,cACA,YAMH,kHAEC,aAGD,sIAEC,kBACA,SACA,UACA,aACA,WAEA,kJACC,WACA,YACA,oBACA,QAzNO,KA0NP,kKACC,SACA,MA5NM,KA6NN,OA7NM,KAmOT,+DACC,OACA,YACA,aAGA,yFACC,gBACA,uBAMJ,+FACC,cAID,+CACC,aAEA,qEACC,qBACA,cAEA,aAEA,wEACC,iBAEA,iKAEC,aAGD,8EACI,cAQR,aACC,0DACA,YACA,SACA,aACA,WACA,YACA,mCACA,iCACA,YACA,gBAEA,uEAGC,UAGD,oEAEC,mEASF,cACC,eACA,MAOC,uGACC,gBAID,4EACC,WAKF,0BACC,kBACA,QACA,MAKF,gBACC,aAGD,8BACC,gBACA,sBACA,kBACA,kBACA,aACA,eACA,mBAEA,iCACC,WACA,eAGD,6DACC,aACA,YACA","file":"files.css"}

View file

@ -593,7 +593,7 @@ table td.selection {
background-color: var(--color-main-background);
mask: var(--icon-star-rounded-white) no-repeat;
mask-size: 22px 22px;
width: 22px;
height: 22px;
display: flex;
@ -655,8 +655,11 @@ a.action > img {
vertical-align: text-bottom;
}
a.action.action-editlocally img.icon {
filter: var(--background-invert-if-dark);
a.action.action-editlocally,
a.action.action-setreminder {
img.icon {
filter: var(--background-invert-if-dark);
}
}
/* Actions for selected files */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -710,6 +710,22 @@
}
});
if (Boolean(OC.appswebroots.files_reminders) && Boolean(OC.appswebroots.notifications)) {
this.registerAction({
name: 'SetReminder',
displayName: function(_context) {
return t('files', 'Set reminder');
},
mime: 'all',
order: -24,
icon: function(_filename, _context) {
return OC.imagePath('files_reminders', 'alarm.svg')
},
permissions: OC.PERMISSION_READ,
actionHandler: function(_filename, _context) {},
});
}
if (!/Android|iPhone|iPad|iPod/i.test(navigator.userAgent)) {
this.registerAction({
name: 'EditLocally',

View file

@ -133,6 +133,11 @@
this.render();
this.$el.removeClass('hidden');
window._nc_event_bus.emit('files:action-menu:opened', {
el: this.$el[0],
context,
})
OC.showMenu(null, this.$el);
}
});
@ -140,4 +145,3 @@
OCA.Files.FileActionsMenu = FileActionsMenu;
})();

View file

@ -707,8 +707,10 @@
tr.addClass('highlighted');
this._currentFileModel = model;
const secondaryActionsOpen = Boolean(tr.find('.actions-secondary-vue').length)
// open sidebar and set file
if (typeof show === 'undefined' || !!show || (OCA.Files.Sidebar.file !== '')) {
if (!secondaryActionsOpen && (typeof show === 'undefined' || !!show || (OCA.Files.Sidebar.file !== ''))) {
OCA.Files.Sidebar.open(path.replace('//', '/'))
}
},

View file

@ -20,7 +20,6 @@
"newfilemenu.js",
"operationprogressbar.js",
"recentfilelist.js",
"recentplugin.js",
"semaphore.js",
"sidebarpreviewmanager.js",
"sidebarpreviewtext.js",

View file

@ -1,121 +0,0 @@
/*
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function (OCA) {
/**
* Registers the recent file list from the files app sidebar.
*
* @namespace OCA.Files.RecentPlugin
*/
OCA.Files.RecentPlugin = {
name: 'Recent',
/**
* @type OCA.Files.RecentFileList
*/
recentFileList: null,
attach: function () {
var self = this;
$('#app-content-recent').on('show.plugin-recent', function (e) {
self.showFileList($(e.target));
});
$('#app-content-recent').on('hide.plugin-recent', function () {
self.hideFileList();
});
},
detach: function () {
if (this.recentFileList) {
this.recentFileList.destroy();
OCA.Files.fileActions.off('setDefault.plugin-recent', this._onActionsUpdated);
OCA.Files.fileActions.off('registerAction.plugin-recent', this._onActionsUpdated);
$('#app-content-recent').off('.plugin-recent');
this.recentFileList = null;
}
},
showFileList: function ($el) {
if (!this.recentFileList) {
this.recentFileList = this._createRecentFileList($el);
}
return this.recentFileList;
},
hideFileList: function () {
if (this.recentFileList) {
this.recentFileList.$fileList.empty();
}
},
/**
* Creates the recent file list.
*
* @param $el container for the file list
* @return {OCA.Files.RecentFileList} file list
*/
_createRecentFileList: function ($el) {
var fileActions = this._createFileActions();
// register recent list for sidebar section
return new OCA.Files.RecentFileList(
$el, {
fileActions: fileActions,
// The file list is created when a "show" event is handled,
// so it should be marked as "shown" like it would have been
// done if handling the event with the file list already
// created.
shown: true
}
);
},
_createFileActions: function () {
// inherit file actions from the files app
var fileActions = new OCA.Files.FileActions();
// note: not merging the legacy actions because legacy apps are not
// compatible with the sharing overview and need to be adapted first
fileActions.registerDefaultActions();
fileActions.merge(OCA.Files.fileActions);
if (!this._globalActionsInitialized) {
// in case actions are registered later
this._onActionsUpdated = _.bind(this._onActionsUpdated, this);
OCA.Files.fileActions.on('setDefault.plugin-recent', this._onActionsUpdated);
OCA.Files.fileActions.on('registerAction.plugin-recent', this._onActionsUpdated);
this._globalActionsInitialized = true;
}
// when the user clicks on a folder, redirect to the corresponding
// folder in the files app instead of opening it directly
fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
OCA.Files.App.setActiveView('files', {silent: true});
var path = OC.joinPaths(context.$file.attr('data-path'), filename);
OCA.Files.App.fileList.changeDirectory(path, true, true);
});
fileActions.setDefault('dir', 'Open');
return fileActions;
},
_onActionsUpdated: function (ev) {
if (ev.action) {
this.recentFileList.fileActions.registerAction(ev.action);
} else if (ev.defaultAction) {
this.recentFileList.fileActions.setDefault(
ev.defaultAction.mime,
ev.defaultAction.name
);
}
}
};
})(OCA);
OC.Plugins.register('OCA.Files.App', OCA.Files.RecentPlugin);

View file

@ -194,7 +194,7 @@ OC.L10N.register(
"descending" : "تنازلياً",
"Sort list by {column} ({direction})" : "ترتيب القائمة بحسب {column} ({direction})",
"List of files and folders." : "قائمة الملفات و المجلدات",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "لم يمكن عرض هذه القائمة بالكامل بسبب إشكالية في الأداء. سيتم عرض الملفات عندما تمر عليها في القائمة",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "لم يتم عرض هذه القائمة بالكامل لأسباب تتعلق بالأداء. سيتم عرض الملفات تباعاً أثناء التنقل عبر القائمة.",
"Storage informations" : "معلومات التخزين",
"{usedQuotaByte} used" : "{usedQuotaByte} مستخدمة",
"{relative}% used" : "{relative}% مستخدمة",
@ -240,6 +240,7 @@ OC.L10N.register(
"Unable to create new file from template" : "تعذر إنشاء الملف الجديد من القالب",
"Delete permanently" : "حذف بشكل دائم",
"Open folder {displayName}" : "إفتح المجلد {displayName}",
"Open in Files" : "إفتَح في \"الملفات\"",
"Open details" : "افتح التفاصيل",
"Set up templates folder" : "إعداد مجلد القوالب",
"Templates" : "القوالب",
@ -248,6 +249,9 @@ OC.L10N.register(
"List of favorites files and folders." : "قائمة الملفات والمجلدات المفضلة.",
"No favorites yet" : "ليست عندك مفضلات بعد",
"Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ",
"List of recently modified files and folders." : "قائمة بالملفات و المجلدات التي تمّ تعديلها مؤخراً.",
"No recently modified files" : "لا توجد أيّ ملفات تمّ تعديلها مؤخراً",
"Files and folders you recently modified will show up here." : "الملفات و المجلدات التي تمّ تعديلها مؤخراً ستظهر هنا.",
"Toggle %1$s sublist" : "تبديل %1$s قائمة فرعية",
"Toggle grid view" : "تفعيل/تعطيل القائمة",
"No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ",
@ -271,6 +275,7 @@ OC.L10N.register(
"Deleted shares" : "تم حذف المشاركات",
"Pending shares" : "انتظار المشاركات",
"Open folder {name}" : "إفتح المجلد {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "لم يمكن عرض هذه القائمة بالكامل بسبب إشكالية في الأداء. سيتم عرض الملفات عندما تمر عليها في القائمة",
"Search for an account" : "البحث عن حساب",
"No files or folders have been deleted yet" : "لم يتم حذف أي ملفات أو مجلدات بعدُ"
},

View file

@ -192,7 +192,7 @@
"descending" : "تنازلياً",
"Sort list by {column} ({direction})" : "ترتيب القائمة بحسب {column} ({direction})",
"List of files and folders." : "قائمة الملفات و المجلدات",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "لم يمكن عرض هذه القائمة بالكامل بسبب إشكالية في الأداء. سيتم عرض الملفات عندما تمر عليها في القائمة",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "لم يتم عرض هذه القائمة بالكامل لأسباب تتعلق بالأداء. سيتم عرض الملفات تباعاً أثناء التنقل عبر القائمة.",
"Storage informations" : "معلومات التخزين",
"{usedQuotaByte} used" : "{usedQuotaByte} مستخدمة",
"{relative}% used" : "{relative}% مستخدمة",
@ -238,6 +238,7 @@
"Unable to create new file from template" : "تعذر إنشاء الملف الجديد من القالب",
"Delete permanently" : "حذف بشكل دائم",
"Open folder {displayName}" : "إفتح المجلد {displayName}",
"Open in Files" : "إفتَح في \"الملفات\"",
"Open details" : "افتح التفاصيل",
"Set up templates folder" : "إعداد مجلد القوالب",
"Templates" : "القوالب",
@ -246,6 +247,9 @@
"List of favorites files and folders." : "قائمة الملفات والمجلدات المفضلة.",
"No favorites yet" : "ليست عندك مفضلات بعد",
"Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ",
"List of recently modified files and folders." : "قائمة بالملفات و المجلدات التي تمّ تعديلها مؤخراً.",
"No recently modified files" : "لا توجد أيّ ملفات تمّ تعديلها مؤخراً",
"Files and folders you recently modified will show up here." : "الملفات و المجلدات التي تمّ تعديلها مؤخراً ستظهر هنا.",
"Toggle %1$s sublist" : "تبديل %1$s قائمة فرعية",
"Toggle grid view" : "تفعيل/تعطيل القائمة",
"No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ",
@ -269,6 +273,7 @@
"Deleted shares" : "تم حذف المشاركات",
"Pending shares" : "انتظار المشاركات",
"Open folder {name}" : "إفتح المجلد {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "لم يمكن عرض هذه القائمة بالكامل بسبب إشكالية في الأداء. سيتم عرض الملفات عندما تمر عليها في القائمة",
"Search for an account" : "البحث عن حساب",
"No files or folders have been deleted yet" : "لم يتم حذف أي ملفات أو مجلدات بعدُ"
},"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;"

View file

@ -182,7 +182,6 @@ OC.L10N.register(
"ascending" : "възходящо",
"descending" : "низходящо",
"Sort list by {column} ({direction})" : "Сортиране на списъка по {column} ({direction})",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Този списък не е напълно рендиран поради причини, свързани с производителността. Файловете ще бъдат рендирани, докато навигирате из списъка.",
"Storage informations" : "Хранилище на информация",
"{usedQuotaByte} used" : "{usedQuotaByte} използвано",
"{relative}% used" : "{relative}% използвано",
@ -256,6 +255,7 @@ OC.L10N.register(
"Deleted shares" : "Изтрити",
"Pending shares" : "Чакащи споделяния",
"Open folder {name}" : "Отваряне на папка {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Този списък не е напълно рендиран поради причини, свързани с производителността. Файловете ще бъдат рендирани, докато навигирате из списъка.",
"Search for an account" : "Търсене на профил",
"No files or folders have been deleted yet" : "Все още няма изтрити файлове или папки"
},

View file

@ -180,7 +180,6 @@
"ascending" : "възходящо",
"descending" : "низходящо",
"Sort list by {column} ({direction})" : "Сортиране на списъка по {column} ({direction})",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Този списък не е напълно рендиран поради причини, свързани с производителността. Файловете ще бъдат рендирани, докато навигирате из списъка.",
"Storage informations" : "Хранилище на информация",
"{usedQuotaByte} used" : "{usedQuotaByte} използвано",
"{relative}% used" : "{relative}% използвано",
@ -254,6 +253,7 @@
"Deleted shares" : "Изтрити",
"Pending shares" : "Чакащи споделяния",
"Open folder {name}" : "Отваряне на папка {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Този списък не е напълно рендиран поради причини, свързани с производителността. Файловете ще бъдат рендирани, докато навигирате из списъка.",
"Search for an account" : "Търсене на профил",
"No files or folders have been deleted yet" : "Все още няма изтрити файлове или папки"
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View file

@ -194,7 +194,7 @@ OC.L10N.register(
"descending" : "descendent",
"Sort list by {column} ({direction})" : "Ordena la llista per {column} ({direction})",
"List of files and folders." : "Llista de fitxers i carpetes.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"Storage informations" : "Informació d'emmagatzematge",
"{usedQuotaByte} used" : "{usedQuotaByte} en ús",
"{relative}% used" : "{relative}% en ús",
@ -240,6 +240,7 @@ OC.L10N.register(
"Unable to create new file from template" : "No s'ha pogut crear el fitxer a partir de la plantilla",
"Delete permanently" : "Suprimeix permanentment",
"Open folder {displayName}" : "Obre la carpeta {displayName}",
"Open in Files" : "Obre a Fitxers",
"Open details" : "Obre els detalls",
"Set up templates folder" : "Configura la carpeta de plantilles",
"Templates" : "Plantilles",
@ -247,7 +248,10 @@ OC.L10N.register(
"Unable to initialize the templates directory" : "No s'ha pogut inicialitzar la carpeta de plantilles",
"List of favorites files and folders." : "Llista de fitxers i carpetes preferits.",
"No favorites yet" : "Encara no teniu preferits",
"Files and folders you mark as favorite will show up here" : "Aquí apareixeran els fitxers i carpetes que marqueu com a preferits",
"Files and folders you mark as favorite will show up here" : "Els fitxers i les carpetes que marqueu com a preferits es mostraran aquí",
"List of recently modified files and folders." : "Llista de fitxers i carpetes modificats recentment.",
"No recently modified files" : "No hi ha cap fitxer modificat recentment",
"Files and folders you recently modified will show up here." : "Els fitxers i les carpetes que heu modificat recentment es mostraran aquí",
"Toggle %1$s sublist" : "Canvia la subllista de %1$s",
"Toggle grid view" : "Canvia la visualització de quadrícula",
"No entries found in this folder" : "No s'ha trobat cap entrada en aquesta carpeta",
@ -271,6 +275,7 @@ OC.L10N.register(
"Deleted shares" : "Suprimit",
"Pending shares" : "Pendent",
"Open folder {name}" : "Obre la carpeta {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"Search for an account" : "Cerqueu un compte",
"No files or folders have been deleted yet" : "Encara no s'ha suprimit cap fitxer o carpeta"
},

View file

@ -192,7 +192,7 @@
"descending" : "descendent",
"Sort list by {column} ({direction})" : "Ordena la llista per {column} ({direction})",
"List of files and folders." : "Llista de fitxers i carpetes.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"Storage informations" : "Informació d'emmagatzematge",
"{usedQuotaByte} used" : "{usedQuotaByte} en ús",
"{relative}% used" : "{relative}% en ús",
@ -238,6 +238,7 @@
"Unable to create new file from template" : "No s'ha pogut crear el fitxer a partir de la plantilla",
"Delete permanently" : "Suprimeix permanentment",
"Open folder {displayName}" : "Obre la carpeta {displayName}",
"Open in Files" : "Obre a Fitxers",
"Open details" : "Obre els detalls",
"Set up templates folder" : "Configura la carpeta de plantilles",
"Templates" : "Plantilles",
@ -245,7 +246,10 @@
"Unable to initialize the templates directory" : "No s'ha pogut inicialitzar la carpeta de plantilles",
"List of favorites files and folders." : "Llista de fitxers i carpetes preferits.",
"No favorites yet" : "Encara no teniu preferits",
"Files and folders you mark as favorite will show up here" : "Aquí apareixeran els fitxers i carpetes que marqueu com a preferits",
"Files and folders you mark as favorite will show up here" : "Els fitxers i les carpetes que marqueu com a preferits es mostraran aquí",
"List of recently modified files and folders." : "Llista de fitxers i carpetes modificats recentment.",
"No recently modified files" : "No hi ha cap fitxer modificat recentment",
"Files and folders you recently modified will show up here." : "Els fitxers i les carpetes que heu modificat recentment es mostraran aquí",
"Toggle %1$s sublist" : "Canvia la subllista de %1$s",
"Toggle grid view" : "Canvia la visualització de quadrícula",
"No entries found in this folder" : "No s'ha trobat cap entrada en aquesta carpeta",
@ -269,6 +273,7 @@
"Deleted shares" : "Suprimit",
"Pending shares" : "Pendent",
"Open folder {name}" : "Obre la carpeta {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"Search for an account" : "Cerqueu un compte",
"No files or folders have been deleted yet" : "Encara no s'ha suprimit cap fitxer o carpeta"
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View file

@ -194,7 +194,7 @@ OC.L10N.register(
"descending" : "sestupně",
"Sort list by {column} ({direction})" : "Seřadit seznam podle {column} ({direction})",
"List of files and folders." : "Seznam souborů a složek.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"Storage informations" : "Informace o úložišti",
"{usedQuotaByte} used" : "{usedQuotaByte} využito",
"{relative}% used" : "{relative}% využito",
@ -240,6 +240,7 @@ OC.L10N.register(
"Unable to create new file from template" : "Nedaří se vytvořit soubor ze šablony",
"Delete permanently" : "Nadobro smazat",
"Open folder {displayName}" : "Otevřít složku {displayName}",
"Open in Files" : "Otevřít v Souborech",
"Open details" : "Otevřít podorobnosti",
"Set up templates folder" : "Vytvořit složku pro šablony",
"Templates" : "Šablony",
@ -248,6 +249,9 @@ OC.L10N.register(
"List of favorites files and folders." : "Seznam oblíbených souborů a složek.",
"No favorites yet" : "Zatím nic oblíbeného",
"Files and folders you mark as favorite will show up here" : "Zde budou zobrazeny soubory a složky, které označíte jako oblíbené",
"List of recently modified files and folders." : "Seznam nedávno změněných souborů a složek.",
"No recently modified files" : "Žádné nedávno změněné soubory.",
"Files and folders you recently modified will show up here." : "Zde budou zobrazeny soubory a složky, které jste nedávno změnili.",
"Toggle %1$s sublist" : "Přepnout %1$s podseznam",
"Toggle grid view" : "Vyp/zap. zobrazení v mřížce",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
@ -271,6 +275,7 @@ OC.L10N.register(
"Deleted shares" : "Smazaná sdílení",
"Pending shares" : "Čekající sdílení",
"Open folder {name}" : "Otevřít složku {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"Search for an account" : "Hledat účet",
"No files or folders have been deleted yet" : "Zatím nebyly smazány žádné soubory či složky"
},

View file

@ -192,7 +192,7 @@
"descending" : "sestupně",
"Sort list by {column} ({direction})" : "Seřadit seznam podle {column} ({direction})",
"List of files and folders." : "Seznam souborů a složek.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"Storage informations" : "Informace o úložišti",
"{usedQuotaByte} used" : "{usedQuotaByte} využito",
"{relative}% used" : "{relative}% využito",
@ -238,6 +238,7 @@
"Unable to create new file from template" : "Nedaří se vytvořit soubor ze šablony",
"Delete permanently" : "Nadobro smazat",
"Open folder {displayName}" : "Otevřít složku {displayName}",
"Open in Files" : "Otevřít v Souborech",
"Open details" : "Otevřít podorobnosti",
"Set up templates folder" : "Vytvořit složku pro šablony",
"Templates" : "Šablony",
@ -246,6 +247,9 @@
"List of favorites files and folders." : "Seznam oblíbených souborů a složek.",
"No favorites yet" : "Zatím nic oblíbeného",
"Files and folders you mark as favorite will show up here" : "Zde budou zobrazeny soubory a složky, které označíte jako oblíbené",
"List of recently modified files and folders." : "Seznam nedávno změněných souborů a složek.",
"No recently modified files" : "Žádné nedávno změněné soubory.",
"Files and folders you recently modified will show up here." : "Zde budou zobrazeny soubory a složky, které jste nedávno změnili.",
"Toggle %1$s sublist" : "Přepnout %1$s podseznam",
"Toggle grid view" : "Vyp/zap. zobrazení v mřížce",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
@ -269,6 +273,7 @@
"Deleted shares" : "Smazaná sdílení",
"Pending shares" : "Čekající sdílení",
"Open folder {name}" : "Otevřít složku {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"Search for an account" : "Hledat účet",
"No files or folders have been deleted yet" : "Zatím nebyly smazány žádné soubory či složky"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"

View file

@ -107,6 +107,8 @@ OC.L10N.register(
"Create new folder" : "Opret ny mappe",
"Upload file" : "Upload fil",
"Recent" : "Seneste",
"This file has the tag {tag}" : "Denne fil har tagget {tag}",
"This file has the tags {firstTags} and {lastTag}" : "Denne fil har taggene {firstTags} og {lastTag}",
"Not favorited" : "Ingen foretrukne",
"Remove from favorites" : "Fjern fra favoritter",
"Add to favorites" : "Tilføj til favoritter",
@ -166,6 +168,8 @@ OC.L10N.register(
"The ownership transfer of {path} from {user} has completed." : "Ejerskabsoverførslen af {path} fra {user} er fuldført.",
"in %s" : "i %s",
"File Management" : "Filhåndtering",
"Reload current directory" : "Genindlæs den aktuelle mappe",
"Go to the \"{dir}\" directory" : "Gå til mappen \"{dir}\"",
"Name cannot be empty" : "Navn må ikke være tomt",
"Select all" : "Vælg alle",
"Storage informations" : "Lagerinformationer",

View file

@ -105,6 +105,8 @@
"Create new folder" : "Opret ny mappe",
"Upload file" : "Upload fil",
"Recent" : "Seneste",
"This file has the tag {tag}" : "Denne fil har tagget {tag}",
"This file has the tags {firstTags} and {lastTag}" : "Denne fil har taggene {firstTags} og {lastTag}",
"Not favorited" : "Ingen foretrukne",
"Remove from favorites" : "Fjern fra favoritter",
"Add to favorites" : "Tilføj til favoritter",
@ -164,6 +166,8 @@
"The ownership transfer of {path} from {user} has completed." : "Ejerskabsoverførslen af {path} fra {user} er fuldført.",
"in %s" : "i %s",
"File Management" : "Filhåndtering",
"Reload current directory" : "Genindlæs den aktuelle mappe",
"Go to the \"{dir}\" directory" : "Gå til mappen \"{dir}\"",
"Name cannot be empty" : "Navn må ikke være tomt",
"Select all" : "Vælg alle",
"Storage informations" : "Lagerinformationer",

View file

@ -182,7 +182,6 @@ OC.L10N.register(
"ascending" : "Aufsteigend",
"descending" : "Absteigend",
"Sort list by {column} ({direction})" : "Liste sortieren nach {column} ({direction})",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn du durch die Liste navigierst.",
"Storage informations" : "Speicherinformationen",
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
"{relative}% used" : "{relative}% verwendet",
@ -255,6 +254,7 @@ OC.L10N.register(
"Deleted shares" : "Gelöschte Freigaben",
"Pending shares" : "Ausstehende Freigaben",
"Open folder {name}" : "Ordner {name} öffnen",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn du durch die Liste navigierst.",
"Search for an account" : "Nach einem Konto suchen",
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht"
},

View file

@ -180,7 +180,6 @@
"ascending" : "Aufsteigend",
"descending" : "Absteigend",
"Sort list by {column} ({direction})" : "Liste sortieren nach {column} ({direction})",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn du durch die Liste navigierst.",
"Storage informations" : "Speicherinformationen",
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
"{relative}% used" : "{relative}% verwendet",
@ -253,6 +252,7 @@
"Deleted shares" : "Gelöschte Freigaben",
"Pending shares" : "Ausstehende Freigaben",
"Open folder {name}" : "Ordner {name} öffnen",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn du durch die Liste navigierst.",
"Search for an account" : "Nach einem Konto suchen",
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht"
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View file

@ -194,7 +194,7 @@ OC.L10N.register(
"descending" : "Absteigend",
"Sort list by {column} ({direction})" : "Liste sortieren nach {column} ({direction})",
"List of files and folders." : "Liste der Dateien und Ordner.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"Storage informations" : "Speicherinformationen",
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
"{relative}% used" : "{relative}% verwendet",
@ -240,6 +240,7 @@ OC.L10N.register(
"Unable to create new file from template" : "Neue Datei kann nicht aus Vorlage erstellt werden",
"Delete permanently" : "Endgültig löschen",
"Open folder {displayName}" : "Ordner {displayName} öffnen",
"Open in Files" : "In Dateien öffnen",
"Open details" : "Details öffnen",
"Set up templates folder" : "Vorlagenordner einrichten",
"Templates" : "Vorlagen",
@ -248,6 +249,9 @@ OC.L10N.register(
"List of favorites files and folders." : "Liste der favorisierten Ordner und Dateien.",
"No favorites yet" : "Noch keine Favoriten vorhanden",
"Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen",
"List of recently modified files and folders." : "Liste der zuletzt geänderten Dateien und Ordner.",
"No recently modified files" : "Keine kürzlich geänderten Dateien",
"Files and folders you recently modified will show up here." : "Die von Ihnen kürzlich geänderten Dateien und Ordner werden hier angezeigt.",
"Toggle %1$s sublist" : "Unterliste %1$s umschalten",
"Toggle grid view" : "Rasteransicht umschalten",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
@ -271,6 +275,7 @@ OC.L10N.register(
"Deleted shares" : "Gelöschte Freigaben",
"Pending shares" : "Ausstehende Freigaben",
"Open folder {name}" : "Ordner {name} öffnen",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"Search for an account" : "Nach einem Konto suchen",
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht"
},

View file

@ -192,7 +192,7 @@
"descending" : "Absteigend",
"Sort list by {column} ({direction})" : "Liste sortieren nach {column} ({direction})",
"List of files and folders." : "Liste der Dateien und Ordner.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"Storage informations" : "Speicherinformationen",
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
"{relative}% used" : "{relative}% verwendet",
@ -238,6 +238,7 @@
"Unable to create new file from template" : "Neue Datei kann nicht aus Vorlage erstellt werden",
"Delete permanently" : "Endgültig löschen",
"Open folder {displayName}" : "Ordner {displayName} öffnen",
"Open in Files" : "In Dateien öffnen",
"Open details" : "Details öffnen",
"Set up templates folder" : "Vorlagenordner einrichten",
"Templates" : "Vorlagen",
@ -246,6 +247,9 @@
"List of favorites files and folders." : "Liste der favorisierten Ordner und Dateien.",
"No favorites yet" : "Noch keine Favoriten vorhanden",
"Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen",
"List of recently modified files and folders." : "Liste der zuletzt geänderten Dateien und Ordner.",
"No recently modified files" : "Keine kürzlich geänderten Dateien",
"Files and folders you recently modified will show up here." : "Die von Ihnen kürzlich geänderten Dateien und Ordner werden hier angezeigt.",
"Toggle %1$s sublist" : "Unterliste %1$s umschalten",
"Toggle grid view" : "Rasteransicht umschalten",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
@ -269,6 +273,7 @@
"Deleted shares" : "Gelöschte Freigaben",
"Pending shares" : "Ausstehende Freigaben",
"Open folder {name}" : "Ordner {name} öffnen",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"Search for an account" : "Nach einem Konto suchen",
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht"
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View file

@ -194,7 +194,7 @@ OC.L10N.register(
"descending" : "descending",
"Sort list by {column} ({direction})" : "Sort list by {column} ({direction})",
"List of files and folders." : "List of files and folders.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
"Storage informations" : "Storage informations",
"{usedQuotaByte} used" : "{usedQuotaByte} used",
"{relative}% used" : "{relative}% used",
@ -240,6 +240,7 @@ OC.L10N.register(
"Unable to create new file from template" : "Unable to create new file from template",
"Delete permanently" : "Delete permanently",
"Open folder {displayName}" : "Open folder {displayName}",
"Open in Files" : "Open in Files",
"Open details" : "Open details",
"Set up templates folder" : "Set up templates folder",
"Templates" : "Templates",
@ -248,6 +249,9 @@ OC.L10N.register(
"List of favorites files and folders." : "List of favourites files and folders.",
"No favorites yet" : "No favourites yet",
"Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here",
"List of recently modified files and folders." : "List of recently modified files and folders.",
"No recently modified files" : "No recently modified files",
"Files and folders you recently modified will show up here." : "Files and folders you recently modified will show up here.",
"Toggle %1$s sublist" : "Toggle %1$s sublist",
"Toggle grid view" : "Toggle grid view",
"No entries found in this folder" : "No entries found in this folder",
@ -271,6 +275,7 @@ OC.L10N.register(
"Deleted shares" : "Deleted shares",
"Pending shares" : "Pending shares",
"Open folder {name}" : "Open folder {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.",
"Search for an account" : "Search for an account",
"No files or folders have been deleted yet" : "No files or folders have been deleted yet"
},

View file

@ -192,7 +192,7 @@
"descending" : "descending",
"Sort list by {column} ({direction})" : "Sort list by {column} ({direction})",
"List of files and folders." : "List of files and folders.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
"Storage informations" : "Storage informations",
"{usedQuotaByte} used" : "{usedQuotaByte} used",
"{relative}% used" : "{relative}% used",
@ -238,6 +238,7 @@
"Unable to create new file from template" : "Unable to create new file from template",
"Delete permanently" : "Delete permanently",
"Open folder {displayName}" : "Open folder {displayName}",
"Open in Files" : "Open in Files",
"Open details" : "Open details",
"Set up templates folder" : "Set up templates folder",
"Templates" : "Templates",
@ -246,6 +247,9 @@
"List of favorites files and folders." : "List of favourites files and folders.",
"No favorites yet" : "No favourites yet",
"Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here",
"List of recently modified files and folders." : "List of recently modified files and folders.",
"No recently modified files" : "No recently modified files",
"Files and folders you recently modified will show up here." : "Files and folders you recently modified will show up here.",
"Toggle %1$s sublist" : "Toggle %1$s sublist",
"Toggle grid view" : "Toggle grid view",
"No entries found in this folder" : "No entries found in this folder",
@ -269,6 +273,7 @@
"Deleted shares" : "Deleted shares",
"Pending shares" : "Pending shares",
"Open folder {name}" : "Open folder {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.",
"Search for an account" : "Search for an account",
"No files or folders have been deleted yet" : "No files or folders have been deleted yet"
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View file

@ -193,7 +193,8 @@ OC.L10N.register(
"ascending" : "ascendente",
"descending" : "descendente",
"Sort list by {column} ({direction})" : "Ordenar lista por {column} ({direction})",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se renderiza completa por razones de rendimiento. Los archivos serán renderizados mientras ud. navegue por la lista.",
"List of files and folders." : "Lista de archivos y carpetas.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
"Storage informations" : "Informaciones de almacenamiento",
"{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
"{relative}% used" : "{relative}% utilizado",
@ -239,6 +240,7 @@ OC.L10N.register(
"Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla",
"Delete permanently" : "Eliminar de forma definitiva",
"Open folder {displayName}" : "Abrir carpeta {displayName}",
"Open in Files" : "Abrir en Archivos",
"Open details" : "Abrir detalles",
"Set up templates folder" : "Configura una carpeta para plantillas",
"Templates" : "Plantillas",
@ -247,6 +249,9 @@ OC.L10N.register(
"List of favorites files and folders." : "Lista de archivos y carpetas favoritos.",
"No favorites yet" : "Aún no hay favoritos",
"Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que has marcado como favoritos",
"List of recently modified files and folders." : "Lista de archivos y carpetas modificados recientemente.",
"No recently modified files" : "No hay archivos modificados recientemente.",
"Files and folders you recently modified will show up here." : "Los archivos y carpetas que ha modificado recientemente aparecerán aquí.",
"Toggle %1$s sublist" : "Alternar %1$s sublista",
"Toggle grid view" : "Alternar vista de cuadrícula",
"No entries found in this folder" : "No hay entradas en esta carpeta",
@ -270,6 +275,7 @@ OC.L10N.register(
"Deleted shares" : "Recursos compartidos eliminados",
"Pending shares" : "Recursos compartidos pendientes",
"Open folder {name}" : "Abrir carpeta {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se renderiza completa por razones de rendimiento. Los archivos serán renderizados mientras ud. navegue por la lista.",
"Search for an account" : "Buscar una cuenta",
"No files or folders have been deleted yet" : "No se han borrado archivos o carpetas todavía"
},

View file

@ -191,7 +191,8 @@
"ascending" : "ascendente",
"descending" : "descendente",
"Sort list by {column} ({direction})" : "Ordenar lista por {column} ({direction})",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se renderiza completa por razones de rendimiento. Los archivos serán renderizados mientras ud. navegue por la lista.",
"List of files and folders." : "Lista de archivos y carpetas.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
"Storage informations" : "Informaciones de almacenamiento",
"{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
"{relative}% used" : "{relative}% utilizado",
@ -237,6 +238,7 @@
"Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla",
"Delete permanently" : "Eliminar de forma definitiva",
"Open folder {displayName}" : "Abrir carpeta {displayName}",
"Open in Files" : "Abrir en Archivos",
"Open details" : "Abrir detalles",
"Set up templates folder" : "Configura una carpeta para plantillas",
"Templates" : "Plantillas",
@ -245,6 +247,9 @@
"List of favorites files and folders." : "Lista de archivos y carpetas favoritos.",
"No favorites yet" : "Aún no hay favoritos",
"Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que has marcado como favoritos",
"List of recently modified files and folders." : "Lista de archivos y carpetas modificados recientemente.",
"No recently modified files" : "No hay archivos modificados recientemente.",
"Files and folders you recently modified will show up here." : "Los archivos y carpetas que ha modificado recientemente aparecerán aquí.",
"Toggle %1$s sublist" : "Alternar %1$s sublista",
"Toggle grid view" : "Alternar vista de cuadrícula",
"No entries found in this folder" : "No hay entradas en esta carpeta",
@ -268,6 +273,7 @@
"Deleted shares" : "Recursos compartidos eliminados",
"Pending shares" : "Recursos compartidos pendientes",
"Open folder {name}" : "Abrir carpeta {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se renderiza completa por razones de rendimiento. Los archivos serán renderizados mientras ud. navegue por la lista.",
"Search for an account" : "Buscar una cuenta",
"No files or folders have been deleted yet" : "No se han borrado archivos o carpetas todavía"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"

View file

@ -194,7 +194,6 @@ OC.L10N.register(
"descending" : "descendente",
"Sort list by {column} ({direction})" : "Ordenar lista por {column} ({direction}).",
"List of files and folders." : "Lista de archivos y carpetas. ",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navegas por la lista.",
"Storage informations" : "Información de almacenamiento.",
"{usedQuotaByte} used" : "{usedQuotaByte} usados.",
"{relative}% used" : "{relative}% usados.",
@ -271,6 +270,7 @@ OC.L10N.register(
"Deleted shares" : "Comparticiones eliminadas",
"Pending shares" : "Comparticiones pendientes",
"Open folder {name}" : "Abrir carpeta {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navegas por la lista.",
"Search for an account" : "Buscar una cuenta",
"No files or folders have been deleted yet" : "No se han eliminado archivos o carpetas todavía."
},

View file

@ -192,7 +192,6 @@
"descending" : "descendente",
"Sort list by {column} ({direction})" : "Ordenar lista por {column} ({direction}).",
"List of files and folders." : "Lista de archivos y carpetas. ",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navegas por la lista.",
"Storage informations" : "Información de almacenamiento.",
"{usedQuotaByte} used" : "{usedQuotaByte} usados.",
"{relative}% used" : "{relative}% usados.",
@ -269,6 +268,7 @@
"Deleted shares" : "Comparticiones eliminadas",
"Pending shares" : "Comparticiones pendientes",
"Open folder {name}" : "Abrir carpeta {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navegas por la lista.",
"Search for an account" : "Buscar una cuenta",
"No files or folders have been deleted yet" : "No se han eliminado archivos o carpetas todavía."
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"

View file

@ -193,7 +193,8 @@ OC.L10N.register(
"ascending" : "goranzkoa",
"descending" : "beheranzkoa",
"Sort list by {column} ({direction})" : "Ordenatu zerrenda {zutabea} ({norabidea}) arabera",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"List of files and folders." : "Fitxategi eta karpeten zerrenda.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"Storage informations" : "Biltegiaren informazioak",
"{usedQuotaByte} used" : "{usedQuotaByte} erabilita",
"{relative}% used" : "%{relative} erabilita",
@ -239,6 +240,7 @@ OC.L10N.register(
"Unable to create new file from template" : "Ezin da fitxategi berria sortu txantiloitik",
"Delete permanently" : "Ezabatu betirako",
"Open folder {displayName}" : "Ireki {displayName} karpeta",
"Open in Files" : "Ireki Fitxategiak aplikazioan",
"Open details" : "Ireki xehetasunak",
"Set up templates folder" : "Konfiguratu txantiloien karpeta",
"Templates" : "Txantiloiak",
@ -247,6 +249,9 @@ OC.L10N.register(
"List of favorites files and folders." : "Fitxategi eta karpeta gogokoen zerrenda.",
"No favorites yet" : "Gogokorik ez oraindik",
"Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpetak hemen agertuko dira",
"List of recently modified files and folders." : "Azkenaldian aldatutako fitxategi eta karpeten zerrenda.",
"No recently modified files" : "Ez dago azkenaldian aldatutako fitxategirik",
"Files and folders you recently modified will show up here." : "Azkenaldian aldatu dituzun fitxategi eta karpetak hemen agertuko dira.",
"Toggle %1$s sublist" : "Txandakatu %1$sazpizerrenda",
"Toggle grid view" : "Txandakatu sareta ikuspegia",
"No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
@ -270,6 +275,7 @@ OC.L10N.register(
"Deleted shares" : "Ezabatutako partekatzeak",
"Pending shares" : "Zain dauden partekatzeak",
"Open folder {name}" : "Ireki {name} karpeta",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"Search for an account" : "Bilatu kontu bat",
"No files or folders have been deleted yet" : "Oraindik ez da ezabatu fitxategirik edo karpetarik"
},

View file

@ -191,7 +191,8 @@
"ascending" : "goranzkoa",
"descending" : "beheranzkoa",
"Sort list by {column} ({direction})" : "Ordenatu zerrenda {zutabea} ({norabidea}) arabera",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"List of files and folders." : "Fitxategi eta karpeten zerrenda.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"Storage informations" : "Biltegiaren informazioak",
"{usedQuotaByte} used" : "{usedQuotaByte} erabilita",
"{relative}% used" : "%{relative} erabilita",
@ -237,6 +238,7 @@
"Unable to create new file from template" : "Ezin da fitxategi berria sortu txantiloitik",
"Delete permanently" : "Ezabatu betirako",
"Open folder {displayName}" : "Ireki {displayName} karpeta",
"Open in Files" : "Ireki Fitxategiak aplikazioan",
"Open details" : "Ireki xehetasunak",
"Set up templates folder" : "Konfiguratu txantiloien karpeta",
"Templates" : "Txantiloiak",
@ -245,6 +247,9 @@
"List of favorites files and folders." : "Fitxategi eta karpeta gogokoen zerrenda.",
"No favorites yet" : "Gogokorik ez oraindik",
"Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpetak hemen agertuko dira",
"List of recently modified files and folders." : "Azkenaldian aldatutako fitxategi eta karpeten zerrenda.",
"No recently modified files" : "Ez dago azkenaldian aldatutako fitxategirik",
"Files and folders you recently modified will show up here." : "Azkenaldian aldatu dituzun fitxategi eta karpetak hemen agertuko dira.",
"Toggle %1$s sublist" : "Txandakatu %1$sazpizerrenda",
"Toggle grid view" : "Txandakatu sareta ikuspegia",
"No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
@ -268,6 +273,7 @@
"Deleted shares" : "Ezabatutako partekatzeak",
"Pending shares" : "Zain dauden partekatzeak",
"Open folder {name}" : "Ireki {name} karpeta",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"Search for an account" : "Bilatu kontu bat",
"No files or folders have been deleted yet" : "Oraindik ez da ezabatu fitxategirik edo karpetarik"
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View file

@ -41,6 +41,10 @@ OC.L10N.register(
"Could not load info for file \"{file}\"" : "بارگیری اطلاعات برای پرونده امکان پذیر نیست \"{file}\"",
"Files" : "پرونده‌ها",
"Details" : "جزئیات",
"Please select tag(s) to add to the selection" : "لطفاً برچسب(های) را برای افزودن به انتخاب انتخاب کنید",
"Apply tag(s) to selection" : "تگ(ها) را در انتخاب اعمال کنید",
"Select directory \"{dirName}\"" : "دایرکتوری \"{dirName}\" را انتخاب کنید",
"Select file \"{fileName}\"" : "فایل \"{fileName}\" را انتخاب کنید",
"Pending" : "در انتظار",
"Unable to determine date" : "امکان تعیین تاریخ وجود ندارد",
"This operation is forbidden" : "این عملیات غیرمجاز است",
@ -53,35 +57,59 @@ OC.L10N.register(
"Could not copy \"{file}\"" : "پرونده کپی نشد",
"Copied {origin} inside {destination}" : "کپی شده (اصل) در مقصد",
"Copied {origin} and {nbfiles} other files inside {destination}" : "رونوشت شده از {origin} و {nbfiles} پرونده‌های دیگر در {destination}",
"Failed to redirect to client" : "هدایت به مشتری انجام نشد",
"{newName} already exists" : "{newName} قبلاً موجود است",
"Could not rename \"{fileName}\", it does not exist any more" : "نمی‌توان نام «{fileName}» را تغییر داد، دیگر وجود ندارد",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "عنوان \"{targetName}\" هم اکنون در پوشه \"{dir}\" وجود دارد. لطفا نام دیگری انتخاب کنید",
"Could not rename \"{fileName}\"" : "\"{fileName}\" تغییر نام داده نمی‌شود",
"Could not create file \"{file}\"" : "پروندهٔ \"{file}\" ساخته نشد",
"Could not create file \"{file}\" because it already exists" : "نمی توان پرونده \"{file}\" ایجاد کرد زیرا در حال حاضر وجود دارد",
"Could not create folder \"{dir}\" because it already exists" : "شاخه \"{dir}\" به علت موجود بودن ساخته نشد",
"Could not fetch file details \"{file}\"" : "جزئیات فایل \"{file}\" واکشی نشد",
"Error deleting file \"{fileName}\"." : "خطای حذف پروندهٔ \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "جستجو در پوشه های دیگر برای {tag}{filter}{endtag} یافت نشد",
"Enter more than two characters to search in other folders" : "برای جستجو در پوشه های دیگر بیش از دو کاراکتر وارد کنید",
"Name" : "نام",
"Size" : "اندازه",
"Modified" : "تاریخ",
"_%n folder_::_%n folders_" : ["%n پوشه","%n پوشه"],
"_%n file_::_%n files_" : ["%n فایل","%n فایل"],
"{dirs} and {files}" : "{dirs} و {files}",
"_including %n hidden_::_including %n hidden_" : ["از جمله %nپنهان","از جمله %nپنهان"],
"You do not have permission to upload or create files here" : "شما اجازه آپلود یا ایجاد فایل در اینجا را ندارید",
"_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل","در حال بارگذاری %n فایل"],
"New file/folder menu" : "منوی فایل/پوشه جدید",
"Select file range" : "محدوده فایل را انتخاب کنید",
"{used}%" : "{used}%",
"{used} of {quota} used" : "{used} از {quota} استفاده شده",
"{used} used" : "{used} استفاده شده",
"\"{name}\" is an invalid file name." : "\"{name}\" نامی نامعتبر برای فایل است.",
"File name cannot be empty." : "نام پرونده نمی تواند خالی باشد.",
"\"/\" is not allowed inside a file name." : "\"/\" در داخل نام فایل مجاز نیست.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" یک نوع پرونده مجاز نیست",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "فضای ذخیره‌سازی {owner} پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "پوشه گروه \"{mountPoint}\" پر است، فایل‌ها دیگر قابل به‌روزرسانی یا همگام‌سازی نیستند!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "حافظه خارجی \"{mountPoint}\" پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
"Your storage is full, files cannot be updated or synced anymore!" : "فضای ذخیره‌سازی شما پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "فضای ذخیره سازی {owner} تقریباً پر است ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "پوشه گروه \"{mountPoint}\" تقریبا پر است ({usedSpacePercent}%).",
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "حافظه خارجی \"{mountPoint}\" تقریباً پر است ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "فضای ذخیره‌سازی شما تقریباً پر است ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["مطابقت با \"{filter}\"","مطابقت با \"{filter}\""],
"View in folder" : "مشاهده در پوشه",
"Direct link was copied (only works for users who have access to this file/folder)" : "پیوند مستقیم کپی شد (فقط برای کاربرانی که به این فایل/پوشه دسترسی دارند کار می کند)",
"Path" : "مسیر",
"_%n byte_::_%n bytes_" : ["%n بایت","%n بایت"],
"Favorited" : "برگزیده شده",
"Favorite" : "برگزیده",
"Copy direct link (only works for users who have access to this file/folder)" : "کپی لینک مستقیم (فقط برای کاربرانی که به این فایل/پوشه دسترسی دارند کار می کند)",
"New folder" : "پوشه جدید",
"Create new folder" : "ساختن پوشه جدید",
"Upload file" : "بارگذاری پرونده",
"Recent" : "اخیر",
"This file has the tag {tag}" : "این فایل دارای تگ {tag} است",
"This file has the tags {firstTags} and {lastTag}" : "این فایل دارای تگ‌های {firstTags} و {lastTag} است.",
"Not favorited" : "مورد علاقه نیست",
"Remove from favorites" : "حذف کردن از برگزیده ها",
"Add to favorites" : "اضافه کردن به برگزیده ها",
"An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسب‌ها رخ داده است",
@ -94,33 +122,137 @@ OC.L10N.register(
"Created by {user}" : "{user} ٖایجاد کرد",
"Changed by {user}" : "{user} تغییر داد",
"Deleted by {user}" : " {user} حذف کرد",
"Restored by {user}" : "بازیابی شده توسط {user}",
"Renamed by {user}" : "تغییر نام توسط {user}",
"Moved by {user}" : "منتقل شده توسط {user}",
"\"remote user\"" : "\"کاربران از راه‌ دور\"",
"You created {file}" : "شما {file} را ایجاد کردید",
"You created an encrypted file in {file}" : "شما یک فایل رمزگذاری شده در {file} ایجاد کردید",
"{user} created {file}" : "{user} {file} را ایجاد کرد",
"{user} created an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده در {file} ایجاد کرد",
"{file} was created in a public folder" : "{file} در یک پوشه عمومی ایجاد شد",
"You changed {file}" : "شما {file} را تغییر دادید",
"You changed an encrypted file in {file}" : "شما یک فایل رمزگذاری شده را در {file} تغییر دادید",
"{user} changed {file}" : "{user} {file} را تغییر داد",
"{user} changed an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده را در {file} تغییر داد",
"You deleted {file}" : "شما {file} را حذف کردید",
"You deleted an encrypted file in {file}" : "شما یک فایل رمزگذاری شده را در {file} حذف کردید",
"{user} deleted {file}" : "{user} {file} را حذف کرد",
"{user} deleted an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده را در {file} حذف کرد",
"You restored {file}" : "شما {file} را بازیابی کردید",
"{user} restored {file}" : "{user} {file} را بازیابی کرد",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "شما نام {oldfile} (پنهان) را به {newfile} (پنهان) تغییر دادید",
"You renamed {oldfile} (hidden) to {newfile}" : "شما نام {oldfile} (پنهان) را به {newfile} تغییر دادید",
"You renamed {oldfile} to {newfile} (hidden)" : "شما نام {oldfile} را به {newfile} تغییر دادید (پنهان)",
"You renamed {oldfile} to {newfile}" : "شما نام {oldfile} را به {newfile} تغییر دادید",
"{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} به {oldfile} تغییر نام داد (پنهان) به {newfile} (مخفی)",
"{user} renamed {oldfile} (hidden) to {newfile}" : "{user} به {oldfile} تغییر نام داد (پنهان) به {newfile}",
"{user} renamed {oldfile} to {newfile} (hidden)" : "{user} نام {oldfile} را به {newfile} تغییر داد (پنهان)",
"{user} renamed {oldfile} to {newfile}" : "{user} نام {oldfile} را به {newfile} تغییر داد",
"You moved {oldfile} to {newfile}" : "شما {oldfile} را به {newfile} منتقل کردید",
"{user} moved {oldfile} to {newfile}" : "{user} {oldfile} را به {newfile} منتقل کرد",
"A file has been added to or removed from your <strong>favorites</strong>" : "یک فایل به موارد دلخواه شما اضافه یا حذف شده است",
"A file or folder has been <strong>changed</strong>" : "پرونده یا پوشه‌ای به <strong>تغییر</strong> داده شد",
"A favorite file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه مورد علاقه تغییر کرده است",
"All files" : "تمامی فایل‌ها",
"Upload (max. %s)" : "آپلود (بیشترین سایز %s)",
"Accept" : "قبول",
"Reject" : "رد کردن",
"Incoming ownership transfer from {user}" : "انتقال مالکیت ورودی از {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "آیا می خواهید {path} را بپذیرید؟\n\nتوجه: فرآیند انتقال پس از پذیرش ممکن است تا 1 ساعت طول بکشد.",
"Ownership transfer failed" : "انتقال مالکیت ناموفق بود",
"Your ownership transfer of {path} to {user} failed." : "انتقال مالکیت شما از {path} به {user} انجام نشد.",
"The ownership transfer of {path} from {user} failed." : "انتقال مالکیت {path} از {user} انجام نشد.",
"Ownership transfer done" : "انتقال مالکیت انجام شد",
"Your ownership transfer of {path} to {user} has completed." : "انتقال مالکیت شما از {path} به {user} تکمیل شد.",
"The ownership transfer of {path} from {user} has completed." : "انتقال مالکیت {path} از {user} تکمیل شد.",
"in %s" : "در %s",
"File Management" : "مدیریت فایل",
"Reload current directory" : "دایرکتوری فعلی را دوباره بارگیری کنید",
"Go to the \"{dir}\" directory" : "به دایرکتوری \"{dir}\" بروید",
"Select the row for {displayName}" : "ردیف {displayName} را انتخاب کنید",
"Rename file" : "تغییر نام فایل",
"File name" : "نام فایل",
"A long time ago" : "مدت ها پیش",
"Download file {name}" : "دانلود فایل {name}",
"\"{displayName}\" action executed successfully" : "عملکرد \"{displayName}\" با موفقیت اجرا شد",
"\"{displayName}\" action failed" : "اقدام \"{displayName}\" ناموفق بود",
"\"{name}\" is not an allowed filetype." : "\"{name}\" یک نوع فایل مجاز نیست.",
"{newName} already exists." : "{newName} از قبل وجود دارد.",
"Name cannot be empty" : "نام نمی‌تواند خالی باشد",
"Another entry with the same name already exists" : "ورودی دیگری با همین نام در حال حاضر وجود دارد",
"Renamed \"{oldName}\" to \"{newName}\"" : "تغییر نام \"{oldName}\" به \"{newName}\"",
"Could not rename \"{oldName}\", it does not exist any more" : "نمی‌توان نام «{oldName}» را تغییر داد، دیگر وجود ندارد",
"The name \"{newName}\"\" is already used in the folder \"{dir}\". Please choose a different name." : "نام \"{newName}\" قبلاً در پوشه \"{dir}\" استفاده شده است. لطفاً نام دیگری انتخاب کنید.",
"Could not rename \"{oldName}\"" : "تغییر نام \"{oldName}\" ممکن نیست",
"Total rows summary" : "خلاصه کل ردیف ها",
"Select all" : "انتخاب همه",
"Unselect all" : "همه را لغو انتخاب کنید",
"\"{displayName}\" failed on some elements " : "\"{displayName}\" در برخی از عناصر ناموفق بود",
"\"{displayName}\" batch action executed successfully" : "عملکرد دسته‌ای \"{displayName}\" با موفقیت اجرا شد",
"ascending" : "صعودی",
"descending" : "نزولی",
"Sort list by {column} ({direction})" : "مرتب سازی لیست بر اساس {ستون} ({direction})",
"List of files and folders." : "لیست فایل ها و پوشه ها",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل عملکرد به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.",
"Storage informations" : "ذخیره سازی اطلاعات ",
"{usedQuotaByte} used" : "{usedQuotaByte} استفاده شده است",
"{relative}% used" : "{نسبی}% استفاده شده است",
"Could not refresh storage stats" : "نمی‌توان آمار ذخیره‌سازی را بازخوانی کرد",
"Transfer ownership of a file or folder" : "انتقال مالکیت یک فایل یا پوشه",
"Choose file or folder to transfer" : "فایل یا پوشه را برای انتقال انتخاب کنید",
"Change" : "تغییر",
"New owner" : "مالک جدید",
"Choose a file or folder to transfer" : "فایل یا پوشه ای را برای انتقال انتخاب کنید",
"Transfer" : "انتقال",
"Transfer {path} to {userid}" : "انتقال {path} به {userid}",
"Invalid path selected" : "مسیر نامعتبر انتخاب شده است",
"Unknown error" : "خطای نامشخص",
"Ownership transfer request sent" : "درخواست انتقال مالکیت ارسال شد",
"Cannot transfer ownership of a file or folder you do not own" : "نمی‌توان مالکیت فایل یا پوشه‌ای را که متعلق به شما نیست، منتقل کرد",
"Select file or folder to link to" : "فایل یا پوشه را برای پیوند انتخاب کنید",
"Loading current folder" : "در حال بارگیری پوشه فعلی",
"No files in here" : "هیچ فایلی اینجا وجود ندارد",
"Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگام‌سازی کنید!",
"Go to the previous folder" : "به پوشه قبلی بروید",
"Go back" : "برگرد",
"Open the files app settings" : "تنظیمات برنامه فایل ها را باز کنید",
"Files settings" : "تنظیمات پرونده‌ها",
"File cannot be accessed" : "فایل قابل دسترسی نیست",
"You might not have have permissions to view it, ask the sender to share it" : "ممکن است مجوز مشاهده آن را نداشته باشید، از فرستنده بخواهید آن را به اشتراک بگذارد",
"Sort favorites first" : "ابتدا موارد دلخواه را مرتب کنید",
"Show hidden files" : "نمایش پرونده‌های مخفی",
"Crop image previews" : "پیش نمایش تصویر برش",
"Additional settings" : "تنظیمات اضافی",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "رونوشت به تخته‌گیره",
"Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید",
"If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.",
"Clipboard is not available" : "تخته گیره موحود نیست",
"WebDAV URL copied to clipboard" : "URL WebDAV در کلیپ بورد کپی شد",
"Unable to change the favourite state of the file" : "امکان تغییر حالت دلخواه فایل وجود ندارد",
"Error while loading the file data" : "خطا هنگام بارگیری داده های فایل",
"Pick a template for {name}" : "یک الگو برای {name} انتخاب کنید",
"Create" : "ساخت",
"Create a new file with the selected template" : "یک فایل جدید با الگوی انتخاب شده ایجاد کنید",
"Creating file" : "ایجاد فایل",
"Blank" : "جای خالی",
"Unable to create new file from template" : "امکان ایجاد فایل جدید از الگو وجود ندارد",
"Delete permanently" : "حذف قطعی",
"Open folder {displayName}" : "باز کردن پوشه {displayName}",
"Open in Files" : "در فایل باز کنید",
"Open details" : "باز کردن جزئیات",
"Set up templates folder" : "پوشه قالب ها را تنظیم کنید",
"Templates" : "قالب‌ها",
"Create new templates folder" : "پوشه قالب های جدید ایجاد کنید",
"Unable to initialize the templates directory" : "راه اندازی دایرکتوری الگوها ممکن نیست",
"List of favorites files and folders." : "لیست فایل ها و پوشه های مورد علاقه",
"No favorites yet" : "هنوز مورد دلخواه وجود ندارد",
"Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود",
"List of recently modified files and folders." : "فهرست فایل‌ها و پوشه‌هایی که اخیراً اصلاح شده‌اند.",
"No recently modified files" : "هیچ فایلی که اخیراً اصلاح شده است",
"Files and folders you recently modified will show up here." : "فایل‌ها و پوشه‌هایی که اخیراً تغییر داده‌اید در اینجا نمایش داده می‌شوند.",
"Toggle %1$s sublist" : "تغییر%1$s فهرست فرعی",
"Toggle grid view" : "نمای شبکه را تغییر دهید",
"No entries found in this folder" : "هیچ ورودی‌ای در این پوشه وجود ندارد",
"Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
@ -128,8 +260,12 @@ OC.L10N.register(
"Text file" : "فایل متنی",
"New text file.txt" : "پروندهٔ متنی جدید با پسوند txt",
"Storage invalid" : "فضای ذخیره‌سازی نامعتبر",
"You can only favorite a single file or folder at a time" : "در هر زمان فقط می توانید یک فایل یا پوشه را مورد علاقه خود قرار دهید",
"Unlimited" : "نامحدود",
"Search users" : "جستجوی کاربران",
"Cancel" : "لغو",
"%s used" : "%sاستفاده شده",
"%s%%" : "%s%%",
"%1$s of %2$s used" : "%1$s از %2$s استفاده شده ",
"Deleted files" : "پرونده‌های حذف شده",
"Shares" : "اشتراک گذاری ها",
@ -137,6 +273,10 @@ OC.L10N.register(
"Shared with you" : "Shared with you",
"Shared by link" : "اشتراک گذاشته شده از طریق لینک",
"Deleted shares" : "اشتراک گذاری های حذف شده",
"Pending shares" : "اشتراک در حال انتظار "
"Pending shares" : "اشتراک در حال انتظار ",
"Open folder {name}" : "باز کردن پوشه {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل اجرایی به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.",
"Search for an account" : "جستجو برای یک حساب کاربری",
"No files or folders have been deleted yet" : "هنوز هیچ فایل یا پوشه ای حذف نشده است"
},
"nplurals=2; plural=(n > 1);");

View file

@ -39,6 +39,10 @@
"Could not load info for file \"{file}\"" : "بارگیری اطلاعات برای پرونده امکان پذیر نیست \"{file}\"",
"Files" : "پرونده‌ها",
"Details" : "جزئیات",
"Please select tag(s) to add to the selection" : "لطفاً برچسب(های) را برای افزودن به انتخاب انتخاب کنید",
"Apply tag(s) to selection" : "تگ(ها) را در انتخاب اعمال کنید",
"Select directory \"{dirName}\"" : "دایرکتوری \"{dirName}\" را انتخاب کنید",
"Select file \"{fileName}\"" : "فایل \"{fileName}\" را انتخاب کنید",
"Pending" : "در انتظار",
"Unable to determine date" : "امکان تعیین تاریخ وجود ندارد",
"This operation is forbidden" : "این عملیات غیرمجاز است",
@ -51,35 +55,59 @@
"Could not copy \"{file}\"" : "پرونده کپی نشد",
"Copied {origin} inside {destination}" : "کپی شده (اصل) در مقصد",
"Copied {origin} and {nbfiles} other files inside {destination}" : "رونوشت شده از {origin} و {nbfiles} پرونده‌های دیگر در {destination}",
"Failed to redirect to client" : "هدایت به مشتری انجام نشد",
"{newName} already exists" : "{newName} قبلاً موجود است",
"Could not rename \"{fileName}\", it does not exist any more" : "نمی‌توان نام «{fileName}» را تغییر داد، دیگر وجود ندارد",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "عنوان \"{targetName}\" هم اکنون در پوشه \"{dir}\" وجود دارد. لطفا نام دیگری انتخاب کنید",
"Could not rename \"{fileName}\"" : "\"{fileName}\" تغییر نام داده نمی‌شود",
"Could not create file \"{file}\"" : "پروندهٔ \"{file}\" ساخته نشد",
"Could not create file \"{file}\" because it already exists" : "نمی توان پرونده \"{file}\" ایجاد کرد زیرا در حال حاضر وجود دارد",
"Could not create folder \"{dir}\" because it already exists" : "شاخه \"{dir}\" به علت موجود بودن ساخته نشد",
"Could not fetch file details \"{file}\"" : "جزئیات فایل \"{file}\" واکشی نشد",
"Error deleting file \"{fileName}\"." : "خطای حذف پروندهٔ \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "جستجو در پوشه های دیگر برای {tag}{filter}{endtag} یافت نشد",
"Enter more than two characters to search in other folders" : "برای جستجو در پوشه های دیگر بیش از دو کاراکتر وارد کنید",
"Name" : "نام",
"Size" : "اندازه",
"Modified" : "تاریخ",
"_%n folder_::_%n folders_" : ["%n پوشه","%n پوشه"],
"_%n file_::_%n files_" : ["%n فایل","%n فایل"],
"{dirs} and {files}" : "{dirs} و {files}",
"_including %n hidden_::_including %n hidden_" : ["از جمله %nپنهان","از جمله %nپنهان"],
"You do not have permission to upload or create files here" : "شما اجازه آپلود یا ایجاد فایل در اینجا را ندارید",
"_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل","در حال بارگذاری %n فایل"],
"New file/folder menu" : "منوی فایل/پوشه جدید",
"Select file range" : "محدوده فایل را انتخاب کنید",
"{used}%" : "{used}%",
"{used} of {quota} used" : "{used} از {quota} استفاده شده",
"{used} used" : "{used} استفاده شده",
"\"{name}\" is an invalid file name." : "\"{name}\" نامی نامعتبر برای فایل است.",
"File name cannot be empty." : "نام پرونده نمی تواند خالی باشد.",
"\"/\" is not allowed inside a file name." : "\"/\" در داخل نام فایل مجاز نیست.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" یک نوع پرونده مجاز نیست",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "فضای ذخیره‌سازی {owner} پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "پوشه گروه \"{mountPoint}\" پر است، فایل‌ها دیگر قابل به‌روزرسانی یا همگام‌سازی نیستند!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "حافظه خارجی \"{mountPoint}\" پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
"Your storage is full, files cannot be updated or synced anymore!" : "فضای ذخیره‌سازی شما پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "فضای ذخیره سازی {owner} تقریباً پر است ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "پوشه گروه \"{mountPoint}\" تقریبا پر است ({usedSpacePercent}%).",
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "حافظه خارجی \"{mountPoint}\" تقریباً پر است ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "فضای ذخیره‌سازی شما تقریباً پر است ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["مطابقت با \"{filter}\"","مطابقت با \"{filter}\""],
"View in folder" : "مشاهده در پوشه",
"Direct link was copied (only works for users who have access to this file/folder)" : "پیوند مستقیم کپی شد (فقط برای کاربرانی که به این فایل/پوشه دسترسی دارند کار می کند)",
"Path" : "مسیر",
"_%n byte_::_%n bytes_" : ["%n بایت","%n بایت"],
"Favorited" : "برگزیده شده",
"Favorite" : "برگزیده",
"Copy direct link (only works for users who have access to this file/folder)" : "کپی لینک مستقیم (فقط برای کاربرانی که به این فایل/پوشه دسترسی دارند کار می کند)",
"New folder" : "پوشه جدید",
"Create new folder" : "ساختن پوشه جدید",
"Upload file" : "بارگذاری پرونده",
"Recent" : "اخیر",
"This file has the tag {tag}" : "این فایل دارای تگ {tag} است",
"This file has the tags {firstTags} and {lastTag}" : "این فایل دارای تگ‌های {firstTags} و {lastTag} است.",
"Not favorited" : "مورد علاقه نیست",
"Remove from favorites" : "حذف کردن از برگزیده ها",
"Add to favorites" : "اضافه کردن به برگزیده ها",
"An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسب‌ها رخ داده است",
@ -92,33 +120,137 @@
"Created by {user}" : "{user} ٖایجاد کرد",
"Changed by {user}" : "{user} تغییر داد",
"Deleted by {user}" : " {user} حذف کرد",
"Restored by {user}" : "بازیابی شده توسط {user}",
"Renamed by {user}" : "تغییر نام توسط {user}",
"Moved by {user}" : "منتقل شده توسط {user}",
"\"remote user\"" : "\"کاربران از راه‌ دور\"",
"You created {file}" : "شما {file} را ایجاد کردید",
"You created an encrypted file in {file}" : "شما یک فایل رمزگذاری شده در {file} ایجاد کردید",
"{user} created {file}" : "{user} {file} را ایجاد کرد",
"{user} created an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده در {file} ایجاد کرد",
"{file} was created in a public folder" : "{file} در یک پوشه عمومی ایجاد شد",
"You changed {file}" : "شما {file} را تغییر دادید",
"You changed an encrypted file in {file}" : "شما یک فایل رمزگذاری شده را در {file} تغییر دادید",
"{user} changed {file}" : "{user} {file} را تغییر داد",
"{user} changed an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده را در {file} تغییر داد",
"You deleted {file}" : "شما {file} را حذف کردید",
"You deleted an encrypted file in {file}" : "شما یک فایل رمزگذاری شده را در {file} حذف کردید",
"{user} deleted {file}" : "{user} {file} را حذف کرد",
"{user} deleted an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده را در {file} حذف کرد",
"You restored {file}" : "شما {file} را بازیابی کردید",
"{user} restored {file}" : "{user} {file} را بازیابی کرد",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "شما نام {oldfile} (پنهان) را به {newfile} (پنهان) تغییر دادید",
"You renamed {oldfile} (hidden) to {newfile}" : "شما نام {oldfile} (پنهان) را به {newfile} تغییر دادید",
"You renamed {oldfile} to {newfile} (hidden)" : "شما نام {oldfile} را به {newfile} تغییر دادید (پنهان)",
"You renamed {oldfile} to {newfile}" : "شما نام {oldfile} را به {newfile} تغییر دادید",
"{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} به {oldfile} تغییر نام داد (پنهان) به {newfile} (مخفی)",
"{user} renamed {oldfile} (hidden) to {newfile}" : "{user} به {oldfile} تغییر نام داد (پنهان) به {newfile}",
"{user} renamed {oldfile} to {newfile} (hidden)" : "{user} نام {oldfile} را به {newfile} تغییر داد (پنهان)",
"{user} renamed {oldfile} to {newfile}" : "{user} نام {oldfile} را به {newfile} تغییر داد",
"You moved {oldfile} to {newfile}" : "شما {oldfile} را به {newfile} منتقل کردید",
"{user} moved {oldfile} to {newfile}" : "{user} {oldfile} را به {newfile} منتقل کرد",
"A file has been added to or removed from your <strong>favorites</strong>" : "یک فایل به موارد دلخواه شما اضافه یا حذف شده است",
"A file or folder has been <strong>changed</strong>" : "پرونده یا پوشه‌ای به <strong>تغییر</strong> داده شد",
"A favorite file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه مورد علاقه تغییر کرده است",
"All files" : "تمامی فایل‌ها",
"Upload (max. %s)" : "آپلود (بیشترین سایز %s)",
"Accept" : "قبول",
"Reject" : "رد کردن",
"Incoming ownership transfer from {user}" : "انتقال مالکیت ورودی از {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "آیا می خواهید {path} را بپذیرید؟\n\nتوجه: فرآیند انتقال پس از پذیرش ممکن است تا 1 ساعت طول بکشد.",
"Ownership transfer failed" : "انتقال مالکیت ناموفق بود",
"Your ownership transfer of {path} to {user} failed." : "انتقال مالکیت شما از {path} به {user} انجام نشد.",
"The ownership transfer of {path} from {user} failed." : "انتقال مالکیت {path} از {user} انجام نشد.",
"Ownership transfer done" : "انتقال مالکیت انجام شد",
"Your ownership transfer of {path} to {user} has completed." : "انتقال مالکیت شما از {path} به {user} تکمیل شد.",
"The ownership transfer of {path} from {user} has completed." : "انتقال مالکیت {path} از {user} تکمیل شد.",
"in %s" : "در %s",
"File Management" : "مدیریت فایل",
"Reload current directory" : "دایرکتوری فعلی را دوباره بارگیری کنید",
"Go to the \"{dir}\" directory" : "به دایرکتوری \"{dir}\" بروید",
"Select the row for {displayName}" : "ردیف {displayName} را انتخاب کنید",
"Rename file" : "تغییر نام فایل",
"File name" : "نام فایل",
"A long time ago" : "مدت ها پیش",
"Download file {name}" : "دانلود فایل {name}",
"\"{displayName}\" action executed successfully" : "عملکرد \"{displayName}\" با موفقیت اجرا شد",
"\"{displayName}\" action failed" : "اقدام \"{displayName}\" ناموفق بود",
"\"{name}\" is not an allowed filetype." : "\"{name}\" یک نوع فایل مجاز نیست.",
"{newName} already exists." : "{newName} از قبل وجود دارد.",
"Name cannot be empty" : "نام نمی‌تواند خالی باشد",
"Another entry with the same name already exists" : "ورودی دیگری با همین نام در حال حاضر وجود دارد",
"Renamed \"{oldName}\" to \"{newName}\"" : "تغییر نام \"{oldName}\" به \"{newName}\"",
"Could not rename \"{oldName}\", it does not exist any more" : "نمی‌توان نام «{oldName}» را تغییر داد، دیگر وجود ندارد",
"The name \"{newName}\"\" is already used in the folder \"{dir}\". Please choose a different name." : "نام \"{newName}\" قبلاً در پوشه \"{dir}\" استفاده شده است. لطفاً نام دیگری انتخاب کنید.",
"Could not rename \"{oldName}\"" : "تغییر نام \"{oldName}\" ممکن نیست",
"Total rows summary" : "خلاصه کل ردیف ها",
"Select all" : "انتخاب همه",
"Unselect all" : "همه را لغو انتخاب کنید",
"\"{displayName}\" failed on some elements " : "\"{displayName}\" در برخی از عناصر ناموفق بود",
"\"{displayName}\" batch action executed successfully" : "عملکرد دسته‌ای \"{displayName}\" با موفقیت اجرا شد",
"ascending" : "صعودی",
"descending" : "نزولی",
"Sort list by {column} ({direction})" : "مرتب سازی لیست بر اساس {ستون} ({direction})",
"List of files and folders." : "لیست فایل ها و پوشه ها",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل عملکرد به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.",
"Storage informations" : "ذخیره سازی اطلاعات ",
"{usedQuotaByte} used" : "{usedQuotaByte} استفاده شده است",
"{relative}% used" : "{نسبی}% استفاده شده است",
"Could not refresh storage stats" : "نمی‌توان آمار ذخیره‌سازی را بازخوانی کرد",
"Transfer ownership of a file or folder" : "انتقال مالکیت یک فایل یا پوشه",
"Choose file or folder to transfer" : "فایل یا پوشه را برای انتقال انتخاب کنید",
"Change" : "تغییر",
"New owner" : "مالک جدید",
"Choose a file or folder to transfer" : "فایل یا پوشه ای را برای انتقال انتخاب کنید",
"Transfer" : "انتقال",
"Transfer {path} to {userid}" : "انتقال {path} به {userid}",
"Invalid path selected" : "مسیر نامعتبر انتخاب شده است",
"Unknown error" : "خطای نامشخص",
"Ownership transfer request sent" : "درخواست انتقال مالکیت ارسال شد",
"Cannot transfer ownership of a file or folder you do not own" : "نمی‌توان مالکیت فایل یا پوشه‌ای را که متعلق به شما نیست، منتقل کرد",
"Select file or folder to link to" : "فایل یا پوشه را برای پیوند انتخاب کنید",
"Loading current folder" : "در حال بارگیری پوشه فعلی",
"No files in here" : "هیچ فایلی اینجا وجود ندارد",
"Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگام‌سازی کنید!",
"Go to the previous folder" : "به پوشه قبلی بروید",
"Go back" : "برگرد",
"Open the files app settings" : "تنظیمات برنامه فایل ها را باز کنید",
"Files settings" : "تنظیمات پرونده‌ها",
"File cannot be accessed" : "فایل قابل دسترسی نیست",
"You might not have have permissions to view it, ask the sender to share it" : "ممکن است مجوز مشاهده آن را نداشته باشید، از فرستنده بخواهید آن را به اشتراک بگذارد",
"Sort favorites first" : "ابتدا موارد دلخواه را مرتب کنید",
"Show hidden files" : "نمایش پرونده‌های مخفی",
"Crop image previews" : "پیش نمایش تصویر برش",
"Additional settings" : "تنظیمات اضافی",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "رونوشت به تخته‌گیره",
"Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید",
"If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.",
"Clipboard is not available" : "تخته گیره موحود نیست",
"WebDAV URL copied to clipboard" : "URL WebDAV در کلیپ بورد کپی شد",
"Unable to change the favourite state of the file" : "امکان تغییر حالت دلخواه فایل وجود ندارد",
"Error while loading the file data" : "خطا هنگام بارگیری داده های فایل",
"Pick a template for {name}" : "یک الگو برای {name} انتخاب کنید",
"Create" : "ساخت",
"Create a new file with the selected template" : "یک فایل جدید با الگوی انتخاب شده ایجاد کنید",
"Creating file" : "ایجاد فایل",
"Blank" : "جای خالی",
"Unable to create new file from template" : "امکان ایجاد فایل جدید از الگو وجود ندارد",
"Delete permanently" : "حذف قطعی",
"Open folder {displayName}" : "باز کردن پوشه {displayName}",
"Open in Files" : "در فایل باز کنید",
"Open details" : "باز کردن جزئیات",
"Set up templates folder" : "پوشه قالب ها را تنظیم کنید",
"Templates" : "قالب‌ها",
"Create new templates folder" : "پوشه قالب های جدید ایجاد کنید",
"Unable to initialize the templates directory" : "راه اندازی دایرکتوری الگوها ممکن نیست",
"List of favorites files and folders." : "لیست فایل ها و پوشه های مورد علاقه",
"No favorites yet" : "هنوز مورد دلخواه وجود ندارد",
"Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود",
"List of recently modified files and folders." : "فهرست فایل‌ها و پوشه‌هایی که اخیراً اصلاح شده‌اند.",
"No recently modified files" : "هیچ فایلی که اخیراً اصلاح شده است",
"Files and folders you recently modified will show up here." : "فایل‌ها و پوشه‌هایی که اخیراً تغییر داده‌اید در اینجا نمایش داده می‌شوند.",
"Toggle %1$s sublist" : "تغییر%1$s فهرست فرعی",
"Toggle grid view" : "نمای شبکه را تغییر دهید",
"No entries found in this folder" : "هیچ ورودی‌ای در این پوشه وجود ندارد",
"Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
@ -126,8 +258,12 @@
"Text file" : "فایل متنی",
"New text file.txt" : "پروندهٔ متنی جدید با پسوند txt",
"Storage invalid" : "فضای ذخیره‌سازی نامعتبر",
"You can only favorite a single file or folder at a time" : "در هر زمان فقط می توانید یک فایل یا پوشه را مورد علاقه خود قرار دهید",
"Unlimited" : "نامحدود",
"Search users" : "جستجوی کاربران",
"Cancel" : "لغو",
"%s used" : "%sاستفاده شده",
"%s%%" : "%s%%",
"%1$s of %2$s used" : "%1$s از %2$s استفاده شده ",
"Deleted files" : "پرونده‌های حذف شده",
"Shares" : "اشتراک گذاری ها",
@ -135,6 +271,10 @@
"Shared with you" : "Shared with you",
"Shared by link" : "اشتراک گذاشته شده از طریق لینک",
"Deleted shares" : "اشتراک گذاری های حذف شده",
"Pending shares" : "اشتراک در حال انتظار "
"Pending shares" : "اشتراک در حال انتظار ",
"Open folder {name}" : "باز کردن پوشه {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل اجرایی به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.",
"Search for an account" : "جستجو برای یک حساب کاربری",
"No files or folders have been deleted yet" : "هنوز هیچ فایل یا پوشه ای حذف نشده است"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}

View file

@ -179,6 +179,7 @@ OC.L10N.register(
"Name cannot be empty" : "Nimi ei voi olla tyhjä",
"Another entry with the same name already exists" : "Toinen tietue samalla nimellä on jo olemassa",
"Renamed \"{oldName}\" to \"{newName}\"" : "Kohteen \"{oldName}\" uudeksi nimeksi asetettiin \"{newName}\"",
"Could not rename \"{oldName}\", it does not exist any more" : "Kohdetta \"{oldName}\" ei voitu nimetä uudelleen, koska sitä ei ole enää olemassa",
"Could not rename \"{oldName}\"" : "Ei voitu nimetä uudelleen \"{oldName}\"",
"Select all" : "Valitse kaikki",
"Unselect all" : "Poista valinnat",
@ -186,7 +187,7 @@ OC.L10N.register(
"descending" : "laskevasti",
"Sort list by {column} ({direction})" : "Järjestä luettelo sarakkeen {column} mukaan ({direction})",
"List of files and folders." : "Luettelo tiedostoista ja kansioista.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"Storage informations" : "Tallennustilan tietoja",
"{usedQuotaByte} used" : "{usedQuotaByte} käytetty",
"{relative}% used" : "{relative} % käytetty",
@ -240,6 +241,8 @@ OC.L10N.register(
"List of favorites files and folders." : "Luettelo suosikkitiedostoista ja -kansioista.",
"No favorites yet" : "Ei vielä suosikkeja",
"Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä",
"List of recently modified files and folders." : "Luettelo äskettäin muokatuista tiedostoista ja kansioista.",
"No recently modified files" : "Ei äskettäin muokattuja tiedostoja",
"Toggle grid view" : "Ruudukkonäkymä päälle/pois",
"No entries found in this folder" : "Ei kohteita tässä kansiossa",
"Upload too large" : "Lähetettävä tiedosto on liian suuri",
@ -262,6 +265,7 @@ OC.L10N.register(
"Deleted shares" : "Poistetut jaot",
"Pending shares" : "Odottavat jaot",
"Open folder {name}" : "Avaa kansio {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"Search for an account" : "Etsi tiliä",
"No files or folders have been deleted yet" : "Tiedostoja tai kansioita ei ole vielä poistettu"
},

View file

@ -177,6 +177,7 @@
"Name cannot be empty" : "Nimi ei voi olla tyhjä",
"Another entry with the same name already exists" : "Toinen tietue samalla nimellä on jo olemassa",
"Renamed \"{oldName}\" to \"{newName}\"" : "Kohteen \"{oldName}\" uudeksi nimeksi asetettiin \"{newName}\"",
"Could not rename \"{oldName}\", it does not exist any more" : "Kohdetta \"{oldName}\" ei voitu nimetä uudelleen, koska sitä ei ole enää olemassa",
"Could not rename \"{oldName}\"" : "Ei voitu nimetä uudelleen \"{oldName}\"",
"Select all" : "Valitse kaikki",
"Unselect all" : "Poista valinnat",
@ -184,7 +185,7 @@
"descending" : "laskevasti",
"Sort list by {column} ({direction})" : "Järjestä luettelo sarakkeen {column} mukaan ({direction})",
"List of files and folders." : "Luettelo tiedostoista ja kansioista.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"Storage informations" : "Tallennustilan tietoja",
"{usedQuotaByte} used" : "{usedQuotaByte} käytetty",
"{relative}% used" : "{relative} % käytetty",
@ -238,6 +239,8 @@
"List of favorites files and folders." : "Luettelo suosikkitiedostoista ja -kansioista.",
"No favorites yet" : "Ei vielä suosikkeja",
"Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä",
"List of recently modified files and folders." : "Luettelo äskettäin muokatuista tiedostoista ja kansioista.",
"No recently modified files" : "Ei äskettäin muokattuja tiedostoja",
"Toggle grid view" : "Ruudukkonäkymä päälle/pois",
"No entries found in this folder" : "Ei kohteita tässä kansiossa",
"Upload too large" : "Lähetettävä tiedosto on liian suuri",
@ -260,6 +263,7 @@
"Deleted shares" : "Poistetut jaot",
"Pending shares" : "Odottavat jaot",
"Open folder {name}" : "Avaa kansio {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"Search for an account" : "Etsi tiliä",
"No files or folders have been deleted yet" : "Tiedostoja tai kansioita ei ole vielä poistettu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View file

@ -194,7 +194,7 @@ OC.L10N.register(
"descending" : "descendant",
"Sort list by {column} ({direction})" : "Trier la liste par {column} ({direction})",
"List of files and folders." : "Liste des fichiers et dossiers.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas affichée en totalité pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous parcourrez la liste.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas entièrement affichée pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous naviguerez dans la liste.",
"Storage informations" : "Informations sur le stockage",
"{usedQuotaByte} used" : "{usedQuotaByte} utilisés",
"{relative}% used" : "{relative}% utilisés",
@ -271,6 +271,7 @@ OC.L10N.register(
"Deleted shares" : "Partages supprimés",
"Pending shares" : "Partages en attente",
"Open folder {name}" : "Ouvrir le dossier {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas affichée en totalité pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous parcourrez la liste.",
"Search for an account" : "Chercher un compte",
"No files or folders have been deleted yet" : "Aucun fichier ou dossier n'a encore été supprimé"
},

View file

@ -192,7 +192,7 @@
"descending" : "descendant",
"Sort list by {column} ({direction})" : "Trier la liste par {column} ({direction})",
"List of files and folders." : "Liste des fichiers et dossiers.",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas affichée en totalité pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous parcourrez la liste.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas entièrement affichée pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous naviguerez dans la liste.",
"Storage informations" : "Informations sur le stockage",
"{usedQuotaByte} used" : "{usedQuotaByte} utilisés",
"{relative}% used" : "{relative}% utilisés",
@ -269,6 +269,7 @@
"Deleted shares" : "Partages supprimés",
"Pending shares" : "Partages en attente",
"Open folder {name}" : "Ouvrir le dossier {name}",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas affichée en totalité pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous parcourrez la liste.",
"Search for an account" : "Chercher un compte",
"No files or folders have been deleted yet" : "Aucun fichier ou dossier n'a encore été supprimé"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"

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