Merge branch 'master' into replace_strpos_calls_in_dav_app

Signed-off-by: Faraz Samapoor <f.samapoor@gmail.com>
This commit is contained in:
Faraz Samapoor 2023-06-27 19:07:09 +03:30 committed by GitHub
commit bbfe2fb821
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
921 changed files with 15994 additions and 9759 deletions

View file

@ -1,15 +0,0 @@
codecov:
branch: master
ci:
- drone.nextcloud.com
- !scrutinizer-ci.com
coverage:
precision: 2
round: down
range: "70...100"
status:
project: off
patch: off
comment: off

View file

@ -24,6 +24,10 @@ trim_trailing_whitespace = false
[*.svg]
insert_final_newline = false
[package*.json]
indent_size = 2
indent_style = space
[build/psalm-baseline.xml]
indent_size = 2
indent_style = space

2
.github/CODEOWNERS vendored
View file

@ -8,7 +8,7 @@
/apps/dav/lib/CardDAV @ChristophWurst @miaulalala @tcitworld
/apps/encryption/appinfo/info.xml @come-nc @icewind1991
/apps/federatedfilesharing/appinfo/info.xml @icewind1991 @danxuliu
/apps/federation/appinfo/info.xml @vitormattos @datenangebot
/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_sharing/appinfo/info.xml @skjnldsv @come-nc

View file

@ -171,3 +171,12 @@ updates:
# ignore all GitHub linguist patch updates
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
# GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris

View file

@ -23,7 +23,7 @@ jobs:
require: write
- name: Add reaction on start
uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
@ -66,7 +66,7 @@ jobs:
git config --local user.name "nextcloud-command"
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1
id: package-engines-versions
with:
fallbackNode: '^16'
@ -108,7 +108,7 @@ jobs:
git push --force origin ${{ needs.init.outputs.head_ref }}
- name: Add reaction on failure
uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
if: failure()
with:
token: ${{ secrets.COMMAND_BOT_PAT }}

View file

@ -18,7 +18,7 @@ jobs:
steps:
- name: Add reaction on start
uses: peter-evans/create-or-update-comment@v2
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
@ -46,7 +46,7 @@ jobs:
git push
- name: Add reaction on failure
uses: peter-evans/create-or-update-comment@v2
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa
if: failure()
with:
token: ${{ secrets.COMMAND_BOT_PAT }}

View file

@ -23,7 +23,7 @@ jobs:
steps:
- name: Add reaction on start
uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
@ -42,7 +42,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
- name: Add reaction on failure
uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
if: failure()
with:
token: ${{ secrets.COMMAND_BOT_PAT }}

View file

@ -24,7 +24,7 @@ jobs:
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1
id: versions
with:
fallbackNode: "^14"

View file

@ -42,7 +42,7 @@ jobs:
if [[ "${{ matrix.ftpd }}" == 'vsftpd' ]]; then docker run --name ftp -d --net host -e FTP_USER=test -e FTP_PASS=test -e PASV_ADDRESS=127.0.0.1 -v /tmp/ftp:/home/vsftpd/test fauria/vsftpd; fi
if [[ "${{ matrix.ftpd }}" == 'pure-ftpd' ]]; then docker run --name ftp -d --net host -e "PUBLICHOST=localhost" -e FTP_USER_NAME=test -e FTP_USER_PASS=test -e FTP_USER_HOME=/home/test -v /tmp/ftp2:/home/test -v /tmp/ftp2:/etc/pure-ftpd/passwd stilliard/pure-ftpd; fi
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9

View file

@ -41,7 +41,7 @@ jobs:
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1
id: versions
with:
fallbackNode: '^16'

View file

@ -22,11 +22,11 @@ jobs:
uses: actions/checkout@v3
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@v1.1
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1
id: versions
with:
fallbackNode: '^12'
fallbackNpm: '^6'
fallbackNode: '^16'
fallbackNpm: '^7'
test:
runs-on: ubuntu-latest
@ -37,7 +37,7 @@ jobs:
uses: actions/checkout@v3
- name: Set up node ${{ needs.versions.outputs.nodeVersion }}
uses: actions/setup-node@v2
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c
with:
node-version: ${{ needs.versions.outputs.nodeVersion }}
@ -47,8 +47,13 @@ jobs:
- name: Install dependencies
run: npm ci
- name: Test
run: npm run test
- name: Test and process coverage
run: npm run test:coverage
- name: Collect coverage
uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4
with:
files: ./coverage/lcov.info
jsunit:
runs-on: ubuntu-latest
@ -59,7 +64,7 @@ jobs:
uses: actions/checkout@v3
- name: Set up node ${{ needs.versions.outputs.nodeVersion }}
uses: actions/setup-node@v2
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c
with:
node-version: ${{ needs.versions.outputs.nodeVersion }}
@ -81,7 +86,7 @@ jobs:
uses: actions/checkout@v3
- name: Set up node ${{ needs.versions.outputs.nodeVersion }}
uses: actions/setup-node@v2
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c
with:
node-version: ${{ needs.versions.outputs.nodeVersion }}

View file

@ -40,7 +40,7 @@ jobs:
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1
id: versions
with:
fallbackNode: '^16'

View file

@ -29,7 +29,7 @@ jobs:
ref: ${{ matrix.branches }}
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1
id: versions
with:
fallbackNode: '^16'

View file

@ -47,7 +47,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
with:
php-version: ${{ matrix.php-versions }}
extensions: ctype, curl, dom, fileinfo, gd, imagick, intl, json, mbstring, oci8, openssl, pcntl, pdo_sqlite, posix, sqlite, xml, zip

View file

@ -23,7 +23,7 @@ jobs:
ref: ${{ github.event.pull_request.base.ref }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9
@ -79,7 +79,7 @@ jobs:
- name: Upload profiles
if: always()
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce
with:
name: profiles
path: |

View file

@ -40,7 +40,7 @@ jobs:
sudo apt-get install -y ffmpeg imagemagick libmagickcore-6.q16-3-extra
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
with:
php-version: ${{ matrix.php-versions }}
extensions: ctype, curl, dom, fileinfo, gd, imagick, intl, json, mbstring, openssl, pdo_sqlite, posix, sqlite, xml, zip, apcu

View file

@ -43,7 +43,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9
@ -96,7 +96,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9

View file

@ -41,7 +41,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9

View file

@ -37,7 +37,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9

1
.gitignore vendored
View file

@ -154,6 +154,7 @@ Vagrantfile
/config/config-autotest-backup.php
/config/autoconfig.php
clover.xml
/coverage
# Tests - dependencies
tests/acceptance/vendor/

View file

@ -0,0 +1,34 @@
/**
* @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author John Molakvoæ <skjnldsv@protonmail.com>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
export const getCurrentUser = function() {
return {
uid: 'test',
displayName: 'Test',
isAdmin: false,
}
}
export const getRequestToken = function() {
return 'test-token-1234'
}
export const onRequestTokenUpdate = function() {}

View file

@ -0,0 +1,25 @@
/**
* @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author John Molakvoæ <skjnldsv@protonmail.com>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
export default {
delete: async () => ({ status: 200, data: {} }),
post: async () => ({ status: 200, data: {} }),
}

22
__mocks__/svg.js Normal file
View file

@ -0,0 +1,22 @@
/**
* @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author John Molakvoæ <skjnldsv@protonmail.com>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
export default 'SvgMock'

View file

@ -21,3 +21,6 @@
*/
import '@testing-library/jest-dom'
// Mock `window.location` with Jest spies and extend expect
import 'jest-location-mock'

View file

@ -2,6 +2,6 @@ OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "Auditoría / Rexistro",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de rexistro para o Nextcloud como rexistros de acceso a ficheiros ou calquera outra acción sensíbel."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de rexistro para Nextcloud como rexistros de acceso a ficheiros ou calquera outra acción sensíbel."
},
"nplurals=2; plural=(n != 1);");

View file

@ -1,5 +1,5 @@
{ "translations": {
"Auditing / Logging" : "Auditoría / Rexistro",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de rexistro para o Nextcloud como rexistros de acceso a ficheiros ou calquera outra acción sensíbel."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de rexistro para Nextcloud como rexistros de acceso a ficheiros ou calquera outra acción sensíbel."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -0,0 +1,8 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "واجهة برمجة التطبيقات API للاتحاد السحابي Cloud Federation",
"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." : "واجهة برمجة التطبيقات API للاتحاد السحابي Cloud Federation تسمح لخوادم نكست كلاود بالاتصال ببعضها البعض و تبادل البيانات."
},
"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

@ -0,0 +1,6 @@
{ "translations": {
"Cloud Federation API" : "واجهة برمجة التطبيقات API للاتحاد السحابي Cloud Federation",
"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." : "واجهة برمجة التطبيقات API للاتحاد السحابي Cloud Federation تسمح لخوادم نكست كلاود بالاتصال ببعضها البعض و تبادل البيانات."
},"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

@ -0,0 +1,8 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "Pilve Liit API",
"Enable clouds to communicate with each other and exchange data" : "Luba pilvedel suhelda omavahel ja vahetada andmeid",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Pilve Liit API lubab erinevad Nextcloud'i osadel suhelda omavahel ja vahetada andmeid"
},
"nplurals=2; plural=(n != 1);");

View file

