Compare commits

..

3 commits

Author SHA1 Message Date
Christoph Wurst
efe52c96e3
fixup! Use external Toast implementation and deprecate the OCP API
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-03-03 10:01:10 +01:00
Christoph Wurst
f83c11e923
Inline usages of OCP.Toast in bundled files
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-02-14 18:09:55 +01:00
Christoph Wurst
efec045afe
Use external Toast implementation and deprecate the OCP API
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-02-14 18:06:20 +01:00
703 changed files with 2440 additions and 5095 deletions

View file

@ -41,6 +41,25 @@ trigger:
- pull_request
- push
---
kind: pipeline
name: handlebars
steps:
- name: handlebars
image: node
commands:
- npm i
- ./build/compile-handlebars-templates.sh
trigger:
branch:
- master
- stable*
event:
- pull_request
- push
#---
#kind: pipeline
#name: syntax-and-phan

View file

@ -48,20 +48,3 @@ jobs:
npm ci
- name: Test
run: npm run test
handlebars:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.x]
steps:
- uses: actions/checkout@v2
- name: Use node ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: |
npm ci
- name: Run compile
run: ./build/compile-handlebars-templates.sh

@ -1 +1 @@
Subproject commit 97fb70b955d004d781142ee409210fcb9b6eb853
Subproject commit ad7f5526980028b68bc8dcca9a63efc9cae37562

View file

@ -4,7 +4,7 @@ all: clean dev-setup build-js-production
dev-setup: clean clean-dev npm-init
npm-init:
npm ci
npm install
npm-update:
npm update

View file