@ -0,0 +1,6 @@
{ "translations": {
"Cloud Federation API" : "Pilve Liit API",
"Enable clouds to communicate with each other and exchange data" : "Luba pilvedel suhelda omavahel ja vahetada andmeid",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Pilve Liit API lubab erinevad Nextcloud'i osadel suhelda omavahel ja vahetada andmeid"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -3,6 +3,6 @@ OC.L10N.register(
{
"Cloud Federation API" : "API da Nube federada",
"Enable clouds to communicate with each other and exchange data" : "Permite que as nubes se comuniquen entre elas e intercambien datos",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nube federada permite que varias instancias do Nextcloud se comuniquen entre elas e intercambien datos."
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nube federada permite que varias instancias de Nextcloud se comuniquen entre elas e intercambien datos."
},
"nplurals=2; plural=(n != 1);");

View file

@ -1,6 +1,6 @@
{ "translations": {
"Cloud Federation API" : "API da Nube federada",
"Enable clouds to communicate with each other and exchange data" : "Permite que as nubes se comuniquen entre elas e intercambien datos",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nube federada permite que varias instancias do Nextcloud se comuniquen entre elas e intercambien datos."
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nube federada permite que varias instancias de Nextcloud se comuniquen entre elas e intercambien datos."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -1,8 +1,8 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "联合云 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." : "联合云 API 使各种 Nextcloud 实例可以相互通信并交换数据。"
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "联合云API使各种 Nextcloud 实例可以相互通信并交换数据。"
},
"nplurals=1; plural=0;");

View file

@ -1,6 +1,6 @@
{ "translations": {
"Cloud Federation API" : "联合云 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." : "联合云 API 使各种 Nextcloud 实例可以相互通信并交换数据。"
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "联合云API使各种 Nextcloud 实例可以相互通信并交换数据。"
},"pluralForm" :"nplurals=1; plural=0;"
}

View file

@ -14,7 +14,7 @@ return array(
'OCA\\Comments\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
'OCA\\Comments\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
'OCA\\Comments\\Collaboration\\CommentersSorter' => $baseDir . '/../lib/Collaboration/CommentersSorter.php',
'OCA\\Comments\\Controller\\Notifications' => $baseDir . '/../lib/Controller/Notifications.php',
'OCA\\Comments\\Controller\\NotificationsController' => $baseDir . '/../lib/Controller/NotificationsController.php',
'OCA\\Comments\\EventHandler' => $baseDir . '/../lib/EventHandler.php',
'OCA\\Comments\\Listener\\CommentsEntityEventListener' => $baseDir . '/../lib/Listener/CommentsEntityEventListener.php',
'OCA\\Comments\\Listener\\LoadAdditionalScripts' => $baseDir . '/../lib/Listener/LoadAdditionalScripts.php',

View file

@ -7,14 +7,14 @@ namespace Composer\Autoload;
class ComposerStaticInitComments
{
public static $prefixLengthsPsr4 = array (
'O' =>
'O' =>
array (
'OCA\\Comments\\' => 13,
),
);
public static $prefixDirsPsr4 = array (
'OCA\\Comments\\' =>
'OCA\\Comments\\' =>
array (
0 => __DIR__ . '/..' . '/../lib',
),
@ -29,7 +29,7 @@ class ComposerStaticInitComments
'OCA\\Comments\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
'OCA\\Comments\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
'OCA\\Comments\\Collaboration\\CommentersSorter' => __DIR__ . '/..' . '/../lib/Collaboration/CommentersSorter.php',
'OCA\\Comments\\Controller\\Notifications' => __DIR__ . '/..' . '/../lib/Controller/Notifications.php',
'OCA\\Comments\\Controller\\NotificationsController' => __DIR__ . '/..' . '/../lib/Controller/NotificationsController.php',
'OCA\\Comments\\EventHandler' => __DIR__ . '/..' . '/../lib/EventHandler.php',
'OCA\\Comments\\Listener\\CommentsEntityEventListener' => __DIR__ . '/..' . '/../lib/Listener/CommentsEntityEventListener.php',
'OCA\\Comments\\Listener\\LoadAdditionalScripts' => __DIR__ . '/..' . '/../lib/Listener/LoadAdditionalScripts.php',

View file

@ -19,6 +19,7 @@ OC.L10N.register(
"No comments yet, start the conversation!" : "لا يوجد تعليقات, ابدأ النقاش الآن!",
"No more messages" : "لامزيد من الرسائل",
"Retry" : "أعد المحاولة",
"Failed to mark comments as read" : "إخفاق في تعيين ملاحظات كمقرؤة",
"Unable to load the comments list" : "تعذر تحميل قائمة التعليقات",
"_%n unread comment_::_%n unread comments_" : ["%n تعليق غير مقروء","%n تعليق غير مقروء","تعليقان غير مقروءة","%n تعليقات غير مقروء","%n تعليق غير مقروء","%n تعليق غير مقروء"],
"_1 new comment_::_{unread} new comments_" : ["1 تعليق جديد","1 تعليق جديد","{unread} تعليقات جديدة","{unread} تعليقات جديدة","{unread} تعليقات جديدة","{unread} تعليقات جديدة"],

View file

@ -17,6 +17,7 @@
"No comments yet, start the conversation!" : "لا يوجد تعليقات, ابدأ النقاش الآن!",
"No more messages" : "لامزيد من الرسائل",
"Retry" : "أعد المحاولة",
"Failed to mark comments as read" : "إخفاق في تعيين ملاحظات كمقرؤة",
"Unable to load the comments list" : "تعذر تحميل قائمة التعليقات",
"_%n unread comment_::_%n unread comments_" : ["%n تعليق غير مقروء","%n تعليق غير مقروء","تعليقان غير مقروءة","%n تعليقات غير مقروء","%n تعليق غير مقروء","%n تعليق غير مقروء"],
"_1 new comment_::_{unread} new comments_" : ["1 تعليق جديد","1 تعليق جديد","{unread} تعليقات جديدة","{unread} تعليقات جديدة","{unread} تعليقات جديدة","{unread} تعليقات جديدة"],

View file

@ -9,12 +9,25 @@ OC.L10N.register(
"%1$s commented on %2$s" : "%1$s kommenteeris %2$s",
"{author} commented on {file}" : "{author} kommenteeris faili {file}",
"<strong>Comments</strong> for files" : "<strong>Kommentaarid</strong> failidele",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Sind mainis faili \"{file}\" kommentaaris kasutaja, kes on praeguseks kustutatud.",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mainis sind faili \"{file}\" kommentaaris",
"Files app plugin to add comments to files" : "Failid rakenduse laiendus failidele kommentaaride lisamiseks",
"Edit comment" : "Muuda kommentaari",
"Delete comment" : "Kustuta kommentaar",
"No comments yet, start the conversation!" : "Kommentaare veel pole, alusta vestlust",
"Cancel edit" : "Loobu muutmisest",
"Post comment" : "Postita kommentaar",
"No comments yet, start the conversation!" : "Kommentaare veel pole, alusta vestlust!",
"No more messages" : "Rohkem teateid pole",
"Retry" : "Proovi uuesti",
"Failed to mark comments as read" : "Kommentaaride loetuks märkimine ebaõnnestus",
"Unable to load the comments list" : "Kommentaaride loendi laadimine ebaõnnestus",
"_%n unread comment_::_%n unread comments_" : ["%n lugemata kommentaar","%n lugemata kommentaari"],
"_1 new comment_::_{unread} new comments_" : ["1 uus kommentaar","{unread} uus kommentaar"],
"Comment" : "Kommentaar",
"An error occurred while trying to edit the comment" : "Kommentaari muutmisel tekkis tõrge",
"Comment deleted" : "Kommentaar kustutatud",
"An error occurred while trying to delete the comment" : "Kommentaari kustutamisel tekkis tõrge",
"An error occurred while trying to create the comment" : "Kommentaari lisamisel tekkis tõrge",
"%1$s commented" : "%1$s kommenteeris"
},
"nplurals=2; plural=(n != 1);");

View file

@ -7,12 +7,25 @@
"%1$s commented on %2$s" : "%1$s kommenteeris %2$s",
"{author} commented on {file}" : "{author} kommenteeris faili {file}",
"<strong>Comments</strong> for files" : "<strong>Kommentaarid</strong> failidele",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Sind mainis faili \"{file}\" kommentaaris kasutaja, kes on praeguseks kustutatud.",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mainis sind faili \"{file}\" kommentaaris",
"Files app plugin to add comments to files" : "Failid rakenduse laiendus failidele kommentaaride lisamiseks",
"Edit comment" : "Muuda kommentaari",
"Delete comment" : "Kustuta kommentaar",
"No comments yet, start the conversation!" : "Kommentaare veel pole, alusta vestlust",
"Cancel edit" : "Loobu muutmisest",
"Post comment" : "Postita kommentaar",
"No comments yet, start the conversation!" : "Kommentaare veel pole, alusta vestlust!",
"No more messages" : "Rohkem teateid pole",
"Retry" : "Proovi uuesti",
"Failed to mark comments as read" : "Kommentaaride loetuks märkimine ebaõnnestus",
"Unable to load the comments list" : "Kommentaaride loendi laadimine ebaõnnestus",
"_%n unread comment_::_%n unread comments_" : ["%n lugemata kommentaar","%n lugemata kommentaari"],
"_1 new comment_::_{unread} new comments_" : ["1 uus kommentaar","{unread} uus kommentaar"],
"Comment" : "Kommentaar",
"An error occurred while trying to edit the comment" : "Kommentaari muutmisel tekkis tõrge",
"Comment deleted" : "Kommentaar kustutatud",
"An error occurred while trying to delete the comment" : "Kommentaari kustutamisel tekkis tõrge",
"An error occurred while trying to create the comment" : "Kommentaari lisamisel tekkis tõrge",
"%1$s commented" : "%1$s kommenteeris"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -9,16 +9,17 @@ OC.L10N.register(
"%1$s commented on %2$s" : "%1$s comentados en %2$s",
"{author} commented on {file}" : "{author} comentou en {file}",
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> para ficheiros",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Mencionáronte en \"{ficheiro}\", nun comentario dun usuario que xa foi eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mencionoute nun comentario en \"{file}\"",
"Files app plugin to add comments to files" : "Engadido da aplicación de ficheiros para engadir comentarios aos ficheiros",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Mencionárono en «{file}», nun comentario dun usuario que xa foi eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mencionouno a vostede nun comentario en «{file}»",
"Files app plugin to add comments to files" : "Complemento da aplicación de ficheiros para engadir comentarios aos ficheiros",
"Edit comment" : "Editar comentario",
"Delete comment" : "Eliminar comentario",
"Cancel edit" : "Cancelar a edición",
"Post comment" : "Publicar comentario",
"No comments yet, start the conversation!" : "Aínda non hai comentarios, comeza a conversa!",
"No more messages" : "Non hai máis mensaxes",
"Retry" : "Volver tentar",
"Retry" : "Tentar de novo",
"Failed to mark comments as read" : "Produciuse un fallo ao marcar os comentarios como lidos",
"Unable to load the comments list" : "Non é posíbel cargar a lista de comentarios",
"_%n unread comment_::_%n unread comments_" : ["%n comentario sen ler","%n comentarios sen ler"],
"_1 new comment_::_{unread} new comments_" : ["1 comentario novo","{unread} comentarios novos"],

View file

@ -7,16 +7,17 @@
"%1$s commented on %2$s" : "%1$s comentados en %2$s",
"{author} commented on {file}" : "{author} comentou en {file}",
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> para ficheiros",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Mencionáronte en \"{ficheiro}\", nun comentario dun usuario que xa foi eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mencionoute nun comentario en \"{file}\"",
"Files app plugin to add comments to files" : "Engadido da aplicación de ficheiros para engadir comentarios aos ficheiros",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Mencionárono en «{file}», nun comentario dun usuario que xa foi eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mencionouno a vostede nun comentario en «{file}»",
"Files app plugin to add comments to files" : "Complemento da aplicación de ficheiros para engadir comentarios aos ficheiros",
"Edit comment" : "Editar comentario",
"Delete comment" : "Eliminar comentario",
"Cancel edit" : "Cancelar a edición",
"Post comment" : "Publicar comentario",
"No comments yet, start the conversation!" : "Aínda non hai comentarios, comeza a conversa!",
"No more messages" : "Non hai máis mensaxes",
"Retry" : "Volver tentar",
"Retry" : "Tentar de novo",
"Failed to mark comments as read" : "Produciuse un fallo ao marcar os comentarios como lidos",
"Unable to load the comments list" : "Non é posíbel cargar a lista de comentarios",
"_%n unread comment_::_%n unread comments_" : ["%n comentario sen ler","%n comentarios sen ler"],
"_1 new comment_::_{unread} new comments_" : ["1 comentario novo","{unread} comentarios novos"],

View file

@ -27,64 +27,42 @@ use OCP\IL10N;
use OCP\IURLGenerator;
class Filter implements IFilter {
/** @var IL10N */
protected $l;
/** @var IURLGenerator */
protected $url;
protected IL10N $l;
protected IURLGenerator $url;
public function __construct(IL10N $l, IURLGenerator $url) {
$this->l = $l;
$this->url = $url;
}
/**
* @return string Lowercase a-z only identifier
* @since 11.0.0
*/
public function getIdentifier() {
public function getIdentifier(): string {
return 'comments';
}
/**
* @return string A translated string
* @since 11.0.0
*/
public function getName() {
public function getName(): string {
return $this->l->t('Comments');
}
/**
* @return int
* @since 11.0.0
*/
public function getPriority() {
public function getPriority(): int {
return 40;
}
/**
* @return string Full URL to an icon, empty string when none is given
* @since 11.0.0
*/
public function getIcon() {
public function getIcon(): string {
return $this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/comment.svg'));
}
/**
* @param string[] $types
* @return string[] An array of allowed apps from which activities should be displayed
* @since 11.0.0
*/
public function filterTypes(array $types) {
public function filterTypes(array $types): array {
return $types;
}
/**
* @return string[] An array of allowed apps from which activities should be displayed
* @since 11.0.0
*/
public function allowedApps() {
public function allowedApps(): array {
return ['comments'];
}
}

View file

@ -59,10 +59,7 @@ class Listener {
$this->shareHelper = $shareHelper;
}
/**
* @param CommentsEvent $event
*/
public function commentEvent(CommentsEvent $event) {
public function commentEvent(CommentsEvent $event): void {
if ($event->getComment()->getObjectType() !== 'files'
|| $event->getEvent() !== CommentsEvent::EVENT_ADD
|| !$this->appManager->isInstalled('activity')) {

View file

@ -58,7 +58,7 @@ class Provider implements IProvider {
* @throws \InvalidArgumentException
* @since 11.0.0
*/
public function parse($language, IEvent $event, IEvent $previousEvent = null) {
public function parse($language, IEvent $event, IEvent $previousEvent = null): IEvent {
if ($event->getApp() !== 'comments') {
throw new \InvalidArgumentException();
}

View file

@ -26,72 +26,37 @@ use OCP\Activity\ISetting;
use OCP\IL10N;
class Setting implements ISetting {
protected IL10N $l;
/** @var IL10N */
protected $l;
/**
* @param IL10N $l
*/
public function __construct(IL10N $l) {
$this->l = $l;
}
/**
* @return string Lowercase a-z and underscore only identifier
* @since 11.0.0
*/
public function getIdentifier() {
public function getIdentifier(): string {
return 'comments';
}
/**
* @return string A translated string
* @since 11.0.0
*/
public function getName() {
public function getName(): string {
return $this->l->t('<strong>Comments</strong> for files');
}
/**
* @return int whether the filter should be rather on the top or bottom of
* the admin section. The filters are arranged in ascending order of the
* priority values. It is required to return a value between 0 and 100.
* @since 11.0.0
*/
public function getPriority() {
public function getPriority(): int {
return 50;
}
/**
* @return bool True when the option can be changed for the stream
* @since 11.0.0
*/
public function canChangeStream() {
public function canChangeStream(): bool {
return true;
}
/**
* @return bool True when the option can be changed for the stream
* @since 11.0.0
*/
public function isDefaultEnabledStream() {
public function isDefaultEnabledStream(): bool {
return true;
}
/**
* @return bool True when the option can be changed for the mail
* @since 11.0.0
*/
public function canChangeMail() {
public function canChangeMail(): bool {
return true;
}
/**
* @return bool True when the option can be changed for the stream
* @since 11.0.0
*/
public function isDefaultEnabledMail() {
public function isDefaultEnabledMail(): bool {
return false;
}
}

View file

@ -28,7 +28,6 @@ namespace OCA\Comments\AppInfo;
use Closure;
use OCA\Comments\Capabilities;
use OCA\Comments\Controller\Notifications;
use OCA\Comments\EventHandler;
use OCA\Comments\Listener\CommentsEntityEventListener;
use OCA\Comments\Listener\LoadAdditionalScripts;
@ -58,8 +57,6 @@ class Application extends App implements IBootstrap {
public function register(IRegistrationContext $context): void {
$context->registerCapability(Capabilities::class);
$context->registerServiceAlias('NotificationsController', Notifications::class);
$context->registerEventListener(
LoadAdditionalScriptsEvent::class,
LoadAdditionalScripts::class

View file

@ -27,14 +27,13 @@ use OCP\Collaboration\AutoComplete\ISorter;
use OCP\Comments\ICommentsManager;
class CommentersSorter implements ISorter {
private ICommentsManager $commentsManager;
public function __construct(ICommentsManager $commentsManager) {
$this->commentsManager = $commentsManager;
}
public function getId() {
public function getId(): string {
return 'commenters';
}
@ -42,10 +41,10 @@ class CommentersSorter implements ISorter {
* Sorts people who commented on the given item atop (descelating) of the
* others
*
* @param array $sortArray
* @param array &$sortArray
* @param array $context
*/
public function sort(array &$sortArray, array $context) {
public function sort(array &$sortArray, array $context): void {
$commenters = $this->retrieveCommentsInformation($context['itemType'], $context['itemId']);
if (count($commenters) === 0) {
return;
@ -76,6 +75,9 @@ class CommentersSorter implements ISorter {
}
}
/**
* @return array<string, array<string, int>>
*/
protected function retrieveCommentsInformation(string $type, string $id): array {
$comments = $this->commentsManager->getForObject($type, $id);
if (count($comments) === 0) {

View file

@ -38,11 +38,11 @@ use OCP\IUserSession;
use OCP\Notification\IManager;
/**
* Class Notifications
* Class NotificationsController
*
* @package OCA\Comments\Controller
*/
class Notifications extends Controller {
class NotificationsController extends Controller {
protected IRootFolder $rootFolder;
protected ICommentsManager $commentsManager;
@ -51,7 +51,7 @@ class Notifications extends Controller {
protected IUserSession $userSession;
/**
* Notifications constructor.
* NotificationsController constructor.
*/
public function __construct(
string $appName,

View file

@ -34,21 +34,15 @@ use OCP\Comments\ICommentsEventHandler;
* @package OCA\Comments
*/
class EventHandler implements ICommentsEventHandler {
/** @var ActivityListener */
private $activityListener;
/** @var NotificationListener */
private $notificationListener;
private ActivityListener $activityListener;
private NotificationListener $notificationListener;
public function __construct(ActivityListener $activityListener, NotificationListener $notificationListener) {
$this->activityListener = $activityListener;
$this->notificationListener = $notificationListener;
}
/**
* @param CommentsEvent $event
*/
public function handle(CommentsEvent $event) {
public function handle(CommentsEvent $event): void {
if ($event->getComment()->getObjectType() !== 'files') {
// this is a 'files'-specific Handler
return;
@ -73,17 +67,11 @@ class EventHandler implements ICommentsEventHandler {
}
}
/**
* @param CommentsEvent $event
*/
private function activityHandler(CommentsEvent $event) {
private function activityHandler(CommentsEvent $event): void {
$this->activityListener->commentEvent($event);
}
/**
* @param CommentsEvent $event
*/
private function notificationHandler(CommentsEvent $event) {
private function notificationHandler(CommentsEvent $event): void {
$this->notificationListener->evaluate($event);
}
}

View file

@ -28,16 +28,25 @@ namespace OCA\Comments\Listener;
use OCP\Comments\CommentsEntityEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Files\IRootFolder;
class CommentsEntityEventListener implements IEventListener {
private IRootFolder $rootFolder;
private ?string $userId;
public function __construct(IRootFolder $rootFolder, ?string $userId = null) {
$this->rootFolder = $rootFolder;
$this->userId = $userId;
}
public function handle(Event $event): void {
if (!($event instanceof CommentsEntityEvent)) {
// Unrelated
return;
}
$event->addEntityCollection('files', function ($name) {
$nodes = \OC::$server->getUserFolder()->getById((int)$name);
$event->addEntityCollection('files', function ($name): bool {
$nodes = $this->rootFolder->getUserFolder($this->userId)->getById((int)$name);
return !empty($nodes);
});
}

View file

@ -31,9 +31,7 @@ use OCP\AppFramework\Services\InitialStateProvider;
use OCP\IConfig;
class MaxAutoCompleteResultsInitialState extends InitialStateProvider {
/** @var IConfig */
private $config;
private IConfig $config;
public function __construct(IConfig $config) {
$this->config = $config;

View file

@ -27,15 +27,12 @@ use OCP\Comments\CommentsEvent;
use OCP\Comments\IComment;
use OCP\IUserManager;
use OCP\Notification\IManager;
use OCP\Notification\INotification;
class Listener {
protected IManager $notificationManager;
protected IUserManager $userManager;
/**
* Listener constructor.
*/
public function __construct(
IManager $notificationManager,
IUserManager $userManager
@ -44,10 +41,7 @@ class Listener {
$this->userManager = $userManager;
}
/**
* @param CommentsEvent $event
*/
public function evaluate(CommentsEvent $event) {
public function evaluate(CommentsEvent $event): void {
$comment = $event->getComment();
$mentions = $this->extractMentions($comment->getMentions());
@ -77,12 +71,9 @@ class Listener {
}
/**
* creates a notification instance and fills it with comment data
*
* @param IComment $comment
* @return \OCP\Notification\INotification
* Creates a notification instance and fills it with comment data
*/
public function instantiateNotification(IComment $comment) {
public function instantiateNotification(IComment $comment): INotification {
$notification = $this->notificationManager->createNotification();
$notification
->setApp('comments')
@ -94,12 +85,12 @@ class Listener {
}
/**
* flattens the mention array returned from comments to a list of user ids.
* Flattens the mention array returned from comments to a list of user ids.
*
* @param array $mentions
* @return string[] containing the mentions, e.g. ['alice', 'bob']
* @return list<string> containing the mentions, e.g. ['alice', 'bob']
*/
public function extractMentions(array $mentions) {
public function extractMentions(array $mentions): array {
if (empty($mentions)) {
return [];
}

View file

@ -39,7 +39,6 @@ use function array_map;
use function pathinfo;
class CommentsSearchProvider implements IProvider {
private IUserManager $userManager;
private IL10N $l10n;
private IURLGenerator $urlGenerator;
@ -55,23 +54,14 @@ class CommentsSearchProvider implements IProvider {
$this->legacyProvider = $legacyProvider;
}
/**
* @inheritDoc
*/
public function getId(): string {
return 'comments';
}
/**
* @inheritDoc
*/
public function getName(): string {
return $this->l10n->t('Comments');
}
/**
* @inheritDoc
*/
public function getOrder(string $route, array $routeParameters): int {
if ($route === 'files.View.index') {
// Files first
@ -80,9 +70,6 @@ class CommentsSearchProvider implements IProvider {
return 10;
}
/**
* @inheritDoc
*/
public function search(IUser $user, ISearchQuery $query): SearchResult {
return SearchResult::complete(
$this->l10n->t('Comments'),

View file

@ -58,10 +58,6 @@ class Result extends BaseResult {
public $fileName;
/**
* @param string $search
* @param IComment $comment
* @param string $authorName
* @param string $path
* @throws NotFoundException
* @deprecated 20.0.0
*/
@ -70,7 +66,7 @@ class Result extends BaseResult {
string $authorName,
string $path) {
parent::__construct(
(int) $comment->getId(),
$comment->getId(),
$comment->getMessage()
/* @todo , [link to file] */
);
@ -83,8 +79,6 @@ class Result extends BaseResult {
}
/**
* @param string $path
* @return string
* @throws NotFoundException
*/
protected function getVisiblePath(string $path): string {
@ -98,9 +92,6 @@ class Result extends BaseResult {
}
/**
* @param string $message
* @param string $search
* @return string
* @throws NotFoundException
*/
protected function getRelevantMessagePart(string $message, string $search): string {

View file

@ -51,11 +51,8 @@ class ApplicationTest extends TestCase {
$app = new Application();
$c = $app->getContainer();
// assert service instances in the container are properly setup
$s = $c->get('NotificationsController');
$this->assertInstanceOf('OCA\Comments\Controller\Notifications', $s);
$services = [
'OCA\Comments\Controller\NotificationsController',
'OCA\Comments\Activity\Filter',
'OCA\Comments\Activity\Listener',
'OCA\Comments\Activity\Provider',

View file

@ -25,7 +25,7 @@
*/
namespace OCA\Comments\Tests\Unit\Controller;
use OCA\Comments\Controller\Notifications;
use OCA\Comments\Controller\NotificationsController;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\Comments\IComment;
@ -43,7 +43,7 @@ use OCP\Notification\INotification;
use Test\TestCase;
class NotificationsTest extends TestCase {
/** @var Notifications */
/** @var NotificationsController */
protected $notificationsController;
/** @var ICommentsManager|\PHPUnit\Framework\MockObject\MockObject */
@ -70,7 +70,7 @@ class NotificationsTest extends TestCase {
$this->notificationManager = $this->createMock(IManager::class);
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->notificationsController = new Notifications(
$this->notificationsController = new NotificationsController(
'comments',
$this->createMock(IRequest::class),
$this->commentsManager,

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=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

@ -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=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

@ -4,6 +4,6 @@ OC.L10N.register(
"Recently contacted" : "Contactado recentemente",
"Contacts Interaction" : "Interacción de contactos",
"Manages interaction between users and contacts" : "Xestiona a interacción entre usuarios e contactos",
"Collect data about user and contacts interactions and provide an address book for the data" : "Recolle datos sobre as interaccións entre usuarios e contactos e fornrece un caderno de enderezos para os datos"
"Collect data about user and contacts interactions and provide an address book for the data" : "Recolle datos sobre as interaccións entre usuarios e contactos e fornece un caderno de enderezos para os datos"
},
"nplurals=2; plural=(n != 1);");

View file

@ -2,6 +2,6 @@
"Recently contacted" : "Contactado recentemente",
"Contacts Interaction" : "Interacción de contactos",
"Manages interaction between users and contacts" : "Xestiona a interacción entre usuarios e contactos",
"Collect data about user and contacts interactions and provide an address book for the data" : "Recolle datos sobre as interaccións entre usuarios e contactos e fornrece un caderno de enderezos para os datos"
"Collect data about user and contacts interactions and provide an address book for the data" : "Recolle datos sobre as interaccións entre usuarios e contactos e fornece un caderno de enderezos para os datos"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -3,8 +3,11 @@ OC.L10N.register(
{
"Dashboard" : "الرئيسية",
"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." : "إبدأ يومك بالاطلاع على ما يهمّك\n\nلوحة قيادة نكست كلاود هي نقطة البداية ليومك؛\nتعطيك لمحة عن مواعيدك القادمة و الرسائل المستعجلة و المحادثات الواردة و تذاكر طلب المساعدة المعلقة و آخر التغريدات و الكثير غيرها!\nيمكنك أن تضيف أدوات أخرى ترغبها\nكما يمكنك تغيير مظهر و خلفية اللوحة كما تريد. ",
"\"{title} icon\"" : "\"{title} أيقونة\"",
"Customize" : "تعديل",
"Edit widgets" : "تعديل الودجات",
"Get more widgets from the App Store" : "يمكنك الحصول على المزيد من الأدوات من متجر التطبيقات",
"Weather service" : "خدمة احوال الطقس",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "لخصوصيتك، يتم استدعاء بيانات احوال الطقس عبر خادم نكست كلاود الخاص بك نيابه عنك ولذلك خدمة احوال الطقس لا تشارك المعلومات الشخصية.",
"Weather data from Met.no" : "بيانات احوال الطقس من Met.no",
@ -19,6 +22,7 @@ OC.L10N.register(
"Good evening" : "مساء الخير",
"Good evening, {name}" : "مساء الخير، {name}",
"Hello" : "مرحبا",
"Hello, {name}" : "مرحبا، {name} "
"Hello, {name}" : "مرحبا، {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." : "إبدأ يومك بالاطلاع على ما يهمّك\n\nلوحة قيادة نكست كلاود هي نقطة البداية ليومك؛\nتعطيك لمحة عن مواعيدك القادمة و الرسائل المستعجلة و المحادثات الواردة و تذاكر طلب المساعدة المعلقة و آخر التغريدات و الكثير غيرها!\nيمكنك أن تضيف أدوات أخرى ترغبها\nكما يمكنك تغيير مظهر و خلفية اللوحة كما تريد. "
},
"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

@ -1,8 +1,11 @@
{ "translations": {
"Dashboard" : "الرئيسية",
"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." : "إبدأ يومك بالاطلاع على ما يهمّك\n\nلوحة قيادة نكست كلاود هي نقطة البداية ليومك؛\nتعطيك لمحة عن مواعيدك القادمة و الرسائل المستعجلة و المحادثات الواردة و تذاكر طلب المساعدة المعلقة و آخر التغريدات و الكثير غيرها!\nيمكنك أن تضيف أدوات أخرى ترغبها\nكما يمكنك تغيير مظهر و خلفية اللوحة كما تريد. ",
"\"{title} icon\"" : "\"{title} أيقونة\"",
"Customize" : "تعديل",
"Edit widgets" : "تعديل الودجات",
"Get more widgets from the App Store" : "يمكنك الحصول على المزيد من الأدوات من متجر التطبيقات",
"Weather service" : "خدمة احوال الطقس",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "لخصوصيتك، يتم استدعاء بيانات احوال الطقس عبر خادم نكست كلاود الخاص بك نيابه عنك ولذلك خدمة احوال الطقس لا تشارك المعلومات الشخصية.",
"Weather data from Met.no" : "بيانات احوال الطقس من Met.no",
@ -17,6 +20,7 @@
"Good evening" : "مساء الخير",
"Good evening, {name}" : "مساء الخير، {name}",
"Hello" : "مرحبا",
"Hello, {name}" : "مرحبا، {name} "
"Hello, {name}" : "مرحبا، {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." : "إبدأ يومك بالاطلاع على ما يهمّك\n\nلوحة قيادة نكست كلاود هي نقطة البداية ليومك؛\nتعطيك لمحة عن مواعيدك القادمة و الرسائل المستعجلة و المحادثات الواردة و تذاكر طلب المساعدة المعلقة و آخر التغريدات و الكثير غيرها!\nيمكنك أن تضيف أدوات أخرى ترغبها\nكما يمكنك تغيير مظهر و خلفية اللوحة كما تريد. "
},"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

@ -3,13 +3,13 @@ OC.L10N.register(
{
"Dashboard" : "Taboleiro",
"Dashboard app" : "Aplicación de taboleiro",
"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." : "Comeza o día informado\n\nO Taboleiro de Nextcloud é o teu punto de partida do día, dándoche unha visión xeral das túas próximas citas, correos electrónicos urxentes, mensaxes de chat, tickets entrantes, chíos máis recentes e moito máis. Os usuarios poden engadir os widgets que lles gustan e cambiar o fondo ao seu gusto.",
"\"{title} icon\"" : "\"icona {title}\"",
"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." : "Comece o día informado\n\nO Taboleiro de Nextcloud é o seu punto de partida do día, onde atopará unha visión xeral das súas próximas citas, correos-e urxentes, mensaxes de conversas, billetes entrantes, chíos máis recentes e moito máis. Os usuarios poden engadir os trebellos que lles gusten e cambiar o fondo ao seu antollo.",
"\"{title} icon\"" : "«icona {title}»",
"Customize" : "Personalizar",
"Edit widgets" : "Editar trebellos",
"Get more widgets from the App Store" : "Obtén máis widgets da Tenda de Aplicacións",
"Get more widgets from the App Store" : "Obter máis trebellos na tenda de aplicacións",
"Weather service" : "Servizo meteorolóxico",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor do Nextcloud solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor de Nextcloud solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.",
"Weather data from Met.no" : "Datos meteorolóxicos de Met.no",
"geocoding with Nominatim" : "xeocodificación con Nominatim",
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
@ -23,6 +23,6 @@ OC.L10N.register(
"Good evening, {name}" : "Boas noites, {name}",
"Hello" : "Hello",
"Hello, {name}" : "Ola, {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." : "Comeza o día informado\n\nO Dashboard de Nextcloud é o teu punto de partida do día, dándoche unha\nvisión xeral das túas próximas citas, correos electrónicos urxentes, mensaxes de chat,\nentradas entrantes, tweets máis recentes e moito máis. Os usuarios poden engadir os widgets\nque lles gustan e cambiar o fondo ao seu gusto."
"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." : "Comece o día informado\n\nO Taboleiro de Nextcloud é o seu punto de partida do día, onde atopará unha visión xeral das súas próximas citas, correos-e urxentes, mensaxes de conversas, billetes entrantes, chíos máis recentes e moito máis. Os usuarios poden engadir os trebellos que lles gusten e cambiar o fondo ao seu antollo."
},
"nplurals=2; plural=(n != 1);");

View file

@ -1,13 +1,13 @@
{ "translations": {
"Dashboard" : "Taboleiro",
"Dashboard app" : "Aplicación de taboleiro",
"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." : "Comeza o día informado\n\nO Taboleiro de Nextcloud é o teu punto de partida do día, dándoche unha visión xeral das túas próximas citas, correos electrónicos urxentes, mensaxes de chat, tickets entrantes, chíos máis recentes e moito máis. Os usuarios poden engadir os widgets que lles gustan e cambiar o fondo ao seu gusto.",
"\"{title} icon\"" : "\"icona {title}\"",
"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." : "Comece o día informado\n\nO Taboleiro de Nextcloud é o seu punto de partida do día, onde atopará unha visión xeral das súas próximas citas, correos-e urxentes, mensaxes de conversas, billetes entrantes, chíos máis recentes e moito máis. Os usuarios poden engadir os trebellos que lles gusten e cambiar o fondo ao seu antollo.",
"\"{title} icon\"" : "«icona {title}»",
"Customize" : "Personalizar",
"Edit widgets" : "Editar trebellos",
"Get more widgets from the App Store" : "Obtén máis widgets da Tenda de Aplicacións",
"Get more widgets from the App Store" : "Obter máis trebellos na tenda de aplicacións",
"Weather service" : "Servizo meteorolóxico",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor do Nextcloud solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor de Nextcloud solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.",
"Weather data from Met.no" : "Datos meteorolóxicos de Met.no",
"geocoding with Nominatim" : "xeocodificación con Nominatim",
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
@ -21,6 +21,6 @@
"Good evening, {name}" : "Boas noites, {name}",
"Hello" : "Hello",
"Hello, {name}" : "Ola, {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." : "Comeza o día informado\n\nO Dashboard de Nextcloud é o teu punto de partida do día, dándoche unha\nvisión xeral das túas próximas citas, correos electrónicos urxentes, mensaxes de chat,\nentradas entrantes, tweets máis recentes e moito máis. Os usuarios poden engadir os widgets\nque lles gustan e cambiar o fondo ao seu gusto."
"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." : "Comece o día informado\n\nO Taboleiro de Nextcloud é o seu punto de partida do día, onde atopará unha visión xeral das súas próximas citas, correos-e urxentes, mensaxes de conversas, billetes entrantes, chíos máis recentes e moito máis. Os usuarios poden engadir os trebellos que lles gusten e cambiar o fondo ao seu antollo."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -13,12 +13,12 @@ OC.L10N.register(
"Weather" : "날씨",
"Status" : "상태",
"Good morning" : "좋은 아침입니다.",
"Good morning, {name}" : "{name} 님, 좋은 아침입니다.",
"Good afternoon" : "안녕하세요",
"Good afternoon, {name}" : "{name} 님, 안녕하세요",
"Good evening" : "안녕하세요",
"Good evening, {name}" : "{name} 님, 안녕하세요",
"Hello" : "안녕하세요",
"Hello, {name}" : "{name} 님, 안녕하세요"
"Good morning, {name}" : "{name}님, 좋은 아침입니다.",
"Good afternoon" : "안녕하세요.",
"Good afternoon, {name}" : "안녕하세요, {name}님.",
"Good evening" : "안녕하세요.",
"Good evening, {name}" : "안녕하세요, {name}님.",
"Hello" : "안녕하세요.",
"Hello, {name}" : "안녕하세요, {name}님."
},
"nplurals=1; plural=0;");

View file

@ -11,12 +11,12 @@
"Weather" : "날씨",
"Status" : "상태",
"Good morning" : "좋은 아침입니다.",
"Good morning, {name}" : "{name} 님, 좋은 아침입니다.",
"Good afternoon" : "안녕하세요",
"Good afternoon, {name}" : "{name} 님, 안녕하세요",
"Good evening" : "안녕하세요",
"Good evening, {name}" : "{name} 님, 안녕하세요",
"Hello" : "안녕하세요",
"Hello, {name}" : "{name} 님, 안녕하세요"
"Good morning, {name}" : "{name}님, 좋은 아침입니다.",
"Good afternoon" : "안녕하세요.",
"Good afternoon, {name}" : "안녕하세요, {name}님.",
"Good evening" : "안녕하세요.",
"Good evening, {name}" : "안녕하세요, {name}님.",
"Hello" : "안녕하세요.",
"Hello, {name}" : "안녕하세요, {name}님."
},"pluralForm" :"nplurals=1; plural=0;"
}

191
apps/dav/l10n/ar.js Normal file
View file

@ -0,0 +1,191 @@
OC.L10N.register(
"dav",
{
"Calendar" : "التقويم",
"To-dos" : "قائمة المهام",
"Personal" : "شخصي",
"{actor} created calendar {calendar}" : "{actor} قام بإنشاء تقويم {calendar}",
"You created calendar {calendar}" : "قمت بإنشاء التقويم {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} قام بحذف التقويم {calendar}",
"You deleted calendar {calendar}" : "لقد قمت بحذف التقويم {calendar}",
"{actor} updated calendar {calendar}" : "{actor} حدّث التقويم {calendar}",
"You updated calendar {calendar}" : "لقد قمت بتحديث التقويم {calendar}",
"{actor} restored calendar {calendar}" : "{actor} استعاد التقويم {calendar}",
"You restored calendar {calendar}" : "أنت استعدت التقويم {calendar}",
"You shared calendar {calendar} as public link" : "أنت شاركت التقويم {calendar} كرابطٍ عموميٍ public link",
"You removed public link for calendar {calendar}" : "أنت ألغيب الرابط العمومي للتقويم {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} قام بمشاركة التقويم {calendar} معك",
"You shared calendar {calendar} with {user}" : "لقد قمت بمشاركة التقويم {calendar} مع {user}",
"{actor} shared calendar {calendar} with {user}" : "{actor} قام بمشاركة التقويم {calendar} مع {user}",
"{actor} unshared calendar {calendar} from you" : "{actor} أزال مشاركة التقويم {calendar} منك",
"You unshared calendar {calendar} from {user}" : "لقد أزلت مشاركة التقويم {calendar} من {user}",
"{actor} unshared calendar {calendar} from {user}" : "{actor} أزال مشاركة التقويم {calendar} من {user}",
"{actor} unshared calendar {calendar} from themselves" : "{actor} أزال مشاركة التقويم {calendar} من نفسه",
"You shared calendar {calendar} with group {group}" : "أنت شاركت التقويم {calendar} مع المجموعة {group}",
"{actor} shared calendar {calendar} with group {group}" : "{actor} شارك التقويم {calendar} مع المجموعة {group}",
"You unshared calendar {calendar} from group {group}" : "أنت أزلت مشاركة التقويم {calendar} من المجموعة {group}",
"{actor} unshared calendar {calendar} from group {group}" : "{actor} أزال مشاركة التقويم {calendar} من المجموعة {group}",
"Untitled event" : "حدث بدون اسم",
"{actor} created event {event} in calendar {calendar}" : "{actor} أنشأ الحدث {event} في التقويم {calendar}",
"You created event {event} in calendar {calendar}" : "أنت أنشأت الحدث {event} في التقويم {calendar}",
"{actor} deleted event {event} from calendar {calendar}" : "{actor} حذف الحدث {event} من التقويم {calendar}",
"You deleted event {event} from calendar {calendar}" : "أنت حذفت الحدث {event} من التقويم {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} عدّل الحدث {event} في التقويم {calendar}",
"You updated event {event} in calendar {calendar}" : "أنت عدّلت الحدث {event} في التقويم {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} نقل الحدث {event} من التقويم {sourceCalendar} إلى التقويم {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "أنت نقلت الحدث {event} من التقويم {sourceCalendar} إلى التقويم {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} قام باستعادة الحدث {event} للتقويم {calendar}",
"You restored event {event} of calendar {calendar}" : "أنت قمت باستعادة الحدث {event} للتقويم {calendar}",
"Busy" : "مشغول",
"{actor} created to-do {todo} in list {calendar}" : "{actor} قائمة بإنشاء مهمة {todo} في القائمة {calendar}",
"You created to-do {todo} in list {calendar}" : "أنت قمت بإنشاء مهمة {todo} في القائمة {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} قام بحذف مهمة {todo} من القائمة {calendar}",
"You deleted to-do {todo} from list {calendar}" : "أنت قمت بحذف مهمة {todo} من القائمة {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} قام بتعديل مهمة {todo} في القائمة {calendar}",
"You updated to-do {todo} in list {calendar}" : "أنت قمت بتعديل مهمة {todo} في القائمة {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} أنجز المهمة {todo} في القائمة{calendar}",
"You solved to-do {todo} in list {calendar}" : "أنت أنجزت المهمة {todo} في القائمة {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} أعاد فتح المهمة {todo} في القائمة {calendar}",
"You reopened to-do {todo} in list {calendar}" : "أنت أعدت فتح المهمة {todo} في القائمة {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} قام بنقل المهمة {todo} من القائمة {sourceCalendar} إلى القائمة {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "أنت قمت بنقل المهمة {todo} من القائمة {sourceCalendar} إلى القائمة {targetCalendar}",
"Calendar, contacts and tasks" : "التقويم، و جهات الاتصال، و قائمة المهام",
"A <strong>calendar</strong> was modified" : " <strong>تقويم</strong> تمّ تعديله",
"A calendar <strong>event</strong> was modified" : "<strong>حدث</strong> في تقويم تمّ تعديله",
"A calendar <strong>to-do</strong> was modified" : " <strong>مهمة</strong> في تقويم تمّ تعديلها",
"Contact birthdays" : "أعياد ميلاد جهات الاتصال",
"Death of %s" : "وفاة %s",
"Untitled calendar" : "تقويم بدون اسم",
"Calendar:" : "التقويم:",
"Date:" : "التاريخ:",
"Where:" : "المكان:",
"Description:" : "الوصف:",
"_%n minute_::_%n minutes_" : ["%n دقيقة","%n دقيقة","%n دقيقتيْن","%n دقائق","%n دقائق","%n دقائق"],
"%s (in %s)" : "%s (في %s)",
"%s (%s ago)" : "%s (%s مضت)",
"Calendar: %s" : "التقويم: %s",
"Date: %s" : "التاريخ: %s",
"Description: %s" : "الوصف: %s",
"Where: %s" : "المكان: %s",
"%1$s via %2$s" : "%1$s عبر %2$s",
"Cancelled: %1$s" : "مُلغىً: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" تمّ إلغاؤه",
"Re: %1$s" : "إعادة: %1$s",
"%1$s has accepted your invitation" : "%1$s قبل دعوتك",
"%1$s has tentatively accepted your invitation" : "%1$s قبل دعوتك بشكل مبدئي",
"%1$s has declined your invitation" : "%1$s لم يقبل دعوتك",
"%1$s has responded to your invitation" : "%1$s استجاب لدعوتك",
"Invitation updated: %1$s" : "تحديث الدعوة: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s تحديث الحدث \"%2$s\"",
"Invitation: %1$s" : "دعوة: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s يرغب في دعوتكم إلى \"%2$s\"",
"Organizer:" : "تنظيم:",
"Attendees:" : "الحُضُور:",
"Title:" : "العنوان:",
"Time:" : "الوقت:",
"Location:" : "المكان :",
"Link:" : "الرابط:",
"Accept" : "قبول",
"Decline" : "رفض",
"More options …" : "مزيد مِن الخيارات…",
"More options at %s" : "خيارات أخرى في %s",
"Contacts" : "المُراسِلون",
"{actor} created address book {addressbook}" : "{actor} أنشأ دفتر العناوين {addressbook}",
"You created address book {addressbook}" : "أنت أنشأت دفتر العناوين {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} قام بحذف دفتر العناوين {addressbook}",
"You deleted address book {addressbook}" : "أنت قمت بحذف دفتر العناوين {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} قام بتعديل دفتر العناوين {addressbook}",
"You updated address book {addressbook}" : "أنت قمت بتعديل دفتر العناوين {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} قام بمشاركة دفتر العناوين {addressbook} معك",
"You shared address book {addressbook} with {user}" : "أنت قمت بمشاركة دفتر العناوين {addressbook} مع {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} قام بمشاركة دفتر العناوين {addressbook} مع {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} معك",
"You unshared address book {addressbook} from {user}" : "أنت قمت بإلغاء مشاركة دفتر العناوين {addressbook} مع {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} مع {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} قام بإلغاء مشاركته في دفتر العناوين {addressbook} ",
"You shared address book {addressbook} with group {group}" : "أنت قمت بمشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} قام بمشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
"You unshared address book {addressbook} from group {group}" : "أنت قمت بإلغاء مشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} قام بإنشاء جهة اتصال {card} في دفتر العناوين {addressbook}",
"You created contact {card} in address book {addressbook}" : "أنت قمت بإنشاء جهة اتصال {card} في دفتر العناوين {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} قام بحذف جهة الاتصال {card} من دفتر العناوين {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "أنت قمت بحذف جهة الاتصال {card} من دفتر العناوين {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} قام بتحديث جهة الاتصال {card} في دفتر العناوين {addressbook}",
"You updated contact {card} in address book {addressbook}" : "أنت قمت بتحديث جهة الاتصال {card} في دفتر العناوين {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "تمّ تعديل <strong>جهة الاتصال</strong> أو <strong>دفتر العناوين</strong> ",
"Accounts" : "حسابات",
"System address book which holds all accounts" : "دفتر عناوين النظام الذي يحوي كل الحسابات",
"File is not updatable: %1$s" : "ملف غير قابل للتعديل: %1$s",
"Could not write to final file, canceled by hook" : "تعذرت الكتابة إلى الملف النهائي، تم إلغاؤه بواسطة خطّاف hook",
"Could not write file contents" : "تعذرت كتابة محتويات الملف",
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "حدث خطأ أثناء نسخ الملف إلى الموقع المقصد (تمّ نسخه: %1$s, حجم الملف المتوقع: %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." : "الحجم المتوقع للملف هو %1$s؛ بينما المقروء من ( الجهاز العميل لنكست كلاود) و المكتوب في (تخزين نكست كلاود) هو %2$s. يمكن أن يكون السبب إمّا مشكلة اتصال في جانب الجهاز العميل أو مشكلة في الكتابة في وحدة التخزين في جانب خادوم نكست كلاود .",
"Could not rename part file to final file, canceled by hook" : "تعذّرت إعادة تسمية ملف جزئي إلى ملف نهائي. تمّ الإلغاء من قِبَل الخطّاف hook.",
"Could not rename part file to final file" : "تعذّرت إعادة تسمية ملف جزئي إلى ملف نهائي",
"Failed to check file size: %1$s" : "إخفاق في تحديد حجم الملف: %1$s",
"Could not open file" : "تعذّر فتح الملف",
"Encryption not ready: %1$s" : "التشفير غير جاهز: %1$s",
"Failed to open file: %1$s" : "تعذّر فتح الملف: %1$s",
"Failed to unlink: %1$s" : "تعذّر فك الارتباط: %1$s",
"Invalid chunk name" : "اسم كتلة chunk غير صحيح",
"Could not rename part file assembled from chunks" : "تعذّرت إعادة تسمية ملف جزئي مُجمّعٍ من كُتلٍ chunks",
"Failed to write file contents: %1$s" : "إخفاق في كتابة محتويات الملف: %1$s",
"File not found: %1$s" : "ملف غير موجود: %1$s",
"System is in maintenance mode." : "النظام في حالة صيانة.",
"Upgrade needed" : "الترقية لإصدارٍ أحدث لازمةٌٍ",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s الخاص بك يجب تهيئته لاستخدام HTTPS حتى يمكن استعمال CalDAV و CardDAV في نظام التشغيل iOS/macOS. ",
"Configures a CalDAV account" : "تكوين حساب CalDAV",
"Configures a CardDAV account" : "تكوين حساب CardDAV",
"Events" : "أحداث",
"Tasks" : "المهام",
"Untitled task" : "مهمة بدون اسم",
"Completed on %s" : "تمّ الانتهاء منه في %s",
"Due on %s by %s" : "مطلوبٌ في %s من قِبَل%s",
"Due on %s" : "مطلوبٌ في %s",
"Migrated calendar (%1$s)" : "تقويم مُرحّل (%1$s)",
"Calendars including events, details and attendees" : "تحوي التقاويم الأحداث، و تفاصيلها، و الحُضُور",
"Contacts and groups" : "جهات الاتصال والمجموعات",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "النقطة الحدّيّة endpoint لـ WebDAV",
"Availability" : "أوقات التواجد availability",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "إذا قمت بتهيئة ساعات العمل الخاصة بك، فسيظهر للمستخدمين الآخرين عندما يحجزون معك موعداً إذا ما كنت في المكتب أو خارجه.",
"Time zone:" : "منطقة زمنية:",
"to" : "إلى",
"Delete slot" : "حذف فُرَضَةٍ slot زمنيّةٍ",
"No working hours set" : "لم يتم تحديد ساعات العمل",
"Add slot" : "أضِف فُرَضَةً slot زمنيّةً",
"Monday" : "الإثنين",
"Tuesday" : "الثلاثاء",
"Wednesday" : "الأربعاء",
"Thursday" : "الخميس",
"Friday" : "الجمعة",
"Saturday" : "السبت",
"Sunday" : "الأحد",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "قم بتعيين حالة المستخدم تلقائيًا على \"عدم الإزعاج\" خارج نطاق أوقات التوافر لكتم جميع الإشعارات",
"Save" : "حفظ",
"Failed to load availability" : "إخفاق في تحميل أوقات التوافر",
"Saved availability" : "تمّ حفظ أوقات التوافر",
"Failed to save availability" : "إخفاق في حفظ أوقات التواجد",
"Calendar server" : "خادوم التقويم",
"Send invitations to attendees" : "إرسال دعوات للمُستهدفين بالحُضُُور",
"Automatically generate a birthday calendar" : "تجاهل تقويم أعياد الميلاد تلقائيّاً",
"Birthday calendars will be generated by a background job." : "تقويم أعياد الميلاد سيتم توليده من قِبَل مهمةٍ في الخلفية.",
"Hence they will not be available immediately after enabling but will show up after some time." : "ومن ثمّ لن تكون متاحةً فور التفعيل بل ستظهر بعد مرور بعض الوقت.",
"Send notifications for events" : "إرسال إشعارات حول الأحداث",
"Notifications are sent via background jobs, so these must occur often enough." : "يتمّ إرسال الإشعارات من قِبَل مهمّةٍ في الخلفية. لذا سيتكرر عمل هذا المهام حسب الحاجة.",
"Send reminder notifications to calendar sharees as well" : "أرسل إشعارات للتذكير إلى المشتركين بالتقويم كذلك",
"Reminders are always sent to organizers and attendees." : "إشعارات التذكير يتم إرسالها دائماً إلى مُنظّم أو مُنظّمي الحدث و المستهدفين بحضوره.",
"Enable notifications for events via push" : "تمكين الإشعارات حول الأحداث عبر الزّجّ push.",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "قم أيضاً بتنصيب {calendarappstoreopen} تطبيق التقويم {linkclose}, أو {calendardocopen} أوصل جهازك و موبايلك للمُزامنة ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "رجاءُ، تأكّد من الإعداد الصحيح لـ {emailopen} خادوم البريد الالكتروني {linkclose}.",
"There was an error updating your attendance status." : "حدث خطأ في تحديث حالة حضورك.",
"Please contact the organizer directly." : "رجاءً، تواصل مع المُنظّم أو المُنظّمين مُباشرةً.",
"Are you accepting the invitation?" : "هل تقبل الدعوة؟",
"Tentative" : "مبدئي",
"Your attendance was updated successfully." : "حضورك تم تحديثه بنجاحٍ",
"Invitation canceled" : "تمّ إلغاء الدعوة",
"Invitation updated" : "تمّ تعديل الدعوة",
"Invitation" : "دعوة"
},
"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;");

189
apps/dav/l10n/ar.json Normal file
View file

@ -0,0 +1,189 @@
{ "translations": {
"Calendar" : "التقويم",
"To-dos" : "قائمة المهام",
"Personal" : "شخصي",
"{actor} created calendar {calendar}" : "{actor} قام بإنشاء تقويم {calendar}",
"You created calendar {calendar}" : "قمت بإنشاء التقويم {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} قام بحذف التقويم {calendar}",
"You deleted calendar {calendar}" : "لقد قمت بحذف التقويم {calendar}",
"{actor} updated calendar {calendar}" : "{actor} حدّث التقويم {calendar}",
"You updated calendar {calendar}" : "لقد قمت بتحديث التقويم {calendar}",
"{actor} restored calendar {calendar}" : "{actor} استعاد التقويم {calendar}",
"You restored calendar {calendar}" : "أنت استعدت التقويم {calendar}",
"You shared calendar {calendar} as public link" : "أنت شاركت التقويم {calendar} كرابطٍ عموميٍ public link",
"You removed public link for calendar {calendar}" : "أنت ألغيب الرابط العمومي للتقويم {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} قام بمشاركة التقويم {calendar} معك",
"You shared calendar {calendar} with {user}" : "لقد قمت بمشاركة التقويم {calendar} مع {user}",
"{actor} shared calendar {calendar} with {user}" : "{actor} قام بمشاركة التقويم {calendar} مع {user}",
"{actor} unshared calendar {calendar} from you" : "{actor} أزال مشاركة التقويم {calendar} منك",
"You unshared calendar {calendar} from {user}" : "لقد أزلت مشاركة التقويم {calendar} من {user}",
"{actor} unshared calendar {calendar} from {user}" : "{actor} أزال مشاركة التقويم {calendar} من {user}",
"{actor} unshared calendar {calendar} from themselves" : "{actor} أزال مشاركة التقويم {calendar} من نفسه",
"You shared calendar {calendar} with group {group}" : "أنت شاركت التقويم {calendar} مع المجموعة {group}",
"{actor} shared calendar {calendar} with group {group}" : "{actor} شارك التقويم {calendar} مع المجموعة {group}",
"You unshared calendar {calendar} from group {group}" : "أنت أزلت مشاركة التقويم {calendar} من المجموعة {group}",
"{actor} unshared calendar {calendar} from group {group}" : "{actor} أزال مشاركة التقويم {calendar} من المجموعة {group}",
"Untitled event" : "حدث بدون اسم",
"{actor} created event {event} in calendar {calendar}" : "{actor} أنشأ الحدث {event} في التقويم {calendar}",
"You created event {event} in calendar {calendar}" : "أنت أنشأت الحدث {event} في التقويم {calendar}",
"{actor} deleted event {event} from calendar {calendar}" : "{actor} حذف الحدث {event} من التقويم {calendar}",
"You deleted event {event} from calendar {calendar}" : "أنت حذفت الحدث {event} من التقويم {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} عدّل الحدث {event} في التقويم {calendar}",
"You updated event {event} in calendar {calendar}" : "أنت عدّلت الحدث {event} في التقويم {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} نقل الحدث {event} من التقويم {sourceCalendar} إلى التقويم {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "أنت نقلت الحدث {event} من التقويم {sourceCalendar} إلى التقويم {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} قام باستعادة الحدث {event} للتقويم {calendar}",
"You restored event {event} of calendar {calendar}" : "أنت قمت باستعادة الحدث {event} للتقويم {calendar}",
"Busy" : "مشغول",
"{actor} created to-do {todo} in list {calendar}" : "{actor} قائمة بإنشاء مهمة {todo} في القائمة {calendar}",
"You created to-do {todo} in list {calendar}" : "أنت قمت بإنشاء مهمة {todo} في القائمة {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} قام بحذف مهمة {todo} من القائمة {calendar}",
"You deleted to-do {todo} from list {calendar}" : "أنت قمت بحذف مهمة {todo} من القائمة {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} قام بتعديل مهمة {todo} في القائمة {calendar}",
"You updated to-do {todo} in list {calendar}" : "أنت قمت بتعديل مهمة {todo} في القائمة {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} أنجز المهمة {todo} في القائمة{calendar}",
"You solved to-do {todo} in list {calendar}" : "أنت أنجزت المهمة {todo} في القائمة {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} أعاد فتح المهمة {todo} في القائمة {calendar}",
"You reopened to-do {todo} in list {calendar}" : "أنت أعدت فتح المهمة {todo} في القائمة {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} قام بنقل المهمة {todo} من القائمة {sourceCalendar} إلى القائمة {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "أنت قمت بنقل المهمة {todo} من القائمة {sourceCalendar} إلى القائمة {targetCalendar}",
"Calendar, contacts and tasks" : "التقويم، و جهات الاتصال، و قائمة المهام",
"A <strong>calendar</strong> was modified" : " <strong>تقويم</strong> تمّ تعديله",
"A calendar <strong>event</strong> was modified" : "<strong>حدث</strong> في تقويم تمّ تعديله",
"A calendar <strong>to-do</strong> was modified" : " <strong>مهمة</strong> في تقويم تمّ تعديلها",
"Contact birthdays" : "أعياد ميلاد جهات الاتصال",
"Death of %s" : "وفاة %s",
"Untitled calendar" : "تقويم بدون اسم",
"Calendar:" : "التقويم:",
"Date:" : "التاريخ:",
"Where:" : "المكان:",
"Description:" : "الوصف:",
"_%n minute_::_%n minutes_" : ["%n دقيقة","%n دقيقة","%n دقيقتيْن","%n دقائق","%n دقائق","%n دقائق"],
"%s (in %s)" : "%s (في %s)",
"%s (%s ago)" : "%s (%s مضت)",
"Calendar: %s" : "التقويم: %s",
"Date: %s" : "التاريخ: %s",
"Description: %s" : "الوصف: %s",
"Where: %s" : "المكان: %s",
"%1$s via %2$s" : "%1$s عبر %2$s",
"Cancelled: %1$s" : "مُلغىً: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" تمّ إلغاؤه",
"Re: %1$s" : "إعادة: %1$s",
"%1$s has accepted your invitation" : "%1$s قبل دعوتك",
"%1$s has tentatively accepted your invitation" : "%1$s قبل دعوتك بشكل مبدئي",
"%1$s has declined your invitation" : "%1$s لم يقبل دعوتك",
"%1$s has responded to your invitation" : "%1$s استجاب لدعوتك",
"Invitation updated: %1$s" : "تحديث الدعوة: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s تحديث الحدث \"%2$s\"",
"Invitation: %1$s" : "دعوة: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s يرغب في دعوتكم إلى \"%2$s\"",
"Organizer:" : "تنظيم:",
"Attendees:" : "الحُضُور:",
"Title:" : "العنوان:",
"Time:" : "الوقت:",
"Location:" : "المكان :",
"Link:" : "الرابط:",
"Accept" : "قبول",
"Decline" : "رفض",
"More options …" : "مزيد مِن الخيارات…",
"More options at %s" : "خيارات أخرى في %s",
"Contacts" : "المُراسِلون",
"{actor} created address book {addressbook}" : "{actor} أنشأ دفتر العناوين {addressbook}",
"You created address book {addressbook}" : "أنت أنشأت دفتر العناوين {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} قام بحذف دفتر العناوين {addressbook}",
"You deleted address book {addressbook}" : "أنت قمت بحذف دفتر العناوين {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} قام بتعديل دفتر العناوين {addressbook}",
"You updated address book {addressbook}" : "أنت قمت بتعديل دفتر العناوين {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} قام بمشاركة دفتر العناوين {addressbook} معك",
"You shared address book {addressbook} with {user}" : "أنت قمت بمشاركة دفتر العناوين {addressbook} مع {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} قام بمشاركة دفتر العناوين {addressbook} مع {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} معك",
"You unshared address book {addressbook} from {user}" : "أنت قمت بإلغاء مشاركة دفتر العناوين {addressbook} مع {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} مع {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} قام بإلغاء مشاركته في دفتر العناوين {addressbook} ",
"You shared address book {addressbook} with group {group}" : "أنت قمت بمشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} قام بمشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
"You unshared address book {addressbook} from group {group}" : "أنت قمت بإلغاء مشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} قام بإنشاء جهة اتصال {card} في دفتر العناوين {addressbook}",
"You created contact {card} in address book {addressbook}" : "أنت قمت بإنشاء جهة اتصال {card} في دفتر العناوين {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} قام بحذف جهة الاتصال {card} من دفتر العناوين {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "أنت قمت بحذف جهة الاتصال {card} من دفتر العناوين {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} قام بتحديث جهة الاتصال {card} في دفتر العناوين {addressbook}",
"You updated contact {card} in address book {addressbook}" : "أنت قمت بتحديث جهة الاتصال {card} في دفتر العناوين {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "تمّ تعديل <strong>جهة الاتصال</strong> أو <strong>دفتر العناوين</strong> ",
"Accounts" : "حسابات",
"System address book which holds all accounts" : "دفتر عناوين النظام الذي يحوي كل الحسابات",
"File is not updatable: %1$s" : "ملف غير قابل للتعديل: %1$s",
"Could not write to final file, canceled by hook" : "تعذرت الكتابة إلى الملف النهائي، تم إلغاؤه بواسطة خطّاف hook",
"Could not write file contents" : "تعذرت كتابة محتويات الملف",
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "حدث خطأ أثناء نسخ الملف إلى الموقع المقصد (تمّ نسخه: %1$s, حجم الملف المتوقع: %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." : "الحجم المتوقع للملف هو %1$s؛ بينما المقروء من ( الجهاز العميل لنكست كلاود) و المكتوب في (تخزين نكست كلاود) هو %2$s. يمكن أن يكون السبب إمّا مشكلة اتصال في جانب الجهاز العميل أو مشكلة في الكتابة في وحدة التخزين في جانب خادوم نكست كلاود .",
"Could not rename part file to final file, canceled by hook" : "تعذّرت إعادة تسمية ملف جزئي إلى ملف نهائي. تمّ الإلغاء من قِبَل الخطّاف hook.",
"Could not rename part file to final file" : "تعذّرت إعادة تسمية ملف جزئي إلى ملف نهائي",
"Failed to check file size: %1$s" : "إخفاق في تحديد حجم الملف: %1$s",
"Could not open file" : "تعذّر فتح الملف",
"Encryption not ready: %1$s" : "التشفير غير جاهز: %1$s",
"Failed to open file: %1$s" : "تعذّر فتح الملف: %1$s",
"Failed to unlink: %1$s" : "تعذّر فك الارتباط: %1$s",
"Invalid chunk name" : "اسم كتلة chunk غير صحيح",
"Could not rename part file assembled from chunks" : "تعذّرت إعادة تسمية ملف جزئي مُجمّعٍ من كُتلٍ chunks",
"Failed to write file contents: %1$s" : "إخفاق في كتابة محتويات الملف: %1$s",
"File not found: %1$s" : "ملف غير موجود: %1$s",
"System is in maintenance mode." : "النظام في حالة صيانة.",
"Upgrade needed" : "الترقية لإصدارٍ أحدث لازمةٌٍ",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s الخاص بك يجب تهيئته لاستخدام HTTPS حتى يمكن استعمال CalDAV و CardDAV في نظام التشغيل iOS/macOS. ",
"Configures a CalDAV account" : "تكوين حساب CalDAV",
"Configures a CardDAV account" : "تكوين حساب CardDAV",
"Events" : "أحداث",
"Tasks" : "المهام",
"Untitled task" : "مهمة بدون اسم",
"Completed on %s" : "تمّ الانتهاء منه في %s",
"Due on %s by %s" : "مطلوبٌ في %s من قِبَل%s",
"Due on %s" : "مطلوبٌ في %s",
"Migrated calendar (%1$s)" : "تقويم مُرحّل (%1$s)",
"Calendars including events, details and attendees" : "تحوي التقاويم الأحداث، و تفاصيلها، و الحُضُور",
"Contacts and groups" : "جهات الاتصال والمجموعات",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "النقطة الحدّيّة endpoint لـ WebDAV",
"Availability" : "أوقات التواجد availability",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "إذا قمت بتهيئة ساعات العمل الخاصة بك، فسيظهر للمستخدمين الآخرين عندما يحجزون معك موعداً إذا ما كنت في المكتب أو خارجه.",
"Time zone:" : "منطقة زمنية:",
"to" : "إلى",
"Delete slot" : "حذف فُرَضَةٍ slot زمنيّةٍ",
"No working hours set" : "لم يتم تحديد ساعات العمل",
"Add slot" : "أضِف فُرَضَةً slot زمنيّةً",
"Monday" : "الإثنين",
"Tuesday" : "الثلاثاء",
"Wednesday" : "الأربعاء",
"Thursday" : "الخميس",
"Friday" : "الجمعة",
"Saturday" : "السبت",
"Sunday" : "الأحد",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "قم بتعيين حالة المستخدم تلقائيًا على \"عدم الإزعاج\" خارج نطاق أوقات التوافر لكتم جميع الإشعارات",
"Save" : "حفظ",
"Failed to load availability" : "إخفاق في تحميل أوقات التوافر",
"Saved availability" : "تمّ حفظ أوقات التوافر",
"Failed to save availability" : "إخفاق في حفظ أوقات التواجد",
"Calendar server" : "خادوم التقويم",
"Send invitations to attendees" : "إرسال دعوات للمُستهدفين بالحُضُُور",
"Automatically generate a birthday calendar" : "تجاهل تقويم أعياد الميلاد تلقائيّاً",
"Birthday calendars will be generated by a background job." : "تقويم أعياد الميلاد سيتم توليده من قِبَل مهمةٍ في الخلفية.",
"Hence they will not be available immediately after enabling but will show up after some time." : "ومن ثمّ لن تكون متاحةً فور التفعيل بل ستظهر بعد مرور بعض الوقت.",
"Send notifications for events" : "إرسال إشعارات حول الأحداث",
"Notifications are sent via background jobs, so these must occur often enough." : "يتمّ إرسال الإشعارات من قِبَل مهمّةٍ في الخلفية. لذا سيتكرر عمل هذا المهام حسب الحاجة.",
"Send reminder notifications to calendar sharees as well" : "أرسل إشعارات للتذكير إلى المشتركين بالتقويم كذلك",
"Reminders are always sent to organizers and attendees." : "إشعارات التذكير يتم إرسالها دائماً إلى مُنظّم أو مُنظّمي الحدث و المستهدفين بحضوره.",
"Enable notifications for events via push" : "تمكين الإشعارات حول الأحداث عبر الزّجّ push.",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "قم أيضاً بتنصيب {calendarappstoreopen} تطبيق التقويم {linkclose}, أو {calendardocopen} أوصل جهازك و موبايلك للمُزامنة ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "رجاءُ، تأكّد من الإعداد الصحيح لـ {emailopen} خادوم البريد الالكتروني {linkclose}.",
"There was an error updating your attendance status." : "حدث خطأ في تحديث حالة حضورك.",
"Please contact the organizer directly." : "رجاءً، تواصل مع المُنظّم أو المُنظّمين مُباشرةً.",
"Are you accepting the invitation?" : "هل تقبل الدعوة؟",
"Tentative" : "مبدئي",
"Your attendance was updated successfully." : "حضورك تم تحديثه بنجاحٍ",
"Invitation canceled" : "تمّ إلغاء الدعوة",
"Invitation updated" : "تمّ تعديل الدعوة",
"Invitation" : "دعوة"
},"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

@ -65,7 +65,7 @@ OC.L10N.register(
"_%n day_::_%n days_" : ["%n dia","%n dies"],
"_%n hour_::_%n hours_" : ["%n hora","%n hores"],
"_%n minute_::_%n minutes_" : ["%n minut","%n minuts"],
"%s (in %s)" : "%s (d'aquí %s)",
"%s (in %s)" : "%s (d'aquí a %s)",
"%s (%s ago)" : "%s (fa %s)",
"Calendar: %s" : "Calendari: %s",
"Date: %s" : "Data: %s",

View file

@ -63,7 +63,7 @@
"_%n day_::_%n days_" : ["%n dia","%n dies"],
"_%n hour_::_%n hours_" : ["%n hora","%n hores"],
"_%n minute_::_%n minutes_" : ["%n minut","%n minuts"],
"%s (in %s)" : "%s (d'aquí %s)",
"%s (in %s)" : "%s (d'aquí a %s)",
"%s (%s ago)" : "%s (fa %s)",
"Calendar: %s" : "Calendari: %s",
"Date: %s" : "Data: %s",

View file

@ -153,7 +153,7 @@ OC.L10N.register(
"Contacts and groups" : "Contacts et groupes",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Point d'accès WebDAV",
"Availability" : "Disponibilité",
"Availability" : "Disponibilités",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Si vous configurez vos heures de travail, les autres utilisateurs verront si vous êtes disponible quand ils planifient une réunion.",
"Time zone:" : "Fuseau horaire :",
"to" : "à",
@ -167,11 +167,11 @@ OC.L10N.register(
"Friday" : "Vendredi",
"Saturday" : "Samedi",
"Sunday" : "Dimanche",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut \"Ne pas déranger\" en dehors des heures de disponibilité pour désactiver toutes les notifications.",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut \"Ne pas déranger\" en dehors des heures de disponibilités pour désactiver toutes les notifications.",
"Save" : "Enregistrer",
"Failed to load availability" : "Impossible de charger la disponibilité",
"Saved availability" : "Disponibilité sauvegardée",
"Failed to save availability" : "Impossible de sauvegarder la disponibilité",
"Failed to load availability" : "Impossible de charger les disponibilités",
"Saved availability" : "Disponibilités sauvegardées",
"Failed to save availability" : "Impossible de sauvegarder les disponibilités",
"Calendar server" : "Serveur de calendrier",
"Send invitations to attendees" : "Envoyer des invitations aux participants",
"Automatically generate a birthday calendar" : "Générer automatiquement un agenda d'anniversaire",

View file

@ -151,7 +151,7 @@
"Contacts and groups" : "Contacts et groupes",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Point d'accès WebDAV",
"Availability" : "Disponibilité",
"Availability" : "Disponibilités",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Si vous configurez vos heures de travail, les autres utilisateurs verront si vous êtes disponible quand ils planifient une réunion.",
"Time zone:" : "Fuseau horaire :",
"to" : "à",
@ -165,11 +165,11 @@
"Friday" : "Vendredi",
"Saturday" : "Samedi",
"Sunday" : "Dimanche",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut \"Ne pas déranger\" en dehors des heures de disponibilité pour désactiver toutes les notifications.",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut \"Ne pas déranger\" en dehors des heures de disponibilités pour désactiver toutes les notifications.",
"Save" : "Enregistrer",
"Failed to load availability" : "Impossible de charger la disponibilité",
"Saved availability" : "Disponibilité sauvegardée",
"Failed to save availability" : "Impossible de sauvegarder la disponibilité",
"Failed to load availability" : "Impossible de charger les disponibilités",
"Saved availability" : "Disponibilités sauvegardées",
"Failed to save availability" : "Impossible de sauvegarder les disponibilités",
"Calendar server" : "Serveur de calendrier",
"Send invitations to attendees" : "Envoyer des invitations aux participants",
"Automatically generate a birthday calendar" : "Générer automatiquement un agenda d'anniversaire",

View file

@ -5,13 +5,13 @@ OC.L10N.register(
"To-dos" : "Tarefas pendentes",
"Personal" : "Persoal",
"{actor} created calendar {calendar}" : "{actor} creou o calendario {calendar}",
"You created calendar {calendar}" : "Vostede creou o calendario {calendar}",
"You created calendar {calendar}" : "Creou o calendario {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} eliminou o calendario {calendar}",
"You deleted calendar {calendar}" : "Vostede eliminou o calendario {calendar}",
"You deleted calendar {calendar}" : "Eliminou o calendario {calendar}",
"{actor} updated calendar {calendar}" : "{actor} actualizou o calendario {calendar}",
"You updated calendar {calendar}" : "Vostede actualizou o calendario {calendar}",
"{actor} restored calendar {calendar}" : "{actor} restaurou o calendario {calendar}",
"You restored calendar {calendar}" : "Restauraches o calendario {calendar}",
"You restored calendar {calendar}" : "Vostede restaurou o calendario {calendar}",
"You shared calendar {calendar} as public link" : "Vostede compartiu o calendario {calendar} como ligazón pública",
"You removed public link for calendar {calendar}" : "Vostede retirou a ligazón pública do calendario {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} compartiu o calendario {calendar} con vostede",
@ -33,26 +33,26 @@ OC.L10N.register(
"{actor} updated event {event} in calendar {calendar}" : "{actor} actualizou o evento {event} no calendario {calendar}",
"You updated event {event} in calendar {calendar}" : "Vostede actualizou o evento {event} no calendario {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} moveu o evento {event} do calendario {sourceCalendar} ao calendario {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Moveches o evento {evento} do calendario {sourceCalendar} ao calendario {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Moveu o evento {evento} do calendario {sourceCalendar} ao calendario {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} restaurou o evento {evento} do calendario {calendar}",
"You restored event {event} of calendar {calendar}" : "Restauraches o evento {evento} do calendario {calendar}",
"You restored event {event} of calendar {calendar}" : "Restaurou o evento {evento} do calendario {calendar}",
"Busy" : "Ocupado",
"{actor} created to-do {todo} in list {calendar}" : "{actor} creou as tarefas {todo} na lista {calendar}",
"You created to-do {todo} in list {calendar}" : "Creaches a tarefa {todo} na lista {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} eliminou as tarefas pendentes {todo} da lista {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Eliminaches as tarefas pendentes {todo} da lista {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} actualizou a tarefa {todo} na lista {calendar}",
"You updated to-do {todo} in list {calendar}" : "Actualizaches a tarefa {todo} na lista {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} resolveu as tarefas {todo} na lista {calendar}",
"You solved to-do {todo} in list {calendar}" : "Resolveches a tarefa {todo} na lista {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} reabriu as tarefas {todo} na lista {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Reabriches as tarefas {todo} na lista {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moveu a tarefa {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Moveches a tarefa {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"{actor} created to-do {todo} in list {calendar}" : "{actor} creou a tarefa pendente {todo} na lista {calendar}",
"You created to-do {todo} in list {calendar}" : "Creou a tarefa pendente {todo} na lista {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} eliminou a tarefa pendente {todo} da lista {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Eliminou a tarefa pendente {todo} da lista {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} actualizou a tarefa pendente {todo} na lista {calendar}",
"You updated to-do {todo} in list {calendar}" : "Actualizou a tarefa pendente {todo} na lista {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} resolveu a tarefa pendente {todo} na lista {calendar}",
"You solved to-do {todo} in list {calendar}" : "Resolveu a tarefa pendente {todo} na lista {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} reabriu a tarefa pendente {todo} na lista {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Reabriu a tarefa pendente {todo} na lista {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moveu a tarefa pendente {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Moveu a tarefa pendente {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"Calendar, contacts and tasks" : "Calendario, contactos e tarefas",
"A <strong>calendar</strong> was modified" : "Foi modificado un <strong>calendario</strong>",
"A calendar <strong>event</strong> was modified" : "Foi modificado un <strong>evento</strong> do calendario",
"A calendar <strong>to-do</strong> was modified" : "Modificouse unha <strong>tarefa</strong> do calendario",
"A calendar <strong>to-do</strong> was modified" : "Modificouse unha <strong>tarefa pendente</strong> do calendario",
"Contact birthdays" : "Aniversario do contacto",
"Death of %s" : "Falecemento de %s",
"Untitled calendar" : "Calendario sen título",
@ -73,16 +73,16 @@ OC.L10N.register(
"Where: %s" : "Onde: %s",
"%1$s via %2$s" : "%1$s mediante %2$s",
"Cancelled: %1$s" : "Cancelado: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" cancelouse",
"\"%1$s\" has been canceled" : "Cancelouse «%1$s»",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s aceptou a túa invitación",
"%1$s has tentatively accepted your invitation" : "%1$s aceptou provisionalmente a túa invitación",
"%1$s has declined your invitation" : "%1$s rexeitou a túa invitación",
"%1$s has responded to your invitation" : "%1$s respondeu á túa invitación",
"Invitation updated: %1$s" : "Invitación actualizada: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s actualizou o evento \"%2$s\"",
"Invitation: %1$s" : "Invitación: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s quere invitarte a \"%2$s\"",
"%1$s has accepted your invitation" : "%1$s aceptou o seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceptou provisionalmente o seu convite",
"%1$s has declined your invitation" : "%1$s rexeitou o seu convite",
"%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
"Invitation updated: %1$s" : "Convite actualizado: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s actualizou o evento «%2$s»",
"Invitation: %1$s" : "Convite: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s quere convidalo a «%2$s»",
"Organizer:" : "Organizador:",
"Attendees:" : "Asistentes:",
"Title:" : "Título:",
@ -94,49 +94,51 @@ OC.L10N.register(
"More options …" : "Máis opcións…",
"More options at %s" : "Máis opcións en %s",
"Contacts" : "Contactos",
"{actor} created address book {addressbook}" : "{actor} creou a axenda de enderezos {addressbook}",
"You created address book {addressbook}" : "Creaches a axenda de enderezos {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} eliminou a axenda de enderezos {addressbook}",
"You deleted address book {addressbook}" : "Eliminaches a axenda de enderezos {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} actualizou a axenda de enderezos {addressbook}",
"You updated address book {addressbook}" : "Actualizaches a axenda de enderezos {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} compartiu a axenda de enderezos {addressbook} contigo",
"You shared address book {addressbook} with {user}" : "Compartiches a axenda de enderezos {addressbook} con {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} compartiu a axenda de enderezos {addressbook} con {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} deixou de compartir a túa axenda de enderezos {addressbook}",
"You unshared address book {addressbook} from {user}" : "Deixaches de compartir a axenda de enderezos {addressbook} de {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} deixou de compartir a axenda de enderezos {addressbook} de {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} deixaron de compartir a súa axenda de enderezos {addressbook}",
"You shared address book {addressbook} with group {group}" : "Compartiches a axenda de enderezos {addressbook} co grupo {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} compartiu a axenda de enderezos {addressbook} co grupo {group}",
"You unshared address book {addressbook} from group {group}" : "Deixaches de compartir a axenda de enderezos {addressbook} do grupo {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} deixou de compartir axenda de enderezos {addressbook} do grupo {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} creou o contacto {card} na axenda de enderezos {addressbook}",
"You created contact {card} in address book {addressbook}" : "Creaches o contacto {card} na axenda de enderezos {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} eliminou o contacto {card} da axenda de enderezos {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "Eliminaches o contacto {card} da axenda de enderezos {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} actualizou o contacto {card} na axenda de enderezos {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Actualizaches o contacto {card} na axenda de enderezos {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Modificouse un <strong>contacto</strong> ou <strong>axenda de enderezos</strong>",
"File is not updatable: %1$s" : "O ficheiro non se pode actualizar: %1$s",
"Could not write to final file, canceled by hook" : "Non foi posíbel escribir no ficheiro final, cancelouse polo hook",
"Could not write file contents" : "Non se puido escribir o contido do ficheiro",
"{actor} created address book {addressbook}" : "{actor} creou o caderno de enderezos {addressbook}",
"You created address book {addressbook}" : "Vostede creou o caderno de enderezos {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} eliminou o caderno de enderezos {addressbook}",
"You deleted address book {addressbook}" : "Vostede eliminou o caderno de enderezos {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} actualizou o caderno de enderezos {addressbook}",
"You updated address book {addressbook}" : "Vostede actualizou o caderno de enderezos {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} compartiu o caderno de enderezos {addressbook} con vostede",
"You shared address book {addressbook} with {user}" : "Vostede compartiu o caderno de enderezos {addressbook} con {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} compartiu o caderno de enderezos {addressbook} con {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} deixou de compartir o seu caderno de enderezos {addressbook}",
"You unshared address book {addressbook} from {user}" : "Vostede deixou de compartir o caderno de enderezos {addressbook} de {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} deixou de compartir o caderno de enderezos {addressbook} de {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} deixaron de compartir o seu caderno de enderezos {addressbook}",
"You shared address book {addressbook} with group {group}" : "Vostede compartiu o caderno de enderezos {addressbook} co grupo {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} compartiu o caderno de enderezos {addressbook} co grupo {group}",
"You unshared address book {addressbook} from group {group}" : "Vostede deixou de compartir o caderno de enderezos {addressbook} do grupo {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} deixou de compartir o caderno de enderezos {addressbook} do grupo {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} creou o contacto {card} no caderno de enderezos {addressbook}",
"You created contact {card} in address book {addressbook}" : "Vostede creou o contacto {card} no caderno de enderezos {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} eliminou o contacto {card} do caderno de enderezos {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "Vostede eliminou o contacto {card} do caderno de enderezos {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} actualizou o contacto {card} no caderno de enderezos {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Vostede actualizou o contacto {card} no caderno de enderezos {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Foi modificado un <strong>contacto</strong> ou <strong>caderno de enderezos</strong>",
"Accounts" : "Contas",
"System address book which holds all accounts" : "Caderno de enderezos do sistema que contén todas as contas",
"File is not updatable: %1$s" : "Non é posíbel actualizar o ficheiro: %1$s",
"Could not write to final file, canceled by hook" : "Non foi posíbel escribir no ficheiro final, foi cancelado polo sistema",
"Could not write file contents" : "Non foi posíbel escribir o contido do ficheiro",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Produciuse un erro ao copiar o ficheiro na localización de destino (copiado: %1$s, tamaño esperado do ficheiro: %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." : "Tamaño esperado do ficheiro %1$s pero lido (do cliente de Nextcloud) e escrito (no almacenamento de Nextcloud) %2$s. Pode ser un problema de rede no lado do envío ou un problema ao escribir no almacenamento no lado do servidor.",
"Could not rename part file to final file, canceled by hook" : "Non foi posíbel cambiar o nome do ficheiro de parte ao ficheiro final, cancelado polo hook",
"Could not rename part file to final file" : "Non se puido cambiar o nome do ficheiro de parte ao ficheiro final",
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Produciuse un erro ao copiar o ficheiro na localización de destino (copiado: %1$s, tamaño agardado do ficheiro: %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." : "Tamaño agardado do ficheiro %1$s mais lido (do cliente de Nextcloud) e escrito (no almacenamento de Nextcloud) %2$s. Pode ser un problema de rede no lado do envío ou un problema ao escribir no almacenamento no lado do servidor.",
"Could not rename part file to final file, canceled by hook" : "Non foi posíbel cambiar o nome do ficheiro parcial ao ficheiro final, foi cancelado polo sistema",
"Could not rename part file to final file" : "Non foi posíbel cambiar o nome do ficheiro parcial ao ficheiro final",
"Failed to check file size: %1$s" : "Produciuse un erro ao comprobar o tamaño do ficheiro: %1$s",
"Could not open file" : "Non se puido abrir o ficheiro",
"Encryption not ready: %1$s" : "O cifrado non está listo: %1$s",
"Could not open file" : "Non foi posíbel abrir o ficheiro",
"Encryption not ready: %1$s" : "O cifrado non está preparado: %1$s",
"Failed to open file: %1$s" : "Produciuse un erro ao abrir o ficheiro: %1$s",
"Failed to unlink: %1$s" : "Produciuse un erro ao desligar: %1$s",
"Invalid chunk name" : "O nome do fragmento non é válido",
"Could not rename part file assembled from chunks" : "Non se puido cambiar o nome do ficheiro de pezas ensamblados a partir de fragmentos",
"Could not rename part file assembled from chunks" : "Non foi posíbel cambiar o nome do ficheiro de pezas ensamblados a partir de fragmentos",
"Failed to write file contents: %1$s" : "Produciuse un erro ao escribir o contido do ficheiro: %1$s",
"File not found: %1$s" : "Arquivo non atopado: %1$s",
"File not found: %1$s" : "Non se atopou o ficheiro: %1$s",
"System is in maintenance mode." : "O sistema está en modo de mantemento.",
"Upgrade needed" : "É necesario anovar actualizar",
"Upgrade needed" : "É necesario anovar",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "É preciso configurar o seu %s para que empregue HTTPS para poder usar CalDAV e CardDAV con iOS / macOS.",
"Configures a CalDAV account" : "Configurar unha conta de CalDAV",
"Configures a CardDAV account" : "Configurar unha conta de CardDAV",
@ -152,11 +154,11 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Terminación WebDAV",
"Availability" : "Dispoñibilidade",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Se configuras o teu horario de traballo, outros usuarios verán cando estás fóra da oficina cando reserven unha reunión.",
"Time zone:" : "Franxa horaria:",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Se configura o seu horario de traballo, outros usuarios verán cando está fóra da oficina cando reserven unha xuntanza.",
"Time zone:" : "Fuso horario:",
"to" : "para",
"Delete slot" : "Eliminar franxa horaria",
"No working hours set" : "Sen horario de traballo establecido",
"No working hours set" : "Sen horario de traballo estabelecido",
"Add slot" : "Engadir franxa horaria",
"Monday" : "luns",
"Tuesday" : "martes",
@ -165,7 +167,7 @@ OC.L10N.register(
"Friday" : "venres",
"Saturday" : "sábado",
"Sunday" : "domingo",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Establece automaticamente o estado do usuario en \"Non molestar\" fóra da dispoñibilidade para silenciar todas as notificacións.",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Estabelecer automaticamente o estado do usuario en «Non molestar» fóra de dispoñibilidade para silenciar todas as notificacións.",
"Save" : "Gardar",
"Failed to load availability" : "Produciuse un erro ao cargar a dispoñibilidade",
"Saved availability" : "Dispoñibilidade gardada",
@ -177,8 +179,8 @@ OC.L10N.register(
"Hence they will not be available immediately after enabling but will show up after some time." : "Por isto, non estarán dispoñíbeis inmediatamente tras activalos, senón que aparecerán após certo tempo",
"Send notifications for events" : "Enviar notificacións para eventos",
"Notifications are sent via background jobs, so these must occur often enough." : "As notificacións enviaranse mediante procesos en segundo plano, polo que estes teñen que suceder con frecuencia.",
"Send reminder notifications to calendar sharees as well" : "Envía notificacións de recordatorio tamén aos que comparten calendario",
"Reminders are always sent to organizers and attendees." : "Os recordatorios sempre se envían aos organizadores e aos asistentes.",
"Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
"Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
"Enable notifications for events via push" : "Activar o envío de notificacións do automáticas para eventos",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Instale tamén a {calendarappstoreopen}aplicación do Calendario{linkclose} ou {calendardocopen}conecte os seus escritorio e móbil para sincronizalos ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Asegúrese de ter configurado correctamente {emailopen}o servidor de correo-e{linkclose}.",

View file

@ -3,13 +3,13 @@
"To-dos" : "Tarefas pendentes",
"Personal" : "Persoal",
"{actor} created calendar {calendar}" : "{actor} creou o calendario {calendar}",
"You created calendar {calendar}" : "Vostede creou o calendario {calendar}",
"You created calendar {calendar}" : "Creou o calendario {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} eliminou o calendario {calendar}",
"You deleted calendar {calendar}" : "Vostede eliminou o calendario {calendar}",
"You deleted calendar {calendar}" : "Eliminou o calendario {calendar}",
"{actor} updated calendar {calendar}" : "{actor} actualizou o calendario {calendar}",
"You updated calendar {calendar}" : "Vostede actualizou o calendario {calendar}",
"{actor} restored calendar {calendar}" : "{actor} restaurou o calendario {calendar}",
"You restored calendar {calendar}" : "Restauraches o calendario {calendar}",
"You restored calendar {calendar}" : "Vostede restaurou o calendario {calendar}",
"You shared calendar {calendar} as public link" : "Vostede compartiu o calendario {calendar} como ligazón pública",
"You removed public link for calendar {calendar}" : "Vostede retirou a ligazón pública do calendario {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} compartiu o calendario {calendar} con vostede",
@ -31,26 +31,26 @@
"{actor} updated event {event} in calendar {calendar}" : "{actor} actualizou o evento {event} no calendario {calendar}",
"You updated event {event} in calendar {calendar}" : "Vostede actualizou o evento {event} no calendario {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} moveu o evento {event} do calendario {sourceCalendar} ao calendario {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Moveches o evento {evento} do calendario {sourceCalendar} ao calendario {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Moveu o evento {evento} do calendario {sourceCalendar} ao calendario {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} restaurou o evento {evento} do calendario {calendar}",
"You restored event {event} of calendar {calendar}" : "Restauraches o evento {evento} do calendario {calendar}",
"You restored event {event} of calendar {calendar}" : "Restaurou o evento {evento} do calendario {calendar}",
"Busy" : "Ocupado",
"{actor} created to-do {todo} in list {calendar}" : "{actor} creou as tarefas {todo} na lista {calendar}",
"You created to-do {todo} in list {calendar}" : "Creaches a tarefa {todo} na lista {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} eliminou as tarefas pendentes {todo} da lista {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Eliminaches as tarefas pendentes {todo} da lista {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} actualizou a tarefa {todo} na lista {calendar}",
"You updated to-do {todo} in list {calendar}" : "Actualizaches a tarefa {todo} na lista {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} resolveu as tarefas {todo} na lista {calendar}",
"You solved to-do {todo} in list {calendar}" : "Resolveches a tarefa {todo} na lista {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} reabriu as tarefas {todo} na lista {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Reabriches as tarefas {todo} na lista {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moveu a tarefa {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Moveches a tarefa {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"{actor} created to-do {todo} in list {calendar}" : "{actor} creou a tarefa pendente {todo} na lista {calendar}",
"You created to-do {todo} in list {calendar}" : "Creou a tarefa pendente {todo} na lista {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} eliminou a tarefa pendente {todo} da lista {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Eliminou a tarefa pendente {todo} da lista {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} actualizou a tarefa pendente {todo} na lista {calendar}",
"You updated to-do {todo} in list {calendar}" : "Actualizou a tarefa pendente {todo} na lista {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} resolveu a tarefa pendente {todo} na lista {calendar}",
"You solved to-do {todo} in list {calendar}" : "Resolveu a tarefa pendente {todo} na lista {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} reabriu a tarefa pendente {todo} na lista {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Reabriu a tarefa pendente {todo} na lista {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moveu a tarefa pendente {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Moveu a tarefa pendente {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"Calendar, contacts and tasks" : "Calendario, contactos e tarefas",
"A <strong>calendar</strong> was modified" : "Foi modificado un <strong>calendario</strong>",
"A calendar <strong>event</strong> was modified" : "Foi modificado un <strong>evento</strong> do calendario",
"A calendar <strong>to-do</strong> was modified" : "Modificouse unha <strong>tarefa</strong> do calendario",
"A calendar <strong>to-do</strong> was modified" : "Modificouse unha <strong>tarefa pendente</strong> do calendario",
"Contact birthdays" : "Aniversario do contacto",
"Death of %s" : "Falecemento de %s",
"Untitled calendar" : "Calendario sen título",
@ -71,16 +71,16 @@
"Where: %s" : "Onde: %s",
"%1$s via %2$s" : "%1$s mediante %2$s",
"Cancelled: %1$s" : "Cancelado: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" cancelouse",
"\"%1$s\" has been canceled" : "Cancelouse «%1$s»",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s aceptou a túa invitación",
"%1$s has tentatively accepted your invitation" : "%1$s aceptou provisionalmente a túa invitación",
"%1$s has declined your invitation" : "%1$s rexeitou a túa invitación",
"%1$s has responded to your invitation" : "%1$s respondeu á túa invitación",
"Invitation updated: %1$s" : "Invitación actualizada: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s actualizou o evento \"%2$s\"",
"Invitation: %1$s" : "Invitación: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s quere invitarte a \"%2$s\"",
"%1$s has accepted your invitation" : "%1$s aceptou o seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceptou provisionalmente o seu convite",
"%1$s has declined your invitation" : "%1$s rexeitou o seu convite",
"%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
"Invitation updated: %1$s" : "Convite actualizado: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s actualizou o evento «%2$s»",
"Invitation: %1$s" : "Convite: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s quere convidalo a «%2$s»",
"Organizer:" : "Organizador:",
"Attendees:" : "Asistentes:",
"Title:" : "Título:",
@ -92,49 +92,51 @@
"More options …" : "Máis opcións…",
"More options at %s" : "Máis opcións en %s",
"Contacts" : "Contactos",
"{actor} created address book {addressbook}" : "{actor} creou a axenda de enderezos {addressbook}",
"You created address book {addressbook}" : "Creaches a axenda de enderezos {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} eliminou a axenda de enderezos {addressbook}",
"You deleted address book {addressbook}" : "Eliminaches a axenda de enderezos {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} actualizou a axenda de enderezos {addressbook}",
"You updated address book {addressbook}" : "Actualizaches a axenda de enderezos {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} compartiu a axenda de enderezos {addressbook} contigo",
"You shared address book {addressbook} with {user}" : "Compartiches a axenda de enderezos {addressbook} con {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} compartiu a axenda de enderezos {addressbook} con {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} deixou de compartir a túa axenda de enderezos {addressbook}",
"You unshared address book {addressbook} from {user}" : "Deixaches de compartir a axenda de enderezos {addressbook} de {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} deixou de compartir a axenda de enderezos {addressbook} de {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} deixaron de compartir a súa axenda de enderezos {addressbook}",
"You shared address book {addressbook} with group {group}" : "Compartiches a axenda de enderezos {addressbook} co grupo {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} compartiu a axenda de enderezos {addressbook} co grupo {group}",
"You unshared address book {addressbook} from group {group}" : "Deixaches de compartir a axenda de enderezos {addressbook} do grupo {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} deixou de compartir axenda de enderezos {addressbook} do grupo {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} creou o contacto {card} na axenda de enderezos {addressbook}",
"You created contact {card} in address book {addressbook}" : "Creaches o contacto {card} na axenda de enderezos {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} eliminou o contacto {card} da axenda de enderezos {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "Eliminaches o contacto {card} da axenda de enderezos {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} actualizou o contacto {card} na axenda de enderezos {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Actualizaches o contacto {card} na axenda de enderezos {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Modificouse un <strong>contacto</strong> ou <strong>axenda de enderezos</strong>",
"File is not updatable: %1$s" : "O ficheiro non se pode actualizar: %1$s",
"Could not write to final file, canceled by hook" : "Non foi posíbel escribir no ficheiro final, cancelouse polo hook",
"Could not write file contents" : "Non se puido escribir o contido do ficheiro",
"{actor} created address book {addressbook}" : "{actor} creou o caderno de enderezos {addressbook}",
"You created address book {addressbook}" : "Vostede creou o caderno de enderezos {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} eliminou o caderno de enderezos {addressbook}",
"You deleted address book {addressbook}" : "Vostede eliminou o caderno de enderezos {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} actualizou o caderno de enderezos {addressbook}",
"You updated address book {addressbook}" : "Vostede actualizou o caderno de enderezos {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} compartiu o caderno de enderezos {addressbook} con vostede",
"You shared address book {addressbook} with {user}" : "Vostede compartiu o caderno de enderezos {addressbook} con {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} compartiu o caderno de enderezos {addressbook} con {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} deixou de compartir o seu caderno de enderezos {addressbook}",
"You unshared address book {addressbook} from {user}" : "Vostede deixou de compartir o caderno de enderezos {addressbook} de {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} deixou de compartir o caderno de enderezos {addressbook} de {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} deixaron de compartir o seu caderno de enderezos {addressbook}",
"You shared address book {addressbook} with group {group}" : "Vostede compartiu o caderno de enderezos {addressbook} co grupo {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} compartiu o caderno de enderezos {addressbook} co grupo {group}",
"You unshared address book {addressbook} from group {group}" : "Vostede deixou de compartir o caderno de enderezos {addressbook} do grupo {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} deixou de compartir o caderno de enderezos {addressbook} do grupo {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} creou o contacto {card} no caderno de enderezos {addressbook}",
"You created contact {card} in address book {addressbook}" : "Vostede creou o contacto {card} no caderno de enderezos {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} eliminou o contacto {card} do caderno de enderezos {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "Vostede eliminou o contacto {card} do caderno de enderezos {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} actualizou o contacto {card} no caderno de enderezos {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Vostede actualizou o contacto {card} no caderno de enderezos {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Foi modificado un <strong>contacto</strong> ou <strong>caderno de enderezos</strong>",
"Accounts" : "Contas",
"System address book which holds all accounts" : "Caderno de enderezos do sistema que contén todas as contas",
"File is not updatable: %1$s" : "Non é posíbel actualizar o ficheiro: %1$s",
"Could not write to final file, canceled by hook" : "Non foi posíbel escribir no ficheiro final, foi cancelado polo sistema",
"Could not write file contents" : "Non foi posíbel escribir o contido do ficheiro",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Produciuse un erro ao copiar o ficheiro na localización de destino (copiado: %1$s, tamaño esperado do ficheiro: %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." : "Tamaño esperado do ficheiro %1$s pero lido (do cliente de Nextcloud) e escrito (no almacenamento de Nextcloud) %2$s. Pode ser un problema de rede no lado do envío ou un problema ao escribir no almacenamento no lado do servidor.",
"Could not rename part file to final file, canceled by hook" : "Non foi posíbel cambiar o nome do ficheiro de parte ao ficheiro final, cancelado polo hook",
"Could not rename part file to final file" : "Non se puido cambiar o nome do ficheiro de parte ao ficheiro final",
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Produciuse un erro ao copiar o ficheiro na localización de destino (copiado: %1$s, tamaño agardado do ficheiro: %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." : "Tamaño agardado do ficheiro %1$s mais lido (do cliente de Nextcloud) e escrito (no almacenamento de Nextcloud) %2$s. Pode ser un problema de rede no lado do envío ou un problema ao escribir no almacenamento no lado do servidor.",
"Could not rename part file to final file, canceled by hook" : "Non foi posíbel cambiar o nome do ficheiro parcial ao ficheiro final, foi cancelado polo sistema",
"Could not rename part file to final file" : "Non foi posíbel cambiar o nome do ficheiro parcial ao ficheiro final",
"Failed to check file size: %1$s" : "Produciuse un erro ao comprobar o tamaño do ficheiro: %1$s",
"Could not open file" : "Non se puido abrir o ficheiro",
"Encryption not ready: %1$s" : "O cifrado non está listo: %1$s",
"Could not open file" : "Non foi posíbel abrir o ficheiro",
"Encryption not ready: %1$s" : "O cifrado non está preparado: %1$s",
"Failed to open file: %1$s" : "Produciuse un erro ao abrir o ficheiro: %1$s",
"Failed to unlink: %1$s" : "Produciuse un erro ao desligar: %1$s",
"Invalid chunk name" : "O nome do fragmento non é válido",
"Could not rename part file assembled from chunks" : "Non se puido cambiar o nome do ficheiro de pezas ensamblados a partir de fragmentos",
"Could not rename part file assembled from chunks" : "Non foi posíbel cambiar o nome do ficheiro de pezas ensamblados a partir de fragmentos",
"Failed to write file contents: %1$s" : "Produciuse un erro ao escribir o contido do ficheiro: %1$s",
"File not found: %1$s" : "Arquivo non atopado: %1$s",
"File not found: %1$s" : "Non se atopou o ficheiro: %1$s",
"System is in maintenance mode." : "O sistema está en modo de mantemento.",
"Upgrade needed" : "É necesario anovar actualizar",
"Upgrade needed" : "É necesario anovar",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "É preciso configurar o seu %s para que empregue HTTPS para poder usar CalDAV e CardDAV con iOS / macOS.",
"Configures a CalDAV account" : "Configurar unha conta de CalDAV",
"Configures a CardDAV account" : "Configurar unha conta de CardDAV",
@ -150,11 +152,11 @@
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Terminación WebDAV",
"Availability" : "Dispoñibilidade",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Se configuras o teu horario de traballo, outros usuarios verán cando estás fóra da oficina cando reserven unha reunión.",
"Time zone:" : "Franxa horaria:",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Se configura o seu horario de traballo, outros usuarios verán cando está fóra da oficina cando reserven unha xuntanza.",
"Time zone:" : "Fuso horario:",
"to" : "para",
"Delete slot" : "Eliminar franxa horaria",
"No working hours set" : "Sen horario de traballo establecido",
"No working hours set" : "Sen horario de traballo estabelecido",
"Add slot" : "Engadir franxa horaria",
"Monday" : "luns",
"Tuesday" : "martes",
@ -163,7 +165,7 @@
"Friday" : "venres",
"Saturday" : "sábado",
"Sunday" : "domingo",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Establece automaticamente o estado do usuario en \"Non molestar\" fóra da dispoñibilidade para silenciar todas as notificacións.",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Estabelecer automaticamente o estado do usuario en «Non molestar» fóra de dispoñibilidade para silenciar todas as notificacións.",
"Save" : "Gardar",
"Failed to load availability" : "Produciuse un erro ao cargar a dispoñibilidade",
"Saved availability" : "Dispoñibilidade gardada",
@ -175,8 +177,8 @@
"Hence they will not be available immediately after enabling but will show up after some time." : "Por isto, non estarán dispoñíbeis inmediatamente tras activalos, senón que aparecerán após certo tempo",
"Send notifications for events" : "Enviar notificacións para eventos",
"Notifications are sent via background jobs, so these must occur often enough." : "As notificacións enviaranse mediante procesos en segundo plano, polo que estes teñen que suceder con frecuencia.",
"Send reminder notifications to calendar sharees as well" : "Envía notificacións de recordatorio tamén aos que comparten calendario",
"Reminders are always sent to organizers and attendees." : "Os recordatorios sempre se envían aos organizadores e aos asistentes.",
"Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
"Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
"Enable notifications for events via push" : "Activar o envío de notificacións do automáticas para eventos",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Instale tamén a {calendarappstoreopen}aplicación do Calendario{linkclose} ou {calendardocopen}conecte os seus escritorio e móbil para sincronizalos ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Asegúrese de ter configurado correctamente {emailopen}o servidor de correo-e{linkclose}.",

View file

@ -10,7 +10,7 @@ OC.L10N.register(
"You deleted calendar {calendar}" : "달력 {calendar}을(를) 삭제함",
"{actor} updated calendar {calendar}" : "{actor} 님이 달력 {calendar}을(를) 업데이트함",
"You updated calendar {calendar}" : "달력 {calendar}을(를) 업데이트함",
"{actor} restored calendar {calendar}" : "{actor} 님이 달력 {calendar}을(를) 복구함",
"{actor} restored calendar {calendar}" : "{actor}님이 달력 {calendar}을(를) 복구함",
"You restored calendar {calendar}" : "달력 {calendar}을(를) 복구함",
"You shared calendar {calendar} as public link" : "달력 {calendar}을(를) 공개 링크로 공유함",
"You removed public link for calendar {calendar}" : "달력 {calendar}의 공개 링크를 삭제함",
@ -32,22 +32,22 @@ OC.L10N.register(
"You deleted event {event} from calendar {calendar}" : "행사 {event}을(를) 달력 {calendar}에서 삭제함",
"{actor} updated event {event} in calendar {calendar}" : "{actor} 님이 달력 {calendar}의 행사 {event}을(를) 업데이트함",
"You updated event {event} in calendar {calendar}" : "달력 {calendar}의 행사 {event}을(를) 업데이트함",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} 님이 행사 {event}을(를) 달력 {sourceCalendar}에서 달력 {targetCalendar}(으)로 옮김",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor}님이 행사 {event}을(를) 달력 {sourceCalendar}에서 달력 {targetCalendar}(으)로 옮김",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "행사 {event}을(를) 달력 {sourceCalendar}에서 달력 {targetCalendar}(으)로 옮김",
"{actor} restored event {event} of calendar {calendar}" : "{actor} 님이 행사 {event}을(를) 달력 {calendar}에 복구함",
"{actor} restored event {event} of calendar {calendar}" : "{actor}님이 행사 {event}을(를) 달력 {calendar}에 복구함",
"You restored event {event} of calendar {calendar}" : "행사 {event}을(를) 달력 {calendar}에 복구함",
"Busy" : "바쁨",
"{actor} created to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}에 할 일 {todo}을(를) 생성함",
"{actor} created to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}에 할 일 {todo}을(를) 생성함",
"You created to-do {todo} in list {calendar}" : "목록 {calendar}에 할 일 {todo}을(를) 생성함",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} 님이 목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor}님이 목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
"You deleted to-do {todo} from list {calendar}" : "목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
"{actor} updated to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
"You updated to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 끝냄",
"{actor} solved to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 끝냄",
"You solved to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 끝냄",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
"You reopened to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} 님이 할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor}님이 할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"Calendar, contacts and tasks" : "달력, 연락처 및 작업",
"A <strong>calendar</strong> was modified" : "<strong>달력</strong>이 수정됨",
@ -86,28 +86,28 @@ OC.L10N.register(
"More options …" : "더 많은 옵션 …",
"More options at %s" : "%s에 더 많은 옵션 있음",
"Contacts" : "연락처",
"{actor} created address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 생성함",
"{actor} created address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 생성함",
"You created address book {addressbook}" : "주소록 {addressbook}을(를) 생성함",
"{actor} deleted address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 제거함",
"{actor} deleted address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 제거함",
"You deleted address book {addressbook}" : "주소록 {addressbook}을(를) 제거함",
"{actor} updated address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 갱신함",
"{actor} updated address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 갱신함",
"You updated address book {addressbook}" : "주소록 {addressbook}을(를) 갱신함",
"{actor} shared address book {addressbook} with you" : "{actor} 님이 나와 주소록 {addressbook}을(를) 공유함",
"You shared address book {addressbook} with {user}" : "{user} 님과 주소록 {addressbook}을(를) 공유함",
"{actor} shared address book {addressbook} with {user}" : "{actor} 님이 {user} 님과 주소록 {addressbook}을(를) 공유함",
"{actor} unshared address book {addressbook} from you" : "{actor} 님이 주소록 {addressbook}의 공유를 해제함",
"You unshared address book {addressbook} from {user}" : "{user} 님과 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from {user}" : "{actor} 님이 {user} 님과 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from themselves" : "{actor} 님이 자신과 주소록 {addressbook}의 공유를 해제함",
"{actor} shared address book {addressbook} with you" : "{actor}님이 나와 주소록 {addressbook}을(를) 공유함",
"You shared address book {addressbook} with {user}" : "{user}님과 주소록 {addressbook}을(를) 공유함",
"{actor} shared address book {addressbook} with {user}" : "{actor}님이 {user}님과 주소록 {addressbook}을(를) 공유함",
"{actor} unshared address book {addressbook} from you" : "{actor}님이 주소록 {addressbook}의 공유를 해제함",
"You unshared address book {addressbook} from {user}" : "{user}님과 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from {user}" : "{actor}님이 {user}님과 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from themselves" : "{actor}님이 자신과 주소록 {addressbook}의 공유를 해제함",
"You shared address book {addressbook} with group {group}" : "그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
"{actor} shared address book {addressbook} with group {group}" : "{actor} 님이 그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
"{actor} shared address book {addressbook} with group {group}" : "{actor}님이 그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
"You unshared address book {addressbook} from group {group}" : "그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} 님이 그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
"{actor} created contact {card} in address book {addressbook}" : "{actor} 님이 연락처 {card}을(를) 주소록 {addressbook}에 생성함",
"{actor} unshared address book {addressbook} from group {group}" : "{actor}님이 그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
"{actor} created contact {card} in address book {addressbook}" : "{actor}님이 연락처 {card}을(를) 주소록 {addressbook}에 생성함",
"You created contact {card} in address book {addressbook}" : "연락처 {card}을(를) 주소록 {addressbook}에 생성함",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} 님이 연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor}님이 연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
"You deleted contact {card} from address book {addressbook}" : "연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} 님이 주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"{actor} updated contact {card} in address book {addressbook}" : "{actor}님이 주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"You updated contact {card} in address book {addressbook}" : "주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "<strong>연락처</strong> 또는 <strong>주소록</strong>이 변경됨",
"File is not updatable: %1$s" : "파일을 갱신할 수 없습니다: %1$s",
@ -143,7 +143,7 @@ OC.L10N.register(
"Contacts and groups" : "연락처 및 그룹",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "WebDAV 종단점",
"Availability" : "가능한 시간대",
"Availability" : "가용성",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "업무 시간을 설정하면, 회의를 예약할 때 다른 사용자가 부재 중 시간을 볼 수 있습니다.",
"Time zone:" : "시간대:",
"to" : "에서",
@ -157,10 +157,11 @@ OC.L10N.register(
"Friday" : "금요일",
"Saturday" : "토요일",
"Sunday" : "일요일",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "다른 용무 중일 때 자동으로 사용자를 '방해 금지' 모드로 설정해 모든 알림을 음소거합니다.",
"Save" : "저장",
"Failed to load availability" : "가능한 시간대 불러오기 실패",
"Saved availability" : "가능한 시간대를 저장함",
"Failed to save availability" : "가능한 시간대 저장 실패",
"Failed to load availability" : "가용성 불러오기 실패",
"Saved availability" : "가용성을 저장함",
"Failed to save availability" : "가용성 저장 실패",
"Calendar server" : "달력 서버",
"Send invitations to attendees" : "참석자에게 초대장 보내기",
"Automatically generate a birthday calendar" : "자동으로 생일 달력 생성",

View file

@ -8,7 +8,7 @@
"You deleted calendar {calendar}" : "달력 {calendar}을(를) 삭제함",
"{actor} updated calendar {calendar}" : "{actor} 님이 달력 {calendar}을(를) 업데이트함",
"You updated calendar {calendar}" : "달력 {calendar}을(를) 업데이트함",
"{actor} restored calendar {calendar}" : "{actor} 님이 달력 {calendar}을(를) 복구함",
"{actor} restored calendar {calendar}" : "{actor}님이 달력 {calendar}을(를) 복구함",
"You restored calendar {calendar}" : "달력 {calendar}을(를) 복구함",
"You shared calendar {calendar} as public link" : "달력 {calendar}을(를) 공개 링크로 공유함",
"You removed public link for calendar {calendar}" : "달력 {calendar}의 공개 링크를 삭제함",
@ -30,22 +30,22 @@
"You deleted event {event} from calendar {calendar}" : "행사 {event}을(를) 달력 {calendar}에서 삭제함",
"{actor} updated event {event} in calendar {calendar}" : "{actor} 님이 달력 {calendar}의 행사 {event}을(를) 업데이트함",
"You updated event {event} in calendar {calendar}" : "달력 {calendar}의 행사 {event}을(를) 업데이트함",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} 님이 행사 {event}을(를) 달력 {sourceCalendar}에서 달력 {targetCalendar}(으)로 옮김",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor}님이 행사 {event}을(를) 달력 {sourceCalendar}에서 달력 {targetCalendar}(으)로 옮김",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "행사 {event}을(를) 달력 {sourceCalendar}에서 달력 {targetCalendar}(으)로 옮김",
"{actor} restored event {event} of calendar {calendar}" : "{actor} 님이 행사 {event}을(를) 달력 {calendar}에 복구함",
"{actor} restored event {event} of calendar {calendar}" : "{actor}님이 행사 {event}을(를) 달력 {calendar}에 복구함",
"You restored event {event} of calendar {calendar}" : "행사 {event}을(를) 달력 {calendar}에 복구함",
"Busy" : "바쁨",
"{actor} created to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}에 할 일 {todo}을(를) 생성함",
"{actor} created to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}에 할 일 {todo}을(를) 생성함",
"You created to-do {todo} in list {calendar}" : "목록 {calendar}에 할 일 {todo}을(를) 생성함",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} 님이 목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor}님이 목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
"You deleted to-do {todo} from list {calendar}" : "목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
"{actor} updated to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
"You updated to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 끝냄",
"{actor} solved to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 끝냄",
"You solved to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 끝냄",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
"You reopened to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} 님이 할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor}님이 할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"Calendar, contacts and tasks" : "달력, 연락처 및 작업",
"A <strong>calendar</strong> was modified" : "<strong>달력</strong>이 수정됨",
@ -84,28 +84,28 @@
"More options …" : "더 많은 옵션 …",
"More options at %s" : "%s에 더 많은 옵션 있음",
"Contacts" : "연락처",
"{actor} created address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 생성함",
"{actor} created address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 생성함",
"You created address book {addressbook}" : "주소록 {addressbook}을(를) 생성함",
"{actor} deleted address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 제거함",
"{actor} deleted address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 제거함",
"You deleted address book {addressbook}" : "주소록 {addressbook}을(를) 제거함",
"{actor} updated address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 갱신함",
"{actor} updated address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 갱신함",
"You updated address book {addressbook}" : "주소록 {addressbook}을(를) 갱신함",
"{actor} shared address book {addressbook} with you" : "{actor} 님이 나와 주소록 {addressbook}을(를) 공유함",
"You shared address book {addressbook} with {user}" : "{user} 님과 주소록 {addressbook}을(를) 공유함",
"{actor} shared address book {addressbook} with {user}" : "{actor} 님이 {user} 님과 주소록 {addressbook}을(를) 공유함",
"{actor} unshared address book {addressbook} from you" : "{actor} 님이 주소록 {addressbook}의 공유를 해제함",
"You unshared address book {addressbook} from {user}" : "{user} 님과 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from {user}" : "{actor} 님이 {user} 님과 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from themselves" : "{actor} 님이 자신과 주소록 {addressbook}의 공유를 해제함",
"{actor} shared address book {addressbook} with you" : "{actor}님이 나와 주소록 {addressbook}을(를) 공유함",
"You shared address book {addressbook} with {user}" : "{user}님과 주소록 {addressbook}을(를) 공유함",
"{actor} shared address book {addressbook} with {user}" : "{actor}님이 {user}님과 주소록 {addressbook}을(를) 공유함",
"{actor} unshared address book {addressbook} from you" : "{actor}님이 주소록 {addressbook}의 공유를 해제함",
"You unshared address book {addressbook} from {user}" : "{user}님과 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from {user}" : "{actor}님이 {user}님과 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from themselves" : "{actor}님이 자신과 주소록 {addressbook}의 공유를 해제함",
"You shared address book {addressbook} with group {group}" : "그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
"{actor} shared address book {addressbook} with group {group}" : "{actor} 님이 그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
"{actor} shared address book {addressbook} with group {group}" : "{actor}님이 그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
"You unshared address book {addressbook} from group {group}" : "그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} 님이 그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
"{actor} created contact {card} in address book {addressbook}" : "{actor} 님이 연락처 {card}을(를) 주소록 {addressbook}에 생성함",
"{actor} unshared address book {addressbook} from group {group}" : "{actor}님이 그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
"{actor} created contact {card} in address book {addressbook}" : "{actor}님이 연락처 {card}을(를) 주소록 {addressbook}에 생성함",
"You created contact {card} in address book {addressbook}" : "연락처 {card}을(를) 주소록 {addressbook}에 생성함",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} 님이 연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor}님이 연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
"You deleted contact {card} from address book {addressbook}" : "연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} 님이 주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"{actor} updated contact {card} in address book {addressbook}" : "{actor}님이 주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"You updated contact {card} in address book {addressbook}" : "주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "<strong>연락처</strong> 또는 <strong>주소록</strong>이 변경됨",
"File is not updatable: %1$s" : "파일을 갱신할 수 없습니다: %1$s",
@ -141,7 +141,7 @@
"Contacts and groups" : "연락처 및 그룹",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "WebDAV 종단점",
"Availability" : "가능한 시간대",
"Availability" : "가용성",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "업무 시간을 설정하면, 회의를 예약할 때 다른 사용자가 부재 중 시간을 볼 수 있습니다.",
"Time zone:" : "시간대:",
"to" : "에서",
@ -155,10 +155,11 @@
"Friday" : "금요일",
"Saturday" : "토요일",
"Sunday" : "일요일",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "다른 용무 중일 때 자동으로 사용자를 '방해 금지' 모드로 설정해 모든 알림을 음소거합니다.",
"Save" : "저장",
"Failed to load availability" : "가능한 시간대 불러오기 실패",
"Saved availability" : "가능한 시간대를 저장함",
"Failed to save availability" : "가능한 시간대 저장 실패",
"Failed to load availability" : "가용성 불러오기 실패",
"Saved availability" : "가용성을 저장함",
"Failed to save availability" : "가용성 저장 실패",
"Calendar server" : "달력 서버",
"Send invitations to attendees" : "참석자에게 초대장 보내기",
"Automatically generate a birthday calendar" : "자동으로 생일 달력 생성",

View file

@ -2,7 +2,7 @@ OC.L10N.register(
"dav",
{
"Calendar" : "日历",
"To-dos" : "办事项",
"To-dos" : "办事项",
"Personal" : "个人",
"{actor} created calendar {calendar}" : "{actor} 创建了日历 {calendar}",
"You created calendar {calendar}" : "您创建的日历 {calendar}",
@ -37,8 +37,8 @@ OC.L10N.register(
"{actor} restored event {event} of calendar {calendar}" : "{actor} 还原了事件 {event},它位于日历 {calendar}",
"You restored event {event} of calendar {calendar}" : "你还原了事件 {event},它位于日历 {calendar}",
"Busy" : "忙碌",
"{actor} created to-do {todo} in list {calendar}" : "{actor} 在清单 {calendar} 中创建了办事项 {todo}",
"You created to-do {todo} in list {calendar}" : "您已在清单 {calendar} 中创建了办事项 {todo}",
"{actor} created to-do {todo} in list {calendar}" : "{actor} 在清单 {calendar} 中创建了办事项 {todo}",
"You created to-do {todo} in list {calendar}" : "您已在清单 {calendar} 中创建了办事项 {todo}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} 从列表 {calendar} 中删除了待办事项 {todo}",
"You deleted to-do {todo} from list {calendar}" : "你从列表 {calendar} 中删除了待办事项 {todo}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} 更新了列表 {calendar} 中的待办事项 {todo}",
@ -63,8 +63,8 @@ OC.L10N.register(
"_%n year_::_%n years_" : ["%n 年"],
"_%n month_::_%n months_" : ["%n 月"],
"_%n day_::_%n days_" : ["%n 天"],
"_%n hour_::_%n hours_" : ["%n 小时"],
"_%n minute_::_%n minutes_" : ["%n 分钟"],
"_%n hour_::_%n hours_" : ["%n小时"],
"_%n minute_::_%n minutes_" : ["%n分钟"],
"%s (in %s)" : "%s (在 %s",
"%s (%s ago)" : "%s %s 前)",
"Calendar: %s" : "日历:%s",
@ -73,8 +73,16 @@ OC.L10N.register(
"Where: %s" : "地点:%s",
"%1$s via %2$s" : "%1$s 通过 %2$s",
"Cancelled: %1$s" : "已取消:%1$s",
"\"%1$s\" has been canceled" : "“%1$s”已取消",
"Re: %1$s" : "回复:%1$s",
"%1$s has accepted your invitation" : "%1$s 已接受您的邀请",
"%1$s has tentatively accepted your invitation" : "%1$s 暂时接受了您的邀请",
"%1$s has declined your invitation" : "%1$s 已拒绝了您的邀请",
"%1$s has responded to your invitation" : "%1$s 已回应了您的邀请",
"Invitation updated: %1$s" : "邀请已更新:%1$s",
"%1$s updated the event \"%2$s\"" : "%1$s 已更新事件“%2$s”",
"Invitation: %1$s" : "邀请:%1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s 想邀请您加入“%2$s”",
"Organizer:" : "组织者:",
"Attendees:" : "与会者:",
"Title:" : "标题:",
@ -110,6 +118,8 @@ OC.L10N.register(
"{actor} updated contact {card} in address book {addressbook}" : "{actor} 更新了通讯录 {addressbook} 中的联系人 {card} ",
"You updated contact {card} in address book {addressbook}" : "你更新了通讯录 {addressbook} 中的联系人 {card} ",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "一名 <strong>联系人</strong>或一个<strong>通讯录</strong>被更改了",
"Accounts" : "账户",
"System address book which holds all accounts" : "包含所有账户的系统通讯录",
"File is not updatable: %1$s" : "无法更新文件:%1$s",
"Could not write to final file, canceled by hook" : "无法写入最终文件,操作被插件取消",
"Could not write file contents" : "无法写入文件内容",
@ -127,22 +137,22 @@ OC.L10N.register(
"Could not rename part file assembled from chunks" : "无法重命名从分片组合的部分文件",
"Failed to write file contents: %1$s" : "写入文件内容失败:%1$s",
"File not found: %1$s" : "找不到文件:%1$s",
"System is in maintenance mode." : "系统处于维护模式 ",
"System is in maintenance mode." : "系统处于维护模式",
"Upgrade needed" : "需要升级",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "您的%s 需要配置使用HTTPS以在iOS/macOS中使用CalDAV和CardDAV。",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "您的 %s 需要配置使用 HTTPS 以在 iOS/macOS 中使用 CalDAV CardDAV。",
"Configures a CalDAV account" : "配置一个 CalDAV 账号",
"Configures a CardDAV account" : "配置一个 CardDAV 账号",
"Events" : "事件",
"Tasks" : "任务",
"Untitled task" : "无标题任务",
"Completed on %s" : "已完成 %s",
"Due on %s by %s" : "到期于%s ,在%s之前",
"Due on %s" : "到期于%s",
"Due on %s by %s" : "到期于 %s %s 之前",
"Due on %s" : "到期于 %s",
"Migrated calendar (%1$s)" : "迁移的日历(%1$s",
"Calendars including events, details and attendees" : "日历包含活动、参与人和事件详情",
"Contacts and groups" : "联系人和群组",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "WebDAV端点",
"WebDAV endpoint" : "WebDAV 端点",
"Availability" : "可用性",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "如果您配置了工作时间,其他用户在预订会议时就会了解您何时不在办公室。",
"Time zone:" : "时区:",
@ -172,8 +182,8 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "同时向日历共享者发送提醒通知",
"Reminders are always sent to organizers and attendees." : "始终向组织者和与会者发出提醒。",
"Enable notifications for events via push" : "启用推送事件通知",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "也安装 {calendarappstoreopen}日历应用{linkclose},或者 {calendardocopen}连接您的桌面和移动端同步日历 ↗{linkclose}。",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "请确保正确设置 {emailopen}邮件服务器{linkclose}。",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "也安装{calendarappstoreopen}日历应用{linkclose},或者{calendardocopen}连接您的桌面和移动端同步日历 ↗{linkclose}。",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "请确保正确设置{emailopen}邮件服务器{linkclose}。",
"There was an error updating your attendance status." : "更新您的出席状态时出错。",
"Please contact the organizer directly." : "请直接联系组织者。",
"Are you accepting the invitation?" : "您是否接受邀请?",

View file

@ -1,6 +1,6 @@
{ "translations": {
"Calendar" : "日历",
"To-dos" : "办事项",
"To-dos" : "办事项",
"Personal" : "个人",
"{actor} created calendar {calendar}" : "{actor} 创建了日历 {calendar}",
"You created calendar {calendar}" : "您创建的日历 {calendar}",
@ -35,8 +35,8 @@
"{actor} restored event {event} of calendar {calendar}" : "{actor} 还原了事件 {event},它位于日历 {calendar}",
"You restored event {event} of calendar {calendar}" : "你还原了事件 {event},它位于日历 {calendar}",
"Busy" : "忙碌",
"{actor} created to-do {todo} in list {calendar}" : "{actor} 在清单 {calendar} 中创建了办事项 {todo}",
"You created to-do {todo} in list {calendar}" : "您已在清单 {calendar} 中创建了办事项 {todo}",
"{actor} created to-do {todo} in list {calendar}" : "{actor} 在清单 {calendar} 中创建了办事项 {todo}",
"You created to-do {todo} in list {calendar}" : "您已在清单 {calendar} 中创建了办事项 {todo}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} 从列表 {calendar} 中删除了待办事项 {todo}",
"You deleted to-do {todo} from list {calendar}" : "你从列表 {calendar} 中删除了待办事项 {todo}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} 更新了列表 {calendar} 中的待办事项 {todo}",
@ -61,8 +61,8 @@
"_%n year_::_%n years_" : ["%n 年"],
"_%n month_::_%n months_" : ["%n 月"],
"_%n day_::_%n days_" : ["%n 天"],
"_%n hour_::_%n hours_" : ["%n 小时"],
"_%n minute_::_%n minutes_" : ["%n 分钟"],
"_%n hour_::_%n hours_" : ["%n小时"],
"_%n minute_::_%n minutes_" : ["%n分钟"],
"%s (in %s)" : "%s (在 %s",
"%s (%s ago)" : "%s %s 前)",
"Calendar: %s" : "日历:%s",
@ -71,8 +71,16 @@
"Where: %s" : "地点:%s",
"%1$s via %2$s" : "%1$s 通过 %2$s",
"Cancelled: %1$s" : "已取消:%1$s",
"\"%1$s\" has been canceled" : "“%1$s”已取消",
"Re: %1$s" : "回复:%1$s",
"%1$s has accepted your invitation" : "%1$s 已接受您的邀请",
"%1$s has tentatively accepted your invitation" : "%1$s 暂时接受了您的邀请",
"%1$s has declined your invitation" : "%1$s 已拒绝了您的邀请",
"%1$s has responded to your invitation" : "%1$s 已回应了您的邀请",
"Invitation updated: %1$s" : "邀请已更新:%1$s",
"%1$s updated the event \"%2$s\"" : "%1$s 已更新事件“%2$s”",
"Invitation: %1$s" : "邀请:%1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s 想邀请您加入“%2$s”",
"Organizer:" : "组织者:",
"Attendees:" : "与会者:",
"Title:" : "标题:",
@ -108,6 +116,8 @@
"{actor} updated contact {card} in address book {addressbook}" : "{actor} 更新了通讯录 {addressbook} 中的联系人 {card} ",
"You updated contact {card} in address book {addressbook}" : "你更新了通讯录 {addressbook} 中的联系人 {card} ",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "一名 <strong>联系人</strong>或一个<strong>通讯录</strong>被更改了",
"Accounts" : "账户",
"System address book which holds all accounts" : "包含所有账户的系统通讯录",
"File is not updatable: %1$s" : "无法更新文件:%1$s",
"Could not write to final file, canceled by hook" : "无法写入最终文件,操作被插件取消",
"Could not write file contents" : "无法写入文件内容",
@ -125,22 +135,22 @@
"Could not rename part file assembled from chunks" : "无法重命名从分片组合的部分文件",
"Failed to write file contents: %1$s" : "写入文件内容失败:%1$s",
"File not found: %1$s" : "找不到文件:%1$s",
"System is in maintenance mode." : "系统处于维护模式 ",
"System is in maintenance mode." : "系统处于维护模式",
"Upgrade needed" : "需要升级",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "您的%s 需要配置使用HTTPS以在iOS/macOS中使用CalDAV和CardDAV。",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "您的 %s 需要配置使用 HTTPS 以在 iOS/macOS 中使用 CalDAV CardDAV。",
"Configures a CalDAV account" : "配置一个 CalDAV 账号",
"Configures a CardDAV account" : "配置一个 CardDAV 账号",
"Events" : "事件",
"Tasks" : "任务",
"Untitled task" : "无标题任务",
"Completed on %s" : "已完成 %s",
"Due on %s by %s" : "到期于%s ,在%s之前",
"Due on %s" : "到期于%s",
"Due on %s by %s" : "到期于 %s %s 之前",
"Due on %s" : "到期于 %s",
"Migrated calendar (%1$s)" : "迁移的日历(%1$s",
"Calendars including events, details and attendees" : "日历包含活动、参与人和事件详情",
"Contacts and groups" : "联系人和群组",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "WebDAV端点",
"WebDAV endpoint" : "WebDAV 端点",
"Availability" : "可用性",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "如果您配置了工作时间,其他用户在预订会议时就会了解您何时不在办公室。",
"Time zone:" : "时区:",
@ -170,8 +180,8 @@
"Send reminder notifications to calendar sharees as well" : "同时向日历共享者发送提醒通知",
"Reminders are always sent to organizers and attendees." : "始终向组织者和与会者发出提醒。",
"Enable notifications for events via push" : "启用推送事件通知",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "也安装 {calendarappstoreopen}日历应用{linkclose},或者 {calendardocopen}连接您的桌面和移动端同步日历 ↗{linkclose}。",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "请确保正确设置 {emailopen}邮件服务器{linkclose}。",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "也安装{calendarappstoreopen}日历应用{linkclose},或者{calendardocopen}连接您的桌面和移动端同步日历 ↗{linkclose}。",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "请确保正确设置{emailopen}邮件服务器{linkclose}。",
"There was an error updating your attendance status." : "更新您的出席状态时出错。",
"Please contact the organizer directly." : "请直接联系组织者。",
"Are you accepting the invitation?" : "您是否接受邀请?",

View file

@ -3134,10 +3134,19 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
if ($keep < 0) {
throw new \InvalidArgumentException();
}
$query = $this->db->getQueryBuilder();
$query->select($query->func()->max('id'))
->from('calendarchanges');
$maxId = $query->executeQuery()->fetchOne();
if (!$maxId || $maxId < $keep) {
return 0;
}
$query = $this->db->getQueryBuilder();
$query->delete('calendarchanges')
->orderBy('id', 'DESC')
->setFirstResult($keep);
->where($query->expr()->lte('id', $query->createNamedParameter($maxId - $keep, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT));
return $query->executeStatement();
}

View file

@ -1399,10 +1399,19 @@ class CardDavBackend implements BackendInterface, SyncSupport {
if ($keep < 0) {
throw new \InvalidArgumentException();
}
$query = $this->db->getQueryBuilder();
$query->select($query->func()->max('id'))
->from('addressbookchanges');
$maxId = $query->executeQuery()->fetchOne();
if (!$maxId || $maxId < $keep) {
return 0;
}
$query = $this->db->getQueryBuilder();
$query->delete('addressbookchanges')
->orderBy('id', 'DESC')
->setFirstResult($keep);
->where($query->expr()->lte('id', $query->createNamedParameter($maxId - $keep, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT));
return $query->executeStatement();
}

View file

@ -92,7 +92,19 @@ class Converter {
$vCard->add(new Text($vCard, 'TEL', $property->getValue(), ['TYPE' => 'VOICE', 'X-NC-SCOPE' => $scope]));
break;
case IAccountManager::PROPERTY_ADDRESS:
$vCard->add(new Text($vCard, 'ADR', $property->getValue(), ['TYPE' => 'OTHER', 'X-NC-SCOPE' => $scope]));
// structured prop: https://www.rfc-editor.org/rfc/rfc6350.html#section-6.3.1
// post office box;extended address;street address;locality;region;postal code;country
$vCard->add(
new Text(
$vCard,
'ADR',
[ '', '', '', $property->getValue(), '', '', '' ],
[
'TYPE' => 'OTHER',
'X-NC-SCOPE' => $scope,
]
)
);
break;
case IAccountManager::PROPERTY_TWITTER:
$vCard->add(new Text($vCard, 'X-SOCIALPROFILE', $property->getValue(), ['TYPE' => 'TWITTER', 'X-NC-SCOPE' => $scope]));

View file

@ -64,7 +64,7 @@ class SystemAddressbook extends AddressBook {
IUserSession $userSession,
?IRequest $request = null,
?TrustedServers $trustedServers = null,
?IGroupManager $groupManager) {
?IGroupManager $groupManager = null) {
parent::__construct($carddavBackend, $addressBookInfo, $l10n);
$this->config = $config;
$this->userSession = $userSession;

View file

@ -165,10 +165,8 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
/**
* Returns the last modification time, as a unix timestamp
*
* @return int
*/
public function getLastModified() {
public function getLastModified(): ?int {
return null;
}

View file

@ -176,7 +176,7 @@ class CommentsPlugin extends ServerPlugin {
}
if (!is_null($args['datetime'])) {
$args['datetime'] = new \DateTime($args['datetime']);
$args['datetime'] = new \DateTime((string)$args['datetime']);
}
$results = $node->findChildren($args['limit'], $args['offset'], $args['datetime']);
@ -189,7 +189,7 @@ class CommentsPlugin extends ServerPlugin {
$responses[] = new Response(
$this->server->getBaseUri() . $nodePath,
[200 => $resultSet[0][200]],
200
'200'
);
}
}

View file

@ -42,25 +42,14 @@ use Sabre\DAV\Exception\NotFound;
* @package OCA\DAV\Comments
*/
class EntityTypeCollection extends RootCollection {
protected LoggerInterface $logger;
/** @var IUserManager */
protected $userManager;
protected IUserManager $userManager;
/** @var \Closure */
protected $childExistsFunction;
/**
* @param string $name
* @param ICommentsManager $commentsManager
* @param IUserManager $userManager
* @param IUserSession $userSession
* @param LoggerInterface $logger
* @param \Closure $childExistsFunction
*/
public function __construct(
$name,
string $name,
ICommentsManager $commentsManager,
IUserManager $userManager,
IUserSession $userSession,
@ -68,7 +57,7 @@ class EntityTypeCollection extends RootCollection {
\Closure $childExistsFunction
) {
$name = trim($name);
if (empty($name) || !is_string($name)) {
if (empty($name)) {
throw new \InvalidArgumentException('"name" parameter must be non-empty string');
}
$this->name = $name;

View file

@ -36,26 +36,14 @@ use Sabre\DAV\ICollection;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class RootCollection implements ICollection {
/** @var EntityTypeCollection[]|null */
private $entityTypeCollections;
/** @var ICommentsManager */
protected $commentsManager;
/** @var string */
protected $name = 'comments';
private ?array $entityTypeCollections = null;
protected ICommentsManager $commentsManager;
protected string $name = 'comments';
protected LoggerInterface $logger;
/** @var IUserManager */
protected $userManager;
/** @var IUserSession */
protected $userSession;
/** @var EventDispatcherInterface */
protected $dispatcher;
protected IUserManager $userManager;
protected IUserSession $userSession;
protected EventDispatcherInterface $dispatcher;
public function __construct(
ICommentsManager $commentsManager,
@ -149,6 +137,7 @@ class RootCollection implements ICollection {
*/
public function getChildren() {
$this->initCollections();
assert(!is_null($this->entityTypeCollections));
return $this->entityTypeCollections;
}
@ -160,6 +149,7 @@ class RootCollection implements ICollection {
*/
public function childExists($name) {
$this->initCollections();
assert(!is_null($this->entityTypeCollections));
return isset($this->entityTypeCollections[$name]);
}
@ -196,7 +186,7 @@ class RootCollection implements ICollection {
/**
* Returns the last modification time, as a unix timestamp
*
* @return int
* @return ?int
*/
public function getLastModified() {
return null;

View file

@ -94,8 +94,19 @@ class DavAclPlugin extends \Sabre\DAVACL\Plugin {
$path = $request->getPath();
// prevent the plugin from causing an unneeded overhead for file requests
if (!str_starts_with($path, 'files/')) {
parent::beforeMethod($request, $response);
if (str_starts_with($path, 'files/')) {
return;
}
parent::beforeMethod($request, $response);
$createAddressbookOrCalendarRequest = ($request->getMethod() === 'MKCALENDAR' || $request->getMethod() === 'MKCOL')
&& (str_starts_with($path, 'addressbooks/') || str_starts_with($path, 'calendars/'));
if ($createAddressbookOrCalendarRequest) {
[$parentName] = \Sabre\Uri\split($path);
// is calendars/users/bob or addressbooks/users/bob writeable?
$this->checkPrivileges($parentName, '{DAV:}write');
}
}
}

View file

@ -34,6 +34,7 @@ use OCP\Migration\SimpleMigrationStep;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\Log\LoggerInterface;
use Throwable;
class Version1027Date20230504122946 extends SimpleMigrationStep {
private SyncService $syncService;
@ -49,6 +50,13 @@ class Version1027Date20230504122946 extends SimpleMigrationStep {
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
$this->syncService->syncInstance();
try {
$this->syncService->syncInstance();
} catch (Throwable $e) {
$this->logger->error('Could not sync system address books during update', [
'exception' => $e,
]);
$output->warning('System address book sync failed. See logs for details');
}
}
}

View file

@ -1291,6 +1291,8 @@ EOD;
*/
public function testPruneOutdatedSyncTokens(): void {
$calendarId = $this->createTestCalendar();
$changes = $this->backend->getChangesForCalendar($calendarId, '', 1);
$syncToken = $changes['syncToken'];
$uri = static::getUniqueID('calobj');
$calData = <<<EOD
@ -1333,9 +1335,79 @@ EOD;
$deleted = $this->backend->pruneOutdatedSyncTokens(0);
// At least one from the object creation and one from the object update
$this->assertGreaterThanOrEqual(2, $deleted);
$changes = $this->backend->getChangesForCalendar($calendarId, '5', 1);
$changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 1);
$this->assertEmpty($changes['added']);
$this->assertEmpty($changes['modified']);
$this->assertEmpty($changes['deleted']);
// Test that objects remain
// Currently changes are empty
$changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 100);
$this->assertEquals(0, count($changes['added'] + $changes['modified'] + $changes['deleted']));
// Create card
$uri = static::getUniqueID('calobj');
$calData = <<<EOD
BEGIN:VCALENDAR
VERSION:2.0
PRODID:Nextcloud Calendar
BEGIN:VEVENT
CREATED;VALUE=DATE-TIME:20230910T125139Z
UID:47d15e3ec9
LAST-MODIFIED;VALUE=DATE-TIME:20230910T125139Z
DTSTAMP;VALUE=DATE-TIME:20230910T125139Z
SUMMARY:Test Event
DTSTART;VALUE=DATE-TIME:20230912T130000Z
DTEND;VALUE=DATE-TIME:20230912T140000Z
CLASS:PUBLIC
END:VEVENT
END:VCALENDAR
EOD;
$this->backend->createCalendarObject($calendarId, $uri, $calData);
// We now have one add
$changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 100);
$this->assertEquals(1, count($changes['added']));
$this->assertEmpty($changes['modified']);
$this->assertEmpty($changes['deleted']);
// update the card
$calData = <<<'EOD'
BEGIN:VCALENDAR
VERSION:2.0
PRODID:Nextcloud Calendar
BEGIN:VEVENT
CREATED;VALUE=DATE-TIME:20230910T125139Z
UID:47d15e3ec9
LAST-MODIFIED;VALUE=DATE-TIME:20230910T125139Z
DTSTAMP;VALUE=DATE-TIME:20230910T125139Z
SUMMARY:123 Event 🙈
DTSTART;VALUE=DATE-TIME:20230912T130000Z
DTEND;VALUE=DATE-TIME:20230912T140000Z
ATTENDEE;CN=test:mailto:foo@bar.com
END:VEVENT
END:VCALENDAR
EOD;
$this->backend->updateCalendarObject($calendarId, $uri, $calData);
// One add, one modify, but shortened to modify
$changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 100);
$this->assertEmpty($changes['added']);
$this->assertEquals(1, count($changes['modified']));
$this->assertEmpty($changes['deleted']);
// Delete all but last change
$deleted = $this->backend->pruneOutdatedSyncTokens(1);
$this->assertEquals(1, $deleted); // We had two changes before, now one
// Only update should remain
$changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 100);
$this->assertEmpty($changes['added']);
$this->assertEquals(1, count($changes['modified']));
$this->assertEmpty($changes['deleted']);
// Check that no crash occurs when prune is called without current changes
$deleted = $this->backend->pruneOutdatedSyncTokens(1);
}
}

View file

@ -853,15 +853,54 @@ class CardDavBackendTest extends TestCase {
*/
public function testPruneOutdatedSyncTokens(): void {
$addressBookId = $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []);
$changes = $this->backend->getChangesForAddressBook($addressBookId, '', 1);
$syncToken = $changes['syncToken'];
$uri = $this->getUniqueID('card');
$this->backend->createCard($addressBookId, $uri, $this->vcardTest0);
$this->backend->updateCard($addressBookId, $uri, $this->vcardTest1);
$deleted = $this->backend->pruneOutdatedSyncTokens(0);
// At least one from the object creation and one from the object update
$this->assertGreaterThanOrEqual(2, $deleted);
$changes = $this->backend->getChangesForAddressBook($addressBookId, '5', 1);
$changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 1);
$this->assertEmpty($changes['added']);
$this->assertEmpty($changes['modified']);
$this->assertEmpty($changes['deleted']);
// Test that objects remain
// Currently changes are empty
$changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 100);
$this->assertEquals(0, count($changes['added'] + $changes['modified'] + $changes['deleted']));
// Create card
$uri = $this->getUniqueID('card');
$this->backend->createCard($addressBookId, $uri, $this->vcardTest0);
// We now have one add
$changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 100);
$this->assertEquals(1, count($changes['added']));
$this->assertEmpty($changes['modified']);
$this->assertEmpty($changes['deleted']);
// Update card
$this->backend->updateCard($addressBookId, $uri, $this->vcardTest1);
// One add, one modify, but shortened to modify
$changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 100);
$this->assertEmpty($changes['added']);
$this->assertEquals(1, count($changes['modified']));
$this->assertEmpty($changes['deleted']);
// Delete all but last change
$deleted = $this->backend->pruneOutdatedSyncTokens(1);
$this->assertEquals(1, $deleted); // We had two changes before, now one
// Only update should remain
$changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 100);
$this->assertEmpty($changes['added']);
$this->assertEquals(1, count($changes['modified']));
$this->assertEmpty($changes['deleted']);
// Check that no crash occurs when prune is called without current changes
$deleted = $this->backend->pruneOutdatedSyncTokens(1);
}
}

View file

@ -1,29 +1,43 @@
OC.L10N.register(
"encryption",
{
"Missing recovery key password" : "كلمة مرور مفتاح الاستعادة مفقودة",
"Missing recovery key password" : "لم يُمكن العثور على كلمة مرور مفتاح الاستعادة",
"Please repeat the recovery key password" : "يرجى تكرار كلمة مرور مفتاح الاستعادة",
"Repeated recovery key password does not match the provided recovery key password" : "تأكيد كلمة مرور مفتاح الاستعادة لا تتطابق مع كلمة مرور مفتاح الاستعادة المدخلة",
"Recovery key successfully enabled" : "تم بنجاح تفعيل مفتاح الاستعادة",
"Could not enable recovery key. Please check your recovery key password!" : ا يمكن تفعيل مفتاح الاستعادة, يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
"Recovery key successfully disabled" : "تم تعطيل مفتاح الاستعادة بنجاح",
"Could not disable recovery key. Please check your recovery key password!" : ا يمكن تعطيل مفتاح الاستعادة, يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
"Missing parameters" : "المعاملات مفقودة",
"Please provide the old recovery password" : "يرجى تقديم كلمة مرور الاستعادة القديمة",
"Please provide a new recovery password" : "يرجى تقديم كلمة مرور جديدة للاستعادة",
"Please repeat the new recovery password" : "يرجى إعادة كلمة مرور الاستعادة الجديدة",
"Password successfully changed." : "تم تغيير كلمة المرور بنجاح.",
"Could not change the password. Maybe the old password was not correct." : "تعذر تغيير كلمة المرور. من الممكن ان كلمة المرور القديمة غير صحيحة.",
"Recovery Key disabled" : "مفتاح الاستعادة معطل",
"Recovery Key enabled" : "تم تمكين مفتاح الاستعادة",
"Repeated recovery key password does not match the provided recovery key password" : "كلمة مرور مفتاح الاستعادة المُكرّرة لا تتطابق مع كلمة مرور مفتاح الاستعادة المُدخلة",
"Recovery key successfully enabled" : "تمّ بنجاح تفعيل مفتاح الاستعادة",
"Could not enable recovery key. Please check your recovery key password!" : م يُمكن تفعيل مفتاح الاستعادة. يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
"Recovery key successfully disabled" : "تمّ بنجاح تعطيل مفتاح الاستعادة ",
"Could not disable recovery key. Please check your recovery key password!" : م يُمكن تعطيل مفتاح الاستعادة. يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
"Missing parameters" : "البارامترات ناقصة",
"Please provide the old recovery password" : "يرجى إعطاء كلمة مرور الاستعادة القديمة",
"Please provide a new recovery password" : "يرجى إعطاء كلمة مرور جديدة للاستعادة",
"Please repeat the new recovery password" : "يرجى تكرار كلمة مرور الاستعادة الجديدة",
"Password successfully changed." : "تمّ بنجاح تغيير كلمة المرور.",
"Could not change the password. Maybe the old password was not correct." : "تعذر تغيير كلمة المرور. يُمكن أن تكون كلمة المرور القديمة غير صحيحة.",
"Recovery Key disabled" : "مفتاح الاستعادة مُعطّل",
"Recovery Key enabled" : "تمّ تمكين مفتاح الاستعادة",
"Could not enable the recovery key, please try again or contact your administrator" : "تعذر تمكين مفتاح الاسترداد ، يرجى المحاولة مرة أخرى أو الاتصال بالمسؤول",
"Could not update the private key password." : "تعذر تحديث كلمة مرور المفتاح الخاص.",
"Could not update the private key password." : "تعذّر تحديث كلمة مرور المفتاح الخاص.",
"The old password was not correct, please try again." : "كلمة المرور القديمة غير صحيحة ، يرجى المحاولة مرة أخرى.",
"The current log-in password was not correct, please try again." : "كلمة المرور الحالية لتسجيل الدخول غير صحيحة، يرجى المحاولة مرة أخرى.",
"The current log-in password was not correct, please try again." : "كلمة المرور الحالية للدخول غير صحيحة، يرجى المحاولة مرة أخرى.",
"Private key password successfully updated." : "تم تحديث كلمة المرور للمفتاح الخاص بنجاح.",
"Bad Signature" : "التوقيع الرقمي سيء",
"Missing Signature" : "التوقيع مفقود",
"one-time password for server-side-encryption" : "كلمة مرور لمرة واحدة للتشفير من جانب الخادم",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "مفتاح خاص غير صالح لتطبيق التشفير. يرجى تحديث كلمة مرور المفتاح الخاص في إعداداتك الشخصية لاستعادة الوصول إلى ملفاتك المشفرة.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "تمّ تفعيل تطبيق التشفير، لكن لم تتم تهيئة المفاتيح الخاصة بك. الرجاء الخروج ثم الدخول من جديدٍ.",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "يرجى تمكين التشفير من جانب الخادوم في إعدادات المُشرف حتّى يتسنّى استخدام وحدة التشفير.",
"Encryption app is enabled and ready" : "تطبيق التشفير مُفعّل و جاهز للعمل",
"Bad Signature" : "توقيع غير مقبول",
"Missing Signature" : "توقيع مفقود",
"one-time password for server-side-encryption" : "كلمة مرور لمرة واحدة للتشفير من جانب الخادوم",
"Encryption password" : "كلمة سر التشفير",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "قام المشرف بتمكين التشفير من جانب الخادوم. و تمّ تشفير ملفاتك باستخدام كلمة السر <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "قام المشرف بتمكين التشفير من جانب الخادوم. و تمّ تشفير ملفاتك باستخدام كلمة السر \"%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 log-in password\" field and your current login-password." : "الرجاء تسجيل الدخول إلى واجهة الويب ثم الانتقال إلى قسم \"الأمان\" security في إعداداتك الشخصية وتحديث كلمة مرور التشفير الخاصة بك بإدخالها في خانة \"كلمة مرور الدخول القديمة\" ثم إدخال كلمة مرور الدخول الحالية.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "تعذّر فك تشفير هذا الملف؛ ربما يكون ملفّاً مُشتركاً. رجاءً، أطلب من مالك الملف إلغاء مشاركته معك.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "تعذرت قراءة هذا الملف؛ ربما يكون ملفّاً مُشتركاً. رجاءً، أطلب من مالك الملف إلغاء مشاركته معك.",
"Default encryption module" : "وحدة التشفير الافتراضية",
"Default encryption module for server-side encryption" : "وحدة التشفير الافتراضية للتشفير من جانب الخادوم",
"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." : "لاستخدام وحدة التشفير هذه ، تحتاج إلى تمكين التشفير من جانب الخادوم في إعدادات المُشرف. بمجرد تمكين هذه الوحدة ، ستقوم بتشفير جميع ملفاتك بشفافية. يعتمد التشفير على مفاتيح AES 256. لن تلمس الوحدة الملفات الموجودة ، سيتم تشفير الملفات الجديدة فقط بعد تمكين التشفير من جانب الخادوم. لكن لاحظ أنه لن يُمكن تعطيل التشفير والعودة إلى حالة عدم التشفير. يرجى قراءة الوثائق لمعرفة جميع العواقب قبل أن تقرر تمكين التشفير من جانب الخادوم.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "تمّ تمكين تطبيق التشفير، ولكن لم يتمّ تهيئة المفاتيح الخاصة بك. يرجى الخروج ثم الدخول من جديدٍ.",
"Encrypt the home storage" : "تشفير وحدة التخزين الأساسية",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "يؤدي تمكين هذا الخيار إلى تشفير جميع الملفات المخزنة على وحدة التخزين الرئيسية، وإلا فسيتم تشفير الملفات الموجودة على وحدة التخزين الخارجية فقط",
"Enable recovery key" : "تمكين مفتاح الاستعادة",
@ -36,6 +50,7 @@ OC.L10N.register(
"New recovery key password" : "كلمة مرور جديدة لمفتاح الاستعادة",
"Repeat new recovery key password" : "أعد كتابة كلمة مرور مفتاح الاستعادة الجديدة",
"Change Password" : "عدل كلمة السر",
"Basic encryption module" : "وحدة التشفير الأساسية",
"Your private key password no longer matches your log-in password." : "لم تعد كلمة مرور المفتاح الخاص تطابق كلمة مرور تسجيل الدخول الخاصة بك.",
"Set your old private key password to your current log-in password:" : "قم بتعيين كلمة مرور المفتاح الخاص القديم على كلمة مرور تسجيل الدخول الحالية:",
" If you don't remember your old password you can ask your administrator to recover your files." : "اذا كنت لاتتذكر كلمة السر تستطيع ان تطلب من المدير ان يستعيد ملفاتك.",
@ -46,7 +61,10 @@ OC.L10N.register(
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "تفعيل هذا الخيار يمكنك من اعادة الوصول الى ملفاتك المشفرة عند فقدان كلمة المرور",
"Enabled" : "مفعلة",
"Disabled" : "معطلة",
"In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "من أجل استخدام وحدة التشفير هذه تحتاج إلى تمكين جانب الخادوم \n\t\t التشفير في إعدادات المسؤول. بمجرد تمكين هذه الوحدة سوف تقوم بتشفير \n\t\t كل ملفاتك بشفافية. يعتمد التشفير على مفتاح 256 AES\n \t\t لن تلمس الوحدة الملفات الموجودة مُسبقاً و ستقوم فقط بتشفير الملفات الجديدة\n\t\t بعد تمكين التشفير من جانب الخادوم، لن يكون مُمكناً \n\t\t تعطيل التشفير مرة أخرى والرجوع إلى حالة عدم التشفير. \n\t\t يرجى قراءة الوثائق لمعرفة جميع العواقب المترتبةقبل أن تقرر\n\t\t لتمكين التشفير من جانب الخادوم.",
"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" : "مرحبًا ، تم تمكين التشفير من جانب الخادوم من قبل الإدارة. لذا تمّ تشفير ملفاتك باستخدام كلمة المرور %s\".\nالرجاء الدخول إلى واجهة الويب ثم الانتقال إلى قسم \"وحدة التشفير الأساسية\" Basic encryption module في إعداداتك الشخصية، و قُم بتحديث كلمة مرور التشفير عن طريق إدخال كلمتىْ مرورك القديمة و الحالية.\n",
"The share will expire on %s." : "ستنتهي صلاحية المشاركة في %s.",
"Cheers!" : "تحياتي!"
"Cheers!" : "تحياتي!",
"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>" : "أهلاً؛<br><br>قامت الإدارة بتمكين التشفير من جانب الخادوم. لذا، سيتم تشفير ملفاتك باستخدام كلمة المرور <strong>%s</strong>.<br><br>الرجاء الدخول إلى واجهة الويب ثم الانتقال إلى قسم \"وحدة التشفير الأساسية\" Basic encryption module في إعداداتك الشخصية، و قُم بتحديث كلمة مرور التشفير عن طريق إدخال كلمتىْ مرورك القديمة و الحالية.<br><br>"
},
"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

@ -1,27 +1,41 @@
{ "translations": {
"Missing recovery key password" : "كلمة مرور مفتاح الاستعادة مفقودة",
"Missing recovery key password" : "لم يُمكن العثور على كلمة مرور مفتاح الاستعادة",
"Please repeat the recovery key password" : "يرجى تكرار كلمة مرور مفتاح الاستعادة",
"Repeated recovery key password does not match the provided recovery key password" : "تأكيد كلمة مرور مفتاح الاستعادة لا تتطابق مع كلمة مرور مفتاح الاستعادة المدخلة",
"Recovery key successfully enabled" : "تم بنجاح تفعيل مفتاح الاستعادة",
"Could not enable recovery key. Please check your recovery key password!" : ا يمكن تفعيل مفتاح الاستعادة, يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
"Recovery key successfully disabled" : "تم تعطيل مفتاح الاستعادة بنجاح",
"Could not disable recovery key. Please check your recovery key password!" : ا يمكن تعطيل مفتاح الاستعادة, يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
"Missing parameters" : "المعاملات مفقودة",
"Please provide the old recovery password" : "يرجى تقديم كلمة مرور الاستعادة القديمة",
"Please provide a new recovery password" : "يرجى تقديم كلمة مرور جديدة للاستعادة",
"Please repeat the new recovery password" : "يرجى إعادة كلمة مرور الاستعادة الجديدة",
"Password successfully changed." : "تم تغيير كلمة المرور بنجاح.",
"Could not change the password. Maybe the old password was not correct." : "تعذر تغيير كلمة المرور. من الممكن ان كلمة المرور القديمة غير صحيحة.",
"Recovery Key disabled" : "مفتاح الاستعادة معطل",
"Recovery Key enabled" : "تم تمكين مفتاح الاستعادة",
"Repeated recovery key password does not match the provided recovery key password" : "كلمة مرور مفتاح الاستعادة المُكرّرة لا تتطابق مع كلمة مرور مفتاح الاستعادة المُدخلة",
"Recovery key successfully enabled" : "تمّ بنجاح تفعيل مفتاح الاستعادة",
"Could not enable recovery key. Please check your recovery key password!" : م يُمكن تفعيل مفتاح الاستعادة. يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
"Recovery key successfully disabled" : "تمّ بنجاح تعطيل مفتاح الاستعادة ",
"Could not disable recovery key. Please check your recovery key password!" : م يُمكن تعطيل مفتاح الاستعادة. يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
"Missing parameters" : "البارامترات ناقصة",
"Please provide the old recovery password" : "يرجى إعطاء كلمة مرور الاستعادة القديمة",
"Please provide a new recovery password" : "يرجى إعطاء كلمة مرور جديدة للاستعادة",
"Please repeat the new recovery password" : "يرجى تكرار كلمة مرور الاستعادة الجديدة",
"Password successfully changed." : "تمّ بنجاح تغيير كلمة المرور.",
"Could not change the password. Maybe the old password was not correct." : "تعذر تغيير كلمة المرور. يُمكن أن تكون كلمة المرور القديمة غير صحيحة.",
"Recovery Key disabled" : "مفتاح الاستعادة مُعطّل",
"Recovery Key enabled" : "تمّ تمكين مفتاح الاستعادة",
"Could not enable the recovery key, please try again or contact your administrator" : "تعذر تمكين مفتاح الاسترداد ، يرجى المحاولة مرة أخرى أو الاتصال بالمسؤول",
"Could not update the private key password." : "تعذر تحديث كلمة مرور المفتاح الخاص.",
"Could not update the private key password." : "تعذّر تحديث كلمة مرور المفتاح الخاص.",
"The old password was not correct, please try again." : "كلمة المرور القديمة غير صحيحة ، يرجى المحاولة مرة أخرى.",
"The current log-in password was not correct, please try again." : "كلمة المرور الحالية لتسجيل الدخول غير صحيحة، يرجى المحاولة مرة أخرى.",
"The current log-in password was not correct, please try again." : "كلمة المرور الحالية للدخول غير صحيحة، يرجى المحاولة مرة أخرى.",
"Private key password successfully updated." : "تم تحديث كلمة المرور للمفتاح الخاص بنجاح.",
"Bad Signature" : "التوقيع الرقمي سيء",
"Missing Signature" : "التوقيع مفقود",
"one-time password for server-side-encryption" : "كلمة مرور لمرة واحدة للتشفير من جانب الخادم",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "مفتاح خاص غير صالح لتطبيق التشفير. يرجى تحديث كلمة مرور المفتاح الخاص في إعداداتك الشخصية لاستعادة الوصول إلى ملفاتك المشفرة.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "تمّ تفعيل تطبيق التشفير، لكن لم تتم تهيئة المفاتيح الخاصة بك. الرجاء الخروج ثم الدخول من جديدٍ.",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "يرجى تمكين التشفير من جانب الخادوم في إعدادات المُشرف حتّى يتسنّى استخدام وحدة التشفير.",
"Encryption app is enabled and ready" : "تطبيق التشفير مُفعّل و جاهز للعمل",
"Bad Signature" : "توقيع غير مقبول",
"Missing Signature" : "توقيع مفقود",
"one-time password for server-side-encryption" : "كلمة مرور لمرة واحدة للتشفير من جانب الخادوم",
"Encryption password" : "كلمة سر التشفير",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "قام المشرف بتمكين التشفير من جانب الخادوم. و تمّ تشفير ملفاتك باستخدام كلمة السر <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "قام المشرف بتمكين التشفير من جانب الخادوم. و تمّ تشفير ملفاتك باستخدام كلمة السر \"%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 log-in password\" field and your current login-password." : "الرجاء تسجيل الدخول إلى واجهة الويب ثم الانتقال إلى قسم \"الأمان\" security في إعداداتك الشخصية وتحديث كلمة مرور التشفير الخاصة بك بإدخالها في خانة \"كلمة مرور الدخول القديمة\" ثم إدخال كلمة مرور الدخول الحالية.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "تعذّر فك تشفير هذا الملف؛ ربما يكون ملفّاً مُشتركاً. رجاءً، أطلب من مالك الملف إلغاء مشاركته معك.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "تعذرت قراءة هذا الملف؛ ربما يكون ملفّاً مُشتركاً. رجاءً، أطلب من مالك الملف إلغاء مشاركته معك.",
"Default encryption module" : "وحدة التشفير الافتراضية",
"Default encryption module for server-side encryption" : "وحدة التشفير الافتراضية للتشفير من جانب الخادوم",
"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." : "لاستخدام وحدة التشفير هذه ، تحتاج إلى تمكين التشفير من جانب الخادوم في إعدادات المُشرف. بمجرد تمكين هذه الوحدة ، ستقوم بتشفير جميع ملفاتك بشفافية. يعتمد التشفير على مفاتيح AES 256. لن تلمس الوحدة الملفات الموجودة ، سيتم تشفير الملفات الجديدة فقط بعد تمكين التشفير من جانب الخادوم. لكن لاحظ أنه لن يُمكن تعطيل التشفير والعودة إلى حالة عدم التشفير. يرجى قراءة الوثائق لمعرفة جميع العواقب قبل أن تقرر تمكين التشفير من جانب الخادوم.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "تمّ تمكين تطبيق التشفير، ولكن لم يتمّ تهيئة المفاتيح الخاصة بك. يرجى الخروج ثم الدخول من جديدٍ.",
"Encrypt the home storage" : "تشفير وحدة التخزين الأساسية",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "يؤدي تمكين هذا الخيار إلى تشفير جميع الملفات المخزنة على وحدة التخزين الرئيسية، وإلا فسيتم تشفير الملفات الموجودة على وحدة التخزين الخارجية فقط",
"Enable recovery key" : "تمكين مفتاح الاستعادة",
@ -34,6 +48,7 @@
"New recovery key password" : "كلمة مرور جديدة لمفتاح الاستعادة",
"Repeat new recovery key password" : "أعد كتابة كلمة مرور مفتاح الاستعادة الجديدة",
"Change Password" : "عدل كلمة السر",
"Basic encryption module" : "وحدة التشفير الأساسية",
"Your private key password no longer matches your log-in password." : "لم تعد كلمة مرور المفتاح الخاص تطابق كلمة مرور تسجيل الدخول الخاصة بك.",
"Set your old private key password to your current log-in password:" : "قم بتعيين كلمة مرور المفتاح الخاص القديم على كلمة مرور تسجيل الدخول الحالية:",
" If you don't remember your old password you can ask your administrator to recover your files." : "اذا كنت لاتتذكر كلمة السر تستطيع ان تطلب من المدير ان يستعيد ملفاتك.",
@ -44,7 +59,10 @@
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "تفعيل هذا الخيار يمكنك من اعادة الوصول الى ملفاتك المشفرة عند فقدان كلمة المرور",
"Enabled" : "مفعلة",
"Disabled" : "معطلة",
"In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "من أجل استخدام وحدة التشفير هذه تحتاج إلى تمكين جانب الخادوم \n\t\t التشفير في إعدادات المسؤول. بمجرد تمكين هذه الوحدة سوف تقوم بتشفير \n\t\t كل ملفاتك بشفافية. يعتمد التشفير على مفتاح 256 AES\n \t\t لن تلمس الوحدة الملفات الموجودة مُسبقاً و ستقوم فقط بتشفير الملفات الجديدة\n\t\t بعد تمكين التشفير من جانب الخادوم، لن يكون مُمكناً \n\t\t تعطيل التشفير مرة أخرى والرجوع إلى حالة عدم التشفير. \n\t\t يرجى قراءة الوثائق لمعرفة جميع العواقب المترتبةقبل أن تقرر\n\t\t لتمكين التشفير من جانب الخادوم.",
"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" : "مرحبًا ، تم تمكين التشفير من جانب الخادوم من قبل الإدارة. لذا تمّ تشفير ملفاتك باستخدام كلمة المرور %s\".\nالرجاء الدخول إلى واجهة الويب ثم الانتقال إلى قسم \"وحدة التشفير الأساسية\" Basic encryption module في إعداداتك الشخصية، و قُم بتحديث كلمة مرور التشفير عن طريق إدخال كلمتىْ مرورك القديمة و الحالية.\n",
"The share will expire on %s." : "ستنتهي صلاحية المشاركة في %s.",
"Cheers!" : "تحياتي!"
"Cheers!" : "تحياتي!",
"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>" : "أهلاً؛<br><br>قامت الإدارة بتمكين التشفير من جانب الخادوم. لذا، سيتم تشفير ملفاتك باستخدام كلمة المرور <strong>%s</strong>.<br><br>الرجاء الدخول إلى واجهة الويب ثم الانتقال إلى قسم \"وحدة التشفير الأساسية\" Basic encryption module في إعداداتك الشخصية، و قُم بتحديث كلمة مرور التشفير عن طريق إدخال كلمتىْ مرورك القديمة و الحالية.<br><br>"
},"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

@ -1,28 +1,28 @@
OC.L10N.register(
"encryption",
{
"Missing recovery key password" : "Falta o contrasinal da clave de recuperación",
"Please repeat the recovery key password" : "Repita o contrasinal da clave de recuperación",
"Repeated recovery key password does not match the provided recovery key password" : "A repetición do contrasinal da clave de recuperación non coincide co contrasinal da clave de recuperación fornecido",
"Recovery key successfully enabled" : "A clave de recuperación foi activada satisfactoriamente ",
"Could not enable recovery key. Please check your recovery key password!" : "Non foi posíbel activar a clave de recuperación. Comprobe o contrasinal da clave de recuperación!",
"Recovery key successfully disabled" : "A clave de recuperación foi desactivada satisfactoriamente ",
"Could not disable recovery key. Please check your recovery key password!" : "Non foi posíbel desactivar a clave de recuperación. Comprobe o contrasinal da clave de recuperación!",
"Missing recovery key password" : "Falta o contrasinal da chave de recuperación",
"Please repeat the recovery key password" : "Repita o contrasinal da chave de recuperación",
"Repeated recovery key password does not match the provided recovery key password" : "A repetición do contrasinal da chave de recuperación non coincide co contrasinal da chave de recuperación fornecido",
"Recovery key successfully enabled" : "A chave de recuperación foi activada satisfactoriamente ",
"Could not enable recovery key. Please check your recovery key password!" : "Non foi posíbel activar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!",
"Recovery key successfully disabled" : "A chave de recuperación foi desactivada satisfactoriamente ",
"Could not disable recovery key. Please check your recovery key password!" : "Non foi posíbel desactivar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!",
"Missing parameters" : "Faltan os parámetros",
"Please provide the old recovery password" : "Introduza o antigo contrasinal de recuperación",
"Please provide a new recovery password" : "Introduza o novo contrasinal de recuperación",
"Please repeat the new recovery password" : "Repita o novo contrasinal de recuperación",
"Password successfully changed." : "O contrasinal foi cambiado satisfactoriamente",
"Could not change the password. Maybe the old password was not correct." : "Non foi posíbel cambiar o contrasinal. Probabelmente o contrasinal antigo non é o correcto.",
"Recovery Key disabled" : "Desactivada a clave de recuperación",
"Recovery Key enabled" : "A clave de recuperación foi activada ",
"Could not enable the recovery key, please try again or contact your administrator" : "Non foi posíbel activar a clave de recuperación, ténteo de novo ou póñase en contacto co administrador.",
"Could not update the private key password." : "Non foi posíbel actualizar o contrasinal da clave privada.",
"Recovery Key disabled" : "Desactivada a chave de recuperación",
"Recovery Key enabled" : "A chave de recuperación foi activada ",
"Could not enable the recovery key, please try again or contact your administrator" : "Non foi posíbel activar a chave de recuperación, ténteo de novo ou póñase en contacto co administrador.",
"Could not update the private key password." : "Non foi posíbel actualizar o contrasinal da chave privada.",
"The old password was not correct, please try again." : "O contrasinal antigo non é correcto, ténteo de novo.",
"The current log-in password was not correct, please try again." : "O actual contrasinal de acceso non é correcto, ténteo de novo.",
"Private key password successfully updated." : "A clave privada foi actualizada correctamente.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "A clave privada para a aplicación de cifrado non é correcta. Actualice o contrasinal da súa clave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros cifrados.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "A aplicación de cifrado está activada, mais non foron preparadas as lhaves. Saia da sesión e volva a acceder de novo",
"Private key password successfully updated." : "A chave privada foi actualizada correctamente.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "A chave privada para a aplicación de cifrado non é correcta. Actualice o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros cifrados.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "A aplicación de cifrado está activada, mais non foron preparadas as lhaves. Saia da sesión e volva acceder de novo",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Active o cifrado no lado do servidor nos axustes de administración para poder usar o módulo de cifrado.",
"Encryption app is enabled and ready" : " A aplicación de cifrado está activada e preparada",
"Bad Signature" : "Sinatura errónea",
@ -30,31 +30,31 @@ OC.L10N.register(
"one-time password for server-side-encryption" : "Contrasinal de só un uso para o cifrado no lado do servidor",
"Default encryption module" : "Módulo de cifrado predeterminado",
"Default encryption module for server-side encryption" : "Módulo de cifrado predeterminado para o cifrado no lado do servidor",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as claves non foron preparadas, saia da sesión e volva a acceder de novo",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as súas chaves non foron preparadas, saia da sesión e volva acceder de novo",
"Encrypt the home storage" : "Cifrar o almacenamento persoal",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ao activar esta opción cífranse todos os ficheiros almacenados no almacenamento principal, senón só se cifran os ficheiros do almacenamento externo.",
"Enable recovery key" : "Activar a clave de recuperación",
"Disable recovery key" : "Desactivar a clave de recuperación",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A clave de recuperación é unha clave de cifrado adicional que se utiliza para cifrar ficheiros. Permite a recuperación de ficheiros dun usuario se o usuario esquece o seu contrasinal.",
"Recovery key password" : "Contrasinal da clave de recuperación",
"Repeat recovery key password" : "Repita o contrasinal da clave de recuperación",
"Change recovery key password:" : "Cambiar o contrasinal da clave de la recuperación:",
"Old recovery key password" : "Contrasinal antigo da clave de recuperación",
"New recovery key password" : "Novo contrasinal da clave de recuperación",
"Repeat new recovery key password" : "Repita o novo contrasinal da clave de recuperación",
"Enable recovery key" : "Activar a chave de recuperación",
"Disable recovery key" : "Desactivar a chave de recuperación",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperación é unha chave de cifrado adicional que se utiliza para cifrar ficheiros. Permite a recuperación de ficheiros dun usuario se o usuario esquece o seu contrasinal.",
"Recovery key password" : "Contrasinal da chave de recuperación",
"Repeat recovery key password" : "Repita o contrasinal da chave de recuperación",
"Change recovery key password:" : "Cambiar o contrasinal da chave de la recuperación:",
"Old recovery key password" : "Contrasinal antigo da chave de recuperación",
"New recovery key password" : "Novo contrasinal da chave de recuperación",
"Repeat new recovery key password" : "Repita o novo contrasinal da chave de recuperación",
"Change Password" : "Cambiar o contrasinal",
"Basic encryption module" : "Módulo de cifrado básico",
"Your private key password no longer matches your log-in password." : "O seu contrasinal da clave privada non coincide co seu contrasinal de acceso.",
"Set your old private key password to your current log-in password:" : "Estabeleza o seu contrasinal antigo da clave de recuperación ao seu contrasinal de acceso actual:",
"Your private key password no longer matches your log-in password." : "O seu contrasinal da chave privada non coincide co seu contrasinal de acceso.",
"Set your old private key password to your current log-in password:" : "Estabeleza o seu contrasinal antigo da chave de recuperación ao seu contrasinal de acceso actual:",
" If you don't remember your old password you can ask your administrator to recover your files." : "Se non lembra o seu antigo contrasinal pode pedirllo ao seu administrador para recuperar os seus ficheiros.",
"Old log-in password" : "Contrasinal antigo de acceso",
"Current log-in password" : "Contrasinal actual de acceso",
"Update Private Key Password" : "Actualizar o contrasinal da clave privada",
"Update Private Key Password" : "Actualizar o contrasinal da chave privada",
"Enable password recovery:" : "Activar o contrasinal de recuperación:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao activar esta opción permitiráselle volver obter acceso aos ficheiros cifrados no caso de perda do contrasinal",
"Enabled" : "Activado",
"Disabled" : "Desactivado",
"In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Para usar este módulo de cifrado é preciso activar o cifrado no lado\n\t\tdo servidor nos axustes de administración. Una vez activado este módulo cifrará\n\t\ttodos os seus ficheiros de xeito transparente. O cifrado basease en claves AES 256.\n\t\tO módulo non tocará os ficheiros existentes, só se cifran os ficheiros novos\n\t\tapós que se active o cifrado no lado do servidor. Tampouco é posíbel\n\t\tdesactivar o cifrado e volver a un sistema sen cifrar.\n\t\tLea a documentación para coñecer todas as implicacións antes de decidir\n\t\tactivar o cifrado no lado do servidor.",
"In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Para usar este módulo de cifrado é preciso activar o cifrado no lado\n\t\tdo servidor nos axustes de administración. Una vez activado este módulo cifrará\n\t\ttodos os seus ficheiros de xeito transparente. O cifrado basease en chave AES 256.\n\t\tO módulo non tocará os ficheiros existentes, só se cifran os ficheiros novos\n\t\tapós que se active o cifrado no lado do servidor. Tampouco é posíbel\n\t\tdesactivar o cifrado e volver a un sistema sen cifrar.\n\t\tLea a documentación para coñecer todas as implicacións antes de decidir\n\t\tactivar o cifrado no lado do servidor.",
"The share will expire on %s." : "Este recurso compartido caduca o %s.",
"Cheers!" : "Saúdos!"
},

View file

@ -1,26 +1,26 @@
{ "translations": {
"Missing recovery key password" : "Falta o contrasinal da clave de recuperación",
"Please repeat the recovery key password" : "Repita o contrasinal da clave de recuperación",
"Repeated recovery key password does not match the provided recovery key password" : "A repetición do contrasinal da clave de recuperación non coincide co contrasinal da clave de recuperación fornecido",
"Recovery key successfully enabled" : "A clave de recuperación foi activada satisfactoriamente ",
"Could not enable recovery key. Please check your recovery key password!" : "Non foi posíbel activar a clave de recuperación. Comprobe o contrasinal da clave de recuperación!",
"Recovery key successfully disabled" : "A clave de recuperación foi desactivada satisfactoriamente ",
"Could not disable recovery key. Please check your recovery key password!" : "Non foi posíbel desactivar a clave de recuperación. Comprobe o contrasinal da clave de recuperación!",
"Missing recovery key password" : "Falta o contrasinal da chave de recuperación",
"Please repeat the recovery key password" : "Repita o contrasinal da chave de recuperación",
"Repeated recovery key password does not match the provided recovery key password" : "A repetición do contrasinal da chave de recuperación non coincide co contrasinal da chave de recuperación fornecido",
"Recovery key successfully enabled" : "A chave de recuperación foi activada satisfactoriamente ",
"Could not enable recovery key. Please check your recovery key password!" : "Non foi posíbel activar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!",
"Recovery key successfully disabled" : "A chave de recuperación foi desactivada satisfactoriamente ",
"Could not disable recovery key. Please check your recovery key password!" : "Non foi posíbel desactivar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!",
"Missing parameters" : "Faltan os parámetros",
"Please provide the old recovery password" : "Introduza o antigo contrasinal de recuperación",
"Please provide a new recovery password" : "Introduza o novo contrasinal de recuperación",
"Please repeat the new recovery password" : "Repita o novo contrasinal de recuperación",
"Password successfully changed." : "O contrasinal foi cambiado satisfactoriamente",
"Could not change the password. Maybe the old password was not correct." : "Non foi posíbel cambiar o contrasinal. Probabelmente o contrasinal antigo non é o correcto.",
"Recovery Key disabled" : "Desactivada a clave de recuperación",
"Recovery Key enabled" : "A clave de recuperación foi activada ",
"Could not enable the recovery key, please try again or contact your administrator" : "Non foi posíbel activar a clave de recuperación, ténteo de novo ou póñase en contacto co administrador.",
"Could not update the private key password." : "Non foi posíbel actualizar o contrasinal da clave privada.",
"Recovery Key disabled" : "Desactivada a chave de recuperación",
"Recovery Key enabled" : "A chave de recuperación foi activada ",
"Could not enable the recovery key, please try again or contact your administrator" : "Non foi posíbel activar a chave de recuperación, ténteo de novo ou póñase en contacto co administrador.",
"Could not update the private key password." : "Non foi posíbel actualizar o contrasinal da chave privada.",
"The old password was not correct, please try again." : "O contrasinal antigo non é correcto, ténteo de novo.",
"The current log-in password was not correct, please try again." : "O actual contrasinal de acceso non é correcto, ténteo de novo.",
"Private key password successfully updated." : "A clave privada foi actualizada correctamente.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "A clave privada para a aplicación de cifrado non é correcta. Actualice o contrasinal da súa clave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros cifrados.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "A aplicación de cifrado está activada, mais non foron preparadas as lhaves. Saia da sesión e volva a acceder de novo",
"Private key password successfully updated." : "A chave privada foi actualizada correctamente.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "A chave privada para a aplicación de cifrado non é correcta. Actualice o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros cifrados.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "A aplicación de cifrado está activada, mais non foron preparadas as lhaves. Saia da sesión e volva acceder de novo",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Active o cifrado no lado do servidor nos axustes de administración para poder usar o módulo de cifrado.",
"Encryption app is enabled and ready" : " A aplicación de cifrado está activada e preparada",
"Bad Signature" : "Sinatura errónea",
@ -28,31 +28,31 @@
"one-time password for server-side-encryption" : "Contrasinal de só un uso para o cifrado no lado do servidor",
"Default encryption module" : "Módulo de cifrado predeterminado",
"Default encryption module for server-side encryption" : "Módulo de cifrado predeterminado para o cifrado no lado do servidor",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as claves non foron preparadas, saia da sesión e volva a acceder de novo",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as súas chaves non foron preparadas, saia da sesión e volva acceder de novo",
"Encrypt the home storage" : "Cifrar o almacenamento persoal",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ao activar esta opción cífranse todos os ficheiros almacenados no almacenamento principal, senón só se cifran os ficheiros do almacenamento externo.",
"Enable recovery key" : "Activar a clave de recuperación",
"Disable recovery key" : "Desactivar a clave de recuperación",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A clave de recuperación é unha clave de cifrado adicional que se utiliza para cifrar ficheiros. Permite a recuperación de ficheiros dun usuario se o usuario esquece o seu contrasinal.",
"Recovery key password" : "Contrasinal da clave de recuperación",
"Repeat recovery key password" : "Repita o contrasinal da clave de recuperación",
"Change recovery key password:" : "Cambiar o contrasinal da clave de la recuperación:",
"Old recovery key password" : "Contrasinal antigo da clave de recuperación",
"New recovery key password" : "Novo contrasinal da clave de recuperación",
"Repeat new recovery key password" : "Repita o novo contrasinal da clave de recuperación",
"Enable recovery key" : "Activar a chave de recuperación",
"Disable recovery key" : "Desactivar a chave de recuperación",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperación é unha chave de cifrado adicional que se utiliza para cifrar ficheiros. Permite a recuperación de ficheiros dun usuario se o usuario esquece o seu contrasinal.",
"Recovery key password" : "Contrasinal da chave de recuperación",
"Repeat recovery key password" : "Repita o contrasinal da chave de recuperación",
"Change recovery key password:" : "Cambiar o contrasinal da chave de la recuperación:",
"Old recovery key password" : "Contrasinal antigo da chave de recuperación",
"New recovery key password" : "Novo contrasinal da chave de recuperación",
"Repeat new recovery key password" : "Repita o novo contrasinal da chave de recuperación",
"Change Password" : "Cambiar o contrasinal",
"Basic encryption module" : "Módulo de cifrado básico",
"Your private key password no longer matches your log-in password." : "O seu contrasinal da clave privada non coincide co seu contrasinal de acceso.",
"Set your old private key password to your current log-in password:" : "Estabeleza o seu contrasinal antigo da clave de recuperación ao seu contrasinal de acceso actual:",
"Your private key password no longer matches your log-in password." : "O seu contrasinal da chave privada non coincide co seu contrasinal de acceso.",
"Set your old private key password to your current log-in password:" : "Estabeleza o seu contrasinal antigo da chave de recuperación ao seu contrasinal de acceso actual:",
" If you don't remember your old password you can ask your administrator to recover your files." : "Se non lembra o seu antigo contrasinal pode pedirllo ao seu administrador para recuperar os seus ficheiros.",
"Old log-in password" : "Contrasinal antigo de acceso",
"Current log-in password" : "Contrasinal actual de acceso",
"Update Private Key Password" : "Actualizar o contrasinal da clave privada",
"Update Private Key Password" : "Actualizar o contrasinal da chave privada",
"Enable password recovery:" : "Activar o contrasinal de recuperación:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao activar esta opción permitiráselle volver obter acceso aos ficheiros cifrados no caso de perda do contrasinal",
"Enabled" : "Activado",
"Disabled" : "Desactivado",
"In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Para usar este módulo de cifrado é preciso activar o cifrado no lado\n\t\tdo servidor nos axustes de administración. Una vez activado este módulo cifrará\n\t\ttodos os seus ficheiros de xeito transparente. O cifrado basease en claves AES 256.\n\t\tO módulo non tocará os ficheiros existentes, só se cifran os ficheiros novos\n\t\tapós que se active o cifrado no lado do servidor. Tampouco é posíbel\n\t\tdesactivar o cifrado e volver a un sistema sen cifrar.\n\t\tLea a documentación para coñecer todas as implicacións antes de decidir\n\t\tactivar o cifrado no lado do servidor.",
"In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Para usar este módulo de cifrado é preciso activar o cifrado no lado\n\t\tdo servidor nos axustes de administración. Una vez activado este módulo cifrará\n\t\ttodos os seus ficheiros de xeito transparente. O cifrado basease en chave AES 256.\n\t\tO módulo non tocará os ficheiros existentes, só se cifran os ficheiros novos\n\t\tapós que se active o cifrado no lado do servidor. Tampouco é posíbel\n\t\tdesactivar o cifrado e volver a un sistema sen cifrar.\n\t\tLea a documentación para coñecer todas as implicacións antes de decidir\n\t\tactivar o cifrado no lado do servidor.",
"The share will expire on %s." : "Este recurso compartido caduca o %s.",
"Cheers!" : "Saúdos!"
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View file

@ -6,7 +6,7 @@ OC.L10N.register(
"Repeated recovery key password does not match the provided recovery key password" : "입력한 복구 키 암호가 서로 다릅니다",
"Recovery key successfully enabled" : "복구 키가 성공적으로 활성화되었습니다",
"Could not enable recovery key. Please check your recovery key password!" : "복구 키를 활성화할 수 없습니다. 복구 키의 암호를 확인해 주십시오!",
"Recovery key successfully disabled" : "복구 키가 성공적으로 비활성화되었습니다",
"Recovery key successfully disabled" : "복구 키가 성공적으로 비활성화되었습니다.",
"Could not disable recovery key. Please check your recovery key password!" : "복구 키를 비활성화할 수 없습니다. 복구 키의 암호를 확인해 주십시오!",
"Missing parameters" : "인자 부족함",
"Please provide the old recovery password" : "이전 복구 암호를 입력하십시오",
@ -23,7 +23,7 @@ OC.L10N.register(
"Private key password successfully updated." : "개인 키 암호가 성공적으로 업데이트되었습니다.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "암호화 앱의 개인 키가 잘못되었습니다. 암호화된 파일에 다시 접근하려면 개인 설정에서 개인 키 암호를 업데이트해야 합니다.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "암호화 앱이 활성화되었으나 키가 초기화되지 않았습니다. 로그아웃한 후 다시 로그인하십시오.",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "암호화 모듈을 사용하려면 관리자 설정에서 서버 측 암호화 기능을 활성화해야 합니다",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "암호화 모듈을 사용하려면 관리자 설정에서 서버 측 암호화 기능을 활성화해야 합니다.",
"Encryption app is enabled and ready" : "암호화 앱이 활성화되었고 준비됨",
"Bad Signature" : "잘못된 서명",
"Missing Signature" : "서명 없음",

View file

@ -4,7 +4,7 @@
"Repeated recovery key password does not match the provided recovery key password" : "입력한 복구 키 암호가 서로 다릅니다",
"Recovery key successfully enabled" : "복구 키가 성공적으로 활성화되었습니다",
"Could not enable recovery key. Please check your recovery key password!" : "복구 키를 활성화할 수 없습니다. 복구 키의 암호를 확인해 주십시오!",
"Recovery key successfully disabled" : "복구 키가 성공적으로 비활성화되었습니다",
"Recovery key successfully disabled" : "복구 키가 성공적으로 비활성화되었습니다.",
"Could not disable recovery key. Please check your recovery key password!" : "복구 키를 비활성화할 수 없습니다. 복구 키의 암호를 확인해 주십시오!",
"Missing parameters" : "인자 부족함",
"Please provide the old recovery password" : "이전 복구 암호를 입력하십시오",
@ -21,7 +21,7 @@
"Private key password successfully updated." : "개인 키 암호가 성공적으로 업데이트되었습니다.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "암호화 앱의 개인 키가 잘못되었습니다. 암호화된 파일에 다시 접근하려면 개인 설정에서 개인 키 암호를 업데이트해야 합니다.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "암호화 앱이 활성화되었으나 키가 초기화되지 않았습니다. 로그아웃한 후 다시 로그인하십시오.",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "암호화 모듈을 사용하려면 관리자 설정에서 서버 측 암호화 기능을 활성화해야 합니다",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "암호화 모듈을 사용하려면 관리자 설정에서 서버 측 암호화 기능을 활성화해야 합니다.",
"Encryption app is enabled and ready" : "암호화 앱이 활성화되었고 준비됨",
"Bad Signature" : "잘못된 서명",
"Missing Signature" : "서명 없음",

View file

@ -28,10 +28,15 @@ OC.L10N.register(
"Bad Signature" : "Погана сиґнатура",
"Missing Signature" : "Відсутній підпис",
"one-time password for server-side-encryption" : "одноразовий пароль для шифрування на сервері",
"Encryption password" : "Пароль для шифрування",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Адміністратор увімкнув шифрування даних на рівні сервера. Ваші файли було зашифровано з використанням паролю <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Адміністратор увімкнув шифрування даних на рівні сервера. Ваші файли було зашифровано з використанням паролю \"%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 log-in password\" field and your current login-password." : "Будь ласка, відкрийте вебсторінку хмари, перейдіть до розділу \"Безпека\" у особистих налаштуваннях та оновіть пароль шифрування, для цього зазначте парольні фрази у полях \"Старий пароль для входу\" та поточний пароль.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не вдається розшифрувати цей файл, ймовірно, він знаходиться у спільному доступі. Будь ласка, зверніться до власника файлу з проханням надати вам доступ до нього.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не вдається прочитати цей файл, ймовірно, це файл із загальним доступом. Будь ласка, попросіть власника файлу надати вам спільний доступ до нього. ",
"Default encryption module" : "Типовий модуль шифрування",
"Default encryption module for server-side encryption" : "Типовий модуль шифрування для шифрування на стороні сервера",
"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." : "Для користування цим модулем шифрування потрібно увімкнути шифрування даних на рівні сервера у налаштуваннях адміністратора. Одразу після увімкнення цього модуля ваші дані буде зашифровано з використанням AES 256 ключа.\nЗверніть увагу, що цей модуль передбачає, що шифрування буде застосовано тільки до нових файлів, файли, які було створено до увімкнення шифрування залишаться незашифровані. Також подалі не буде можливо вимкнути шифрування та повернутися до незашифрованого стану системи.\nБудь ласка, ознайомтеся з документацією та врахуйте всі ризики до того, як увімкнете шифрування на рівні сервера.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Програму для шифрування ввімкнено, але ваші ключі не ініціалізовано. Будь ласка, вийдіть із системи та увійдіть знову",
"Encrypt the home storage" : "Зашифрувати домашній каталог",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Увімкнення цього параметра шифрує всі файли, що зберігаються в основній пам’яті, інакше будуть зашифровані лише файли на зовнішній пам’яті",
@ -56,7 +61,10 @@ OC.L10N.register(
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Включення цієї опції дозволить вам отримати доступ до своїх зашифрованих файлів у випадку втрати паролю",
"Enabled" : "Увімкнено",
"Disabled" : "Вимкнено",
"In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Для користування цим модулем шифрування потрібно увімкнути шифрування даних на рівні сервера \n\t\tу налаштуваннях адміністратора. Одразу після увімкнення цього модуля ваші дані буде \n\t\tзашифровано з використанням AES 256 ключа. Зверніть увагу, що цей модуль передбачає, \n\t\tщо шифрування буде застосовано тільки до нових файлів, файли, які було створено до \n\t\tувімкнення шифрування залишаться незашифровані. Також подалі не буде можливо \n\t\tвимкнути шифрування та повернутися до незашифрованого стану системи.\n\t\tБудь ласка, ознайомтеся з документацією та врахуйте всі ризики до того, як \n\t\tувімкнете шифрування на рівні сервера.",
"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" : "Вітання!\n\nАдміністратор увімкнув шифрування даних на рівні сервера. Ваші файли буде зашифровано з використанням паролю \"%s\".\n\nБудь ласка, перейдіть до розділу \"Основний модуль шифрування\" (Basic encryption module) ваших особистих налаштувань на вебсторінці хмари та оновіть пароль шифрування, для цього введіть цей пароль у полі \"Старий пароль для входу\" та поточний пароль авторизації.\n",
"The share will expire on %s." : "Спільний доступ закінчиться %s.",
"Cheers!" : "Будьмо!"
"Cheers!" : "Будьмо!",
"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>" : "Вітання!<br><br>Адміністратор увімкнув шифрування даних на рівні сервера. Ваші файли буде зашифровано з використанням паролю <strong>%s</strong><br><br>Будь ласка, перейдіть до розділу \"Основний модуль шифрування\" (Basic encryption module) ваших особистих налаштувань на вебсторінці хмари та оновіть пароль шифрування, для цього введіть цей пароль у полі \"Старий пароль для входу\" та поточний пароль авторизації.<br><br>"
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");

View file

@ -26,10 +26,15 @@
"Bad Signature" : "Погана сиґнатура",
"Missing Signature" : "Відсутній підпис",
"one-time password for server-side-encryption" : "одноразовий пароль для шифрування на сервері",
"Encryption password" : "Пароль для шифрування",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Адміністратор увімкнув шифрування даних на рівні сервера. Ваші файли було зашифровано з використанням паролю <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Адміністратор увімкнув шифрування даних на рівні сервера. Ваші файли було зашифровано з використанням паролю \"%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 log-in password\" field and your current login-password." : "Будь ласка, відкрийте вебсторінку хмари, перейдіть до розділу \"Безпека\" у особистих налаштуваннях та оновіть пароль шифрування, для цього зазначте парольні фрази у полях \"Старий пароль для входу\" та поточний пароль.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не вдається розшифрувати цей файл, ймовірно, він знаходиться у спільному доступі. Будь ласка, зверніться до власника файлу з проханням надати вам доступ до нього.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не вдається прочитати цей файл, ймовірно, це файл із загальним доступом. Будь ласка, попросіть власника файлу надати вам спільний доступ до нього. ",
"Default encryption module" : "Типовий модуль шифрування",
"Default encryption module for server-side encryption" : "Типовий модуль шифрування для шифрування на стороні сервера",
"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." : "Для користування цим модулем шифрування потрібно увімкнути шифрування даних на рівні сервера у налаштуваннях адміністратора. Одразу після увімкнення цього модуля ваші дані буде зашифровано з використанням AES 256 ключа.\nЗверніть увагу, що цей модуль передбачає, що шифрування буде застосовано тільки до нових файлів, файли, які було створено до увімкнення шифрування залишаться незашифровані. Також подалі не буде можливо вимкнути шифрування та повернутися до незашифрованого стану системи.\nБудь ласка, ознайомтеся з документацією та врахуйте всі ризики до того, як увімкнете шифрування на рівні сервера.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Програму для шифрування ввімкнено, але ваші ключі не ініціалізовано. Будь ласка, вийдіть із системи та увійдіть знову",
"Encrypt the home storage" : "Зашифрувати домашній каталог",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Увімкнення цього параметра шифрує всі файли, що зберігаються в основній пам’яті, інакше будуть зашифровані лише файли на зовнішній пам’яті",
@ -54,7 +59,10 @@
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Включення цієї опції дозволить вам отримати доступ до своїх зашифрованих файлів у випадку втрати паролю",
"Enabled" : "Увімкнено",
"Disabled" : "Вимкнено",
"In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Для користування цим модулем шифрування потрібно увімкнути шифрування даних на рівні сервера \n\t\tу налаштуваннях адміністратора. Одразу після увімкнення цього модуля ваші дані буде \n\t\tзашифровано з використанням AES 256 ключа. Зверніть увагу, що цей модуль передбачає, \n\t\tщо шифрування буде застосовано тільки до нових файлів, файли, які було створено до \n\t\tувімкнення шифрування залишаться незашифровані. Також подалі не буде можливо \n\t\tвимкнути шифрування та повернутися до незашифрованого стану системи.\n\t\tБудь ласка, ознайомтеся з документацією та врахуйте всі ризики до того, як \n\t\tувімкнете шифрування на рівні сервера.",
"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" : "Вітання!\n\nАдміністратор увімкнув шифрування даних на рівні сервера. Ваші файли буде зашифровано з використанням паролю \"%s\".\n\nБудь ласка, перейдіть до розділу \"Основний модуль шифрування\" (Basic encryption module) ваших особистих налаштувань на вебсторінці хмари та оновіть пароль шифрування, для цього введіть цей пароль у полі \"Старий пароль для входу\" та поточний пароль авторизації.\n",
"The share will expire on %s." : "Спільний доступ закінчиться %s.",
"Cheers!" : "Будьмо!"
"Cheers!" : "Будьмо!",
"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>" : "Вітання!<br><br>Адміністратор увімкнув шифрування даних на рівні сервера. Ваші файли буде зашифровано з використанням паролю <strong>%s</strong><br><br>Будь ласка, перейдіть до розділу \"Основний модуль шифрування\" (Basic encryption module) ваших особистих налаштувань на вебсторінці хмари та оновіть пароль шифрування, для цього введіть цей пароль у полі \"Старий пароль для входу\" та поточний пароль авторизації.<br><br>"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
}

View file

@ -1,7 +1,59 @@
OC.L10N.register(
"federatedfilesharing",
{
"Invalid Federated Cloud ID" : "معرّف السحابة المتحدة غير صالح",
"Accept" : "قبول"
"Do you want to add the remote share {name} from {owner}@{remote}?" : "هل ترغب في إضافة مُشاركة قصيّة remote ـ {name} من {owner}@{remote}؟",
"Remote share" : "مُشاركة قصيّة remote",
"Remote share password" : "كلمة مرور مُشاركة قصيّة remote",
"Cancel" : "إلغاء",
"Add remote share" : "إضافة مُشاركة قصيّة remote",
"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)." : "تعذّر تأسيس مُشاركة اتحاديّة. يبدو أن إصدار خادوم نكست كلاود الذي طلبت الاتحاد معه قديمٌ ( ما قبل الإصدار 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. يُمكن أن يكون هذ بسبب أن الخادوم لا يُمكن الوصول إليه حاليّاً أو أنه يستعمل شهادةً ذاتيّة التصديق self-signed certificate.",
"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" : "البحث في سجلات العناوين العمومية public و الشاملة glabal عن مُستخدِمين",
"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" : "يُمكنك المشاركة مع أي شخص يستخدم خادوم نكست كلاود أو خوادم وخدمات أخرى متوافقة مع بروتوكول Open Cloud Mesh (OCM)! فقط ضع مُعرّف السحابة الاتحاديّة Federated Cloud في مربع حوار المُشاركة؛ و الذي سيكون شكله على هذا النسق: 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 Federated Cloud ID، أنظر {url} ",
"Share with me through my #Nextcloud Federated Cloud ID" : "شارك معي عبر #مُعرّف سحابة نكست كلاود الاتّحاديّة Nextcloud Federated Cloud ID",
"Cloud ID copied to the clipboard" : "تمّ نسخ مُعرّف السحابة إلى الحافظة",
"Copy to clipboard" : "نسخ الرابط",
"Clipboard is not available" : "الحافظة غير متوافرة",
"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 Federated Cloud ID. أنظر %s"
},
"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;");

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