@ -61,7 +61,7 @@ Otherwise, git checkouts can be handled the same as release archives, by using t
### Building front-end code 🏗
We are moving more and more towards using Vue.js in the frontend, starting with Settings. For building the code on changes, use these terminal commands in the root folder:
We move more and more towards using Vue.js in the frontend, starting with Settings. For building the code on changes, use these terminal commands in the root folder:
``` bash
# install dependencies

View file

@ -1,28 +1,21 @@
OC.L10N.register(
"accessibility",
{
"Dark theme" : "مظهر داكن",
"Enable dark theme" : "تفعيل المظهر الداكن",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "المظهر الداكن يخفف من الإرهاق على عينيك، وذلك بتخفيض حدّة الإضاءة والسطوع. هذه الميزة لا تزال تحت التطوير، لهذا نود منكم الإبلاغ عن أي مشكلة قد تصادفكم.",
"High contrast mode" : "وضع تباين الألوان العالي",
"Enable high contrast mode" : "تفعيل وضع تباين الألوان العالي",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع تباين الألوان العالي يساعدك على التنقل في الموقع بسهولة. الجودة المرئية سوف تقل بينما الوضوح سيزداد.",
"Dyslexia font" : "خط خاص بالمصابين بعسر القراءة",
"Enable dyslexia font" : "تفعيل الخط الخاص بالمصابين بعسر القراءة",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic خط مجاني مصمم للمساعدة على تفادي الأخطاء لمن يعانون من عسر القراءة.",
"Accessibility" : "تسهيل الإستعمال",
"Accessibility options for nextcloud" : "خيارات تسهيل إستعمال نكست كلاود",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "توفر عدة خيارات تسهيل إستعمال لتسهيل تنقلك على نكست كلاود",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "الوصول الشامل مهم جدا بالنسبة لنا. نحن نتبع معايير ويب صارمة ونتأكد من أن كل شيء يمكن إستعماله حتى دون الحاجة للفأرة أو إلى أي برامج مساعدة مثل برامج قراءة الشاشة. هدفنا أن نكون متوافقين مع {guidelines} توجيهات تسهيل إستعمال محتوى الويب {linkend} 2.1 بمستوى AA، ومتوافقين مع مظهر تباين الألوان العالي بمستوى يصل حتى إلى AAA.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "إذا واجهت أي مشاكل، لا تتردد بالإبلاغ عنها على {issuetracker} متعقب المشاكل الخاص بنا {linkend}. أما إذا أردت المشاركة في التطوير، إنضم إلى {designteam} فريق التصميم {linkend}!",
"High contrast theme" : "وضع تباين الألوان العالي",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع تباين الألوان العالي يساعدك في التنقل بين القوائم بسهولة. الجودة المرئية سوف تقل بينما الوضوح سيزداد.",
"Dark theme (beta)" : "مظهر داكن (تجريبي)",
"Web Content Accessibility Guidelines" : "توجيهات تسهيل إستعمال محتوى الويب",
"our issue tracker" : "متعقب المشاكل الخاص بنا",
"Dark theme" : "مظهر مظلم",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "المظهر المظلم يخفف من الإرهاق على عينيك، عن طريق تخفيض النور والسطوعة بشكلٍ عام من التطبيق. هذي الميزة لا زالت تحت التطوير، لهذا السبب نود منكم بإبلاغ عن أي مشكلة قد تصادفكم.",
"High contrast mode" : "وضع التباين العالي",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع التباين العالي يساعدك في إستخدام التطبيق والإنتقال في القوائم بسهوله. علماً أن الجودة سوف تتظرر سلبياً من هذا الوضع لكن الدقة سوف تتحسن بكثير.",
"Dyslexia font" : "خط لعسر القرائة",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic خط مجاني مصمم للمساعدة في تصحيح الأخطاء المتسببة من عسر القرائة.",
"Accessibility" : "إمكانية الوصول",
"Accessibility options for nextcloud" : "خيارات إمكانية الوصول لـNextCloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "توفر خيارات إمكانية الوصول عديدة لتسهيل إستخدامك لـNextCloud",
"High contrast theme" : "وضع التباين العالي",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع التباين العالي يساعدك في إستخدام التطبيق والإنتقال في القوائم بسهوله. علماً أن الجودة سوف تتظرر سلبياً من هذا الوضع لكن الدقة سوف تتحسن بكثير.",
"Dark theme (beta)" : "مظهر مظلم (تحت التجريب)",
"Web Content Accessibility Guidelines" : "شروط إمكانية الوصول لمحتوى الويب",
"our issue tracker" : "تعقب الأخطاء الخاص بنا",
"our design team" : "فريق التصميم الخاص بنا",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "الوصول الشامل مهم جدا بالنسبة لنا. نحن نتبع معايير ويب صارمة ونتأكد من أن كل شيء يمكن إستعماله حتى دون الحاجة للفأرة أو إلى أي برامج مساعدة مثل برامج قراءة الشاشة. هدفنا أن نكون متوافقين مع {guidelines} 2.1 بمستوى AA، ومتوافقين مع مظهر تباين الألوان العالي بمستوى يصل حتى إلى AAA.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "إذا واجهت أي مشاكل، لا تتردد بالإبلاغ عنها على {issuetracker}. أما إذا أردت المشاركة في التطوير، إنضم إلينا {designteam}!",
"Enable" : "تفعيل"
},
"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,26 +1,19 @@
{ "translations": {
"Dark theme" : "مظهر داكن",
"Enable dark theme" : "تفعيل المظهر الداكن",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "المظهر الداكن يخفف من الإرهاق على عينيك، وذلك بتخفيض حدّة الإضاءة والسطوع. هذه الميزة لا تزال تحت التطوير، لهذا نود منكم الإبلاغ عن أي مشكلة قد تصادفكم.",
"High contrast mode" : "وضع تباين الألوان العالي",
"Enable high contrast mode" : "تفعيل وضع تباين الألوان العالي",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع تباين الألوان العالي يساعدك على التنقل في الموقع بسهولة. الجودة المرئية سوف تقل بينما الوضوح سيزداد.",
"Dyslexia font" : "خط خاص بالمصابين بعسر القراءة",
"Enable dyslexia font" : "تفعيل الخط الخاص بالمصابين بعسر القراءة",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic خط مجاني مصمم للمساعدة على تفادي الأخطاء لمن يعانون من عسر القراءة.",
"Accessibility" : "تسهيل الإستعمال",
"Accessibility options for nextcloud" : "خيارات تسهيل إستعمال نكست كلاود",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "توفر عدة خيارات تسهيل إستعمال لتسهيل تنقلك على نكست كلاود",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "الوصول الشامل مهم جدا بالنسبة لنا. نحن نتبع معايير ويب صارمة ونتأكد من أن كل شيء يمكن إستعماله حتى دون الحاجة للفأرة أو إلى أي برامج مساعدة مثل برامج قراءة الشاشة. هدفنا أن نكون متوافقين مع {guidelines} توجيهات تسهيل إستعمال محتوى الويب {linkend} 2.1 بمستوى AA، ومتوافقين مع مظهر تباين الألوان العالي بمستوى يصل حتى إلى AAA.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "إذا واجهت أي مشاكل، لا تتردد بالإبلاغ عنها على {issuetracker} متعقب المشاكل الخاص بنا {linkend}. أما إذا أردت المشاركة في التطوير، إنضم إلى {designteam} فريق التصميم {linkend}!",
"High contrast theme" : "وضع تباين الألوان العالي",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع تباين الألوان العالي يساعدك في التنقل بين القوائم بسهولة. الجودة المرئية سوف تقل بينما الوضوح سيزداد.",
"Dark theme (beta)" : "مظهر داكن (تجريبي)",
"Web Content Accessibility Guidelines" : "توجيهات تسهيل إستعمال محتوى الويب",
"our issue tracker" : "متعقب المشاكل الخاص بنا",
"Dark theme" : "مظهر مظلم",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "المظهر المظلم يخفف من الإرهاق على عينيك، عن طريق تخفيض النور والسطوعة بشكلٍ عام من التطبيق. هذي الميزة لا زالت تحت التطوير، لهذا السبب نود منكم بإبلاغ عن أي مشكلة قد تصادفكم.",
"High contrast mode" : "وضع التباين العالي",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع التباين العالي يساعدك في إستخدام التطبيق والإنتقال في القوائم بسهوله. علماً أن الجودة سوف تتظرر سلبياً من هذا الوضع لكن الدقة سوف تتحسن بكثير.",
"Dyslexia font" : "خط لعسر القرائة",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic خط مجاني مصمم للمساعدة في تصحيح الأخطاء المتسببة من عسر القرائة.",
"Accessibility" : "إمكانية الوصول",
"Accessibility options for nextcloud" : "خيارات إمكانية الوصول لـNextCloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "توفر خيارات إمكانية الوصول عديدة لتسهيل إستخدامك لـNextCloud",
"High contrast theme" : "وضع التباين العالي",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع التباين العالي يساعدك في إستخدام التطبيق والإنتقال في القوائم بسهوله. علماً أن الجودة سوف تتظرر سلبياً من هذا الوضع لكن الدقة سوف تتحسن بكثير.",
"Dark theme (beta)" : "مظهر مظلم (تحت التجريب)",
"Web Content Accessibility Guidelines" : "شروط إمكانية الوصول لمحتوى الويب",
"our issue tracker" : "تعقب الأخطاء الخاص بنا",
"our design team" : "فريق التصميم الخاص بنا",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "الوصول الشامل مهم جدا بالنسبة لنا. نحن نتبع معايير ويب صارمة ونتأكد من أن كل شيء يمكن إستعماله حتى دون الحاجة للفأرة أو إلى أي برامج مساعدة مثل برامج قراءة الشاشة. هدفنا أن نكون متوافقين مع {guidelines} 2.1 بمستوى AA، ومتوافقين مع مظهر تباين الألوان العالي بمستوى يصل حتى إلى AAA.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "إذا واجهت أي مشاكل، لا تتردد بالإبلاغ عنها على {issuetracker}. أما إذا أردت المشاركة في التطوير، إنضم إلينا {designteam}!",
"Enable" : "تفعيل"
},"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

@ -2,13 +2,10 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "Mørk tema",
"Enable dark theme" : "Aktiver Mørk tema",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Et mørk tema, venligere for øjnene ved at dæmpe lysstyrken. Det er stadig under udvikling så indberet venligst alle problemer du måtte finde.",
"High contrast mode" : "Højkontrasttilstand",
"Enable high contrast mode" : "aktiver højkontrasttilstand",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "En højkontrasttilstand letter navigationen. Presentation af lavere kvalitet, men tydeligere.",
"Dyslexia font" : "Skrifftype for ordblinde",
"Enable dyslexia font" : "aktiver skrifftype for ordblinde",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic er en gratis skrifttype designet til at undgå læsefejl pga. ordblindhed",
"Accessibility" : "Handicapvenlig",
"Accessibility options for nextcloud" : "Handicapvenlige indstillinger for nextcloud",

View file

@ -1,12 +1,9 @@
{ "translations": {
"Dark theme" : "Mørk tema",
"Enable dark theme" : "Aktiver Mørk tema",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Et mørk tema, venligere for øjnene ved at dæmpe lysstyrken. Det er stadig under udvikling så indberet venligst alle problemer du måtte finde.",
"High contrast mode" : "Højkontrasttilstand",
"Enable high contrast mode" : "aktiver højkontrasttilstand",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "En højkontrasttilstand letter navigationen. Presentation af lavere kvalitet, men tydeligere.",
"Dyslexia font" : "Skrifftype for ordblinde",
"Enable dyslexia font" : "aktiver skrifftype for ordblinde",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic er en gratis skrifttype designet til at undgå læsefejl pga. ordblindhed",
"Accessibility" : "Handicapvenlig",
"Accessibility options for nextcloud" : "Handicapvenlige indstillinger for nextcloud",

View file

@ -2,19 +2,14 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "Σκούρο θέμα",
"Enable dark theme" : "Ενεργοποίηση σκούρου θέματος",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Ένα σκοτεινό θέμα που διευκολύνει τα μάτια σας μειώνοντας την συνολική ακτινοβολία και φωτεινότητα. Είναι ακόμη υπό δοκιμή, οπότε θα σας παρακαλούσαμε να αναφέρετε οποιαδήποτε προβλήματα παρατηρηθούν.",
"High contrast mode" : "Λειτουργία υψηλής αντίθεσης",
"Enable high contrast mode" : "Ενεργοποίηση λειτουργίας υψηλής αντίθεσης",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Λειτουργία με υψηλή αντίθεση για να διευκολύνει την πλοήγηση σας. Η οπτική ποιότητα θα είναι μειωμένη αλλά θα έχετε υψηλότερη ευκρίνεια.",
"Dyslexia font" : "Γραμματοσειρά για δυσλεκτικούς",
"Enable dyslexia font" : "Ενεργοποίηση γραμματοσειράς για δυσλεκτικούς",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Η OpenDyslexic είναι μία δωρεάν γραμματοσειρά σχεδιασμένη ώστε να περιορίζει ορισμένα από τα πιο συνήθη προβλήματα που προκαλεί η δυσλεξία στην ανάγνωση",
"Accessibility" : "Προσβασιμότητα",
"Accessibility options for nextcloud" : "Ρυθμίσεις προσβασιμότητας του nextcloud.",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Προσφέρει πολλαπλές επιλογές προσβασιμότητας για να διευκολύνουν τη χρήση του Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Η γενική πρόσβαση είναι πολύ σημαντική για εμάς. Ακολουθούμε τα πρότυπα του διαδικτύου και ελέγχουμε ότι τα πάντα μπορούν να χρησιμοποιηθούν χωρίς ποντίκι και βοηθητικό λογισμικό όπως προγράμματα ανάγνωσης οθόνης. Στόχος μας είναι να συμμορφωνόμαστε με την {guidelines} Πρόσβαση Περιεχομένου Ιστού Guidelines{linkend} 2.1 σε επίπεδο AA, με το θέμα υψηλής αντίθεσης ακόμη και σε επίπεδο ΑΑΑ.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Αν διαπιστώσετε τυχόν προβλήματα, μη διστάσετε να τα αναφέρετε στον {issuetracker} στον διακομιστή προβλημάτων μας{linkend}. Και αν θέλετε να εμπλακείτε, ελάτε στο {designteam} στην ομάδα σχεδιασμού μας{linkend}!",
"High contrast theme" : "Θέμα υψηλής αντίθεσης",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Ένα θέμα με υψηλή αντίθεση για να διευκολύνει την πλοήγηση σας. Η οπτική ποιότητα θα είναι μειωμένη αλλά θα έχετε υψηλότερη ευκρίνεια.",
"Dark theme (beta)" : "Σκοτεινό θέμα (δοκιμαστική έκδοση)",

View file

@ -1,18 +1,13 @@
{ "translations": {
"Dark theme" : "Σκούρο θέμα",
"Enable dark theme" : "Ενεργοποίηση σκούρου θέματος",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Ένα σκοτεινό θέμα που διευκολύνει τα μάτια σας μειώνοντας την συνολική ακτινοβολία και φωτεινότητα. Είναι ακόμη υπό δοκιμή, οπότε θα σας παρακαλούσαμε να αναφέρετε οποιαδήποτε προβλήματα παρατηρηθούν.",
"High contrast mode" : "Λειτουργία υψηλής αντίθεσης",
"Enable high contrast mode" : "Ενεργοποίηση λειτουργίας υψηλής αντίθεσης",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Λειτουργία με υψηλή αντίθεση για να διευκολύνει την πλοήγηση σας. Η οπτική ποιότητα θα είναι μειωμένη αλλά θα έχετε υψηλότερη ευκρίνεια.",
"Dyslexia font" : "Γραμματοσειρά για δυσλεκτικούς",
"Enable dyslexia font" : "Ενεργοποίηση γραμματοσειράς για δυσλεκτικούς",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Η OpenDyslexic είναι μία δωρεάν γραμματοσειρά σχεδιασμένη ώστε να περιορίζει ορισμένα από τα πιο συνήθη προβλήματα που προκαλεί η δυσλεξία στην ανάγνωση",
"Accessibility" : "Προσβασιμότητα",
"Accessibility options for nextcloud" : "Ρυθμίσεις προσβασιμότητας του nextcloud.",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Προσφέρει πολλαπλές επιλογές προσβασιμότητας για να διευκολύνουν τη χρήση του Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Η γενική πρόσβαση είναι πολύ σημαντική για εμάς. Ακολουθούμε τα πρότυπα του διαδικτύου και ελέγχουμε ότι τα πάντα μπορούν να χρησιμοποιηθούν χωρίς ποντίκι και βοηθητικό λογισμικό όπως προγράμματα ανάγνωσης οθόνης. Στόχος μας είναι να συμμορφωνόμαστε με την {guidelines} Πρόσβαση Περιεχομένου Ιστού Guidelines{linkend} 2.1 σε επίπεδο AA, με το θέμα υψηλής αντίθεσης ακόμη και σε επίπεδο ΑΑΑ.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Αν διαπιστώσετε τυχόν προβλήματα, μη διστάσετε να τα αναφέρετε στον {issuetracker} στον διακομιστή προβλημάτων μας{linkend}. Και αν θέλετε να εμπλακείτε, ελάτε στο {designteam} στην ομάδα σχεδιασμού μας{linkend}!",
"High contrast theme" : "Θέμα υψηλής αντίθεσης",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Ένα θέμα με υψηλή αντίθεση για να διευκολύνει την πλοήγηση σας. Η οπτική ποιότητα θα είναι μειωμένη αλλά θα έχετε υψηλότερη ευκρίνεια.",
"Dark theme (beta)" : "Σκοτεινό θέμα (δοκιμαστική έκδοση)",

View file

@ -2,25 +2,20 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "Tema oscuro",
"Enable dark theme" : "Habilitar tema nocturno",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Un tema oscuro para facilitar la vista al reducir la luminosidad y el brillo general. Todavía está en desarrollo, por lo tanto, informe cualquier problema que pueda encontrar.",
"High contrast mode" : "Modo alto contraste",
"Enable high contrast mode" : "Habilitar modo de Contraste Alto",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un modo de alto contraste para facilitar su navegación. Se reducirá la calidad visual pero se aumentará la claridad.",
"Dyslexia font" : "Dislexia fuente",
"Enable dyslexia font" : "Habilitar la fuente para personas con dislexia",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic es un tipo de letra/fuente gratuita diseñada para mitigar algunos de los errores comunes de lectura causados por la dislexia.",
"Accessibility" : "Accesibilidad",
"Accessibility options for nextcloud" : "Opciones de accesibilidad para nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Proporciona múltiples opciones de accesibilidad para facilitar el uso de Nextcloud",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si encuentra algún problema, no dude en informarlo en {issuetracker}nuestro rastreador de problemas {linkend}. Y si desea participar, ¡únase a {designteam}a nuestro equipo de diseño {linkend}!",
"High contrast theme" : "Tema de alto contraste",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un tema de alto contraste para facilitar su navegación. Se reducirá la calidad visual pero se aumentará la claridad.",
"Dark theme (beta)" : "Tema oscuro (beta)",
"Web Content Accessibility Guidelines" : "Pautas de accesibilidad de contenido web",
"our issue tracker" : "nuestro rastreador de problemas",
"our design team" : "nuestro equipo de diseño",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Si encuentras algún problema, no dudes en informarlo en {issuetracker}. Y si deseas involucrarte, ¡unite a {designteam}!",
"Enable" : "Habilitar"
},
"nplurals=2; plural=(n != 1);");

View file

@ -1,24 +1,19 @@
{ "translations": {
"Dark theme" : "Tema oscuro",
"Enable dark theme" : "Habilitar tema nocturno",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Un tema oscuro para facilitar la vista al reducir la luminosidad y el brillo general. Todavía está en desarrollo, por lo tanto, informe cualquier problema que pueda encontrar.",
"High contrast mode" : "Modo alto contraste",
"Enable high contrast mode" : "Habilitar modo de Contraste Alto",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un modo de alto contraste para facilitar su navegación. Se reducirá la calidad visual pero se aumentará la claridad.",
"Dyslexia font" : "Dislexia fuente",
"Enable dyslexia font" : "Habilitar la fuente para personas con dislexia",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic es un tipo de letra/fuente gratuita diseñada para mitigar algunos de los errores comunes de lectura causados por la dislexia.",
"Accessibility" : "Accesibilidad",
"Accessibility options for nextcloud" : "Opciones de accesibilidad para nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Proporciona múltiples opciones de accesibilidad para facilitar el uso de Nextcloud",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si encuentra algún problema, no dude en informarlo en {issuetracker}nuestro rastreador de problemas {linkend}. Y si desea participar, ¡únase a {designteam}a nuestro equipo de diseño {linkend}!",
"High contrast theme" : "Tema de alto contraste",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un tema de alto contraste para facilitar su navegación. Se reducirá la calidad visual pero se aumentará la claridad.",
"Dark theme (beta)" : "Tema oscuro (beta)",
"Web Content Accessibility Guidelines" : "Pautas de accesibilidad de contenido web",
"our issue tracker" : "nuestro rastreador de problemas",
"our design team" : "nuestro equipo de diseño",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Si encuentras algún problema, no dudes en informarlo en {issuetracker}. Y si deseas involucrarte, ¡unite a {designteam}!",
"Enable" : "Habilitar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -2,27 +2,20 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "Gai iluna",
"Enable dark theme" : "Gaitu gai iluna",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Murriztu begietan kalte egitea gai ilunarekin: argitasun orokorra eta distira jaisten ditu. Garapenean dagoen aukera da, beraz jakinarazi aurkitzen dituzun arazoak.",
"High contrast mode" : "Kontraste altuko modua",
"Enable high contrast mode" : "Gaitu kontraste handiko modua",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Kontraste altuko modua zuri nabigazioa errazteko. Kalitate bisuala murriztuko da baina argitasuna handiagotu.",
"Dyslexia font" : "Dislexia letra-tipoa",
"Enable dyslexia font" : "Gaitu dislexia letra-tipoa",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic letra-tipo librea da dislexiak eragindako ohiko irakurketa akats batzuk leuntzeko diseinatua.",
"Accessibility" : "Erabilerraztasuna",
"Accessibility options for nextcloud" : "Erabilerraztasun aukerak nextcloudentzat",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Nextcloud-en erabilera errazteko hainbat aukera eskaintzen ditu.",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Sarbide unibertsala oso garrantzitsua da guretzat. Web estadandarrak jarraitu eta sagu gabeko erabiltasuna egiaztatzen ditugu, pantaila-irakurle moduko software laguntzaileak barne. Helburu bezala jartzen dugu {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 AA mailan betetzea, kontraste altuko modua AAA mailaraino lortuz.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Arazorik aurkitzen baduzu, bidali ezazu lasai {issuetracker}gure arazo-kontrolatzailera{linkend}. Eta parte hartu nahi baduzu, elkartu zaitez gurekin {designteam}gure diseinu taldera{linkend}!",
"High contrast theme" : "Kontraste altuko gaia",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Kontraste altuko gaia nabigazioa errazteko. Kalitate bisuala murriztuko da baina argitasuna handiagotu.",
"Dark theme (beta)" : "Gai beltza (beta)",
"Web Content Accessibility Guidelines" : "Web Edukiaren Erabilerraztasun Jarraibideak",
"our issue tracker" : "gure akats egunkaria",
"our design team" : "gure diseinatzaile taldea",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Sarbide unibertsala oso garrantzitsua da guretzat. Web estadandarrak jarraitu eta sagu gabeko erabiltasuna egiaztatzen ditugu, pantaila-irakurle moduko software laguntzaileak barne. Helburu bezala jartzen dugu {guidelines} 2.1 AA mailan betetzea, kontraste altuko modua AAA mailaraino lortuz.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Arazorik aurkitzen baduzu, bidali ezazu lasai {issuetracker}(e)ra. Eta parte hartu nahi baduzu, elkartu zaitez gurekin {designteam}(e)n!",
"Enable" : "Gaitu"
},
"nplurals=2; plural=(n != 1);");

View file

@ -1,26 +1,19 @@
{ "translations": {
"Dark theme" : "Gai iluna",
"Enable dark theme" : "Gaitu gai iluna",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Murriztu begietan kalte egitea gai ilunarekin: argitasun orokorra eta distira jaisten ditu. Garapenean dagoen aukera da, beraz jakinarazi aurkitzen dituzun arazoak.",
"High contrast mode" : "Kontraste altuko modua",
"Enable high contrast mode" : "Gaitu kontraste handiko modua",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Kontraste altuko modua zuri nabigazioa errazteko. Kalitate bisuala murriztuko da baina argitasuna handiagotu.",
"Dyslexia font" : "Dislexia letra-tipoa",
"Enable dyslexia font" : "Gaitu dislexia letra-tipoa",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic letra-tipo librea da dislexiak eragindako ohiko irakurketa akats batzuk leuntzeko diseinatua.",
"Accessibility" : "Erabilerraztasuna",
"Accessibility options for nextcloud" : "Erabilerraztasun aukerak nextcloudentzat",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Nextcloud-en erabilera errazteko hainbat aukera eskaintzen ditu.",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Sarbide unibertsala oso garrantzitsua da guretzat. Web estadandarrak jarraitu eta sagu gabeko erabiltasuna egiaztatzen ditugu, pantaila-irakurle moduko software laguntzaileak barne. Helburu bezala jartzen dugu {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 AA mailan betetzea, kontraste altuko modua AAA mailaraino lortuz.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Arazorik aurkitzen baduzu, bidali ezazu lasai {issuetracker}gure arazo-kontrolatzailera{linkend}. Eta parte hartu nahi baduzu, elkartu zaitez gurekin {designteam}gure diseinu taldera{linkend}!",
"High contrast theme" : "Kontraste altuko gaia",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Kontraste altuko gaia nabigazioa errazteko. Kalitate bisuala murriztuko da baina argitasuna handiagotu.",
"Dark theme (beta)" : "Gai beltza (beta)",
"Web Content Accessibility Guidelines" : "Web Edukiaren Erabilerraztasun Jarraibideak",
"our issue tracker" : "gure akats egunkaria",
"our design team" : "gure diseinatzaile taldea",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Sarbide unibertsala oso garrantzitsua da guretzat. Web estadandarrak jarraitu eta sagu gabeko erabiltasuna egiaztatzen ditugu, pantaila-irakurle moduko software laguntzaileak barne. Helburu bezala jartzen dugu {guidelines} 2.1 AA mailan betetzea, kontraste altuko modua AAA mailaraino lortuz.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Arazorik aurkitzen baduzu, bidali ezazu lasai {issuetracker}(e)ra. Eta parte hartu nahi baduzu, elkartu zaitez gurekin {designteam}(e)n!",
"Enable" : "Gaitu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -13,8 +13,6 @@ OC.L10N.register(
"Accessibility" : "Accessibilité",
"Accessibility options for nextcloud" : "Options d'accessibilité pour Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Fournit de nombreuses options d'accessibilité pour faciliter votre utilisation de Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et vérifions que tout soit utilisable également sans souris et avec des logiciels d'assistance technique tels que les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si vous rencontrez un problème, n'hésitez pas à nous le signaler sur {issuetracker}notre traqueur de problème{linkend}. Et si vous souhaitez vous impliquer, rejoignez {designteam}notre équipe de conception{linkend} !",
"High contrast theme" : "Thème à contraste élevé",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un thème au contraste élevé pour faciliter votre navigation. La qualité visuelle sera réduite, mais la clarté sera améliorée.",
"Dark theme (beta)" : "Thème sombre (beta)",

View file

@ -11,8 +11,6 @@
"Accessibility" : "Accessibilité",
"Accessibility options for nextcloud" : "Options d'accessibilité pour Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Fournit de nombreuses options d'accessibilité pour faciliter votre utilisation de Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et vérifions que tout soit utilisable également sans souris et avec des logiciels d'assistance technique tels que les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si vous rencontrez un problème, n'hésitez pas à nous le signaler sur {issuetracker}notre traqueur de problème{linkend}. Et si vous souhaitez vous impliquer, rejoignez {designteam}notre équipe de conception{linkend} !",
"High contrast theme" : "Thème à contraste élevé",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un thème au contraste élevé pour faciliter votre navigation. La qualité visuelle sera réduite, mais la clarté sera améliorée.",
"Dark theme (beta)" : "Thème sombre (beta)",

View file

@ -2,27 +2,20 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "Sötét téma",
"Enable dark theme" : "Sötét téma engedélyezése",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "A sötét téma csökkenti a szemek terhelését az átlagos fényesség és fényerő csökkentésével. Még mindig fejlesztés alatt áll, így jelentse ha problémát talál.",
"High contrast mode" : "Magas kontrasztú mód",
"Enable high contrast mode" : "Magas kontrasztú mód engedélyezése",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A magas kontrasztú téma megkönnyíti a navigációt. A képi minőség csökken, de az olvashatóság javul.",
"Dyslexia font" : "Diszlexia betűkészlet",
"Enable dyslexia font" : "Diszlexia betűkészlet engedélyezése",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Az OpenDyslexic egy szabad betűkészlet, amely egyes, diszlexia által okozott, gyakori olvasási hibák csökkentésére lett tervezve.",
"Accessibility" : "Akadálymentesítés",
"Accessibility options for nextcloud" : "Akadálymentesítési lehetőségek a Nextcloudhoz",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Több akadálymentesítési lehetőséget biztosít, hogy megkönnyítse a Nextcloud használatát",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Az akadálymentesítés fontos számunka. A webes szabványokat követjük, és ellenőrizzük, hogy minden használható egér nélkül, illetve akadálymentesítési technológiákkal, például képernyőolvasókkal. Arra törekszünk, hogy a {guidelines}Webes tartalom vonatkozó akadálymentesítési irányelvek{linkend} 2.1-es változatának AA szinten, a magas kontrasztú témával pedig AAA szinten megfeleljünk.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ha problémákat tapasztal, jelentse a {issuetracker}hibakövetőnkben{linkend}. És ha segíteni szeretne, csatlakozzon a {designteam}dizájn csapatunkhoz{linkend}!",
"High contrast theme" : "Magas kontrasztú téma",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A magas kontrasztú téma megkönnyíti a navigációt. A képi minőség csökken, de az olvashatóság javul.",
"Dark theme (beta)" : "Sötét téma (béta)",
"Web Content Accessibility Guidelines" : "Webes tartalom akadálymentesítési irányelvek",
"our issue tracker" : "a hibakövetőnk",
"our design team" : "a fejlesztőcsapatunk",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Az akadálymentesítés fontos számunka. A webes szabványokat követjük, és ellenőrizzük, hogy minden használható egér nélkül, illetve akadálymentesítési technológiákkal, például képernyőolvasókkal. Arra törekszünk, hogy a {guidelines} 2.1-es változatának AA szinten, a magas kontrasztú témával pedig AAA szinten megfeleljünk.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Ha problémákat tapasztal, jelentse a {issuetracker}hibakövetőnkben{linkend}. És ha segíteni szeretne, csatlakozzon a {designteam}!",
"Enable" : "Engedélyezés"
},
"nplurals=2; plural=(n != 1);");

View file

@ -1,26 +1,19 @@
{ "translations": {
"Dark theme" : "Sötét téma",
"Enable dark theme" : "Sötét téma engedélyezése",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "A sötét téma csökkenti a szemek terhelését az átlagos fényesség és fényerő csökkentésével. Még mindig fejlesztés alatt áll, így jelentse ha problémát talál.",
"High contrast mode" : "Magas kontrasztú mód",
"Enable high contrast mode" : "Magas kontrasztú mód engedélyezése",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A magas kontrasztú téma megkönnyíti a navigációt. A képi minőség csökken, de az olvashatóság javul.",
"Dyslexia font" : "Diszlexia betűkészlet",
"Enable dyslexia font" : "Diszlexia betűkészlet engedélyezése",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Az OpenDyslexic egy szabad betűkészlet, amely egyes, diszlexia által okozott, gyakori olvasási hibák csökkentésére lett tervezve.",
"Accessibility" : "Akadálymentesítés",
"Accessibility options for nextcloud" : "Akadálymentesítési lehetőségek a Nextcloudhoz",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Több akadálymentesítési lehetőséget biztosít, hogy megkönnyítse a Nextcloud használatát",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Az akadálymentesítés fontos számunka. A webes szabványokat követjük, és ellenőrizzük, hogy minden használható egér nélkül, illetve akadálymentesítési technológiákkal, például képernyőolvasókkal. Arra törekszünk, hogy a {guidelines}Webes tartalom vonatkozó akadálymentesítési irányelvek{linkend} 2.1-es változatának AA szinten, a magas kontrasztú témával pedig AAA szinten megfeleljünk.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ha problémákat tapasztal, jelentse a {issuetracker}hibakövetőnkben{linkend}. És ha segíteni szeretne, csatlakozzon a {designteam}dizájn csapatunkhoz{linkend}!",
"High contrast theme" : "Magas kontrasztú téma",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A magas kontrasztú téma megkönnyíti a navigációt. A képi minőség csökken, de az olvashatóság javul.",
"Dark theme (beta)" : "Sötét téma (béta)",
"Web Content Accessibility Guidelines" : "Webes tartalom akadálymentesítési irányelvek",
"our issue tracker" : "a hibakövetőnk",
"our design team" : "a fejlesztőcsapatunk",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Az akadálymentesítés fontos számunka. A webes szabványokat követjük, és ellenőrizzük, hogy minden használható egér nélkül, illetve akadálymentesítési technológiákkal, például képernyőolvasókkal. Arra törekszünk, hogy a {guidelines} 2.1-es változatának AA szinten, a magas kontrasztú témával pedig AAA szinten megfeleljünk.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Ha problémákat tapasztal, jelentse a {issuetracker}hibakövetőnkben{linkend}. És ha segíteni szeretne, csatlakozzon a {designteam}!",
"Enable" : "Engedélyezés"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -2,13 +2,10 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "ダークテーマ",
"Enable dark theme" : "ダークテーマを有効にする",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "ダークテーマは目の負担になりにくいです。このテーマは開発中のためバグを見つけたら報告してください。",
"High contrast mode" : "ハイ・コントラストモード",
"Enable high contrast mode" : "ハイ・コントラストモードを有効にする。",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "操作をわかりやすくするためのハイ・コントラストモード。\n見た目の美しさは低下しますが、明確さが向上します。",
"Dyslexia font" : "Dyslexia フォント",
"Enable dyslexia font" : "Dyslexia フォントを有効にする",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexicは、ディスレクシアによって引き起こされる一般的な読み間違いの一部を軽減するためにデザインされた、無料で利用できる書体/フォントです。",
"Accessibility" : "アクセシビリティ",
"Accessibility options for nextcloud" : "nextcloudのアクセシビリティオプション",

View file

@ -1,12 +1,9 @@
{ "translations": {
"Dark theme" : "ダークテーマ",
"Enable dark theme" : "ダークテーマを有効にする",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "ダークテーマは目の負担になりにくいです。このテーマは開発中のためバグを見つけたら報告してください。",
"High contrast mode" : "ハイ・コントラストモード",
"Enable high contrast mode" : "ハイ・コントラストモードを有効にする。",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "操作をわかりやすくするためのハイ・コントラストモード。\n見た目の美しさは低下しますが、明確さが向上します。",
"Dyslexia font" : "Dyslexia フォント",
"Enable dyslexia font" : "Dyslexia フォントを有効にする",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexicは、ディスレクシアによって引き起こされる一般的な読み間違いの一部を軽減するためにデザインされた、無料で利用できる書体/フォントです。",
"Accessibility" : "アクセシビリティ",
"Accessibility options for nextcloud" : "nextcloudのアクセシビリティオプション",

View file

@ -2,13 +2,10 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "어두운 테마",
"Enable dark theme" : "어두운 테마 활성화",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "어두운 테마는 전체적인 밝기를 낮춰 눈을 편안하게 해 줍니다. 아직 개발 중인 기능이니 문제가 있다면 보고해 주세요.",
"High contrast mode" : "고대비 모드",
"Enable high contrast mode" : "고대비 모드 활성화",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "쉬운 탐색을 위한 고대비 테마입니다. 색감이 나빠지지만 더 선명해집니다.",
"Dyslexia font" : "난독증용 글꼴",
"Enable dyslexia font" : "난독증용 글꼴 활성화",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic은 난독증 때문에 읽기에 문제가 있는 사람들을 위해 디자인된 자유 글꼴입니다.",
"Accessibility" : "접근성",
"Accessibility options for nextcloud" : "Nextcloud 접근성 옵션",

View file

@ -1,12 +1,9 @@
{ "translations": {
"Dark theme" : "어두운 테마",
"Enable dark theme" : "어두운 테마 활성화",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "어두운 테마는 전체적인 밝기를 낮춰 눈을 편안하게 해 줍니다. 아직 개발 중인 기능이니 문제가 있다면 보고해 주세요.",
"High contrast mode" : "고대비 모드",
"Enable high contrast mode" : "고대비 모드 활성화",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "쉬운 탐색을 위한 고대비 테마입니다. 색감이 나빠지지만 더 선명해집니다.",
"Dyslexia font" : "난독증용 글꼴",
"Enable dyslexia font" : "난독증용 글꼴 활성화",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic은 난독증 때문에 읽기에 문제가 있는 사람들을 위해 디자인된 자유 글꼴입니다.",
"Accessibility" : "접근성",
"Accessibility options for nextcloud" : "Nextcloud 접근성 옵션",

View file

@ -2,19 +2,14 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "Темна тема",
"Enable dark theme" : "Овозможи темна тема",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Темна тема за да ви го олесни гледањето преку намалување на вкупната осветленост. Сеуште е во развој, затоа ве молиме пријавете ги сите проблеми кои ќе ги најдете.",
"High contrast mode" : "Режим на висок контраст",
"Enable high contrast mode" : "Овозможи режим на висок контраст",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Режим со висок контраст за олеснување на навигацијата. Визуелниот квалитет ќе се намали, но јасноста ќе се зголеми.",
"Dyslexia font" : "Фонт за дислексија",
"Enable dyslexia font" : "Овозможи фонт за дислексија",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic е бесплатен фонт дизајниран за ублажување на некои од честите грешки во читањето предизвикани од дислексија.",
"Accessibility" : "Достапност",
"Accessibility options for nextcloud" : "Опции за пристапност на Nextcloud. ",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Овозможува повеќе опции за пристапност за да се олесни употребата на Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универзалниот пристап е многу важен за нас. Ние ги следиме веб-стандардите и ги имплементираме за да го направиме користењето попристапно, како користење без маус, и помошни апликации за читање на екранот. Наша цел е да бидеме во согласност со {guidelines} {linkend}2.1 на ниво АА, со висока контрастна тема дури и на ниво на ААА.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "околку наидете на некој проблем, не се двоумете и пријавете го на {issuetracker} {linkend}. И доколку сакате можете да се приклучите кон нашиот {designteam} {linkend}!",
"High contrast theme" : "Тема со висок контраст",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Тема со висок контраст за да ја олесни навигацијата. Визуелниот квалитет ќе се намали, но јасноста ќе се зголеми.",
"Dark theme (beta)" : "Темна тема (бета)",

View file

@ -1,18 +1,13 @@
{ "translations": {
"Dark theme" : "Темна тема",
"Enable dark theme" : "Овозможи темна тема",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Темна тема за да ви го олесни гледањето преку намалување на вкупната осветленост. Сеуште е во развој, затоа ве молиме пријавете ги сите проблеми кои ќе ги најдете.",
"High contrast mode" : "Режим на висок контраст",
"Enable high contrast mode" : "Овозможи режим на висок контраст",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Режим со висок контраст за олеснување на навигацијата. Визуелниот квалитет ќе се намали, но јасноста ќе се зголеми.",
"Dyslexia font" : "Фонт за дислексија",
"Enable dyslexia font" : "Овозможи фонт за дислексија",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic е бесплатен фонт дизајниран за ублажување на некои од честите грешки во читањето предизвикани од дислексија.",
"Accessibility" : "Достапност",
"Accessibility options for nextcloud" : "Опции за пристапност на Nextcloud. ",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Овозможува повеќе опции за пристапност за да се олесни употребата на Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универзалниот пристап е многу важен за нас. Ние ги следиме веб-стандардите и ги имплементираме за да го направиме користењето попристапно, како користење без маус, и помошни апликации за читање на екранот. Наша цел е да бидеме во согласност со {guidelines} {linkend}2.1 на ниво АА, со висока контрастна тема дури и на ниво на ААА.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "околку наидете на некој проблем, не се двоумете и пријавете го на {issuetracker} {linkend}. И доколку сакате можете да се приклучите кон нашиот {designteam} {linkend}!",
"High contrast theme" : "Тема со висок контраст",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Тема со висок контраст за да ја олесни навигацијата. Визуелниот квалитет ќе се намали, но јасноста ќе се зголеми.",
"Dark theme (beta)" : "Темна тема (бета)",

View file

@ -2,27 +2,20 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "Donker thema",
"Enable dark theme" : "Donker thema inschakelen",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Een donker thema dat je ogen minder vermoeit minder door de lichtsterkte en helderheid te verminderen. Dit thema is nog in ontwikkeling, dus we horen graag van je als je fouten tegenkomt.",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Een donker thema dat minder licht op je ogen is door de lichtsterkte en helderheid te verminderen. Dit thema is nog in ontwikkeling, dus we horen graag van je als je fouten tegenkomt.",
"High contrast mode" : "Hoog contrast modus",
"Enable high contrast mode" : "Hoog contrast modus inschakelen",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Een thema met hoog contrast dat de navigatie vergemakkelijkt. De visuele kwaliteit vermindert, maar de duidelijkheid neemt toe.",
"Dyslexia font" : "Dyslexie-lettertype",
"Enable dyslexia font" : "Dyslexie-lettertype inschakelen",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic is een open source lettertype dat is ontwikkeld om de meest voorkomende leesfouten die worden veroorzaakt door dyslexie te voorkomen.",
"Accessibility" : "Toegankelijkheid",
"Accessibility options for nextcloud" : "Toegankelijkheidsopties voor Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Biedt verschillende opties om de toegankelijkheid van Nextcloud te verbeteren",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universele toegang is heel belangrijk voor ons. We volgen webstandaarden en controleren dat alles ook zonder muis en met ondersteunende software zoals schermlezers bruikbaar is. We streven om de {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 op AA-niveau te volgen, en met het hoge contrast thema zelfs op AAA-niveau.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Mocht je eventuele problemen vinden, aarzel dan niet om ze te melden op {issuetracker}onze issue tracker{linkend}. En mocht je mee willen helpen, wordt dan lid van {designteam} ons ontwikkelteam{linkend}!",
"High contrast theme" : "Hoog contrast-thema",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Een thema met hoog contrast dat de navigatie vergemakkelijkt. De visuele kwaliteit vermindert, maar de duidelijkheid neemt toe.",
"Dark theme (beta)" : "Donker thema (bèta)",
"Web Content Accessibility Guidelines" : "Richtlijnen voor Toegankelijkheid van Webcontent (WCAG)",
"our issue tracker" : "onze issue tracker",
"our design team" : "ons ontwerpteam",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universele toegang is heel belangrijk voor ons. We volgen webstandaarden en controleren dat alles ook zonder muis en met ondersteunende software zoals schermlezers bruikbaar is. We streven om de {guidelines} 2.1 op AA-niveau te volgen, en met het hoge contrast thema zelfs op AAA-niveau.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Mocht je eventuele problemen vinden, aarzel dan niet om ze te melden op {issuetracker}. En mocht je mee willen helpen, wordt dan lid van het {designteam}!",
"Enable" : "Inschakelen"
},
"nplurals=2; plural=(n != 1);");

View file

@ -1,26 +1,19 @@
{ "translations": {
"Dark theme" : "Donker thema",
"Enable dark theme" : "Donker thema inschakelen",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Een donker thema dat je ogen minder vermoeit minder door de lichtsterkte en helderheid te verminderen. Dit thema is nog in ontwikkeling, dus we horen graag van je als je fouten tegenkomt.",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Een donker thema dat minder licht op je ogen is door de lichtsterkte en helderheid te verminderen. Dit thema is nog in ontwikkeling, dus we horen graag van je als je fouten tegenkomt.",
"High contrast mode" : "Hoog contrast modus",
"Enable high contrast mode" : "Hoog contrast modus inschakelen",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Een thema met hoog contrast dat de navigatie vergemakkelijkt. De visuele kwaliteit vermindert, maar de duidelijkheid neemt toe.",
"Dyslexia font" : "Dyslexie-lettertype",
"Enable dyslexia font" : "Dyslexie-lettertype inschakelen",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic is een open source lettertype dat is ontwikkeld om de meest voorkomende leesfouten die worden veroorzaakt door dyslexie te voorkomen.",
"Accessibility" : "Toegankelijkheid",
"Accessibility options for nextcloud" : "Toegankelijkheidsopties voor Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Biedt verschillende opties om de toegankelijkheid van Nextcloud te verbeteren",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universele toegang is heel belangrijk voor ons. We volgen webstandaarden en controleren dat alles ook zonder muis en met ondersteunende software zoals schermlezers bruikbaar is. We streven om de {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 op AA-niveau te volgen, en met het hoge contrast thema zelfs op AAA-niveau.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Mocht je eventuele problemen vinden, aarzel dan niet om ze te melden op {issuetracker}onze issue tracker{linkend}. En mocht je mee willen helpen, wordt dan lid van {designteam} ons ontwikkelteam{linkend}!",
"High contrast theme" : "Hoog contrast-thema",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Een thema met hoog contrast dat de navigatie vergemakkelijkt. De visuele kwaliteit vermindert, maar de duidelijkheid neemt toe.",
"Dark theme (beta)" : "Donker thema (bèta)",
"Web Content Accessibility Guidelines" : "Richtlijnen voor Toegankelijkheid van Webcontent (WCAG)",
"our issue tracker" : "onze issue tracker",
"our design team" : "ons ontwerpteam",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universele toegang is heel belangrijk voor ons. We volgen webstandaarden en controleren dat alles ook zonder muis en met ondersteunende software zoals schermlezers bruikbaar is. We streven om de {guidelines} 2.1 op AA-niveau te volgen, en met het hoge contrast thema zelfs op AAA-niveau.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Mocht je eventuele problemen vinden, aarzel dan niet om ze te melden op {issuetracker}. En mocht je mee willen helpen, wordt dan lid van het {designteam}!",
"Enable" : "Inschakelen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -1,28 +1,21 @@
OC.L10N.register(
"accessibility",
{
"Dark theme" : "Тёмное оформление",
"Enable dark theme" : "Использовать тёмное оформление",
"Dark theme" : "Тёмная тема",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Тёмное оформление снижает напряжение глаз за счёт уменьшения общей яркости. Тема находится в разработке. Сообщайте о всех найденных ошибках и недочётах.",
"High contrast mode" : "Режим высокой контрастности",
"Enable high contrast mode" : "Включить режим высокой контрастности",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Этот высококонтрастный режим упрощает навигацию по сайту. Качество изображения будет уменьшено за счёт увеличения чёткости.",
"Dyslexia font" : "Шрифт Dyslexia",
"Enable dyslexia font" : "Использовать шрифт Dyslexia",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic — бесплатный шрифт, который смягчает некоторые распространённые ошибки чтения, вызываемые дислексией.",
"Accessibility" : "Доступность",
"Accessibility options for nextcloud" : "Настройки доступности для Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Предоставляет несколько вариантов доступности, чтобы облегчить использование Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Nextcloud разрабатывается с возможностью его использования всеми. При разработке учитываются веб-стандарты и выполняются проверки возможности использования без мыши, а также при помощи специальных программ, например, выполняющих чтение с экрана. Nextcloud стремиться к выполнению предписаний {guidelines}Руководства доступности веб-контента{linkend} версии 2.1 на уровне АА, а при использованием режима высокой контрастности — даже на уровне ААА.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Сообщайте об обнаруженных проблемах в {issuetracker} системе отслеживания ошибок{linkend}. Присоединяйтесь к {designteam}команде дизайнеров{linkend} чтобы участвовать в разработке.",
"High contrast theme" : "Режим высокой контрастности",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Это высококонтрастное оформление упрощает навигацию по сайту. Качество изображения будет уменьшено за счёт увеличения чёткости.",
"Dark theme (beta)" : "Тёмное оформление (бета)",
"Web Content Accessibility Guidelines" : "Руководство по обеспечению доступности Web-контента WGAG",
"our issue tracker" : "Сообщить об ошибке",
"our design team" : "Команда разработчиков",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Nextcloud разрабатывается с возможностью его использования всеми. При разработке учитываются веб-стандарты и выполняются проверки возможности использования без мыши, а также при помощи специальных программ, например, выполняющих чтение с экрана. Nextcloud стремиться к выполнению предписаний {guidelines} версии 2.1 на уровне АА, а при использованием режима высокой контрастности — даже на уровне ААА.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Сообщайте об обнаруженных проблемах в {issuetracker} системе отслеживания ошибок{linkend}. Присоединяйтесь к {designteam} чтобы участвовать в разработке.",
"Enable" : "Включить"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");

View file

@ -1,26 +1,19 @@
{ "translations": {
"Dark theme" : "Тёмное оформление",
"Enable dark theme" : "Использовать тёмное оформление",
"Dark theme" : "Тёмная тема",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Тёмное оформление снижает напряжение глаз за счёт уменьшения общей яркости. Тема находится в разработке. Сообщайте о всех найденных ошибках и недочётах.",
"High contrast mode" : "Режим высокой контрастности",
"Enable high contrast mode" : "Включить режим высокой контрастности",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Этот высококонтрастный режим упрощает навигацию по сайту. Качество изображения будет уменьшено за счёт увеличения чёткости.",
"Dyslexia font" : "Шрифт Dyslexia",
"Enable dyslexia font" : "Использовать шрифт Dyslexia",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic — бесплатный шрифт, который смягчает некоторые распространённые ошибки чтения, вызываемые дислексией.",
"Accessibility" : "Доступность",
"Accessibility options for nextcloud" : "Настройки доступности для Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Предоставляет несколько вариантов доступности, чтобы облегчить использование Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Nextcloud разрабатывается с возможностью его использования всеми. При разработке учитываются веб-стандарты и выполняются проверки возможности использования без мыши, а также при помощи специальных программ, например, выполняющих чтение с экрана. Nextcloud стремиться к выполнению предписаний {guidelines}Руководства доступности веб-контента{linkend} версии 2.1 на уровне АА, а при использованием режима высокой контрастности — даже на уровне ААА.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Сообщайте об обнаруженных проблемах в {issuetracker} системе отслеживания ошибок{linkend}. Присоединяйтесь к {designteam}команде дизайнеров{linkend} чтобы участвовать в разработке.",
"High contrast theme" : "Режим высокой контрастности",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Это высококонтрастное оформление упрощает навигацию по сайту. Качество изображения будет уменьшено за счёт увеличения чёткости.",
"Dark theme (beta)" : "Тёмное оформление (бета)",
"Web Content Accessibility Guidelines" : "Руководство по обеспечению доступности Web-контента WGAG",
"our issue tracker" : "Сообщить об ошибке",
"our design team" : "Команда разработчиков",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Nextcloud разрабатывается с возможностью его использования всеми. При разработке учитываются веб-стандарты и выполняются проверки возможности использования без мыши, а также при помощи специальных программ, например, выполняющих чтение с экрана. Nextcloud стремиться к выполнению предписаний {guidelines} версии 2.1 на уровне АА, а при использованием режима высокой контрастности — даже на уровне ААА.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Сообщайте об обнаруженных проблемах в {issuetracker} системе отслеживания ошибок{linkend}. Присоединяйтесь к {designteam} чтобы участвовать в разработке.",
"Enable" : "Включить"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
}

View file

@ -1,28 +1,21 @@
OC.L10N.register(
"accessibility",
{
"Dark theme" : "Tmavý motív vzhľadu",
"Enable dark theme" : "Zapnúť tmavý motív vzhľadu",
"Dark theme" : "Tmavý motív",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Tmavý motív vzhľadu pre úľavu vašim očiam znížením celkovej svietivosti a jasu. Je ešte stále vo vývoji, ak náhodou narazíte na nejaký problém, tak nám ho prosím nahláste.",
"High contrast mode" : "Režim vysokého kontrastu",
"Enable high contrast mode" : "Zapnúť režim vysokého kontrastu",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Mód s vysokým kontrastom pre uľahčenie navigácie. Zníži sa síce vizuálna kvalita, ale zvýši sa čitateľnosť.",
"Dyslexia font" : "Písmo pre dyslektikov",
"Enable dyslexia font" : "Povoliť písmo pre dyslektikov",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic je slobodný typ písma navrhnutý priamo pre obmedzenie vplyvu niektorých bežných porúch čítania spôsobených dyslexiou.",
"Accessibility" : "Prístupnosť",
"Accessibility options for nextcloud" : "Možnosti prístupnosti pre Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Poskytuje viac možností prístupnosti pre uľahčenie používania Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Univerzálny prístup je pre nás veľmi dôležitý. Dodržiavame webové štandardy a kontrolujeme, aby bolo všetko použiteľné aj bez myši a pomocného softvéru, ako sú čítačky obrazovky. Naším cieľom je byť v súlade s {guidelines}pokynmi pre prístup k webovému obsahu {linkend} 2.1 na úrovni AA, v režime vysokého kontrastu dokonca na úrovni AAA.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ak nájdete nejaký problém, neváhajte a nahláste ho na {issuetracker}nástroj na sledovanie problémov{linkend}. A ak sa chcete zapojiť, pripojte sa k {designteam}nášmu dizajnérskemu tímu{linkend}!",
"High contrast theme" : "Motív vzhľadu s vysokým kontrastom",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Motív vzhľadu s vysokým kontrastom pre uľahčenie navigácie. Zníži sa síce vizuálna kvalita, ale zvýši sa čitateľnosť.",
"Dark theme (beta)" : "Tmavý motív vzhľadu (beta)",
"Web Content Accessibility Guidelines" : "Usmernenia o prístupnosti webového obsahu",
"our issue tracker" : "náš systém evidencie hlásenia chýb",
"our design team" : "náš tím dizajnérov",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Univerzálny prístup je pre nás veľmi dôležitý. Dodržiavame webové štandardy a kontrolujeme, aby bolo všetko použiteľné aj bez myši a pomocného softvéru, ako sú čítačky obrazovky. Naším cieľom je byť v súlade s {guidelines} 2.1 na úrovni AA, v režime vysokého kontrastu dokonca na úrovni AAA.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Ak nájdete nejaký problém, neváhajte a nahláste ho na {issuetracker}. A ak sa chcete zapojiť, pripojte sa k {designteam}!",
"Enable" : "Zapnúť"
},
"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);");

View file

@ -1,26 +1,19 @@
{ "translations": {
"Dark theme" : "Tmavý motív vzhľadu",
"Enable dark theme" : "Zapnúť tmavý motív vzhľadu",
"Dark theme" : "Tmavý motív",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Tmavý motív vzhľadu pre úľavu vašim očiam znížením celkovej svietivosti a jasu. Je ešte stále vo vývoji, ak náhodou narazíte na nejaký problém, tak nám ho prosím nahláste.",
"High contrast mode" : "Režim vysokého kontrastu",
"Enable high contrast mode" : "Zapnúť režim vysokého kontrastu",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Mód s vysokým kontrastom pre uľahčenie navigácie. Zníži sa síce vizuálna kvalita, ale zvýši sa čitateľnosť.",
"Dyslexia font" : "Písmo pre dyslektikov",
"Enable dyslexia font" : "Povoliť písmo pre dyslektikov",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic je slobodný typ písma navrhnutý priamo pre obmedzenie vplyvu niektorých bežných porúch čítania spôsobených dyslexiou.",
"Accessibility" : "Prístupnosť",
"Accessibility options for nextcloud" : "Možnosti prístupnosti pre Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Poskytuje viac možností prístupnosti pre uľahčenie používania Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Univerzálny prístup je pre nás veľmi dôležitý. Dodržiavame webové štandardy a kontrolujeme, aby bolo všetko použiteľné aj bez myši a pomocného softvéru, ako sú čítačky obrazovky. Naším cieľom je byť v súlade s {guidelines}pokynmi pre prístup k webovému obsahu {linkend} 2.1 na úrovni AA, v režime vysokého kontrastu dokonca na úrovni AAA.",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ak nájdete nejaký problém, neváhajte a nahláste ho na {issuetracker}nástroj na sledovanie problémov{linkend}. A ak sa chcete zapojiť, pripojte sa k {designteam}nášmu dizajnérskemu tímu{linkend}!",
"High contrast theme" : "Motív vzhľadu s vysokým kontrastom",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Motív vzhľadu s vysokým kontrastom pre uľahčenie navigácie. Zníži sa síce vizuálna kvalita, ale zvýši sa čitateľnosť.",
"Dark theme (beta)" : "Tmavý motív vzhľadu (beta)",
"Web Content Accessibility Guidelines" : "Usmernenia o prístupnosti webového obsahu",
"our issue tracker" : "náš systém evidencie hlásenia chýb",
"our design team" : "náš tím dizajnérov",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Univerzálny prístup je pre nás veľmi dôležitý. Dodržiavame webové štandardy a kontrolujeme, aby bolo všetko použiteľné aj bez myši a pomocného softvéru, ako sú čítačky obrazovky. Naším cieľom je byť v súlade s {guidelines} 2.1 na úrovni AA, v režime vysokého kontrastu dokonca na úrovni AAA.",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Ak nájdete nejaký problém, neváhajte a nahláste ho na {issuetracker}. A ak sa chcete zapojiť, pripojte sa k {designteam}!",
"Enable" : "Zapnúť"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"
}

View file

@ -1,14 +1,15 @@
OC.L10N.register(
"accessibility",
{
"High contrast mode" : "Висококонтрастний режим",
"Enable high contrast mode" : "Увімкнути висококонтрастний режим",
"Dark theme" : "Темна тема",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Темна тема зменшує навантаження для очей шляхом зменшення загального світлового випромінення і яскравості. Вона все ще перебуває на стадії розробки, тож якщо знайдете якісь проблеми, будь ласка, сповістіть нас про це.",
"High contrast mode" : "Контрастна тема",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Контрастна тема спрощує Вашу навігацію. Знижена візуальна якість, проте підвищена ясність і зрозумілість.",
"Dyslexia font" : "Шрифт для людей, які страждають від дислексії",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic - це вільно доступний шрифт, що було розроблено для уникнення деяких загальних помилок, що спричинені дизлексією.",
"Accessibility" : "Доступність",
"Accessibility options for nextcloud" : "Опції доступності для nextcloud",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Якщо ви знайшли будь-які проблеми, будь-ласка повідомте про них на {issuetracker} до нашого трекера задач{linkend}. Якщо ж ви бажаєте стати учасником - будь-ласка приєднуйтесь до {designteam} нашої команди{linkend}! ",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Надає кілька опцій доступності для полегшення вашого користування Nextcloud",
"High contrast theme" : "Висококонтрастна тема",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Висококонтрастна тема для того, щоб полегшити користування. Візуальні ефекти буде погіршено, однак чіткість - покращено.",
"Dark theme (beta)" : "Темна тема (бета)",

View file

@ -1,12 +1,13 @@
{ "translations": {
"High contrast mode" : "Висококонтрастний режим",
"Enable high contrast mode" : "Увімкнути висококонтрастний режим",
"Dark theme" : "Темна тема",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Темна тема зменшує навантаження для очей шляхом зменшення загального світлового випромінення і яскравості. Вона все ще перебуває на стадії розробки, тож якщо знайдете якісь проблеми, будь ласка, сповістіть нас про це.",
"High contrast mode" : "Контрастна тема",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Контрастна тема спрощує Вашу навігацію. Знижена візуальна якість, проте підвищена ясність і зрозумілість.",
"Dyslexia font" : "Шрифт для людей, які страждають від дислексії",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic - це вільно доступний шрифт, що було розроблено для уникнення деяких загальних помилок, що спричинені дизлексією.",
"Accessibility" : "Доступність",
"Accessibility options for nextcloud" : "Опції доступності для nextcloud",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Якщо ви знайшли будь-які проблеми, будь-ласка повідомте про них на {issuetracker} до нашого трекера задач{linkend}. Якщо ж ви бажаєте стати учасником - будь-ласка приєднуйтесь до {designteam} нашої команди{linkend}! ",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Надає кілька опцій доступності для полегшення вашого користування Nextcloud",
"High contrast theme" : "Висококонтрастна тема",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Висококонтрастна тема для того, щоб полегшити користування. Візуальні ефекти буде погіршено, однак чіткість - покращено.",
"Dark theme (beta)" : "Темна тема (бета)",

View file

@ -1,14 +1,11 @@
OC.L10N.register(
"accessibility",
{
"Dark theme" : "Chế độ ban đêm",
"Enable dark theme" : "Bật chế độ ban đêm",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Chế độ ban đêm giúp giảm mỏi mắt bằng cách giảm tương phản ở các màu chói và giảm độ sáng. Chế độ này đang được phát triển, vì vậy, xin hãy báo cáo nếu bạn gặp bất kỳ vấn đề nào trong lúc sử dụng.",
"Dark theme" : "Chế độ tối",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Một chủ đề tối để làm dịu đôi mắt của bạn bằng cách giảm độ sáng và độ sáng tổng thể. Nó vẫn đang được phát triển, vì vậy vui lòng báo cáo bất kỳ vấn đề bạn có thể tìm thấy.",
"High contrast mode" : "Chế độ tương phản cao",
"Enable high contrast mode" : "Bật chế độ tương phản cao",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Chế độ tương phản cao giúp bạn dễ dàng điều hướng và phân biệt vị trí các mục chính xác hơn. Chất lượng hình ảnh sẽ giảm nhưng độ rõ sẽ được tăng lên.",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Một chế độ tương phản cao để dễ dàng điều hướng của bạn. Chất lượng hình ảnh sẽ giảm nhưng độ rõ sẽ được tăng lên.",
"Dyslexia font" : "Chứng khó đọc",
"Enable dyslexia font" : "Bật chế độ dành cho người gặp chứng khó đọc",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic là một kiểu chữ / phông chữ miễn phí được thiết kế để giảm thiểu một số lỗi đọc phổ biến do chứng khó đọc gây ra.",
"Accessibility" : "Khả năng tiếp cận",
"Accessibility options for nextcloud" : "Tùy chọn truy cập cho nextcloud",

View file

@ -1,12 +1,9 @@
{ "translations": {
"Dark theme" : "Chế độ ban đêm",
"Enable dark theme" : "Bật chế độ ban đêm",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Chế độ ban đêm giúp giảm mỏi mắt bằng cách giảm tương phản ở các màu chói và giảm độ sáng. Chế độ này đang được phát triển, vì vậy, xin hãy báo cáo nếu bạn gặp bất kỳ vấn đề nào trong lúc sử dụng.",
"Dark theme" : "Chế độ tối",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Một chủ đề tối để làm dịu đôi mắt của bạn bằng cách giảm độ sáng và độ sáng tổng thể. Nó vẫn đang được phát triển, vì vậy vui lòng báo cáo bất kỳ vấn đề bạn có thể tìm thấy.",
"High contrast mode" : "Chế độ tương phản cao",
"Enable high contrast mode" : "Bật chế độ tương phản cao",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Chế độ tương phản cao giúp bạn dễ dàng điều hướng và phân biệt vị trí các mục chính xác hơn. Chất lượng hình ảnh sẽ giảm nhưng độ rõ sẽ được tăng lên.",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Một chế độ tương phản cao để dễ dàng điều hướng của bạn. Chất lượng hình ảnh sẽ giảm nhưng độ rõ sẽ được tăng lên.",
"Dyslexia font" : "Chứng khó đọc",
"Enable dyslexia font" : "Bật chế độ dành cho người gặp chứng khó đọc",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic là một kiểu chữ / phông chữ miễn phí được thiết kế để giảm thiểu một số lỗi đọc phổ biến do chứng khó đọc gây ra.",
"Accessibility" : "Khả năng tiếp cận",
"Accessibility options for nextcloud" : "Tùy chọn truy cập cho nextcloud",

View file

@ -2,19 +2,14 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "深色主题",
"Enable dark theme" : "启用深色主题",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "一款通过降低整体亮度来使您的眼睛放松的深色主题。它仍在开发中,所以请报告您发现的问题。",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "一款通过降低整体亮度来使您的眼睛放松的深色主题。它仍在开发中,所以请报告您可能发现的问题。",
"High contrast mode" : "高对比度模式",
"Enable high contrast mode" : "启用高对比度模式",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "使用高对比度模式。图像质量会下降但清晰度会提升。",
"Dyslexia font" : "阅读障碍字体",
"Enable dyslexia font" : "启用阅读障碍字体",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic是一款免费的字样/字体,这款字体的设计目的是缓解由阅读障碍引起的一些常见阅读错误。",
"Accessibility" : "易用性",
"Accessibility options for nextcloud" : "nextcloud的易用性选项",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "提供多种易用性选项以便于您使用Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "通用访问对我们非常重要。 我们遵循网络标准,并进行检查以确保所有内容都可以在没有鼠标或辅助软件(例如屏幕阅读器)的情况下使用。 我们的目标是遵守 {guidelines} Web 内容可访问性指南 {linkend} 2.1 能达到 AA 级别,具有高对比度主题甚至能达到 AAA 级别。",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果您发现任何问题,请随时在 {issuetracker} 我们的问题跟踪器 {linkend} 上报告。 如果您想参与其中,请加入 {designteam} 我们的设计团队 {linkend}",
"High contrast theme" : "高对比度主题",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "便于您浏览的高对比度主题。图像质量会下降但清晰度会提升。",
"Dark theme (beta)" : "深色主题beta",

View file

@ -1,18 +1,13 @@
{ "translations": {
"Dark theme" : "深色主题",
"Enable dark theme" : "启用深色主题",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "一款通过降低整体亮度来使您的眼睛放松的深色主题。它仍在开发中,所以请报告您发现的问题。",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "一款通过降低整体亮度来使您的眼睛放松的深色主题。它仍在开发中,所以请报告您可能发现的问题。",
"High contrast mode" : "高对比度模式",
"Enable high contrast mode" : "启用高对比度模式",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "使用高对比度模式。图像质量会下降但清晰度会提升。",
"Dyslexia font" : "阅读障碍字体",
"Enable dyslexia font" : "启用阅读障碍字体",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic是一款免费的字样/字体,这款字体的设计目的是缓解由阅读障碍引起的一些常见阅读错误。",
"Accessibility" : "易用性",
"Accessibility options for nextcloud" : "nextcloud的易用性选项",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "提供多种易用性选项以便于您使用Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "通用访问对我们非常重要。 我们遵循网络标准,并进行检查以确保所有内容都可以在没有鼠标或辅助软件(例如屏幕阅读器)的情况下使用。 我们的目标是遵守 {guidelines} Web 内容可访问性指南 {linkend} 2.1 能达到 AA 级别,具有高对比度主题甚至能达到 AAA 级别。",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果您发现任何问题,请随时在 {issuetracker} 我们的问题跟踪器 {linkend} 上报告。 如果您想参与其中,请加入 {designteam} 我们的设计团队 {linkend}",
"High contrast theme" : "高对比度主题",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "便于您浏览的高对比度主题。图像质量会下降但清晰度会提升。",
"Dark theme (beta)" : "深色主题beta",

View file

@ -2,27 +2,20 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "黑暗主題",
"Enable dark theme" : "啟用黑暗主題",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "黑暗風格的主題,通過降低整體亮度來舒緩對您眼睛的刺激。黑暗主題仍在開發中,如發現任何問題,煩請報告。",
"High contrast mode" : "高對比度模式",
"Enable high contrast mode" : "開啟高對比度模式",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "高對比度模式會降低介面品質,但會提高清晰度,有助您瀏覽。",
"Dyslexia font" : "閱讀障礙字型",
"Enable dyslexia font" : "啟用閱讀障礙字型",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "高對比度模式會降低界面質量,但會提高清晰度,有助您瀏覽。",
"Dyslexia font" : "閱讀障礙字體",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic 是一種免費的字型,目的在降低因拼音文字閱讀障礙引起的一些常見閱讀錯誤。",
"Accessibility" : "協助工具",
"Accessibility options for nextcloud" : "Nextcloud 協助工具設定",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "提供多種協助工具使您更易於操作 Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙存取。我們遵循網路標準,並透過檢查來確保所有內容皆可在沒有滑鼠或輔助軟體(例如螢幕閱讀器)的情況下使用。我們目標是能達到 {guidelines}網頁內容可及性指引{linkend} 2.1 版的 AA 等級,加上高對比度主題甚至還能到 AAA 等級。",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果您發現任何一個問題,請不要猶豫並請在 {issuetracker}我們的問題追蹤系統{linkend} 回報。而如果您想參與,歡迎加入 {designteam}我們的設計團隊{linked}",
"High contrast theme" : "高對比度主題",
"High contrast theme" : "高對比主題",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "使用高對比度主題以便於頁面導覽。提高操作理解程度,但視覺質感會下降。",
"Dark theme (beta)" : "黑暗主題(測試)",
"Web Content Accessibility Guidelines" : "網路內容協助工具指南",
"our issue tracker" : "問題追蹤",
"our design team" : "我們的設計團隊",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙存取。我們遵循網路標準,並透過檢查來確保所有內容皆可在沒有滑鼠或輔助軟體(例如螢幕閱讀器)的情況下使用。我們目標是能達到 {guidelines} 2.1 版的 AA 等級,加上高對比度主題甚至還能到 AAA 等級。",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "如果您發現任何一個問題,請不要猶豫並在 {issuetracker} 通知我們。並且如果您想參與,請加入 {designteam}",
"Enable" : "啟用"
},
"nplurals=1; plural=0;");

View file

@ -1,26 +1,19 @@
{ "translations": {
"Dark theme" : "黑暗主題",
"Enable dark theme" : "啟用黑暗主題",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "黑暗風格的主題,通過降低整體亮度來舒緩對您眼睛的刺激。黑暗主題仍在開發中,如發現任何問題,煩請報告。",
"High contrast mode" : "高對比度模式",
"Enable high contrast mode" : "開啟高對比度模式",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "高對比度模式會降低介面品質,但會提高清晰度,有助您瀏覽。",
"Dyslexia font" : "閱讀障礙字型",
"Enable dyslexia font" : "啟用閱讀障礙字型",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "高對比度模式會降低界面質量,但會提高清晰度,有助您瀏覽。",
"Dyslexia font" : "閱讀障礙字體",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic 是一種免費的字型,目的在降低因拼音文字閱讀障礙引起的一些常見閱讀錯誤。",
"Accessibility" : "協助工具",
"Accessibility options for nextcloud" : "Nextcloud 協助工具設定",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "提供多種協助工具使您更易於操作 Nextcloud",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙存取。我們遵循網路標準,並透過檢查來確保所有內容皆可在沒有滑鼠或輔助軟體(例如螢幕閱讀器)的情況下使用。我們目標是能達到 {guidelines}網頁內容可及性指引{linkend} 2.1 版的 AA 等級,加上高對比度主題甚至還能到 AAA 等級。",
"If you find any issues, dont hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果您發現任何一個問題,請不要猶豫並請在 {issuetracker}我們的問題追蹤系統{linkend} 回報。而如果您想參與,歡迎加入 {designteam}我們的設計團隊{linked}",
"High contrast theme" : "高對比度主題",
"High contrast theme" : "高對比主題",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "使用高對比度主題以便於頁面導覽。提高操作理解程度,但視覺質感會下降。",
"Dark theme (beta)" : "黑暗主題(測試)",
"Web Content Accessibility Guidelines" : "網路內容協助工具指南",
"our issue tracker" : "問題追蹤",
"our design team" : "我們的設計團隊",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙存取。我們遵循網路標準,並透過檢查來確保所有內容皆可在沒有滑鼠或輔助軟體(例如螢幕閱讀器)的情況下使用。我們目標是能達到 {guidelines} 2.1 版的 AA 等級,加上高對比度主題甚至還能到 AAA 等級。",
"If you find any issues, dont hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "如果您發現任何一個問題,請不要猶豫並在 {issuetracker} 通知我們。並且如果您想參與,請加入 {designteam}",
"Enable" : "啟用"
},"pluralForm" :"nplurals=1; plural=0;"
}

View file

@ -314,7 +314,7 @@ class AccessibilityController extends Controller {
$scss->compile($variables);
$this->injectedVariables = $variables;
} catch (ParserException $e) {
$this->logger->logException($e, ['app' => 'core']);
$this->logger->error($e, ['app' => 'core']);
}
return $variables;
}

View file

@ -82,7 +82,7 @@ export default {
)
.replace('{issuetracker}', this.issuetrackerLink)
.replace('{designteam}', this.designteamLink)
.replace(/\{linkend\}/g, '</a>')
.replace('/{linkend}/g', '</a>')
},
issuetrackerLink() {
return `<a target="_blank" href="https://github.com/nextcloud/server/issues/" rel="noreferrer nofollow">`

Binary file not shown.

Binary file not shown.

View file

@ -19,7 +19,6 @@ OC.L10N.register(
"More comments …" : "مزيد من التعليقات...",
"Save" : "حفظ",
"Allowed characters {count} of {max}" : "عدد الأحرف المسموح بها {count} من {max}",
"Error occurred while retrieving comment with ID {id}" : "حدث خطأ عند محاولة إيجاد التعليق المعرف بـ {id}",
"Error occurred while updating comment with id {id}" : "حصل خطأ أثناء تعديل التعليق رقم {id}",
"Error occurred while posting comment" : "حصل خطأ أثناء إرسال التعليق",
"_%n unread comment_::_%n unread comments_" : ["%n تعليق غير مقروء","%n تعليق غير مقروء","تعليقان غير مقروءة","%n تعليقات غير مقروء","%n تعليق غير مقروء","%n تعليق غير مقروء"],

View file

@ -17,7 +17,6 @@
"More comments …" : "مزيد من التعليقات...",
"Save" : "حفظ",
"Allowed characters {count} of {max}" : "عدد الأحرف المسموح بها {count} من {max}",
"Error occurred while retrieving comment with ID {id}" : "حدث خطأ عند محاولة إيجاد التعليق المعرف بـ {id}",
"Error occurred while updating comment with id {id}" : "حصل خطأ أثناء تعديل التعليق رقم {id}",
"Error occurred while posting comment" : "حصل خطأ أثناء إرسال التعليق",
"_%n unread comment_::_%n unread comments_" : ["%n تعليق غير مقروء","%n تعليق غير مقروء","تعليقان غير مقروءة","%n تعليقات غير مقروء","%n تعليق غير مقروء","%n تعليق غير مقروء"],

View file

@ -27,7 +27,6 @@ OC.L10N.register(
"Error occurred while updating comment with id {id}" : "שגיאה אירעה כאשר עודכנה תגובה עם מספר זיהוי {id}",
"Error occurred while posting comment" : "אירעה שגיאה בזמן פרסום תגובה",
"_%n unread comment_::_%n unread comments_" : ["תגובה אחת שלא נקראה","%n תגובות שלא נקראו","%n תגובות שלא נקראו","%n תגובות שלא נקראו"],
"_1 new comment_::_{unread} new comments_" : ["הערה חדשה אחת","{unread} הערות חדשות","{unread} הערות חדשות","{unread} הערות חדשות"],
"Comment" : "תגובה"
},
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;");

View file

@ -25,7 +25,6 @@
"Error occurred while updating comment with id {id}" : "שגיאה אירעה כאשר עודכנה תגובה עם מספר זיהוי {id}",
"Error occurred while posting comment" : "אירעה שגיאה בזמן פרסום תגובה",
"_%n unread comment_::_%n unread comments_" : ["תגובה אחת שלא נקראה","%n תגובות שלא נקראו","%n תגובות שלא נקראו","%n תגובות שלא נקראו"],
"_1 new comment_::_{unread} new comments_" : ["הערה חדשה אחת","{unread} הערות חדשות","{unread} הערות חדשות","{unread} הערות חדשות"],
"Comment" : "תגובה"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"
}

View file

@ -19,12 +19,12 @@ OC.L10N.register(
"Post" : "Објави",
"Cancel" : "Откажи",
"[Deleted user]" : "[Обрисан корисник]",
"No comments yet, start the conversation!" : "Још нема коментара. Започните дискусију!",
"No comments yet, start the conversation!" : "Тренутно нема коментара. Започните дискусију",
"More comments …" : "Преостали коментари …",
"Save" : "Сачувај",
"Allowed characters {count} of {max}" : "Дозвољених {count} знакова од {max}",
"Error occurred while retrieving comment with ID {id}" : "Дошло је до грешке при прегледу коментара са идентификацијом {id}",
"Error occurred while updating comment with id {id}" : "Дошло је до грешке при ажурирању коментара са ознаком {id}",
"Error occurred while updating comment with id {id}" : "Дошло је до грешке при преправци коментара ознаке {id}",
"Error occurred while posting comment" : "Дошло је до грешке при објави коментара",
"_%n unread comment_::_%n unread comments_" : ["%nнепрочитани коментар","%nнепрочитана коментара ","%n непрочитаних коментара"],
"_1 new comment_::_{unread} new comments_" : ["1 нови коментар","{unread} нова коментара","{unread} нова коментара"],

View file

@ -17,12 +17,12 @@
"Post" : "Објави",
"Cancel" : "Откажи",
"[Deleted user]" : "[Обрисан корисник]",
"No comments yet, start the conversation!" : "Још нема коментара. Започните дискусију!",
"No comments yet, start the conversation!" : "Тренутно нема коментара. Започните дискусију",
"More comments …" : "Преостали коментари …",
"Save" : "Сачувај",
"Allowed characters {count} of {max}" : "Дозвољених {count} знакова од {max}",
"Error occurred while retrieving comment with ID {id}" : "Дошло је до грешке при прегледу коментара са идентификацијом {id}",
"Error occurred while updating comment with id {id}" : "Дошло је до грешке при ажурирању коментара са ознаком {id}",
"Error occurred while updating comment with id {id}" : "Дошло је до грешке при преправци коментара ознаке {id}",
"Error occurred while posting comment" : "Дошло је до грешке при објави коментара",
"_%n unread comment_::_%n unread comments_" : ["%nнепрочитани коментар","%nнепрочитана коментара ","%n непрочитаних коментара"],
"_1 new comment_::_{unread} new comments_" : ["1 нови коментар","{unread} нова коментара","{unread} нова коментара"],

View file

@ -29,7 +29,6 @@
*/
use OCA\DAV\AppInfo\Application;
use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService;
use OCA\DAV\CardDAV\CardDavBackend;
use Symfony\Component\EventDispatcher\GenericEvent;
@ -62,13 +61,6 @@ $eventDispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::createSubscription
$jobList = $app->getContainer()->getServer()->getJobList();
$subscriptionData = $event->getArgument('subscriptionData');
/**
* Initial subscription refetch
* @var RefreshWebcalService $refreshWebcalService
*/
$refreshWebcalService = $app->getContainer()->query(RefreshWebcalService::class);
$refreshWebcalService->refreshSubscription($subscriptionData['principaluri'], $subscriptionData['uri']);
$jobList->add(\OCA\DAV\BackgroundJob\RefreshWebcalJob::class, [
'principaluri' => $subscriptionData['principaluri'],
'uri' => $subscriptionData['uri']

View file

@ -42,8 +42,6 @@ return array(
'OCA\\DAV\\CalDAV\\CalendarObject' => $baseDir . '/../lib/CalDAV/CalendarObject.php',
'OCA\\DAV\\CalDAV\\CalendarRoot' => $baseDir . '/../lib/CalDAV/CalendarRoot.php',
'OCA\\DAV\\CalDAV\\ICSExportPlugin\\ICSExportPlugin' => $baseDir . '/../lib/CalDAV/ICSExportPlugin/ICSExportPlugin.php',
'OCA\\DAV\\CalDAV\\Integration\\ExternalCalendar' => $baseDir . '/../lib/CalDAV/Integration/ExternalCalendar.php',
'OCA\\DAV\\CalDAV\\Integration\\ICalendarProvider' => $baseDir . '/../lib/CalDAV/Integration/ICalendarProvider.php',
'OCA\\DAV\\CalDAV\\InvitationResponse\\InvitationResponseServer' => $baseDir . '/../lib/CalDAV/InvitationResponse/InvitationResponseServer.php',
'OCA\\DAV\\CalDAV\\Outbox' => $baseDir . '/../lib/CalDAV/Outbox.php',
'OCA\\DAV\\CalDAV\\Plugin' => $baseDir . '/../lib/CalDAV/Plugin.php',
@ -81,7 +79,6 @@ return array(
'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\SearchTermFilter' => $baseDir . '/../lib/CalDAV/Search/Xml/Filter/SearchTermFilter.php',
'OCA\\DAV\\CalDAV\\Search\\Xml\\Request\\CalendarSearchReport' => $baseDir . '/../lib/CalDAV/Search/Xml/Request/CalendarSearchReport.php',
'OCA\\DAV\\CalDAV\\WebcalCaching\\Plugin' => $baseDir . '/../lib/CalDAV/WebcalCaching/Plugin.php',
'OCA\\DAV\\CalDAV\\WebcalCaching\\RefreshWebcalService' => $baseDir . '/../lib/CalDAV/WebcalCaching/RefreshWebcalService.php',
'OCA\\DAV\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
'OCA\\DAV\\CardDAV\\AddressBook' => $baseDir . '/../lib/CardDAV/AddressBook.php',
'OCA\\DAV\\CardDAV\\AddressBookImpl' => $baseDir . '/../lib/CardDAV/AddressBookImpl.php',

View file

@ -57,8 +57,6 @@ class ComposerStaticInitDAV
'OCA\\DAV\\CalDAV\\CalendarObject' => __DIR__ . '/..' . '/../lib/CalDAV/CalendarObject.php',
'OCA\\DAV\\CalDAV\\CalendarRoot' => __DIR__ . '/..' . '/../lib/CalDAV/CalendarRoot.php',
'OCA\\DAV\\CalDAV\\ICSExportPlugin\\ICSExportPlugin' => __DIR__ . '/..' . '/../lib/CalDAV/ICSExportPlugin/ICSExportPlugin.php',
'OCA\\DAV\\CalDAV\\Integration\\ExternalCalendar' => __DIR__ . '/..' . '/../lib/CalDAV/Integration/ExternalCalendar.php',
'OCA\\DAV\\CalDAV\\Integration\\ICalendarProvider' => __DIR__ . '/..' . '/../lib/CalDAV/Integration/ICalendarProvider.php',
'OCA\\DAV\\CalDAV\\InvitationResponse\\InvitationResponseServer' => __DIR__ . '/..' . '/../lib/CalDAV/InvitationResponse/InvitationResponseServer.php',
'OCA\\DAV\\CalDAV\\Outbox' => __DIR__ . '/..' . '/../lib/CalDAV/Outbox.php',
'OCA\\DAV\\CalDAV\\Plugin' => __DIR__ . '/..' . '/../lib/CalDAV/Plugin.php',
@ -96,7 +94,6 @@ class ComposerStaticInitDAV
'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\SearchTermFilter' => __DIR__ . '/..' . '/../lib/CalDAV/Search/Xml/Filter/SearchTermFilter.php',
'OCA\\DAV\\CalDAV\\Search\\Xml\\Request\\CalendarSearchReport' => __DIR__ . '/..' . '/../lib/CalDAV/Search/Xml/Request/CalendarSearchReport.php',
'OCA\\DAV\\CalDAV\\WebcalCaching\\Plugin' => __DIR__ . '/..' . '/../lib/CalDAV/WebcalCaching/Plugin.php',
'OCA\\DAV\\CalDAV\\WebcalCaching\\RefreshWebcalService' => __DIR__ . '/..' . '/../lib/CalDAV/WebcalCaching/RefreshWebcalService.php',
'OCA\\DAV\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
'OCA\\DAV\\CardDAV\\AddressBook' => __DIR__ . '/..' . '/../lib/CardDAV/AddressBook.php',
'OCA\\DAV\\CardDAV\\AddressBookImpl' => __DIR__ . '/..' . '/../lib/CardDAV/AddressBookImpl.php',

View file

@ -63,7 +63,7 @@ OC.L10N.register(
"Where: %s" : "On: %s",
"%1$s via %2$s" : "%1$s mitjançant %2$s",
"Invitation canceled" : "Invitació cancel·lada",
"Hello %s," : "Hola, %s,",
"Hello %s," : "Hola %s,",
"The meeting »%1$s« with %2$s was canceled." : "La reunió »%1$s« amb %2$s ha estat cancel·lada.",
"Invitation updated" : "Invitació actualitzada",
"The meeting »%1$s« with %2$s was updated." : "La reunió »%1$s« amb %2$s ha estat actualitzada.",

View file

@ -61,7 +61,7 @@
"Where: %s" : "On: %s",
"%1$s via %2$s" : "%1$s mitjançant %2$s",
"Invitation canceled" : "Invitació cancel·lada",
"Hello %s," : "Hola, %s,",
"Hello %s," : "Hola %s,",
"The meeting »%1$s« with %2$s was canceled." : "La reunió »%1$s« amb %2$s ha estat cancel·lada.",
"Invitation updated" : "Invitació actualitzada",
"The meeting »%1$s« with %2$s was updated." : "La reunió »%1$s« amb %2$s ha estat actualitzada.",

View file

@ -50,7 +50,7 @@ OC.L10N.register(
"Where:" : "Dónde:",
"Description:" : "Descripción:",
"Untitled event" : "Evento sin título",
"_%n year_::_%n years_" : ["%n año","%n años"],
"_%n year_::_%n years_" : ["%n año","%naños"],
"_%n month_::_%n months_" : ["%n mes","%n meses"],
"_%n day_::_%n days_" : ["%n día","%n días"],
"_%n hour_::_%n hours_" : ["%n hora","%n horas"],

View file

@ -48,7 +48,7 @@
"Where:" : "Dónde:",
"Description:" : "Descripción:",
"Untitled event" : "Evento sin título",
"_%n year_::_%n years_" : ["%n año","%n años"],
"_%n year_::_%n years_" : ["%n año","%naños"],
"_%n month_::_%n months_" : ["%n mes","%n meses"],
"_%n day_::_%n days_" : ["%n día","%n días"],
"_%n hour_::_%n hours_" : ["%n hora","%n horas"],

View file

@ -44,22 +44,9 @@ OC.L10N.register(
"A calendar <strong>event</strong> was modified" : "<strong>Atburði</strong> dagatals var breytt",
"A calendar <strong>todo</strong> was modified" : "<strong>Verkefnalista</strong> dagatals var breytt",
"Contact birthdays" : "Afmælisdagar tengiliðar",
"Calendar:" : "Dagatal:",
"Date:" : "Dagsetning:",
"Where:" : "Hvar:",
"Description:" : "Lýsing:",
"Untitled event" : "Ónefndur atburður",
"_%n year_::_%n years_" : ["%n ár","%n ár"],
"_%n month_::_%n months_" : ["%n mánuður","%n mánuðir"],
"_%n day_::_%n days_" : ["%n dagur","%n dagar"],
"_%n hour_::_%n hours_" : ["%n klukkustund","%n klukkustundir"],
"_%n minute_::_%n minutes_" : ["%n mínúta","%n mínútur"],
"%s (in %s)" : "%s (í %s)",
"%s (%s ago)" : "%s (%s síðan)",
"Calendar: %s" : "Dagatal: %s",
"Date: %s" : "Dagsetning: %s",
"Description: %s" : "Lýsing: %s",
"Where: %s" : "Hvar: %s",
"%1$s via %2$s" : "%1$s með %2$s",
"Invitation canceled" : "Hætt við boð",
"Hello %s," : "Halló %s,",

View file

@ -42,22 +42,9 @@
"A calendar <strong>event</strong> was modified" : "<strong>Atburði</strong> dagatals var breytt",
"A calendar <strong>todo</strong> was modified" : "<strong>Verkefnalista</strong> dagatals var breytt",
"Contact birthdays" : "Afmælisdagar tengiliðar",
"Calendar:" : "Dagatal:",
"Date:" : "Dagsetning:",
"Where:" : "Hvar:",
"Description:" : "Lýsing:",
"Untitled event" : "Ónefndur atburður",
"_%n year_::_%n years_" : ["%n ár","%n ár"],
"_%n month_::_%n months_" : ["%n mánuður","%n mánuðir"],
"_%n day_::_%n days_" : ["%n dagur","%n dagar"],
"_%n hour_::_%n hours_" : ["%n klukkustund","%n klukkustundir"],
"_%n minute_::_%n minutes_" : ["%n mínúta","%n mínútur"],
"%s (in %s)" : "%s (í %s)",
"%s (%s ago)" : "%s (%s síðan)",
"Calendar: %s" : "Dagatal: %s",
"Date: %s" : "Dagsetning: %s",
"Description: %s" : "Lýsing: %s",
"Where: %s" : "Hvar: %s",
"%1$s via %2$s" : "%1$s með %2$s",
"Invitation canceled" : "Hætt við boð",
"Hello %s," : "Halló %s,",

View file

@ -61,13 +61,13 @@ OC.L10N.register(
"Date: %s" : "Дата: %s",
"Description: %s" : "Описание: %s",
"Where: %s" : "Где: %s",
"%1$s via %2$s" : "%1$s через %2$s",
"%1$s via %2$s" : "%1$sчерез %2$s",
"Invitation canceled" : "Приглашение отменено",
"Hello %s," : "Привет, %s!",
"The meeting »%1$s« with %2$s was canceled." : "Встреча «%1$s» с %2$s отменена.",
"Invitation updated" : "Приглашение обновлено",
"The meeting »%1$s« with %2$s was updated." : "Встреча «%1$s» с %2$s обновлена.",
"%1$s invited you to »%2$s«" : "%1$s приглашает вас в «%2$s»",
"%1$s invited you to »%2$s«" : "%1$sприглашает вас в »%2$s«",
"When:" : "Когда:",
"Link:" : "Ссылка:",
"Accept" : "Принять",
@ -97,7 +97,6 @@ OC.L10N.register(
"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." : "Уведомления будут отправляться через фоновые задания, поэтому они должны выполняться достаточно часто.",
"Enable notifications for events via push" : "Включить уведомления о событиях с помощью push",
"Notifications will be send through background jobs, so these need to happen often enough." : "Уведомления будут отправляться через фоновые задания, поэтому они должны выполняться достаточно часто."
},

View file

@ -59,13 +59,13 @@
"Date: %s" : "Дата: %s",
"Description: %s" : "Описание: %s",
"Where: %s" : "Где: %s",
"%1$s via %2$s" : "%1$s через %2$s",
"%1$s via %2$s" : "%1$sчерез %2$s",
"Invitation canceled" : "Приглашение отменено",
"Hello %s," : "Привет, %s!",
"The meeting »%1$s« with %2$s was canceled." : "Встреча «%1$s» с %2$s отменена.",
"Invitation updated" : "Приглашение обновлено",
"The meeting »%1$s« with %2$s was updated." : "Встреча «%1$s» с %2$s обновлена.",
"%1$s invited you to »%2$s«" : "%1$s приглашает вас в «%2$s»",
"%1$s invited you to »%2$s«" : "%1$sприглашает вас в »%2$s«",
"When:" : "Когда:",
"Link:" : "Ссылка:",
"Accept" : "Принять",
@ -95,7 +95,6 @@
"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." : "Уведомления будут отправляться через фоновые задания, поэтому они должны выполняться достаточно часто.",
"Enable notifications for events via push" : "Включить уведомления о событиях с помощью push",
"Notifications will be send through background jobs, so these need to happen often enough." : "Уведомления будут отправляться через фоновые задания, поэтому они должны выполняться достаточно часто."
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"

View file

@ -4,25 +4,25 @@ OC.L10N.register(
"Calendar" : "Календар",
"Todos" : "Подсетници",
"Personal" : "Лично",
"{actor} created calendar {calendar}" : "{actor} направи календар {calendar}",
"You created calendar {calendar}" : "Направили сте календар {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} обриса календар {calendar}",
"{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}",
"{actor} updated calendar {calendar}" : "{actor} је ажурирао календар {calendar}",
"You updated calendar {calendar}" : "Ажурирали сте календар {calendar}",
"You shared calendar {calendar} as public link" : "Поделили сте календар {calendar} као јавну везу",
"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} са њим",
"{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}",
"{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}",
"{actor} unshared calendar {calendar} from group {group}" : "{actor} је укинуо дељење календара {calendar} са групом {group}",
"{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}",

View file

@ -2,25 +2,25 @@
"Calendar" : "Календар",
"Todos" : "Подсетници",
"Personal" : "Лично",
"{actor} created calendar {calendar}" : "{actor} направи календар {calendar}",
"You created calendar {calendar}" : "Направили сте календар {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} обриса календар {calendar}",
"{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}",
"{actor} updated calendar {calendar}" : "{actor} је ажурирао календар {calendar}",
"You updated calendar {calendar}" : "Ажурирали сте календар {calendar}",
"You shared calendar {calendar} as public link" : "Поделили сте календар {calendar} као јавну везу",
"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} са њим",
"{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}",
"{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}",
"{actor} unshared calendar {calendar} from group {group}" : "{actor} је укинуо дељење календара {calendar} са групом {group}",
"{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}",

View file

@ -25,7 +25,6 @@
namespace OCA\DAV\AppInfo;
use OC\ServerContainer;
use OCA\DAV\CalDAV\Integration\ICalendarProvider;
use OCP\App\IAppManager;
use OCP\AppFramework\QueryException;
@ -59,13 +58,6 @@ class PluginManager {
*/
private $collections = null;
/**
* Calendar plugins
*
* @var array
*/
private $calendarPlugins = null;
/**
* Contstruct a PluginManager
*
@ -101,24 +93,11 @@ class PluginManager {
return $this->collections;
}
/**
* Returns an array of app-registered calendar plugins
*
* @return array
*/
public function getCalendarPlugins():array {
if (null === $this->calendarPlugins) {
$this->populate();
}
return $this->calendarPlugins;
}
/**
* Retrieve plugin and collection list and populate attributes
*/
private function populate() {
$this->plugins = [];
$this->calendarPlugins = [];
$this->collections = [];
foreach ($this->appManager->getInstalledApps() as $app) {
// load plugins and collections from info.xml
@ -128,7 +107,6 @@ class PluginManager {
}
$this->loadSabrePluginsFromInfoXml($this->extractPluginList($info));
$this->loadSabreCollectionsFromInfoXml($this->extractCollectionList($info));
$this->loadSabreCalendarPluginsFromInfoXml($this->extractCalendarPluginList($info));
}
}
@ -162,21 +140,6 @@ class PluginManager {
return [];
}
private function extractCalendarPluginList(array $array):array {
if (isset($array['sabre']) && is_array($array['sabre'])) {
if (isset($array['sabre']['calendar-plugins']) && is_array($array['sabre']['calendar-plugins'])) {
if (isset($array['sabre']['calendar-plugins']['plugin'])) {
$items = $array['sabre']['calendar-plugins']['plugin'];
if (!is_array($items)) {
$items = [$items];
}
return $items;
}
}
}
return [];
}
private function loadSabrePluginsFromInfoXml(array $plugins) {
foreach ($plugins as $plugin) {
try {
@ -205,24 +168,4 @@ class PluginManager {
}
}
private function loadSabreCalendarPluginsFromInfoXml(array $calendarPlugins):void {
foreach ($calendarPlugins as $calendarPlugin) {
try {
$instantiatedCalendarPlugin = $this->container->query($calendarPlugin);
} catch (QueryException $e) {
if (class_exists($calendarPlugin)) {
$instantiatedCalendarPlugin = new $calendarPlugin();
} else {
throw new \Exception("Sabre calendar-plugin class '$calendarPlugin' is unknown and could not be loaded");
}
}
if (!($instantiatedCalendarPlugin instanceof ICalendarProvider)) {
throw new \Exception("Sabre calendar-plugin class '$calendarPlugin' does not implement ICalendarProvider interface");
}
$this->calendarPlugins[] = $instantiatedCalendarPlugin;
}
}
}

View file

@ -7,7 +7,6 @@ declare(strict_types=1);
*
* @author Georg Ehrke <oc.list@georgehrke.com>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
@ -28,25 +27,35 @@ declare(strict_types=1);
namespace OCA\DAV\BackgroundJob;
use DateInterval;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use OC\BackgroundJob\Job;
use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService;
use OCA\DAV\CalDAV\CalDavBackend;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\ILogger;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Sabre\DAV\Exception\BadRequest;
use Sabre\DAV\PropPatch;
use Sabre\DAV\Xml\Property\Href;
use Sabre\VObject\Component;
use Sabre\VObject\DateTimeParser;
use Sabre\VObject\InvalidDataException;
use Sabre\VObject\ParseException;
use Sabre\VObject\Reader;
use Sabre\VObject\Splitter\ICalendar;
class RefreshWebcalJob extends Job {
/**
* @var RefreshWebcalService
*/
private $refreshWebcalService;
/** @var CalDavBackend */
private $calDavBackend;
/**
* @var IConfig
*/
/** @var IClientService */
private $clientService;
/** @var IConfig */
private $config;
/** @var ILogger */
@ -55,16 +64,26 @@ class RefreshWebcalJob extends Job {
/** @var ITimeFactory */
private $timeFactory;
/** @var array */
private $subscription;
private const REFRESH_RATE = '{http://apple.com/ns/ical/}refreshrate';
private const STRIP_ALARMS = '{http://calendarserver.org/ns/}subscribed-strip-alarms';
private const STRIP_ATTACHMENTS = '{http://calendarserver.org/ns/}subscribed-strip-attachments';
private const STRIP_TODOS = '{http://calendarserver.org/ns/}subscribed-strip-todos';
/**
* RefreshWebcalJob constructor.
*
* @param RefreshWebcalService $refreshWebcalService
* @param CalDavBackend $calDavBackend
* @param IClientService $clientService
* @param IConfig $config
* @param ILogger $logger
* @param ITimeFactory $timeFactory
*/
public function __construct(RefreshWebcalService $refreshWebcalService, IConfig $config, ILogger $logger, ITimeFactory $timeFactory) {
$this->refreshWebcalService = $refreshWebcalService;
public function __construct(CalDavBackend $calDavBackend, IClientService $clientService, IConfig $config, ILogger $logger, ITimeFactory $timeFactory) {
$this->calDavBackend = $calDavBackend;
$this->clientService = $clientService;
$this->config = $config;
$this->logger = $logger;
$this->timeFactory = $timeFactory;
@ -76,7 +95,7 @@ class RefreshWebcalJob extends Job {
* @inheritdoc
*/
public function execute($jobList, ILogger $logger = null) {
$subscription = $this->refreshWebcalService->getSubscription($this->argument['principaluri'], $this->argument['uri']);
$subscription = $this->getSubscription($this->argument['principaluri'], $this->argument['uri']);
if (!$subscription) {
return;
}
@ -84,14 +103,12 @@ class RefreshWebcalJob extends Job {
$this->fixSubscriptionRowTyping($subscription);
// if no refresh rate was configured, just refresh once a week
$defaultRefreshRate = $this->config->getAppValue('dav', 'calendarSubscriptionRefreshRate', 'P1W');
$refreshRate = $subscription[RefreshWebcalService::REFRESH_RATE] ?? $defaultRefreshRate;
$subscriptionId = $subscription['id'];
$refreshrate = $subscription[self::REFRESH_RATE] ?? 'P1W';
try {
/** @var DateInterval $dateInterval */
$dateInterval = DateTimeParser::parseDuration($refreshRate);
/** @var \DateInterval $dateInterval */
$dateInterval = DateTimeParser::parseDuration($refreshrate);
} catch(InvalidDataException $ex) {
$this->logger->logException($ex);
$this->logger->warning("Subscription $subscriptionId could not be refreshed, refreshrate in database is invalid");
@ -110,16 +127,243 @@ class RefreshWebcalJob extends Job {
* @param array $argument
*/
protected function run($argument) {
$this->refreshWebcalService->refreshSubscription($argument['principaluri'], $argument['uri']);
$subscription = $this->getSubscription($argument['principaluri'], $argument['uri']);
$mutations = [];
if (!$subscription) {
return;
}
$webcalData = $this->queryWebcalFeed($subscription, $mutations);
if (!$webcalData) {
return;
}
$stripTodos = ($subscription[self::STRIP_TODOS] ?? 1) === 1;
$stripAlarms = ($subscription[self::STRIP_ALARMS] ?? 1) === 1;
$stripAttachments = ($subscription[self::STRIP_ATTACHMENTS] ?? 1) === 1;
try {
$splitter = new ICalendar($webcalData, Reader::OPTION_FORGIVING);
// we wait with deleting all outdated events till we parsed the new ones
// in case the new calendar is broken and `new ICalendar` throws a ParseException
// the user will still see the old data
$this->calDavBackend->purgeAllCachedEventsForSubscription($subscription['id']);
while ($vObject = $splitter->getNext()) {
/** @var Component $vObject */
$uid = null;
$compName = null;
foreach ($vObject->getComponents() as $component) {
if ($component->name === 'VTIMEZONE') {
continue;
}
$uid = $component->{'UID'}->getValue();
$compName = $component->name;
if ($stripAlarms) {
unset($component->{'VALARM'});
}
if ($stripAttachments) {
unset($component->{'ATTACH'});
}
}
if ($stripTodos && $compName === 'VTODO') {
continue;
}
$uri = $uid . '.ics';
$calendarData = $vObject->serialize();
try {
$this->calDavBackend->createCalendarObject($subscription['id'], $uri, $calendarData, CalDavBackend::CALENDAR_TYPE_SUBSCRIPTION);
} catch(BadRequest $ex) {
$this->logger->logException($ex);
}
}
$newRefreshRate = $this->checkWebcalDataForRefreshRate($subscription, $webcalData);
if ($newRefreshRate) {
$mutations[self::REFRESH_RATE] = $newRefreshRate;
}
$this->updateSubscription($subscription, $mutations);
} catch(ParseException $ex) {
$subscriptionId = $subscription['id'];
$this->logger->logException($ex);
$this->logger->warning("Subscription $subscriptionId could not be refreshed due to a parsing error");
}
}
/**
* gets webcal feed from remote server
*
* @param array $subscription
* @param array &$mutations
* @return null|string
*/
private function queryWebcalFeed(array $subscription, array &$mutations) {
$client = $this->clientService->newClient();
$didBreak301Chain = false;
$latestLocation = null;
$handlerStack = HandlerStack::create();
$handlerStack->push(Middleware::mapRequest(function (RequestInterface $request) {
return $request
->withHeader('Accept', 'text/calendar, application/calendar+json, application/calendar+xml')
->withHeader('User-Agent', 'Nextcloud Webcal Crawler');
}));
$handlerStack->push(Middleware::mapResponse(function(ResponseInterface $response) use (&$didBreak301Chain, &$latestLocation) {
if (!$didBreak301Chain) {
if ($response->getStatusCode() !== 301) {
$didBreak301Chain = true;
} else {
$latestLocation = $response->getHeader('Location');
}
}
return $response;
}));
$allowLocalAccess = $this->config->getAppValue('dav', 'webcalAllowLocalAccess', 'no');
$subscriptionId = $subscription['id'];
$url = $this->cleanURL($subscription['source']);
if ($url === null) {
return null;
}
if ($allowLocalAccess !== 'yes') {
$host = strtolower(parse_url($url, PHP_URL_HOST));
// remove brackets from IPv6 addresses
if (strpos($host, '[') === 0 && substr($host, -1) === ']') {
$host = substr($host, 1, -1);
}
// Disallow localhost and local network
if ($host === 'localhost' || substr($host, -6) === '.local' || substr($host, -10) === '.localhost') {
$this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules");
return null;
}
// Disallow hostname only
if (substr_count($host, '.') === 0) {
$this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules");
return null;
}
if ((bool)filter_var($host, FILTER_VALIDATE_IP) && !filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules");
return null;
}
// Also check for IPv6 IPv4 nesting, because that's not covered by filter_var
if ((bool)filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) && substr_count($host, '.') > 0) {
$delimiter = strrpos($host, ':'); // Get last colon
$ipv4Address = substr($host, $delimiter + 1);
if (!filter_var($ipv4Address, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules");
return null;
}
}
}
try {
$params = [
'allow_redirects' => [
'redirects' => 10
],
'handler' => $handlerStack,
];
$user = parse_url($subscription['source'], PHP_URL_USER);
$pass = parse_url($subscription['source'], PHP_URL_PASS);
if ($user !== null && $pass !== null) {
$params['auth'] = [$user, $pass];
}
$response = $client->get($url, $params);
$body = $response->getBody();
if ($latestLocation) {
$mutations['{http://calendarserver.org/ns/}source'] = new Href($latestLocation);
}
$contentType = $response->getHeader('Content-Type');
$contentType = explode(';', $contentType, 2)[0];
switch($contentType) {
case 'application/calendar+json':
try {
$jCalendar = Reader::readJson($body, Reader::OPTION_FORGIVING);
} catch(\Exception $ex) {
// In case of a parsing error return null
$this->logger->debug("Subscription $subscriptionId could not be parsed");
return null;
}
return $jCalendar->serialize();
case 'application/calendar+xml':
try {
$xCalendar = Reader::readXML($body);
} catch(\Exception $ex) {
// In case of a parsing error return null
$this->logger->debug("Subscription $subscriptionId could not be parsed");
return null;
}
return $xCalendar->serialize();
case 'text/calendar':
default:
try {
$vCalendar = Reader::read($body);
} catch(\Exception $ex) {
// In case of a parsing error return null
$this->logger->debug("Subscription $subscriptionId could not be parsed");
return null;
}
return $vCalendar->serialize();
}
} catch(\Exception $ex) {
$this->logger->logException($ex);
$this->logger->warning("Subscription $subscriptionId could not be refreshed due to a network error");
return null;
}
}
/**
* loads subscription from backend
*
* @param string $principalUri
* @param string $uri
* @return array|null
*/
private function getSubscription(string $principalUri, string $uri) {
$subscriptions = array_values(array_filter(
$this->calDavBackend->getSubscriptionsForUser($principalUri),
function($sub) use ($uri) {
return $sub['uri'] === $uri;
}
));
if (\count($subscriptions) === 0) {
return null;
}
$this->subscription = $subscriptions[0];
return $this->subscription;
}
/**
* get total number of seconds from DateInterval object
*
* @param DateInterval $interval
* @param \DateInterval $interval
* @return int
*/
private function getIntervalFromDateInterval(DateInterval $interval):int {
private function getIntervalFromDateInterval(\DateInterval $interval):int {
return $interval->s
+ ($interval->i * 60)
+ ($interval->h * 60 * 60)
@ -128,6 +372,103 @@ class RefreshWebcalJob extends Job {
+ ($interval->y * 60 * 60 * 24 * 365);
}
/**
* check if:
* - current subscription stores a refreshrate
* - the webcal feed suggests a refreshrate
* - return suggested refreshrate if user didn't set a custom one
*
* @param array $subscription
* @param string $webcalData
* @return string|null
*/
private function checkWebcalDataForRefreshRate($subscription, $webcalData) {
// if there is no refreshrate stored in the database, check the webcal feed
// whether it suggests any refresh rate and store that in the database
if (isset($subscription[self::REFRESH_RATE]) && $subscription[self::REFRESH_RATE] !== null) {
return null;
}
/** @var Component\VCalendar $vCalendar */
$vCalendar = Reader::read($webcalData);
$newRefreshRate = null;
if (isset($vCalendar->{'X-PUBLISHED-TTL'})) {
$newRefreshRate = $vCalendar->{'X-PUBLISHED-TTL'}->getValue();
}
if (isset($vCalendar->{'REFRESH-INTERVAL'})) {
$newRefreshRate = $vCalendar->{'REFRESH-INTERVAL'}->getValue();
}
if (!$newRefreshRate) {
return null;
}
// check if new refresh rate is even valid
try {
DateTimeParser::parseDuration($newRefreshRate);
} catch(InvalidDataException $ex) {
return null;
}
return $newRefreshRate;
}
/**
* update subscription stored in database
* used to set:
* - refreshrate
* - source
*
* @param array $subscription
* @param array $mutations
*/
private function updateSubscription(array $subscription, array $mutations) {
if (empty($mutations)) {
return;
}
$propPatch = new PropPatch($mutations);
$this->calDavBackend->updateSubscription($subscription['id'], $propPatch);
$propPatch->commit();
}
/**
* This method will strip authentication information and replace the
* 'webcal' or 'webcals' protocol scheme
*
* @param string $url
* @return string|null
*/
private function cleanURL(string $url) {
$parsed = parse_url($url);
if ($parsed === false) {
return null;
}
if (isset($parsed['scheme']) && $parsed['scheme'] === 'http') {
$scheme = 'http';
} else {
$scheme = 'https';
}
$host = $parsed['host'] ?? '';
$port = isset($parsed['port']) ? ':' . $parsed['port'] : '';
$path = $parsed['path'] ?? '';
$query = isset($parsed['query']) ? '?' . $parsed['query'] : '';
$fragment = isset($parsed['fragment']) ? '#' . $parsed['fragment'] : '';
$cleanURL = "$scheme://$host$port$path$query$fragment";
// parse_url is giving some weird results if no url and no :// is given,
// so let's test the url again
$parsedClean = parse_url($cleanURL);
if ($parsedClean === false || !isset($parsedClean['host'])) {
return null;
}
return $cleanURL;
}
/**
* Fixes types of rows
*
@ -137,9 +478,9 @@ class RefreshWebcalJob extends Job {
$forceInt = [
'id',
'lastmodified',
RefreshWebcalService::STRIP_ALARMS,
RefreshWebcalService::STRIP_ATTACHMENTS,
RefreshWebcalService::STRIP_TODOS,
self::STRIP_ALARMS,
self::STRIP_ATTACHMENTS,
self::STRIP_TODOS,
];
foreach($forceInt as $column) {

View file

@ -55,9 +55,10 @@ class UploadCleanup extends TimedJob {
$uid = $argument['uid'];
$folder = $argument['folder'];
$userFolder = $this->rootFolder->getUserFolder($uid);
$userRoot = $userFolder->getParent();
try {
$userFolder = $this->rootFolder->getUserFolder($uid);
$userRoot = $userFolder->getParent();
/** @var Folder $uploads */
$uploads = $userRoot->get('uploads');
/** @var Folder $uploadFolder */

View file

@ -2465,10 +2465,11 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
if ($this->db->supports4ByteText()) {
$value = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $value);
}
$value = mb_substr($value, 0, 254);
$query->setParameter('name', $property->name);
$query->setParameter('parameter', mb_substr($key, 0, 254));
$query->setParameter('value', mb_substr($value, 0, 254));
$query->setParameter('parameter', substr($key, 0, 254));
$query->setParameter('value', substr($value, 0, 254));
$query->execute();
}
}

View file

@ -26,9 +26,6 @@
namespace OCA\DAV\CalDAV;
use OCA\DAV\AppInfo\PluginManager;
use OCA\DAV\CalDAV\Integration\ExternalCalendar;
use OCA\DAV\CalDAV\Integration\ICalendarProvider;
use Sabre\CalDAV\Backend\BackendInterface;
use Sabre\CalDAV\Backend\NotificationSupport;
use Sabre\CalDAV\Backend\SchedulingSupport;
@ -47,9 +44,6 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
/** @var \OCP\IConfig */
private $config;
/** @var PluginManager */
private $pluginManager;
/** @var bool */
private $returnCachedSubscriptions=false;
@ -57,10 +51,6 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
parent::__construct($caldavBackend, $principalInfo);
$this->l10n = \OC::$server->getL10N('dav');
$this->config = \OC::$server->getConfig();
$this->pluginManager = new PluginManager(
\OC::$server,
\OC::$server->getAppManager()
);
}
/**
@ -76,7 +66,7 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
function createExtendedCollection($name, MkCol $mkCol) {
$reservedNames = [BirthdayService::BIRTHDAY_CALENDAR_URI];
if (\in_array($name, $reservedNames, true) || ExternalCalendar::doesViolateReservedName($name)) {
if (in_array($name, $reservedNames)) {
throw new MethodNotAllowed('The resource you tried to create has a reserved name');
}
@ -114,14 +104,6 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
}
}
foreach ($this->pluginManager->getCalendarPlugins() as $calendarPlugin) {
/** @var ICalendarProvider $calendarPlugin */
$calendars = $calendarPlugin->fetchAllForCalendarHome($this->principalInfo['uri']);
foreach ($calendars as $calendar) {
$objects[] = $calendar;
}
}
return $objects;
}
@ -157,21 +139,7 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
return new Subscription($this->caldavBackend, $subscription);
}
}
}
if (ExternalCalendar::isAppGeneratedCalendar($name)) {
[$appId, $calendarUri] = ExternalCalendar::splitAppGeneratedCalendarUri($name);
foreach ($this->pluginManager->getCalendarPlugins() as $calendarPlugin) {
/** @var ICalendarProvider $calendarPlugin */
if ($calendarPlugin->getAppId() !== $appId) {
continue;
}
if ($calendarPlugin->hasCalendarInCalendarHome($this->principalInfo['uri'], $calendarUri)) {
return $calendarPlugin->getCalendarInCalendarHome($this->principalInfo['uri'], $calendarUri);
}
}
}
throw new NotFound('Node with name \'' . $name . '\' could not be found');
@ -187,7 +155,7 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
return $this->caldavBackend->calendarSearch($principalUri, $filters, $limit, $offset);
}
public function enableCachedSubscriptionsForThisRequest() {
$this->returnCachedSubscriptions = true;
}

View file

@ -1,132 +0,0 @@
<?php
/**
* @copyright 2020, Georg Ehrke <oc.list@georgehrke.com>
*
* @author Georg Ehrke <oc.list@georgehrke.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\CalDAV\Integration;
use Sabre\CalDAV;
use Sabre\DAV;
/**
* Class ExternalCalendar
*
* @package OCA\DAV\CalDAV\Integration
* @since 19.0.0
*/
abstract class ExternalCalendar implements CalDAV\ICalendar, DAV\IProperties {
/** @var string */
private const PREFIX = 'app-generated';
/**
* @var string
*
* Double dash is a valid delimiter,
* because it will always split the calendarURIs correctly:
* - our prefix contains only one dash and won't be split
* - appIds are not allowed to contain dashes as per spec:
* > must contain only lowercase ASCII characters and underscore
* - explode has a limit of three, so even if the app-generated
* calendar uri has double dashes, it won't be split
*/
private const DELIMITER = '--';
/** @var string */
private $appId;
/** @var string */
private $calendarUri;
/**
* ExternalCalendar constructor.
*
* @param string $appId
* @param string $calendarUri
*/
public function __construct(string $appId, string $calendarUri) {
$this->appId = $appId;
$this->calendarUri = $calendarUri;
}
/**
* @inheritDoc
*/
final public function getName() {
return implode(self::DELIMITER, [
self::PREFIX,
$this->appId,
$this->calendarUri,
]);
}
/**
* @inheritDoc
*/
final public function setName($name) {
throw new DAV\Exception\MethodNotAllowed('Renaming calendars is not yet supported');
}
/**
* @inheritDoc
*/
final public function createDirectory($name) {
throw new DAV\Exception\MethodNotAllowed('Creating collections in calendar objects is not allowed');
}
/**
* Checks whether the calendar uri is app-generated
*
* @param string $calendarUri
* @return bool
*/
public static function isAppGeneratedCalendar(string $calendarUri):bool {
return strpos($calendarUri, self::PREFIX) === 0 && substr_count($calendarUri, self::DELIMITER) >= 2;
}
/**
* Splits an app-generated calendar-uri into appId and calendarUri
*
* @param string $calendarUri
* @return array
*/
public static function splitAppGeneratedCalendarUri(string $calendarUri):array {
$array = array_slice(explode(self::DELIMITER, $calendarUri, 3), 1);
// Check the array has expected amount of elements
// and none of them is an empty string
if (\count($array) !== 2 || \in_array('', $array, true)) {
throw new \InvalidArgumentException('Provided calendar uri was not app-generated');
}
return $array;
}
/**
* Checks whether a calendar-name, the user wants to create, violates
* the reserved name for calendar uris
*
* @param string $calendarUri
* @return bool
*/
public static function doesViolateReservedName(string $calendarUri):bool {
return strpos($calendarUri, self::PREFIX) === 0;
}
}

View file

@ -1,73 +0,0 @@
<?php
/**
* @copyright 2020, Georg Ehrke <oc.list@georgehrke.com>
*
* @author Georg Ehrke <oc.list@georgehrke.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\CalDAV\Integration;
use Sabre\CalDAV\ICalendar;
/**
* Interface ICalendarProvider
*
* @package OCA\DAV\CalDAV\Integration
* @since 19.0.0
*/
interface ICalendarProvider {
/**
* Provides the appId of the plugin
*
* @since 19.0.0
* @return string AppId
*/
public function getAppId(): string;
/**
* Fetches all calendars for a given principal uri
*
* @since 19.0.0
* @param string $principalUri E.g. principals/users/user1
* @return ExternalCalendar[] Array of all calendars
*/
public function fetchAllForCalendarHome(string $principalUri): array;
/**
* Checks whether plugin has a calendar for a given principalUri and calendarUri
*
* @since 19.0.0
* @param string $principalUri E.g. principals/users/user1
* @param string $calendarUri E.g. personal
* @return bool True if calendar for principalUri and calendarUri exists, false otherwise
*/
public function hasCalendarInCalendarHome(string $principalUri, string $calendarUri): bool;
/**
* Fetches a calendar for a given principalUri and calendarUri
* Returns null if calendar does not exist
*
* @since 19.0.0
* @param string $principalUri E.g. principals/users/user1
* @param string $calendarUri E.g. personal
* @return ExternalCalendar|null Calendar if it exists, null otherwise
*/
public function getCalendarInCalendarHome(string $principalUri, string $calendarUri): ?ExternalCalendar;
}

View file

@ -93,9 +93,6 @@ class PushProvider extends AbstractProvider {
$eventDetails = $this->extractEventDetails($vevent);
$eventDetails['calendar_displayname'] = $calendarDisplayName;
$eventUUID = (string) $vevent->UID;
// Empty Notification ObjectId will be catched by OC\Notification\Notification
$eventUUIDHash = $eventUUID ? hash('sha256', $eventUUID, false) : '';
foreach($users as $user) {
/** @var INotification $notification */
@ -103,7 +100,7 @@ class PushProvider extends AbstractProvider {
$notification->setApp(Application::APP_ID)
->setUser($user->getUID())
->setDateTime($this->timeFactory->getDateTime())
->setObject(Application::APP_ID, $eventUUIDHash)
->setObject(Application::APP_ID, (string) $vevent->UID)
->setSubject('calendar_reminder', [
'title' => $eventDetails['title'],
'start_atom' => $eventDetails['start_atom']

View file

@ -1,416 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2020, Thomas Citharel <nextcloud@tcit.fr>
*
* @author Georg Ehrke <oc.list@georgehrke.com>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\CalDAV\WebcalCaching;
use Exception;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use OCA\DAV\CalDAV\CalDavBackend;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\ILogger;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Sabre\DAV\Exception\BadRequest;
use Sabre\DAV\PropPatch;
use Sabre\DAV\Xml\Property\Href;
use Sabre\VObject\Component;
use Sabre\VObject\DateTimeParser;
use Sabre\VObject\InvalidDataException;
use Sabre\VObject\ParseException;
use Sabre\VObject\Reader;
use Sabre\VObject\Splitter\ICalendar;
use function count;
class RefreshWebcalService {
/** @var CalDavBackend */
private $calDavBackend;
/** @var IClientService */
private $clientService;
/** @var IConfig */
private $config;
/** @var ILogger */
private $logger;
public const REFRESH_RATE = '{http://apple.com/ns/ical/}refreshrate';
public const STRIP_ALARMS = '{http://calendarserver.org/ns/}subscribed-strip-alarms';
public const STRIP_ATTACHMENTS = '{http://calendarserver.org/ns/}subscribed-strip-attachments';
public const STRIP_TODOS = '{http://calendarserver.org/ns/}subscribed-strip-todos';
/**
* RefreshWebcalJob constructor.
*
* @param CalDavBackend $calDavBackend
* @param IClientService $clientService
* @param IConfig $config
* @param ILogger $logger
*/
public function __construct(CalDavBackend $calDavBackend, IClientService $clientService, IConfig $config, ILogger $logger) {
$this->calDavBackend = $calDavBackend;
$this->clientService = $clientService;
$this->config = $config;
$this->logger = $logger;
}
/**
* @param string $principalUri
* @param string $uri
*/
public function refreshSubscription(string $principalUri, string $uri) {
$subscription = $this->getSubscription($principalUri, $uri);
$mutations = [];
if (!$subscription) {
return;
}
$webcalData = $this->queryWebcalFeed($subscription, $mutations);
if (!$webcalData) {
return;
}
$stripTodos = ($subscription[self::STRIP_TODOS] ?? 1) === 1;
$stripAlarms = ($subscription[self::STRIP_ALARMS] ?? 1) === 1;
$stripAttachments = ($subscription[self::STRIP_ATTACHMENTS] ?? 1) === 1;
try {
$splitter = new ICalendar($webcalData, Reader::OPTION_FORGIVING);
// we wait with deleting all outdated events till we parsed the new ones
// in case the new calendar is broken and `new ICalendar` throws a ParseException
// the user will still see the old data
$this->calDavBackend->purgeAllCachedEventsForSubscription($subscription['id']);
while ($vObject = $splitter->getNext()) {
/** @var Component $vObject */
$uid = null;
$compName = null;
foreach ($vObject->getComponents() as $component) {
if ($component->name === 'VTIMEZONE') {
continue;
}
$uid = $component->{'UID'}->getValue();
$compName = $component->name;
if ($stripAlarms) {
unset($component->{'VALARM'});
}
if ($stripAttachments) {
unset($component->{'ATTACH'});
}
}
if ($stripTodos && $compName === 'VTODO') {
continue;
}
$uri = $uid . '.ics';
$calendarData = $vObject->serialize();
try {
$this->calDavBackend->createCalendarObject($subscription['id'], $uri, $calendarData, CalDavBackend::CALENDAR_TYPE_SUBSCRIPTION);
} catch(BadRequest $ex) {
$this->logger->logException($ex);
}
}
$newRefreshRate = $this->checkWebcalDataForRefreshRate($subscription, $webcalData);
if ($newRefreshRate) {
$mutations[self::REFRESH_RATE] = $newRefreshRate;
}
$this->updateSubscription($subscription, $mutations);
} catch(ParseException $ex) {
$subscriptionId = $subscription['id'];
$this->logger->logException($ex);
$this->logger->warning("Subscription $subscriptionId could not be refreshed due to a parsing error");
}
}
/**
* loads subscription from backend
*
* @param string $principalUri
* @param string $uri
* @return array|null
*/
public function getSubscription(string $principalUri, string $uri) {
$subscriptions = array_values(array_filter(
$this->calDavBackend->getSubscriptionsForUser($principalUri),
function($sub) use ($uri) {
return $sub['uri'] === $uri;
}
));
if (count($subscriptions) === 0) {
return null;
}
return $subscriptions[0];
}
/**
* gets webcal feed from remote server
*
* @param array $subscription
* @param array &$mutations
* @return null|string
*/
private function queryWebcalFeed(array $subscription, array &$mutations) {
$client = $this->clientService->newClient();
$didBreak301Chain = false;
$latestLocation = null;
$handlerStack = HandlerStack::create();
$handlerStack->push(Middleware::mapRequest(function (RequestInterface $request) {
return $request
->withHeader('Accept', 'text/calendar, application/calendar+json, application/calendar+xml')
->withHeader('User-Agent', 'Nextcloud Webcal Crawler');
}));
$handlerStack->push(Middleware::mapResponse(function(ResponseInterface $response) use (&$didBreak301Chain, &$latestLocation) {
if (!$didBreak301Chain) {
if ($response->getStatusCode() !== 301) {
$didBreak301Chain = true;
} else {
$latestLocation = $response->getHeader('Location');
}
}
return $response;
}));
$allowLocalAccess = $this->config->getAppValue('dav', 'webcalAllowLocalAccess', 'no');
$subscriptionId = $subscription['id'];
$url = $this->cleanURL($subscription['source']);
if ($url === null) {
return null;
}
if ($allowLocalAccess !== 'yes') {
$host = strtolower(parse_url($url, PHP_URL_HOST));
// remove brackets from IPv6 addresses
if (strpos($host, '[') === 0 && substr($host, -1) === ']') {
$host = substr($host, 1, -1);
}
// Disallow localhost and local network
if ($host === 'localhost' || substr($host, -6) === '.local' || substr($host, -10) === '.localhost') {
$this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules");
return null;
}
// Disallow hostname only
if (substr_count($host, '.') === 0) {
$this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules");
return null;
}
if ((bool)filter_var($host, FILTER_VALIDATE_IP) && !filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules");
return null;
}
// Also check for IPv6 IPv4 nesting, because that's not covered by filter_var
if ((bool)filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) && substr_count($host, '.') > 0) {
$delimiter = strrpos($host, ':'); // Get last colon
$ipv4Address = substr($host, $delimiter + 1);
if (!filter_var($ipv4Address, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules");
return null;
}
}
}
try {
$params = [
'allow_redirects' => [
'redirects' => 10
],
'handler' => $handlerStack,
];
$user = parse_url($subscription['source'], PHP_URL_USER);
$pass = parse_url($subscription['source'], PHP_URL_PASS);
if ($user !== null && $pass !== null) {
$params['auth'] = [$user, $pass];
}
$response = $client->get($url, $params);
$body = $response->getBody();
if ($latestLocation) {
$mutations['{http://calendarserver.org/ns/}source'] = new Href($latestLocation);
}
$contentType = $response->getHeader('Content-Type');
$contentType = explode(';', $contentType, 2)[0];
switch($contentType) {
case 'application/calendar+json':
try {
$jCalendar = Reader::readJson($body, Reader::OPTION_FORGIVING);
} catch(Exception $ex) {
// In case of a parsing error return null
$this->logger->debug("Subscription $subscriptionId could not be parsed");
return null;
}
return $jCalendar->serialize();
case 'application/calendar+xml':
try {
$xCalendar = Reader::readXML($body);
} catch(Exception $ex) {
// In case of a parsing error return null
$this->logger->debug("Subscription $subscriptionId could not be parsed");
return null;
}
return $xCalendar->serialize();
case 'text/calendar':
default:
try {
$vCalendar = Reader::read($body);
} catch(Exception $ex) {
// In case of a parsing error return null
$this->logger->debug("Subscription $subscriptionId could not be parsed");
return null;
}
return $vCalendar->serialize();
}
} catch(Exception $ex) {
$this->logger->logException($ex);
$this->logger->warning("Subscription $subscriptionId could not be refreshed due to a network error");
return null;
}
}
/**
* check if:
* - current subscription stores a refreshrate
* - the webcal feed suggests a refreshrate
* - return suggested refreshrate if user didn't set a custom one
*
* @param array $subscription
* @param string $webcalData
* @return string|null
*/
private function checkWebcalDataForRefreshRate($subscription, $webcalData) {
// if there is no refreshrate stored in the database, check the webcal feed
// whether it suggests any refresh rate and store that in the database
if (isset($subscription[self::REFRESH_RATE]) && $subscription[self::REFRESH_RATE] !== null) {
return null;
}
/** @var Component\VCalendar $vCalendar */
$vCalendar = Reader::read($webcalData);
$newRefreshRate = null;
if (isset($vCalendar->{'X-PUBLISHED-TTL'})) {
$newRefreshRate = $vCalendar->{'X-PUBLISHED-TTL'}->getValue();
}
if (isset($vCalendar->{'REFRESH-INTERVAL'})) {
$newRefreshRate = $vCalendar->{'REFRESH-INTERVAL'}->getValue();
}
if (!$newRefreshRate) {
return null;
}
// check if new refresh rate is even valid
try {
DateTimeParser::parseDuration($newRefreshRate);
} catch(InvalidDataException $ex) {
return null;
}
return $newRefreshRate;
}
/**
* update subscription stored in database
* used to set:
* - refreshrate
* - source
*
* @param array $subscription
* @param array $mutations
*/
private function updateSubscription(array $subscription, array $mutations) {
if (empty($mutations)) {
return;
}
$propPatch = new PropPatch($mutations);
$this->calDavBackend->updateSubscription($subscription['id'], $propPatch);
$propPatch->commit();
}
/**
* This method will strip authentication information and replace the
* 'webcal' or 'webcals' protocol scheme
*
* @param string $url
* @return string|null
*/
private function cleanURL(string $url) {
$parsed = parse_url($url);
if ($parsed === false) {
return null;
}
if (isset($parsed['scheme']) && $parsed['scheme'] === 'http') {
$scheme = 'http';
} else {
$scheme = 'https';
}
$host = $parsed['host'] ?? '';
$port = isset($parsed['port']) ? ':' . $parsed['port'] : '';
$path = $parsed['path'] ?? '';
$query = isset($parsed['query']) ? '?' . $parsed['query'] : '';
$fragment = isset($parsed['fragment']) ? '#' . $parsed['fragment'] : '';
$cleanURL = "$scheme://$host$port$path$query$fragment";
// parse_url is giving some weird results if no url and no :// is given,
// so let's test the url again
$parsedClean = parse_url($cleanURL);
if ($parsedClean === false || !isset($parsedClean['host'])) {
return null;
}
return $cleanURL;
}
}

View file

@ -1063,7 +1063,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
}
}
$query->setParameter('name', $property->name);
$query->setParameter('value', mb_substr($property->getValue(), 0, 254));
$query->setParameter('value', substr($property->getValue(), 0, 254));
$query->setParameter('preferred', $preferred);
$query->execute();
}

View file

@ -28,7 +28,6 @@ namespace OCA\DAV\Tests\unit\AppInfo;
use OC\App\AppManager;
use OC\ServerContainer;
use OCA\DAV\AppInfo\PluginManager;
use OCA\DAV\CalDAV\Integration\ICalendarProvider;
use Test\TestCase;
/**
@ -54,12 +53,6 @@ class PluginManagerTest extends TestCase {
'\OCA\DAV\ADavApp\PluginTwo',
],
],
'calendar-plugins' => [
'plugin' => [
'\OCA\DAV\ADavApp\CalendarPluginOne',
'\OCA\DAV\ADavApp\CalendarPluginTwo',
],
],
'collections' => [
'collection' => [
'\OCA\DAV\ADavApp\CollectionOne',
@ -74,9 +67,6 @@ class PluginManagerTest extends TestCase {
'plugins' => [
'plugin' => '\OCA\DAV\ADavApp2\PluginOne',
],
'calendar-plugins' => [
'plugin' => '\OCA\DAV\ADavApp2\CalendarPluginOne',
],
'collections' => [
'collection' => '\OCA\DAV\ADavApp2\CollectionOne',
],
@ -91,20 +81,13 @@ class PluginManagerTest extends TestCase {
$pluginManager = new PluginManager($server, $appManager);
$calendarPlugin1 = $this->createMock(ICalendarProvider::class);
$calendarPlugin2 = $this->createMock(ICalendarProvider::class);
$calendarPlugin3 = $this->createMock(ICalendarProvider::class);
$server->method('query')
->will($this->returnValueMap([
['\OCA\DAV\ADavApp\PluginOne', true, 'dummyplugin1'],
['\OCA\DAV\ADavApp\PluginTwo', true, 'dummyplugin2'],
['\OCA\DAV\ADavApp\CalendarPluginOne', true, $calendarPlugin1],
['\OCA\DAV\ADavApp\CalendarPluginTwo', true, $calendarPlugin2],
['\OCA\DAV\ADavApp\CollectionOne', true, 'dummycollection1'],
['\OCA\DAV\ADavApp\CollectionTwo', true, 'dummycollection2'],
['\OCA\DAV\ADavApp2\PluginOne', true, 'dummy2plugin1'],
['\OCA\DAV\ADavApp2\CalendarPluginOne', true, $calendarPlugin3],
['\OCA\DAV\ADavApp2\CollectionOne', true, 'dummy2collection1'],
]));
@ -113,11 +96,6 @@ class PluginManagerTest extends TestCase {
'dummyplugin2',
'dummy2plugin1',
];
$expectedCalendarPlugins = [
$calendarPlugin1,
$calendarPlugin2,
$calendarPlugin3,
];
$expectedCollections = [
'dummycollection1',
'dummycollection2',
@ -125,7 +103,6 @@ class PluginManagerTest extends TestCase {
];
$this->assertEquals($expectedPlugins, $pluginManager->getAppPlugins());
$this->assertEquals($expectedCalendarPlugins, $pluginManager->getCalendarPlugins());
$this->assertEquals($expectedCollections, $pluginManager->getAppCollections());
}
}

View file

@ -4,7 +4,6 @@
*
* @author Georg Ehrke <oc.list@georgehrke.com>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
@ -25,37 +24,45 @@
namespace OCA\DAV\Tests\unit\BackgroundJob;
use GuzzleHttp\HandlerStack;
use OCA\DAV\BackgroundJob\RefreshWebcalJob;
use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService;
use OCA\DAV\CalDAV\CalDavBackend;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\IJobList;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IClientService;
use OCP\Http\Client\IResponse;
use OCP\IConfig;
use OCP\ILogger;
use PHPUnit\Framework\MockObject\MockObject;
use Sabre\VObject;
use Test\TestCase;
class RefreshWebcalJobTest extends TestCase {
/** @var RefreshWebcalService | MockObject */
private $refreshWebcalService;
/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject */
private $caldavBackend;
/** @var IConfig | MockObject */
/** @var IClientService | \PHPUnit_Framework_MockObject_MockObject */
private $clientService;
/** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
private $config;
/** @var ILogger | MockObject */
/** @var ILogger | \PHPUnit_Framework_MockObject_MockObject */
private $logger;
/** @var ITimeFactory | MockObject */
/** @var ITimeFactory | \PHPUnit_Framework_MockObject_MockObject */
private $timeFactory;
/** @var IJobList | MockObject */
/** @var IJobList | \PHPUnit_Framework_MockObject_MockObject */
private $jobList;
protected function setUp(): void {
parent::setUp();
$this->refreshWebcalService = $this->createMock(RefreshWebcalService::class);
$this->caldavBackend = $this->createMock(CalDavBackend::class);
$this->clientService = $this->createMock(IClientService::class);
$this->config = $this->createMock(IConfig::class);
$this->logger = $this->createMock(ILogger::class);
$this->timeFactory = $this->createMock(ITimeFactory::class);
@ -64,53 +71,86 @@ class RefreshWebcalJobTest extends TestCase {
}
/**
*
* @param int $lastRun
* @param int $time
* @param bool $process
* @param string $body
* @param string $contentType
* @param string $result
*
* @dataProvider runDataProvider
*/
public function testRun(int $lastRun, int $time, bool $process) {
$backgroundJob = new RefreshWebcalJob($this->refreshWebcalService, $this->config, $this->logger, $this->timeFactory);
public function testRun(string $body, string $contentType, string $result) {
$backgroundJob = new RefreshWebcalJob($this->caldavBackend,
$this->clientService, $this->config, $this->logger, $this->timeFactory);
$backgroundJob->setArgument([
'principaluri' => 'principals/users/testuser',
'uri' => 'sub123',
]);
$backgroundJob->setLastRun($lastRun);
$this->refreshWebcalService->expects($this->once())
->method('getSubscription')
->with('principals/users/testuser', 'sub123')
->willReturn([
'id' => '99',
'uri' => 'sub456',
'{http://apple.com/ns/ical/}refreshrate' => 'P1D',
'{http://calendarserver.org/ns/}subscribed-strip-todos' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-alarms' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-attachments' => '1',
'source' => 'webcal://foo.bar/bla'
]);
$this->config->expects($this->once())
->method('getAppValue')
->with('dav', 'calendarSubscriptionRefreshRate', 'P1W')
->will($this->returnValue('P1W'));
$backgroundJob->setLastRun(0);
$this->timeFactory->expects($this->once())
->method('getTime')
->willReturn($time);
->with()
->will($this->returnValue(1000000000));
if ($process) {
$this->refreshWebcalService->expects($this->once())
->method('refreshSubscription')
->with('principals/users/testuser', 'sub123');
} else {
$this->refreshWebcalService->expects($this->never())
->method('refreshSubscription')
->with('principals/users/testuser', 'sub123');
}
$this->caldavBackend->expects($this->exactly(2))
->method('getSubscriptionsForUser')
->with('principals/users/testuser')
->will($this->returnValue([
[
'id' => '99',
'uri' => 'sub456',
'{http://apple.com/ns/ical/}refreshrate' => 'P1D',
'{http://calendarserver.org/ns/}subscribed-strip-todos' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-alarms' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-attachments' => '1',
'source' => 'webcal://foo.bar/bla'
],
[
'id' => '42',
'uri' => 'sub123',
'{http://apple.com/ns/ical/}refreshrate' => 'PT1H',
'{http://calendarserver.org/ns/}subscribed-strip-todos' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-alarms' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-attachments' => '1',
'source' => 'webcal://foo.bar/bla2'
],
]));
$client = $this->createMock(IClient::class);
$response = $this->createMock(IResponse::class);
$this->clientService->expects($this->once())
->method('newClient')
->with()
->will($this->returnValue($client));
$this->config->expects($this->once())
->method('getAppValue')
->with('dav', 'webcalAllowLocalAccess', 'no')
->will($this->returnValue('no'));
$client->expects($this->once())
->method('get')
->with('https://foo.bar/bla2', $this->callback(function($obj) {
return $obj['allow_redirects']['redirects'] === 10 && $obj['handler'] instanceof HandlerStack;
}))
->will($this->returnValue($response));
$response->expects($this->once())
->method('getBody')
->with()
->will($this->returnValue($body));
$response->expects($this->once())
->method('getHeader')
->with('Content-Type')
->will($this->returnValue($contentType));
$this->caldavBackend->expects($this->once())
->method('purgeAllCachedEventsForSubscription')
->with(42);
$this->caldavBackend->expects($this->once())
->method('createCalendarObject')
->with(42, '12345.ics', $result, 1);
$backgroundJob->execute($this->jobList, $this->logger);
}
@ -120,8 +160,93 @@ class RefreshWebcalJobTest extends TestCase {
*/
public function runDataProvider():array {
return [
[0, 100000, true],
[100000, 100000, false]
[
"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
'text/calendar;charset=utf8',
"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
],
[
'["vcalendar",[["prodid",{},"text","-//Example Corp.//Example Client//EN"],["version",{},"text","2.0"]],[["vtimezone",[["last-modified",{},"date-time","2004-01-10T03:28:45Z"],["tzid",{},"text","US/Eastern"]],[["daylight",[["dtstart",{},"date-time","2000-04-04T02:00:00"],["rrule",{},"recur",{"freq":"YEARLY","byday":"1SU","bymonth":4}],["tzname",{},"text","EDT"],["tzoffsetfrom",{},"utc-offset","-05:00"],["tzoffsetto",{},"utc-offset","-04:00"]],[]],["standard",[["dtstart",{},"date-time","2000-10-26T02:00:00"],["rrule",{},"recur",{"freq":"YEARLY","byday":"1SU","bymonth":10}],["tzname",{},"text","EST"],["tzoffsetfrom",{},"utc-offset","-04:00"],["tzoffsetto",{},"utc-offset","-05:00"]],[]]]],["vevent",[["dtstamp",{},"date-time","2006-02-06T00:11:21Z"],["dtstart",{"tzid":"US/Eastern"},"date-time","2006-01-02T14:00:00"],["duration",{},"duration","PT1H"],["recurrence-id",{"tzid":"US/Eastern"},"date-time","2006-01-04T12:00:00"],["summary",{},"text","Event #2"],["uid",{},"text","12345"]],[]]]]',
'application/calendar+json',
"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VTIMEZONE\r\nLAST-MODIFIED:20040110T032845Z\r\nTZID:US/Eastern\r\nBEGIN:DAYLIGHT\r\nDTSTART:20000404T020000\r\nRRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nDTSTART:20001026T020000\r\nRRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=10\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTAMP:20060206T001121Z\r\nDTSTART;TZID=US/Eastern:20060102T140000\r\nDURATION:PT1H\r\nRECURRENCE-ID;TZID=US/Eastern:20060104T120000\r\nSUMMARY:Event #2\r\nUID:12345\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"
],
[
'<?xml version="1.0" encoding="utf-8" ?><icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0"><vcalendar><properties><prodid><text>-//Example Inc.//Example Client//EN</text></prodid><version><text>2.0</text></version></properties><components><vevent><properties><dtstamp><date-time>2006-02-06T00:11:21Z</date-time></dtstamp><dtstart><parameters><tzid><text>US/Eastern</text></tzid></parameters><date-time>2006-01-04T14:00:00</date-time></dtstart><duration><duration>PT1H</duration></duration><recurrence-id><parameters><tzid><text>US/Eastern</text></tzid></parameters><date-time>2006-01-04T12:00:00</date-time></recurrence-id><summary><text>Event #2 bis</text></summary><uid><text>12345</text></uid></properties></vevent></components></vcalendar></icalendar>',
'application/calendar+xml',
"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nDTSTAMP:20060206T001121Z\r\nDTSTART;TZID=US/Eastern:20060104T140000\r\nDURATION:PT1H\r\nRECURRENCE-ID;TZID=US/Eastern:20060104T120000\r\nSUMMARY:Event #2 bis\r\nUID:12345\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"
]
];
}
/**
* @dataProvider runLocalURLDataProvider
*
* @param string $source
*/
public function testRunLocalURL($source) {
$backgroundJob = new RefreshWebcalJob($this->caldavBackend,
$this->clientService, $this->config, $this->logger, $this->timeFactory);
$backgroundJob->setArgument([
'principaluri' => 'principals/users/testuser',
'uri' => 'sub123',
]);
$backgroundJob->setLastRun(0);
$this->timeFactory->expects($this->once())
->method('getTime')
->with()
->will($this->returnValue(1000000000));
$this->caldavBackend->expects($this->exactly(2))
->method('getSubscriptionsForUser')
->with('principals/users/testuser')
->will($this->returnValue([
[
'id' => 42,
'uri' => 'sub123',
'refreshreate' => 'P1H',
'striptodos' => 1,
'stripalarms' => 1,
'stripattachments' => 1,
'source' => $source
],
]));
$client = $this->createMock(IClient::class);
$this->clientService->expects($this->once())
->method('newClient')
->with()
->will($this->returnValue($client));
$this->config->expects($this->once())
->method('getAppValue')
->with('dav', 'webcalAllowLocalAccess', 'no')
->will($this->returnValue('no'));
$client->expects($this->never())
->method('get');
$backgroundJob->execute($this->jobList, $this->logger);
}
public function runLocalURLDataProvider():array {
return [
['localhost/foo.bar'],
['localHost/foo.bar'],
['random-host/foo.bar'],
['[::1]/bla.blub'],
['[::]/bla.blub'],
['192.168.0.1'],
['172.16.42.1'],
['[fdf8:f53b:82e4::53]/secret.ics'],
['[fe80::200:5aee:feaa:20a2]/secret.ics'],
['[0:0:0:0:0:0:10.0.0.1]/secret.ics'],
['[0:0:0:0:0:ffff:127.0.0.0]/secret.ics'],
['10.0.0.1'],
['another-host.local'],
['service.localhost'],
['!@#$'], // test invalid url
];
}
}

View file

@ -24,14 +24,8 @@
namespace OCA\DAV\Tests\unit\CalDAV;
use OCA\DAV\AppInfo\PluginManager;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\CalendarHome;
use OCA\DAV\CalDAV\Integration\ExternalCalendar;
use OCA\DAV\CalDAV\Integration\ICalendarProvider;
use OCA\DAV\CalDAV\Outbox;
use Sabre\CalDAV\Schedule\Inbox;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\MkCol;
use Test\TestCase;
@ -43,9 +37,6 @@ class CalendarHomeTest extends TestCase {
/** @var array */
private $principalInfo = [];
/** @var PluginManager */
private $pluginManager;
/** @var CalendarHome */
private $calendarHome;
@ -56,16 +47,9 @@ class CalendarHomeTest extends TestCase {
$this->principalInfo = [
'uri' => 'user-principal-123',
];
$this->pluginManager = $this->createMock(PluginManager::class);
$this->calendarHome = new CalendarHome($this->backend,
$this->principalInfo);
// Replace PluginManager with our mock
$reflection = new \ReflectionClass($this->calendarHome);
$reflectionProperty = $reflection->getProperty('pluginManager');
$reflectionProperty->setAccessible(true);
$reflectionProperty->setValue($this->calendarHome, $this->pluginManager);
}
public function testCreateCalendarValidName() {
@ -85,6 +69,7 @@ class CalendarHomeTest extends TestCase {
$this->calendarHome->createExtendedCollection('name123', $mkCol);
}
public function testCreateCalendarReservedName() {
$this->expectException(\Sabre\DAV\Exception\MethodNotAllowed::class);
$this->expectExceptionMessage('The resource you tried to create has a reserved name');
@ -94,136 +79,4 @@ class CalendarHomeTest extends TestCase {
$this->calendarHome->createExtendedCollection('contact_birthdays', $mkCol);
}
public function testCreateCalendarReservedNameAppGenerated() {
$this->expectException(\Sabre\DAV\Exception\MethodNotAllowed::class);
$this->expectExceptionMessage('The resource you tried to create has a reserved name');
/** @var MkCol | \PHPUnit_Framework_MockObject_MockObject $mkCol */
$mkCol = $this->createMock(MkCol::class);
$this->calendarHome->createExtendedCollection('app-generated--example--foo-1', $mkCol);
}
public function testGetChildren():void {
$this->backend
->expects($this->at(0))
->method('getCalendarsForUser')
->with('user-principal-123')
->willReturn([]);
$this->backend
->expects($this->at(1))
->method('getSubscriptionsForUser')
->with('user-principal-123')
->willReturn([]);
$calendarPlugin1 = $this->createMock(ICalendarProvider::class);
$calendarPlugin1
->expects($this->once())
->method('fetchAllForCalendarHome')
->with('user-principal-123')
->willReturn(['plugin1calendar1', 'plugin1calendar2']);
$calendarPlugin2 = $this->createMock(ICalendarProvider::class);
$calendarPlugin2
->expects($this->once())
->method('fetchAllForCalendarHome')
->with('user-principal-123')
->willReturn(['plugin2calendar1', 'plugin2calendar2']);
$this->pluginManager
->expects($this->once())
->method('getCalendarPlugins')
->with()
->willReturn([$calendarPlugin1, $calendarPlugin2]);
$actual = $this->calendarHome->getChildren();
$this->assertCount(6, $actual);
$this->assertInstanceOf(Inbox::class, $actual[0]);
$this->assertInstanceOf(Outbox::class, $actual[1]);
$this->assertEquals('plugin1calendar1', $actual[2]);
$this->assertEquals('plugin1calendar2', $actual[3]);
$this->assertEquals('plugin2calendar1', $actual[4]);
$this->assertEquals('plugin2calendar2', $actual[5]);
}
public function testGetChildNonAppGenerated():void {
$this->backend
->expects($this->at(0))
->method('getCalendarsForUser')
->with('user-principal-123')
->willReturn([]);
$this->backend
->expects($this->at(1))
->method('getSubscriptionsForUser')
->with('user-principal-123')
->willReturn([]);
$this->pluginManager
->expects($this->never())
->method('getCalendarPlugins');
$this->expectException(\Sabre\DAV\Exception\NotFound::class);
$this->expectExceptionMessage('Node with name \'personal\' could not be found');
$this->calendarHome->getChild('personal');
}
public function testGetChildAppGenerated():void {
$this->backend
->expects($this->at(0))
->method('getCalendarsForUser')
->with('user-principal-123')
->willReturn([]);
$this->backend
->expects($this->at(1))
->method('getSubscriptionsForUser')
->with('user-principal-123')
->willReturn([]);
$calendarPlugin1 = $this->createMock(ICalendarProvider::class);
$calendarPlugin1
->expects($this->once())
->method('getAppId')
->with()
->willReturn('calendar_plugin_1');
$calendarPlugin1
->expects($this->never())
->method('hasCalendarInCalendarHome');
$calendarPlugin1
->expects($this->never())
->method('getCalendarInCalendarHome');
$externalCalendarMock = $this->createMock(ExternalCalendar::class);
$calendarPlugin2 = $this->createMock(ICalendarProvider::class);
$calendarPlugin2
->expects($this->once())
->method('getAppId')
->with()
->willReturn('calendar_plugin_2');
$calendarPlugin2
->expects($this->once())
->method('hasCalendarInCalendarHome')
->with('user-principal-123', 'calendar-uri-from-backend')
->willReturn(true);
$calendarPlugin2
->expects($this->once())
->method('getCalendarInCalendarHome')
->with('user-principal-123', 'calendar-uri-from-backend')
->willReturn($externalCalendarMock);
$this->pluginManager
->expects($this->once())
->method('getCalendarPlugins')
->with()
->willReturn([$calendarPlugin1, $calendarPlugin2]);
$actual = $this->calendarHome->getChild('app-generated--calendar_plugin_2--calendar-uri-from-backend');
$this->assertEquals($externalCalendarMock, $actual);
}
}

View file

@ -1,119 +0,0 @@
<?php
/**
* @copyright 2020, Georg Ehrke <oc.list@georgehrke.com>
*
* @author Georg Ehrke <oc.list@georgehrke.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Tests\unit\CalDAV\Integration;
use OCA\DAV\CalDAV\Integration\ExternalCalendar;
use Test\TestCase;
class ExternalCalendarTest extends TestCase {
private $abstractExternalCalendar;
protected function setUp(): void {
parent::setUp();
$this->abstractExternalCalendar =
$this->getMockForAbstractClass(ExternalCalendar::class, ['example-app-id', 'calendar-uri-in-backend']);
}
public function testGetName():void {
// Check that the correct name is returned
$this->assertEquals('app-generated--example-app-id--calendar-uri-in-backend',
$this->abstractExternalCalendar->getName());
// Check that the method is final and can't be overriden by other classes
$reflectionMethod = new \ReflectionMethod(ExternalCalendar::class, 'getName');
$this->assertTrue($reflectionMethod->isFinal());
}
public function testSetName():void {
// Check that the method is final and can't be overriden by other classes
$reflectionMethod = new \ReflectionMethod(ExternalCalendar::class, 'setName');
$this->assertTrue($reflectionMethod->isFinal());
$this->expectException(\Sabre\DAV\Exception\MethodNotAllowed::class);
$this->expectExceptionMessage('Renaming calendars is not yet supported');
$this->abstractExternalCalendar->setName('other-name');
}
public function createDirectory():void {
// Check that the method is final and can't be overriden by other classes
$reflectionMethod = new \ReflectionMethod(ExternalCalendar::class, 'createDirectory');
$this->assertTrue($reflectionMethod->isFinal());
$this->expectException(\Sabre\DAV\Exception\MethodNotAllowed::class);
$this->expectExceptionMessage('Creating collections in calendar objects is not allowed');
$this->abstractExternalCalendar->createDirectory('other-name');
}
public function testIsAppGeneratedCalendar():void {
$this->assertFalse(ExternalCalendar::isAppGeneratedCalendar('personal'));
$this->assertFalse(ExternalCalendar::isAppGeneratedCalendar('work'));
$this->assertFalse(ExternalCalendar::isAppGeneratedCalendar('contact_birthdays'));
$this->assertFalse(ExternalCalendar::isAppGeneratedCalendar('company'));
$this->assertFalse(ExternalCalendar::isAppGeneratedCalendar('app-generated'));
$this->assertFalse(ExternalCalendar::isAppGeneratedCalendar('app-generated--example'));
$this->assertTrue(ExternalCalendar::isAppGeneratedCalendar('app-generated--deck--board-1'));
$this->assertTrue(ExternalCalendar::isAppGeneratedCalendar('app-generated--example--foo-2'));
$this->assertTrue(ExternalCalendar::isAppGeneratedCalendar('app-generated--example--foo--2'));
}
/**
* @dataProvider splitAppGeneratedCalendarUriDataProvider
*/
public function testSplitAppGeneratedCalendarUriInvalid(string $name):void {
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('Provided calendar uri was not app-generated');
ExternalCalendar::splitAppGeneratedCalendarUri($name);
}
public function splitAppGeneratedCalendarUriDataProvider():array {
return [
['personal'],
['foo_shared_by_admin'],
['contact_birthdays'],
];
}
public function testSplitAppGeneratedCalendarUri():void {
$this->assertEquals(['deck', 'board-1'], ExternalCalendar::splitAppGeneratedCalendarUri('app-generated--deck--board-1'));
$this->assertEquals(['example', 'foo-2'], ExternalCalendar::splitAppGeneratedCalendarUri('app-generated--example--foo-2'));
$this->assertEquals(['example', 'foo--2'], ExternalCalendar::splitAppGeneratedCalendarUri('app-generated--example--foo--2'));
}
public function testDoesViolateReservedName():void {
$this->assertFalse(ExternalCalendar::doesViolateReservedName('personal'));
$this->assertFalse(ExternalCalendar::doesViolateReservedName('work'));
$this->assertFalse(ExternalCalendar::doesViolateReservedName('contact_birthdays'));
$this->assertFalse(ExternalCalendar::doesViolateReservedName('company'));
$this->assertTrue(ExternalCalendar::doesViolateReservedName('app-generated'));
$this->assertTrue(ExternalCalendar::doesViolateReservedName('app-generated-calendar'));
$this->assertTrue(ExternalCalendar::doesViolateReservedName('app-generated--deck-123'));
}
}

View file

@ -189,7 +189,7 @@ class PushProviderTest extends AbstractNotificationProviderTest {
$notification->expects($this->once())
->method('setObject')
->with('dav', hash('sha256', 'uid1234', false))
->with('dav', 'uid1234')
->willReturn($notification);
$notification->expects($this->once())

View file

@ -1,221 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2020, Thomas Citharel <nextcloud@tcit.fr>
*
* @author Georg Ehrke <oc.list@georgehrke.com>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Tests\unit\BackgroundJob;
use GuzzleHttp\HandlerStack;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IClientService;
use OCP\Http\Client\IResponse;
use OCP\IConfig;
use OCP\ILogger;
use PHPUnit\Framework\MockObject\MockObject;
use Sabre\VObject;
use Test\TestCase;
class RefreshWebcalServiceTest extends TestCase {
/** @var CalDavBackend | MockObject */
private $caldavBackend;
/** @var IClientService | MockObject */
private $clientService;
/** @var IConfig | MockObject */
private $config;
/** @var ILogger | MockObject */
private $logger;
protected function setUp(): void {
parent::setUp();
$this->caldavBackend = $this->createMock(CalDavBackend::class);
$this->clientService = $this->createMock(IClientService::class);
$this->config = $this->createMock(IConfig::class);
$this->logger = $this->createMock(ILogger::class);
}
/**
* @param string $body
* @param string $contentType
* @param string $result
*
* @dataProvider runDataProvider
*/
public function testRun(string $body, string $contentType, string $result) {
$refreshWebcalService = new RefreshWebcalService($this->caldavBackend,
$this->clientService, $this->config, $this->logger);
$this->caldavBackend->expects($this->once())
->method('getSubscriptionsForUser')
->with('principals/users/testuser')
->will($this->returnValue([
[
'id' => '99',
'uri' => 'sub456',
'{http://apple.com/ns/ical/}refreshrate' => 'P1D',
'{http://calendarserver.org/ns/}subscribed-strip-todos' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-alarms' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-attachments' => '1',
'source' => 'webcal://foo.bar/bla'
],
[
'id' => '42',
'uri' => 'sub123',
'{http://apple.com/ns/ical/}refreshrate' => 'PT1H',
'{http://calendarserver.org/ns/}subscribed-strip-todos' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-alarms' => '1',
'{http://calendarserver.org/ns/}subscribed-strip-attachments' => '1',
'source' => 'webcal://foo.bar/bla2'
],
]));
$client = $this->createMock(IClient::class);
$response = $this->createMock(IResponse::class);
$this->clientService->expects($this->once())
->method('newClient')
->with()
->will($this->returnValue($client));
$this->config->expects($this->once())
->method('getAppValue')
->with('dav', 'webcalAllowLocalAccess', 'no')
->will($this->returnValue('no'));
$client->expects($this->once())
->method('get')
->with('https://foo.bar/bla2', $this->callback(function($obj) {
return $obj['allow_redirects']['redirects'] === 10 && $obj['handler'] instanceof HandlerStack;
}))
->will($this->returnValue($response));
$response->expects($this->once())
->method('getBody')
->with()
->will($this->returnValue($body));
$response->expects($this->once())
->method('getHeader')
->with('Content-Type')
->will($this->returnValue($contentType));
$this->caldavBackend->expects($this->once())
->method('purgeAllCachedEventsForSubscription')
->with(42);
$this->caldavBackend->expects($this->once())
->method('createCalendarObject')
->with(42, '12345.ics', $result, 1);
$refreshWebcalService->refreshSubscription('principals/users/testuser', 'sub123');
}
/**
* @return array
*/
public function runDataProvider():array {
return [
[
"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
'text/calendar;charset=utf8',
"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
],
[
'["vcalendar",[["prodid",{},"text","-//Example Corp.//Example Client//EN"],["version",{},"text","2.0"]],[["vtimezone",[["last-modified",{},"date-time","2004-01-10T03:28:45Z"],["tzid",{},"text","US/Eastern"]],[["daylight",[["dtstart",{},"date-time","2000-04-04T02:00:00"],["rrule",{},"recur",{"freq":"YEARLY","byday":"1SU","bymonth":4}],["tzname",{},"text","EDT"],["tzoffsetfrom",{},"utc-offset","-05:00"],["tzoffsetto",{},"utc-offset","-04:00"]],[]],["standard",[["dtstart",{},"date-time","2000-10-26T02:00:00"],["rrule",{},"recur",{"freq":"YEARLY","byday":"1SU","bymonth":10}],["tzname",{},"text","EST"],["tzoffsetfrom",{},"utc-offset","-04:00"],["tzoffsetto",{},"utc-offset","-05:00"]],[]]]],["vevent",[["dtstamp",{},"date-time","2006-02-06T00:11:21Z"],["dtstart",{"tzid":"US/Eastern"},"date-time","2006-01-02T14:00:00"],["duration",{},"duration","PT1H"],["recurrence-id",{"tzid":"US/Eastern"},"date-time","2006-01-04T12:00:00"],["summary",{},"text","Event #2"],["uid",{},"text","12345"]],[]]]]',
'application/calendar+json',
"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VTIMEZONE\r\nLAST-MODIFIED:20040110T032845Z\r\nTZID:US/Eastern\r\nBEGIN:DAYLIGHT\r\nDTSTART:20000404T020000\r\nRRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nDTSTART:20001026T020000\r\nRRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=10\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTAMP:20060206T001121Z\r\nDTSTART;TZID=US/Eastern:20060102T140000\r\nDURATION:PT1H\r\nRECURRENCE-ID;TZID=US/Eastern:20060104T120000\r\nSUMMARY:Event #2\r\nUID:12345\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"
],
[
'<?xml version="1.0" encoding="utf-8" ?><icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0"><vcalendar><properties><prodid><text>-//Example Inc.//Example Client//EN</text></prodid><version><text>2.0</text></version></properties><components><vevent><properties><dtstamp><date-time>2006-02-06T00:11:21Z</date-time></dtstamp><dtstart><parameters><tzid><text>US/Eastern</text></tzid></parameters><date-time>2006-01-04T14:00:00</date-time></dtstart><duration><duration>PT1H</duration></duration><recurrence-id><parameters><tzid><text>US/Eastern</text></tzid></parameters><date-time>2006-01-04T12:00:00</date-time></recurrence-id><summary><text>Event #2 bis</text></summary><uid><text>12345</text></uid></properties></vevent></components></vcalendar></icalendar>',
'application/calendar+xml',
"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nDTSTAMP:20060206T001121Z\r\nDTSTART;TZID=US/Eastern:20060104T140000\r\nDURATION:PT1H\r\nRECURRENCE-ID;TZID=US/Eastern:20060104T120000\r\nSUMMARY:Event #2 bis\r\nUID:12345\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"
]
];
}
/**
* @dataProvider runLocalURLDataProvider
*
* @param string $source
*/
public function testRunLocalURL($source) {
$refreshWebcalService = new RefreshWebcalService($this->caldavBackend,
$this->clientService, $this->config, $this->logger);
$this->caldavBackend->expects($this->once())
->method('getSubscriptionsForUser')
->with('principals/users/testuser')
->will($this->returnValue([
[
'id' => 42,
'uri' => 'sub123',
'refreshreate' => 'P1H',
'striptodos' => 1,
'stripalarms' => 1,
'stripattachments' => 1,
'source' => $source
],
]));
$client = $this->createMock(IClient::class);
$this->clientService->expects($this->once())
->method('newClient')
->with()
->will($this->returnValue($client));
$this->config->expects($this->once())
->method('getAppValue')
->with('dav', 'webcalAllowLocalAccess', 'no')
->will($this->returnValue('no'));
$client->expects($this->never())
->method('get');
$refreshWebcalService->refreshSubscription('principals/users/testuser', 'sub123');
}
public function runLocalURLDataProvider():array {
return [
['localhost/foo.bar'],
['localHost/foo.bar'],
['random-host/foo.bar'],
['[::1]/bla.blub'],
['[::]/bla.blub'],
['192.168.0.1'],
['172.16.42.1'],
['[fdf8:f53b:82e4::53]/secret.ics'],
['[fe80::200:5aee:feaa:20a2]/secret.ics'],
['[0:0:0:0:0:0:10.0.0.1]/secret.ics'],
['[0:0:0:0:0:ffff:127.0.0.0]/secret.ics'],
['10.0.0.1'],
['another-host.local'],
['service.localhost'],
['!@#$'], // test invalid url
];
}
}

View file

@ -36,7 +36,7 @@ OC.L10N.register(
"Hey there,\n\nthe admin 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" : "Hey,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort '%s' verschlüsselt.\n\nBitte über die Web-Oberfläche anmelden und die persönlichen Einstellungen aufrufen. Dort findet sich die Option 'Basisverschlüsselungsmodul' und das Verschlüsselungspasswort kann aktualisiert werden, indem das Passwort in das Feld 'altes Anmelde-Passwort' und in das 'aktuelles Anmelde-Passwort'-Feld eingegeben wird.\n\n",
"The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
"Cheers!" : "Noch einen schönen Tag!",
"Hey there,<br><br>the admin 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>" : "Hallo,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melde Dich in der Web-Oberfläche an, gehe in Deine persönlichen Einstellungen. Dort findest Du die Option 'Basisverschlüsselungsmodul' und aktualisiere dort Dein Verschlüsselungspasswort indem Du das Passwort in das 'alte Anmelde-Passwort' und in das 'aktuellen Anmelde-Passwort' Feld eingibst.<br><br>",
"Hey there,<br><br>the admin 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>" : "Hallo,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melde Dich im Web-Interface an, gehe in Deine persönlichen Einstellungen. Dort findest Du die Option 'Basisverschlüsselungsmodul' und aktualisiere dort Dein Verschlüsselungspasswort indem Du das Passwort in das 'alte Anmelde-Passwort' und in das 'aktuellen Anmelde-Passwort' Feld eingibst.<br><br>",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Verschlüsselungs-App ist aktiviert, aber die Schlüssel sind noch nicht initialisiert. Bitte melde Dich ab und wieder an",
"Encrypt the home storage" : "Benutzerverzeichnis verschlüsseln",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Die Aktivierung dieser Option verschlüsselt alle Dateien die auf dem Hauptspeicher gespeichert sind, ansonsten werden nur Dateien auf dem externen Speicher verschlüsselt",

View file

@ -34,7 +34,7 @@
"Hey there,\n\nthe admin 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" : "Hey,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort '%s' verschlüsselt.\n\nBitte über die Web-Oberfläche anmelden und die persönlichen Einstellungen aufrufen. Dort findet sich die Option 'Basisverschlüsselungsmodul' und das Verschlüsselungspasswort kann aktualisiert werden, indem das Passwort in das Feld 'altes Anmelde-Passwort' und in das 'aktuelles Anmelde-Passwort'-Feld eingegeben wird.\n\n",
"The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
"Cheers!" : "Noch einen schönen Tag!",
"Hey there,<br><br>the admin 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>" : "Hallo,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melde Dich in der Web-Oberfläche an, gehe in Deine persönlichen Einstellungen. Dort findest Du die Option 'Basisverschlüsselungsmodul' und aktualisiere dort Dein Verschlüsselungspasswort indem Du das Passwort in das 'alte Anmelde-Passwort' und in das 'aktuellen Anmelde-Passwort' Feld eingibst.<br><br>",
"Hey there,<br><br>the admin 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>" : "Hallo,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melde Dich im Web-Interface an, gehe in Deine persönlichen Einstellungen. Dort findest Du die Option 'Basisverschlüsselungsmodul' und aktualisiere dort Dein Verschlüsselungspasswort indem Du das Passwort in das 'alte Anmelde-Passwort' und in das 'aktuellen Anmelde-Passwort' Feld eingibst.<br><br>",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Verschlüsselungs-App ist aktiviert, aber die Schlüssel sind noch nicht initialisiert. Bitte melde Dich ab und wieder an",
"Encrypt the home storage" : "Benutzerverzeichnis verschlüsseln",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Die Aktivierung dieser Option verschlüsselt alle Dateien die auf dem Hauptspeicher gespeichert sind, ansonsten werden nur Dateien auf dem externen Speicher verschlüsselt",

View file

@ -33,10 +33,10 @@ OC.L10N.register(
"Default encryption module" : "Standard-Verschlüsselungsmodul",
"Default encryption module for server-side encryption" : "Standard-Verschlüsselungsmodul für serverseitige Verschlüsselung",
"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." : "Zur Verwendung dieses Verschlüsselungsmoduls muss serverseitige\n\t\tVerschlüsselung in den Admin-Einstellungen aktiviert werden. Nach der\n\t\tAktivierung werden alle Dateien verschlüsselt. Die Verschlüsselung basiert\n\t\tauf AES 256 Schlüsseln. Dieses Modul verschlüsselt nur neue Dateien,\n\t\texistierende Dateien werden nicht geädnert. Es ist nicht möglich die Ver-\n\t\tschlüsselung zu deaktivieren und zum Unverschlüsselten System zurück-\n\t\tzu kehren. Vor der Entscheidung das Verschlüsselungsmodul zu verwenden\n\t\tsollte unbedingt die Dokumentation aufmerksam gelesen werden.",
"Hey there,\n\nthe admin 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" : "Hallo,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort '%s' verschlüsselt.\n\nBitte melden Sie sich in der Web-Oberfläche an, gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'Basisverschlüsselungsmodul' und aktualisieren Sie dort ihr Verschlüsselungspasswort indem Sie das Passwort in das 'altes Anmelde-Passwort' und in das 'aktuelles Anmelde-Passwort' Feld eingeben.\n\n",
"Hey there,\n\nthe admin 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" : "Hallo,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort '%s' verschlüsselt.\n\nBitte melden Sie sich im Web-Oberfläche an, gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'Basisverschlüsselungsmodul' und aktualisieren Sie dort ihr Verschlüsselungspasswort indem Sie das Passwort in das 'altes Anmelde-Passwort' und in das 'aktuelles Anmelde-Passwort' Feld eingeben.\n\n",
"The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
"Cheers!" : "Noch einen schönen Tag!",
"Hey there,<br><br>the admin 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>" : "Hallo,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melden Sie sich in der Web-Oberfläche an und gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'Basisverschlüsselungsmodul' und aktualisieren Sie dort Ihr Verschlüsselungspasswort indem Sie das Passwort in das 'altes Anmelde-Passwort-' und in das 'aktuelles Anmelde-Passwort' Feld eingeben.<br><br>",
"Hey there,<br><br>the admin 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>" : "Hallo,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melden Sie sich im Web-Interface an und gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'Basisverschlüsselungsmodul' und aktualisieren Sie dort Ihr Verschlüsselungspasswort indem Sie das Passwort in das 'altes Anmelde-Passwort-' und in das 'aktuelles Anmelde-Passwort' Feld eingeben.<br><br>",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Verschlüsselungs-App ist aktiviert, aber die Schlüssel sind noch nicht initialisiert. Bitte melden Sie sich ab und wieder an",
"Encrypt the home storage" : "Benutzerverzeichnis verschlüsseln",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Die Aktivierung dieser Option verschlüsselt alle Dateien die auf dem Hauptspeicher gespeichert sind, ansonsten werden nur Dateien auf dem externen Speicher verschlüsselt",

View file

@ -31,10 +31,10 @@
"Default encryption module" : "Standard-Verschlüsselungsmodul",
"Default encryption module for server-side encryption" : "Standard-Verschlüsselungsmodul für serverseitige Verschlüsselung",
"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." : "Zur Verwendung dieses Verschlüsselungsmoduls muss serverseitige\n\t\tVerschlüsselung in den Admin-Einstellungen aktiviert werden. Nach der\n\t\tAktivierung werden alle Dateien verschlüsselt. Die Verschlüsselung basiert\n\t\tauf AES 256 Schlüsseln. Dieses Modul verschlüsselt nur neue Dateien,\n\t\texistierende Dateien werden nicht geädnert. Es ist nicht möglich die Ver-\n\t\tschlüsselung zu deaktivieren und zum Unverschlüsselten System zurück-\n\t\tzu kehren. Vor der Entscheidung das Verschlüsselungsmodul zu verwenden\n\t\tsollte unbedingt die Dokumentation aufmerksam gelesen werden.",
"Hey there,\n\nthe admin 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" : "Hallo,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort '%s' verschlüsselt.\n\nBitte melden Sie sich in der Web-Oberfläche an, gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'Basisverschlüsselungsmodul' und aktualisieren Sie dort ihr Verschlüsselungspasswort indem Sie das Passwort in das 'altes Anmelde-Passwort' und in das 'aktuelles Anmelde-Passwort' Feld eingeben.\n\n",
"Hey there,\n\nthe admin 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" : "Hallo,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort '%s' verschlüsselt.\n\nBitte melden Sie sich im Web-Oberfläche an, gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'Basisverschlüsselungsmodul' und aktualisieren Sie dort ihr Verschlüsselungspasswort indem Sie das Passwort in das 'altes Anmelde-Passwort' und in das 'aktuelles Anmelde-Passwort' Feld eingeben.\n\n",
"The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
"Cheers!" : "Noch einen schönen Tag!",
"Hey there,<br><br>the admin 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>" : "Hallo,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melden Sie sich in der Web-Oberfläche an und gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'Basisverschlüsselungsmodul' und aktualisieren Sie dort Ihr Verschlüsselungspasswort indem Sie das Passwort in das 'altes Anmelde-Passwort-' und in das 'aktuelles Anmelde-Passwort' Feld eingeben.<br><br>",
"Hey there,<br><br>the admin 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>" : "Hallo,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Passwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melden Sie sich im Web-Interface an und gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'Basisverschlüsselungsmodul' und aktualisieren Sie dort Ihr Verschlüsselungspasswort indem Sie das Passwort in das 'altes Anmelde-Passwort-' und in das 'aktuelles Anmelde-Passwort' Feld eingeben.<br><br>",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Verschlüsselungs-App ist aktiviert, aber die Schlüssel sind noch nicht initialisiert. Bitte melden Sie sich ab und wieder an",
"Encrypt the home storage" : "Benutzerverzeichnis verschlüsseln",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Die Aktivierung dieser Option verschlüsselt alle Dateien die auf dem Hauptspeicher gespeichert sind, ansonsten werden nur Dateien auf dem externen Speicher verschlüsselt",

View file

@ -31,8 +31,8 @@ OC.L10N.register(
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да дешифрујем фајл. Вероватно је то дељен фајл. Затражите од власника да га поново подели.",
"Can not 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\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да укључите шифровање на серверу.",
"Default encryption module for server-side encryption" : "Подразумевани модул шифровања за шифровање на серверу",
"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Прочитајте документацију да сазнате све импликације пре него што \t\tсе одлучите да укључите шифровање на серверу.",
"Hey there,\n\nthe admin 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Пријавите се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним поставкама и ажурирајте своју лозинку за шифровање уношењем ове лозинке у поље „стара лозинка за пријаву“ и своју тренутну лозинку за пријављивање.\n",
"The share will expire on %s." : "Дељење истиче %s.",
"Cheers!" : "Здраво!",

View file

@ -29,8 +29,8 @@
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да дешифрујем фајл. Вероватно је то дељен фајл. Затражите од власника да га поново подели.",
"Can not 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\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да укључите шифровање на серверу.",
"Default encryption module for server-side encryption" : "Подразумевани модул шифровања за шифровање на серверу",
"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Прочитајте документацију да сазнате све импликације пре него што \t\tсе одлучите да укључите шифровање на серверу.",
"Hey there,\n\nthe admin 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Пријавите се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним поставкама и ажурирајте своју лозинку за шифровање уношењем ове лозинке у поље „стара лозинка за пријаву“ и своју тренутну лозинку за пријављивање.\n",
"The share will expire on %s." : "Дељење истиче %s.",
"Cheers!" : "Здраво!",

View file

@ -31,7 +31,6 @@ OC.L10N.register(
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。",
"Can not 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" : "伺服器端的預設加密模組",
"Hey there,\n\nthe admin 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' 設置您的個人設定並透過更新加密密碼,將這個組密碼設定在 'old log-in password' 以及您的目前登入密碼\n",
"The share will expire on %s." : "這個分享將會於 %s 過期",
"Cheers!" : "太棒了!",

View file

@ -29,7 +29,6 @@
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。",
"Can not 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" : "伺服器端的預設加密模組",
"Hey there,\n\nthe admin 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' 設置您的個人設定並透過更新加密密碼,將這個組密碼設定在 'old log-in password' 以及您的目前登入密碼\n",
"The share will expire on %s." : "這個分享將會於 %s 過期",
"Cheers!" : "太棒了!",

View file

@ -24,7 +24,6 @@ OC.L10N.register(
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Ha fallat la compartició %1$s, no s'ha pogut trobar %2$s, potser el servidor és inaccessible actualment o fa servir un certificat auto-signat.",
"Could not find share" : "No s'ha pogut trobar la compartició",
"Federated sharing" : "Compartició federada",
"You received \"%3$s\" as a remote share from %4$s (%1$s) (on behalf of %5$s (%2$s))" : "Has rebut \"%3$s\" com a compartició remota de %4$s (%1$s) (en nom de %5$s (%2$s))",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "Heu rebut {share} com un recompte remot de {user} (en nom de {nom})",
"You received {share} as a remote share from {user}" : "Heu rebut {share} com a recompte remot de {user}",
"Accept" : "Accepta",

View file

@ -22,7 +22,6 @@
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Ha fallat la compartició %1$s, no s'ha pogut trobar %2$s, potser el servidor és inaccessible actualment o fa servir un certificat auto-signat.",
"Could not find share" : "No s'ha pogut trobar la compartició",
"Federated sharing" : "Compartició federada",
"You received \"%3$s\" as a remote share from %4$s (%1$s) (on behalf of %5$s (%2$s))" : "Has rebut \"%3$s\" com a compartició remota de %4$s (%1$s) (en nom de %5$s (%2$s))",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "Heu rebut {share} com un recompte remot de {user} (en nom de {nom})",
"You received {share} as a remote share from {user}" : "Heu rebut {share} com a recompte remot de {user}",
"Accept" : "Accepta",

View file

@ -24,7 +24,7 @@ OC.L10N.register(
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Compartir %1$s ha fallado, no se ha podido encontrar %2$s, quizás el servidor no se puede alcanzar ahora mismo o usa un certificado autofirmado.",
"Could not find share" : "No se ha podido encontrar el compartido",
"Federated sharing" : "Compartido federado",
"You received \"%3$s\" as a remote share from %4$s (%1$s) (on behalf of %5$s (%2$s))" : "Has recibido \"%3$s\" como recurso remoto compartido de %4$s (%1$s) (en nombre de %5$s (%2$s))",
"You received \"%3$s\" as a remote share from %4$s (%1$s) (on behalf of %5$s (%2$s))" : "Has recibido \"%3$s\" como recurso remoto comparitdo de %4$s (%1$s) (en nombre de %5$s (%2$s))",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "Has recibido {share} como un recurso compartido remoto de {user} (en nombre de {behalf})",
"You received \"%3$s\" as a remote share from %4$s (%1$s)" : "Has recibido \"%3$s\" como un recurso compartido remoto de %4$s (%1$s)",
"You received {share} as a remote share from {user}" : "Has recibido {share} como un compartido remoto de {user}",
@ -51,7 +51,7 @@ OC.L10N.register(
"Add to your website" : "Añadir a su sitio web",
"Share with me via Nextcloud" : "Compartirlo conmigo vía Nextcloud",
"HTML Code:" : "Código HTML:",
"You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Has recibido \"%3$s\" como un recurso compartido remoto desde %1$s (en nombre de %2$s)",
"You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Has recibido \"/%3$s\" como un recurso compartido remoto de %1$s (en nombre de %2$s)",
"You received \"%3$s\" as a remote share from %1$s" : "Has recibido \"%3$s\" como un compartido remoto de %1$s"
},
"nplurals=2; plural=(n != 1);");

View file

@ -22,7 +22,7 @@
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Compartir %1$s ha fallado, no se ha podido encontrar %2$s, quizás el servidor no se puede alcanzar ahora mismo o usa un certificado autofirmado.",
"Could not find share" : "No se ha podido encontrar el compartido",
"Federated sharing" : "Compartido federado",
"You received \"%3$s\" as a remote share from %4$s (%1$s) (on behalf of %5$s (%2$s))" : "Has recibido \"%3$s\" como recurso remoto compartido de %4$s (%1$s) (en nombre de %5$s (%2$s))",
"You received \"%3$s\" as a remote share from %4$s (%1$s) (on behalf of %5$s (%2$s))" : "Has recibido \"%3$s\" como recurso remoto comparitdo de %4$s (%1$s) (en nombre de %5$s (%2$s))",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "Has recibido {share} como un recurso compartido remoto de {user} (en nombre de {behalf})",
"You received \"%3$s\" as a remote share from %4$s (%1$s)" : "Has recibido \"%3$s\" como un recurso compartido remoto de %4$s (%1$s)",
"You received {share} as a remote share from {user}" : "Has recibido {share} como un compartido remoto de {user}",
@ -49,7 +49,7 @@
"Add to your website" : "Añadir a su sitio web",
"Share with me via Nextcloud" : "Compartirlo conmigo vía Nextcloud",
"HTML Code:" : "Código HTML:",
"You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Has recibido \"%3$s\" como un recurso compartido remoto desde %1$s (en nombre de %2$s)",
"You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Has recibido \"/%3$s\" como un recurso compartido remoto de %1$s (en nombre de %2$s)",
"You received \"%3$s\" as a remote share from %1$s" : "Has recibido \"%3$s\" como un compartido remoto de %1$s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View file

@ -1,11 +1,11 @@
OC.L10N.register(
"federatedfilesharing",
{
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Czy chcesz dodać zdalne udostępnienie {name} od {owner}@{remote}?",
"Remote share" : "Zdalne udostępnienie",
"Remote share password" : "Hasło zdalnego udostępnienia",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcesz się dzielić zdalnie {name} z {owner}@{remote}?",
"Remote share" : "Zdalny zasób",
"Remote share password" : "Hasło do zdalnego zasobu",
"Cancel" : "Anuluj",
"Add remote share" : "Dodaj zdalne udostępnienie",
"Add remote share" : "Dodaj zdalny zasób",
"Copy" : "Kopiuj",
"Copied!" : "Skopiowano!",
"Not supported!" : "Brak wsparcia!",
@ -30,8 +30,8 @@ OC.L10N.register(
"You received {share} as a remote share from {user}" : "Otrzymałeś {share} zdalne udostępnienie od {user}",
"Accept" : "Akceptuj",
"Decline" : "Odrzuć",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Udostępnij mi poprzez mój ID #Nextcloud Chmury Federacyjnej, zobacz %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Udostępnij mi poprzez mój ID #Nextcloud Chmury Federacyjnej",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Podziel się ze mną przez mój ID #Nextcloud Chmury Federacyjnej, zobacz %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Podziel się ze mną za pomocą mojego ID #Nextcloud Chmury Federacyjnej",
"Sharing" : "Udostępnianie",
"Federated file sharing" : "Federacyjne udostępnianie plików",
"Provide federated file sharing across servers" : "Zezwól na federacyjne udostępnianie plików na serwerach",

View file

@ -1,9 +1,9 @@
{ "translations": {
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Czy chcesz dodać zdalne udostępnienie {name} od {owner}@{remote}?",
"Remote share" : "Zdalne udostępnienie",
"Remote share password" : "Hasło zdalnego udostępnienia",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcesz się dzielić zdalnie {name} z {owner}@{remote}?",
"Remote share" : "Zdalny zasób",
"Remote share password" : "Hasło do zdalnego zasobu",
"Cancel" : "Anuluj",
"Add remote share" : "Dodaj zdalne udostępnienie",
"Add remote share" : "Dodaj zdalny zasób",
"Copy" : "Kopiuj",
"Copied!" : "Skopiowano!",
"Not supported!" : "Brak wsparcia!",
@ -28,8 +28,8 @@
"You received {share} as a remote share from {user}" : "Otrzymałeś {share} zdalne udostępnienie od {user}",
"Accept" : "Akceptuj",
"Decline" : "Odrzuć",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Udostępnij mi poprzez mój ID #Nextcloud Chmury Federacyjnej, zobacz %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Udostępnij mi poprzez mój ID #Nextcloud Chmury Federacyjnej",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Podziel się ze mną przez mój ID #Nextcloud Chmury Federacyjnej, zobacz %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Podziel się ze mną za pomocą mojego ID #Nextcloud Chmury Federacyjnej",
"Sharing" : "Udostępnianie",
"Federated file sharing" : "Federacyjne udostępnianie plików",
"Provide federated file sharing across servers" : "Zezwól na federacyjne udostępnianie plików na serwerach",

View file

@ -24,9 +24,7 @@ OC.L10N.register(
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Не удалось предоставить доступ к «%1$s», не удалось найти %2$s. Возможно, сервер недоступен или использует самоподписанный сертификат.",
"Could not find share" : "Не удалось найти общий ресурс",
"Federated sharing" : "Общий доступ из федеративного хранилища",
"You received \"%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 {share} as a remote share from {user} (on behalf of {behalf})" : "Вы получили «{share}» в качестве удалённого ресурса от {user} (от имени {behalf})",
"You received \"%3$s\" as a remote share from %4$s (%1$s)" : "Вам предоставлен доступ к «%3$s» в качестве удалённого ресурса из %4$s (%1$s)",
"You received {share} as a remote share from {user}" : "Вы получили {share} в качестве удалённого ресурса от {user}",
"Accept" : "Принять",
"Decline" : "Отклонить",

View file

@ -22,9 +22,7 @@
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Не удалось предоставить доступ к «%1$s», не удалось найти %2$s. Возможно, сервер недоступен или использует самоподписанный сертификат.",
"Could not find share" : "Не удалось найти общий ресурс",
"Federated sharing" : "Общий доступ из федеративного хранилища",
"You received \"%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 {share} as a remote share from {user} (on behalf of {behalf})" : "Вы получили «{share}» в качестве удалённого ресурса от {user} (от имени {behalf})",
"You received \"%3$s\" as a remote share from %4$s (%1$s)" : "Вам предоставлен доступ к «%3$s» в качестве удалённого ресурса из %4$s (%1$s)",
"You received {share} as a remote share from {user}" : "Вы получили {share} в качестве удалённого ресурса от {user}",
"Accept" : "Принять",
"Decline" : "Отклонить",

View file

@ -38,8 +38,8 @@ OC.L10N.register(
"Federated Cloud Sharing" : "Здружено дељење у облаку",
"Open documentation" : "Отвори документацију",
"Adjust how people can share between servers." : "Подеси како људи деле фајлове између сервера.",
"Allow users on this server to send shares to other servers" : "Дозволи корисницима овог сервера да шаљу дељења на друге сервере",
"Allow users on this server to receive shares from other servers" : "Дозволи корисницима овог сервера да примају дељења са других сервера",
"Allow users on this server to send shares to other servers" : "Дозвољава корисницима овог сервера да шаљу дељења на друге сервере",
"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" : "Тражи кориснике и у глобалним и јавним именицима",

View file

@ -36,8 +36,8 @@
"Federated Cloud Sharing" : "Здружено дељење у облаку",
"Open documentation" : "Отвори документацију",
"Adjust how people can share between servers." : "Подеси како људи деле фајлове између сервера.",
"Allow users on this server to send shares to other servers" : "Дозволи корисницима овог сервера да шаљу дељења на друге сервере",
"Allow users on this server to receive shares from other servers" : "Дозволи корисницима овог сервера да примају дељења са других сервера",
"Allow users on this server to send shares to other servers" : "Дозвољава корисницима овог сервера да шаљу дељења на друге сервере",
"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" : "Тражи кориснике и у глобалним и јавним именицима",

View file

@ -6,7 +6,6 @@ OC.L10N.register(
"No server to federate with found" : "沒有找到可結盟的伺服器",
"Could not add server" : "無法加入伺服器",
"Federation" : "聯盟",
"Federation allows you to connect with other trusted servers to exchange the user directory." : "聯盟功能允許您與信任的伺服器連結,交換使用者列表。",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "聯盟功能允許您與信任的伺服器連結,交換使用者列表。舉例來說,與其他雲端聯盟的使用者分享檔案時,有了這一份列表,就可以在輸入框搜尋他們的使用者名稱。",
"Trusted servers" : "信任的伺服器",
"Add server automatically once a federated share was created successfully" : "當聯盟分享成功建立的時候自動將伺服器加入信任清單",

View file

@ -4,7 +4,6 @@
"No server to federate with found" : "沒有找到可結盟的伺服器",
"Could not add server" : "無法加入伺服器",
"Federation" : "聯盟",
"Federation allows you to connect with other trusted servers to exchange the user directory." : "聯盟功能允許您與信任的伺服器連結,交換使用者列表。",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "聯盟功能允許您與信任的伺服器連結,交換使用者列表。舉例來說,與其他雲端聯盟的使用者分享檔案時,有了這一份列表,就可以在輸入框搜尋他們的使用者名稱。",
"Trusted servers" : "信任的伺服器",
"Add server automatically once a federated share was created successfully" : "當聯盟分享成功建立的時候自動將伺服器加入信任清單",

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