Compare commits

...

179 commits

Author SHA1 Message Date
Alexandre Aubin
99873caa7c
Merge pull request #577 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-08-31 20:08:18 +02:00
José M
f077b8415a Translated using Weblate (Galician)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-08-30 19:54:49 +02:00
xabirequejo
a2647f6cec Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-08-30 19:54:49 +02:00
xabirequejo
e0857f184d Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-08-26 13:54:48 +02:00
Alexandre Aubin
26fdebc57b Update changelog for 11.2.8 2024-08-25 13:26:06 +02:00
Alexandre Aubin
bf785a11e3
Merge pull request #576 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-08-25 13:24:50 +02:00
craftrac
b4769273fa Translated using Weblate (Greek)
Currently translated at 11.1% (62 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/el/
2024-08-24 10:54:48 +02:00
cjdw
6bf0b9ec29 Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-08-22 02:54:48 +02:00
José M
f26e15c0c8 Translated using Weblate (Galician)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-08-22 02:54:48 +02:00
Alexandre Aubin
215ee68044
Merge pull request #574 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-08-20 20:33:42 +02:00
xabirequejo
a59cd08e30 Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-08-20 18:54:48 +02:00
xabirequejo
b33e76fd3f Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-08-17 12:54:48 +02:00
cjdw
3b11a8c0fa Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-08-09 12:54:48 +02:00
cjdw
39f198fcb4 Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-08-07 08:55:15 +02:00
xabirequejo
fbb8305e86 Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-08-05 20:30:16 +02:00
cjdw
aac77cb8af Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-08-04 18:57:20 +02:00
Ivan Davydov
9d48b3429f Translated using Weblate (Russian)
Currently translated at 99.8% (556 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ru/
2024-08-04 18:57:20 +02:00
xabirequejo
c5d86e27c3 Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-08-04 18:57:20 +02:00
Ali Çırçır
03ae379aea Translated using Weblate (Turkish)
Currently translated at 98.3% (548 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/tr/
2024-08-03 17:54:47 +02:00
cjdw
ca449b6c59 Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-08-02 15:54:47 +02:00
cjdw
9c389c208e Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-07-27 04:54:47 +02:00
cjdw
a35a54aaaf Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-07-25 18:54:47 +02:00
Grzegorz Cichocki
18dfd23e81 Translated using Weblate (Polish)
Currently translated at 97.6% (544 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/pl/
2024-07-22 10:36:28 +02:00
Jose Riha
a88afebd1d Translated using Weblate (Slovak)
Currently translated at 89.7% (500 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/sk/
2024-07-20 11:54:50 +02:00
cjdw
c87af75bd7 Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-07-20 11:54:50 +02:00
Jose Riha
f003c17e51 Translated using Weblate (Slovak)
Currently translated at 89.5% (499 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/sk/
2024-07-16 07:14:20 +02:00
cjdw
c7be3db41c Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-07-16 07:14:20 +02:00
Alexandre Aubin
ccc9cb03ba Update changelog for 11.2.7 2024-07-15 16:35:27 +02:00
Alexandre Aubin
27009ef854
Merge pull request #572 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-07-15 16:14:31 +02:00
cjdw
c0b8fb1a68 Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-07-11 16:56:31 +02:00
cjdw
937f158e5b Translated using Weblate (Indonesian)
Currently translated at 94.9% (529 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-07-06 00:49:26 +02:00
Ivan Davydov
d670555f59 Translated using Weblate (Russian)
Currently translated at 99.8% (556 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ru/
2024-07-06 00:49:26 +02:00
Andreas Gammelgaard Damsbo
763c779547 Translated using Weblate (Danish)
Currently translated at 13.1% (73 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/da/
2024-07-06 00:49:26 +02:00
Kuba Bazan
4e1f411eed Translated using Weblate (Polish)
Currently translated at 97.6% (544 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/pl/
2024-07-06 00:49:26 +02:00
Jose Riha
0e1fcfd4b6 Translated using Weblate (Slovak)
Currently translated at 88.1% (491 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/sk/
2024-07-06 00:49:26 +02:00
xabirequejo
737af32352 Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-07-06 00:49:26 +02:00
OniriCorpe
a309c2eb1c
Merge pull request #573 from YunoHost/disable-referer 2024-07-06 00:49:22 +02:00
Alexandre Aubin
3b50606ff8 Disable sending referer when clicking on links to external websites 2024-07-05 19:00:19 +02:00
OniriCorpe
ad7c927aa1 Update 11.2.6 2024-05-20 00:18:50 +02:00
OniriCorpe
653689e8ae chores: add make_changelog script 2024-05-20 00:18:50 +02:00
Alexandre Aubin
5685bf9934
Merge pull request #571 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-05-19 23:36:39 +02:00
rosbeef andino
5f499a4d61 Translated using Weblate (Spanish)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/es/
2024-05-10 17:59:13 +02:00
José M
dde2bf168d Translated using Weblate (Galician)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-05-08 12:13:03 +02:00
OniriCorpe
4aec50c0b9
Merge pull request #570 from yunohost-bot/weblate-yunohost-admin 2024-05-08 05:17:34 +02:00
OniriCorpe
b8c2b46d72 Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-05-08 05:16:30 +02:00
OniriCorpe
f3de655143
Merge pull request #569 from yunohost-bot/weblate-yunohost-admin 2024-05-08 01:48:04 +02:00
OniriCorpe
8a5bcb64f5 Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-05-08 01:43:27 +02:00
Alexandre Aubin
a50344a9f7
Merge pull request #568 from YunoHost/OniriCorpe-patch-1
fix a weird sentence
2024-05-08 01:41:51 +02:00
Alexandre Aubin
9d81fa42cd
Merge pull request #566 from YunoHost/dependabot/npm_and_yarn/app/vite-4.5.3
Bump vite from 4.5.2 to 4.5.3 in /app
2024-05-08 01:41:39 +02:00
OniriCorpe
a0cf68e6bc
fix a weird sentence 2024-05-08 01:40:38 +02:00
Alexandre Aubin
225c1a9eab
Merge pull request #567 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-05-08 01:16:37 +02:00
OniriCorpe
f68dc4170d Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-05-08 01:11:43 +02:00
Øjvind Fritjof Arnfred
8d9f201622 Translated using Weblate (Danish)
Currently translated at 11.1% (62 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/da/
2024-04-24 23:17:38 +02:00
Andreas Gammelgaard Damsbo
f2ec80a0e4 Translated using Weblate (Danish)
Currently translated at 6.1% (34 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/da/
2024-04-24 02:11:57 +02:00
Øjvind Fritjof Arnfred
fc00adb21a Translated using Weblate (Danish)
Currently translated at 6.1% (34 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/da/
2024-04-24 02:11:57 +02:00
Andreas Gammelgaard Damsbo
571c44f3da Translated using Weblate (Danish)
Currently translated at 1.4% (8 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/da/
2024-04-23 16:43:49 +02:00
Øjvind Fritjof Arnfred
16e5d5b429 Translated using Weblate (Danish)
Currently translated at 1.4% (8 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/da/
2024-04-23 16:43:49 +02:00
Titus PiJean
c4650ebd62 Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-04-22 16:38:52 +02:00
bruno van den bosch
72cb162f7e Translated using Weblate (Dutch)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/nl/
2024-04-22 16:38:52 +02:00
axolotle
5a805463bb fix: config panel "tags" turned into "select" 2024-04-22 16:38:26 +02:00
Alexandre Aubin
e9d9aa36cb Update changelog for 11.2.5 2024-04-11 14:12:45 +02:00
Alexandre Aubin
968b109b0c
Merge pull request #562 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-04-11 14:04:58 +02:00
dependabot[bot]
09baea5320
Bump vite from 4.5.2 to 4.5.3 in /app
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.5.2 to 4.5.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.3/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-04 01:55:25 +00:00
José M
cecbdc9184 Translated using Weblate (Galician)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-04-03 05:39:18 +02:00
José M
df6825de08 Translated using Weblate (Galician)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-04-02 10:54:44 +02:00
OniriCorpe
1e297a1ea5 Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-04-02 10:54:44 +02:00
xabirequejo
399965ddbb Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-04-02 10:54:43 +02:00
OniriCorpe
9f41a0eabb Translated using Weblate (German)
Currently translated at 99.6% (555 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/
2024-04-02 10:54:43 +02:00
xabirequejo
d52b520c98 Translated using Weblate (Basque)
Currently translated at 99.8% (556 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-03-31 17:05:14 +02:00
Poesty Li
b7fdb98b62 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/zh_Hans/
2024-03-31 17:05:14 +02:00
Tommi
d8309461f3 Translated using Weblate (Italian)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/it/
2024-03-31 17:05:14 +02:00
José M
3a40bfd121 Translated using Weblate (Galician)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-03-31 17:05:14 +02:00
Boudewijn
ffc6b7e448 Translated using Weblate (Dutch)
Currently translated at 45.0% (251 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/nl/
2024-03-31 17:05:14 +02:00
OniriCorpe
7553def2b2
Merge pull request #565 from YunoHost/missing-interrogative-sign
Translation: fix missing interrogative signs
2024-03-31 17:05:09 +02:00
OniriCorpe
b3fda97bf2 fix missing interrogative signs 2024-03-31 17:02:59 +02:00
OniriCorpe
dedaf98c50
Allow plus on email (#564) 2024-03-31 16:05:37 +02:00
Émile
2ec73a9383 allow plus on email 2024-03-31 12:51:31 +02:00
axolotle
e1b2630138 fix: logs text selection enabler shortcut 2024-03-29 16:57:22 +01:00
Axolotle
ab4dc8fd4e
Merge pull request #563 from YunoHost/fixes
fixes: login not redirecting + /domains query appearing in history
2024-03-26 23:22:31 +01:00
axolotle
8479fe4a20 fix: use api instead of store action to query domains 2024-03-26 23:17:17 +01:00
axolotle
a5e0022fb5 fix(login): return proper Promise on login action 2024-03-26 23:16:19 +01:00
Tagada
4b484a0396
Merge pull request #561 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-03-24 16:56:52 +01:00
Jan-Willem Swane
2db437c622 Translated using Weblate (Dutch)
Currently translated at 36.8% (205 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/nl/
2024-03-24 13:59:59 +01:00
Christian Wehrli
dd7bd0b489 Translated using Weblate (German)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/
2024-03-24 13:59:59 +01:00
OniriCorpe
2ff1bff4a9 Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-03-24 01:36:35 +01:00
Gregor
28332c9092 Translated using Weblate (German)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/
2024-03-24 01:36:34 +01:00
OniriCorpe
c29f11407e Translated using Weblate (Korean)
Currently translated at 3.5% (20 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ko/
2024-03-23 20:05:00 +01:00
OniriCorpe
2fb3a03cdc Translated using Weblate (Japanese)
Currently translated at 96.9% (540 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ja/
2024-03-23 20:04:59 +01:00
OniriCorpe
4a23002172 Translated using Weblate (Lithuanian)
Currently translated at 12.0% (67 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/lt/
2024-03-23 20:04:59 +01:00
OniriCorpe
d386bf5035 Translated using Weblate (Portuguese (Brazil))
Currently translated at 4.1% (23 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/pt_BR/
2024-03-23 20:04:59 +01:00
OniriCorpe
4f905d88d7 Translated using Weblate (Telugu)
Currently translated at 28.0% (156 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/te/
2024-03-23 20:04:59 +01:00
OniriCorpe
ca9e399ca6 Translated using Weblate (Slovak)
Currently translated at 87.9% (490 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/sk/
2024-03-23 20:04:59 +01:00
OniriCorpe
0d4bd13579 Translated using Weblate (Slovenian)
Currently translated at 21.3% (119 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/sl/
2024-03-23 20:04:58 +01:00
OniriCorpe
7c7cfa7e24 Translated using Weblate (Indonesian)
Currently translated at 91.0% (507 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/id/
2024-03-23 20:04:58 +01:00
OniriCorpe
671be81a54 Translated using Weblate (Persian)
Currently translated at 69.2% (386 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fa/
2024-03-23 20:04:58 +01:00
OniriCorpe
094ce99166 Translated using Weblate (Ukrainian)
Currently translated at 98.7% (550 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/uk/
2024-03-23 20:04:58 +01:00
OniriCorpe
8ca25bbeba Translated using Weblate (Finnish)
Currently translated at 77.9% (434 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fi/
2024-03-23 20:04:58 +01:00
OniriCorpe
d50626e789 Translated using Weblate (Czech)
Currently translated at 72.5% (404 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/cs/
2024-03-23 20:04:57 +01:00
OniriCorpe
c7d66f5332 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.9% (551 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/zh_Hans/
2024-03-23 20:04:57 +01:00
OniriCorpe
418c9c2a63 Translated using Weblate (Turkish)
Currently translated at 85.0% (474 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/tr/
2024-03-23 20:04:57 +01:00
OniriCorpe
937f732fd4 Translated using Weblate (Swedish)
Currently translated at 24.4% (136 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/sv/
2024-03-23 20:04:57 +01:00
OniriCorpe
4dc8fc2699 Translated using Weblate (Russian)
Currently translated at 90.4% (504 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ru/
2024-03-23 20:04:56 +01:00
OniriCorpe
8395b2d95b Translated using Weblate (Portuguese)
Currently translated at 72.8% (406 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/pt/
2024-03-23 20:04:56 +01:00
OniriCorpe
8e765e9fb7 Translated using Weblate (Polish)
Currently translated at 97.1% (541 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/pl/
2024-03-23 20:04:56 +01:00
OniriCorpe
fdabed55cb Translated using Weblate (Occitan)
Currently translated at 91.2% (508 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/oc/
2024-03-23 20:04:56 +01:00
OniriCorpe
f2cdd949ca Translated using Weblate (Dutch)
Currently translated at 36.4% (203 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/nl/
2024-03-23 20:04:55 +01:00
OniriCorpe
230dc8b14a Translated using Weblate (Italian)
Currently translated at 96.2% (536 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/it/
2024-03-23 20:04:55 +01:00
OniriCorpe
122e2482de Translated using Weblate (French)
Currently translated at 99.8% (556 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-03-23 20:04:55 +01:00
OniriCorpe
b6bdf0854d Translated using Weblate (Basque)
Currently translated at 98.5% (549 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-03-23 20:04:54 +01:00
OniriCorpe
53fcfa72b3 Translated using Weblate (Spanish)
Currently translated at 99.1% (552 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/es/
2024-03-23 20:04:54 +01:00
OniriCorpe
a22fa45807 Translated using Weblate (Esperanto)
Currently translated at 44.1% (246 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eo/
2024-03-23 20:04:54 +01:00
OniriCorpe
0b2a736c1c Translated using Weblate (German)
Currently translated at 99.6% (555 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/
2024-03-23 20:04:54 +01:00
OniriCorpe
62741c3c4f Translated using Weblate (Catalan)
Currently translated at 99.4% (554 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ca/
2024-03-23 20:04:54 +01:00
OniriCorpe
8adca39e7e Translated using Weblate (Arabic)
Currently translated at 87.2% (486 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ar/
2024-03-23 20:04:53 +01:00
OniriCorpe
8536c0c035 Translated using Weblate (English)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/en/
2024-03-23 20:04:53 +01:00
José M
825df1ee9b Translated using Weblate (Galician)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-03-23 14:39:36 +01:00
ppr
d85cd961ab Translated using Weblate (French)
Currently translated at 99.8% (556 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-03-23 14:39:36 +01:00
xabirequejo
e460fb3ad9 Translated using Weblate (Basque)
Currently translated at 99.6% (555 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-03-23 14:39:36 +01:00
xaloc33
a0bbc40e74 Translated using Weblate (Catalan)
Currently translated at 99.6% (555 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ca/
2024-03-23 14:39:35 +01:00
OniriCorpe
e219718ef0 Translated using Weblate (Slovenian)
Currently translated at 20.8% (116 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/sl/
2024-03-23 06:05:35 +01:00
OniriCorpe
3f286bc2c3 Translated using Weblate (Macedonian)
Currently translated at 0.8% (5 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/mk/
2024-03-23 06:05:35 +01:00
OniriCorpe
2db95e5c94 Translated using Weblate (Galician)
Currently translated at 98.9% (551 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-03-23 06:05:34 +01:00
Bram
66330fb6e7 Translated using Weblate (Bengali (Bangladesh))
Currently translated at 1.2% (7 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/bn_BD/
2024-03-23 06:05:34 +01:00
OniriCorpe
dcecb81a71 Translated using Weblate (Turkish)
Currently translated at 85.0% (474 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/tr/
2024-03-23 06:05:34 +01:00
OniriCorpe
21b3e9d01f Translated using Weblate (Swedish)
Currently translated at 23.8% (133 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/sv/
2024-03-23 06:05:34 +01:00
OniriCorpe
59dc6e99e8 Translated using Weblate (Portuguese)
Currently translated at 72.7% (405 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/pt/
2024-03-23 06:05:33 +01:00
Bram
88a994b294 Translated using Weblate (Dutch)
Currently translated at 36.0% (201 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/nl/
2024-03-23 06:05:33 +01:00
OniriCorpe
311b70eed0 Translated using Weblate (French)
Currently translated at 99.8% (556 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-03-23 06:05:33 +01:00
OniriCorpe
40f6908565 Translated using Weblate (Basque)
Currently translated at 98.5% (549 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-03-23 06:05:32 +01:00
OniriCorpe
7aa481198f Translated using Weblate (Esperanto)
Currently translated at 43.9% (245 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eo/
2024-03-23 06:05:32 +01:00
OniriCorpe
ee5ab71e8a Translated using Weblate (Catalan)
Currently translated at 98.9% (551 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ca/
2024-03-23 06:05:32 +01:00
OniriCorpe
54fdb42e87 Translated using Weblate (English)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/en/
2024-03-23 06:05:32 +01:00
Francescc
25b7f3f79f Translated using Weblate (Catalan)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ca/
2024-03-23 01:55:23 +01:00
OniriCorpe
d5bf2709de Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-03-23 01:54:39 +01:00
Francescc
4a4058aa4e Translated using Weblate (Catalan)
Currently translated at 99.8% (556 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ca/
2024-03-23 01:54:38 +01:00
Tagada
e355f1ab42
Merge pull request #557 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-03-17 13:37:07 +01:00
OniriCorpe
030d637073 Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-03-17 04:55:29 +01:00
Christian Wehrli
a248f5eab4 Translated using Weblate (German)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/
2024-03-11 17:54:39 +01:00
OniriCorpe
4bbb526d33 Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-03-11 17:54:39 +01:00
OniriCorpe
f3c2670d20 Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-03-11 17:54:39 +01:00
axolotle
791a9fe9c7 fix: misc 2024-03-11 17:50:11 +01:00
Bram
8fe6a2aef4
Merge pull request #558 from YunoHost/OniriCorpe-patch-1
Readme: add pictures alt text and some markdown standardization
2024-03-09 12:52:40 +01:00
OniriCorpe
f8daac618f
Readme: add pictures alt text and some markdown standardization 2024-03-09 06:21:23 +01:00
José M
fc30ec1560 Translated using Weblate (Galician)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-03-07 23:08:54 +01:00
OniriCorpe
d657f1acba Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/
2024-03-07 23:08:54 +01:00
OniriCorpe
21f604826f Translated using Weblate (English)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/en/
2024-03-07 23:08:54 +01:00
xabirequejo
061fad90bb Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-03-07 09:12:59 +01:00
xabirequejo
b82b79decf Translated using Weblate (Basque)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/eu/
2024-03-07 09:12:59 +01:00
Christian Wehrli
182a74c91e Translated using Weblate (German)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/
2024-03-07 09:12:59 +01:00
José M
5e211588b4 Translated using Weblate (Galician)
Currently translated at 100.0% (557 of 557 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/gl/
2024-03-07 09:12:59 +01:00
Bram
d0cca4d423
Merge pull request #553 from YunoHost/pre-vue3-prettier-yarn
[2. pre-vue3] prettier + yarn to match yunohost-portal stack
2024-03-05 21:24:35 +01:00
Axolotle
6a7e79794c
Merge pull request #555 from YunoHost/pre-vue3
[1. pre-vue3] Pre vue3 changes
2024-03-03 16:32:12 +01:00
axolotle
b01b06c918 chore: add missing prettier dep 2024-03-03 15:55:05 +01:00
Alexandre Aubin
f81008c150
Merge pull request #552 from YunoHost/misc-fixes
Misc fixes
2024-03-02 17:47:22 +01:00
axolotle
93a31c3843 chore: update .github with yarn 2024-03-02 17:35:47 +01:00
axolotle
61e6af94b3 chore: rm package-lock.json & add yarn.lock 2024-03-02 03:49:08 +01:00
axolotle
225f46bc0d chore: replace npm with yarn 2024-03-02 03:46:02 +01:00
axolotle
4101310b89 chore: lint 2024-03-02 03:09:15 +01:00
axolotle
fb0ec742f5 chore: replace standard with prettier 2024-03-02 02:58:00 +01:00
axolotle
d5c91135bb refactor: reflect YBreadcrumb name change 2024-03-02 02:48:52 +01:00
axolotle
732c1147a3 rename BreadCrumb to YBreadcrumb 2024-03-02 02:48:52 +01:00
axolotle
0c433ac71f fix: deprecated slot syntax 2024-03-02 02:48:52 +01:00
axolotle
fea5730a29 lint 2024-03-02 02:48:52 +01:00
axolotle
85a4178549 refactor: use methods instead of filters 2024-03-02 02:47:30 +01:00
axolotle
c47d7e187d refactor: reflect components name changes 2024-03-02 02:47:30 +01:00
axolotle
8f89e4a8bc chore: rename single word components 2024-03-02 02:46:37 +01:00
axolotle
159f1b5a1a chore: component names to PascalCase 2024-03-02 02:46:37 +01:00
axolotle
e5a3f5df2b header sso link based on main domain or fallback to hostname 2024-03-02 00:20:28 +01:00
axolotle
237b36e2e2 centralize a bit moar app init stuff (installed/connected) 2024-03-02 00:20:10 +01:00
axolotle
10f4fb86b5 fix context evaluation for simple forms (not configpanels) 2024-03-02 00:14:58 +01:00
Alexandre Aubin
51c9f1a03f
Merge pull request #550 from YunoHost/enh-app-package-license
add package license link in AppInfo + AppInstall
2024-03-01 21:06:27 +01:00
axolotle
b44046d478 add package license link in AppInfo + AppInstall 2024-03-01 17:51:44 +01:00
YunoHost Bot
53bab95ef2
Translations update from Weblate (#549)
Co-authored-by: José M <correo@xmgz.eu>
2024-02-29 23:09:34 +01:00
Alexandre Aubin
66f0d00e25
Merge pull request #545 from YunoHost/rename-license-applicense
rename 'License' to 'App license"
2024-02-27 20:20:25 +01:00
Tagada
607842b668
Merge pull request #543 from yunohost-bot/weblate-yunohost-admin
Translations update from Weblate
2024-02-25 18:02:23 +01:00
Christian Wehrli
1b33d36870 Translated using Weblate (German)
Currently translated at 100.0% (556 of 556 strings)

Translation: YunoHost/admin
Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/
2024-02-25 17:59:48 +01:00
Tagada
590724ab46
Merge pull request #546 from YunoHost/OniriCorpe-patch-1
chores: update actions/checkout@v3 to v4
2024-02-25 17:59:44 +01:00
OniriCorpe
c6f4506308
update actions/checkout@v3 to v4
Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20: actions/checkout@v3. For more information see: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.
2024-02-25 04:18:46 +01:00
OniriCorpe
c720330969 rename 'License' to 'App license" 2024-02-25 04:02:42 +01:00
157 changed files with 8628 additions and 7393 deletions

View file

@ -10,8 +10,8 @@ jobs:
eslint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install npm dependencies
run: cd app && npm ci
- uses: actions/checkout@v4
- name: Install yarn dependencies
run: cd app && yarn install --frozen-lockfile
- name: Run linter
run: cd app && npm run lint
run: cd app && yarn lint

View file

@ -1,41 +1,37 @@
<h1 align="center">YunoHost Admin</h1>
<div align="center">
![Version](https://img.shields.io/github/v/tag/yunohost/yunohost-admin?label=version&sort=semver)
[![Tests status](https://github.com/YunoHost/yunohost-admin/actions/workflows/eslint.yml/badge.svg)](https://github.com/YunoHost/yunohost-admin/actions/workflows/eslint.yml)
[![Project license](https://img.shields.io/gitlab/license/yunohost/yunohost)](https://github.com/YunoHost/yunohost/blob/dev/LICENSE)
[YunoHost](https://yunohost.org) administration web interface (VueJS client for the API).
[YunoHost logo](https://yunohost.org) administration web interface (VueJS client for the API).
This client is a part of the YunoHost project, and can not be installed directly. Please visit the YunoHost website for [installation instructions](https://yunohost.org/install).
![](./doc/home.png)
This client is a part of the YunoHost project, and can not be installed directly.
Please visit the YunoHost website for [installation instructions](https://yunohost.org/install).
![Web admin insterface screenshot](./doc/home.png)
</div>
Issues
------
## Issues
- [Please report issues on YunoHost bugtracker](https://github.com/YunoHost/issues).
Translation
-----------
## Translation
You can help translate Yunohost-Admin on our [translation platform](https://translate.yunohost.org/engage/yunohost/?utm_source=widget)
<div align="center"><img src="https://translate.yunohost.org/widgets/yunohost/-/admin/horizontal-auto.svg" alt="Translation status" /></div>
<div align="center"><img alt="View of the translation rate for the different languages available in YunoHost" src="https://translate.yunohost.org/widgets/yunohost/-/admin/horizontal-auto.svg" alt="Translation status" /></div>
Developpers
-------------
## Developpers
Contributions are welcome!
In order to contribute you will need to setup a development environment using [ynh-dev](https://github.com/YunoHost/ynh-dev) (see the README).
In order to contribute you will need to setup a development environment using [ynh-dev](https://github.com/YunoHost/ynh-dev) (see the README).
Once you have a environment running and are attached to it (with `./ynh-dev start`) you will be able to run:
```
$ ./ynh-dev use-git yunohost-admin
```bash
./ynh-dev use-git yunohost-admin
```
This command will install all dependencies and start a dev server (based on [webpack-dev-server](https://github.com/webpack/webpack-dev-server)) with Hot-Module-Replacement (live updates on code modification without reloading the page nor rebuilding the whole code). After the build step, click on the "Network:" link and you are good to go.

View file

@ -2,37 +2,17 @@ module.exports = {
root: true,
env: {
es2021: true,
node: true
node: true,
},
extends: [
'plugin:vue/strongly-recommended',
'eslint:recommended',
'standard'
'plugin:prettier/recommended',
],
rules: {
'vue/max-attributes-per-line': [
'error',
{
singleline: 3,
multiline: 3
}
],
'vue/multi-word-component-names': 'off', // FIXME this should be adressed at some point
'no-console': 'warn',
'template-curly-spacing': 'off',
camelcase: 'warn',
indent: 'off',
'no-irregular-whitespace': 'off',
'no-unused-vars': [
'warn',
{ varsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_' }
{ varsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_' },
],
quotes: 'warn',
'no-multiple-empty-lines': [
'error',
{
max: 2
}
]
}
},
}

1
app/.prettierignore Normal file
View file

@ -0,0 +1 @@
dist/

19
app/.prettierrc Normal file
View file

@ -0,0 +1,19 @@
{
"semi": false,
"tabWidth": 2,
"singleQuote": true,
"overrides": [
{
"files": "**/*.json",
"options": {
"tabWidth": 4
}
},
{
"files": "./*.json",
"options": {
"tabWidth": 2
}
}
]
}

View file

@ -1,23 +1,27 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=yes"
/>
<meta name="format-detection" content="telephone=no" />
<meta name="robots" content="noindex, nofollow" />
<meta name="referrer" content="no-referrer" />
<link rel="icon" href="/favicon.png" />
<title>YunoHost Admin</title>
</head>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=yes">
<meta name="format-detection" content="telephone=no" />
<meta name="robots" content="noindex, nofollow">
<link rel="icon" href="/favicon.png">
<title>YunoHost Admin</title>
</head>
<body>
<noscript>
<strong>We're sorry but YunoHost Admin doesn't work properly without JavaScript enabled. Please enable it to
continue.</strong>
</noscript>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
<body>
<noscript>
<strong>
We're sorry but YunoHost Admin doesn't work properly without JavaScript
enabled. Please enable it to continue.
</strong>
</noscript>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

2703
app/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -7,8 +7,10 @@
"scripts": {
"dev": "vite",
"build": "vite build",
"lint": "eslint --ext .js,.vue src",
"lint-fix": "lint --fix"
"lint:js": "eslint --ext \".ts,.vue,.cjs,.js\" --ignore-path ../.gitignore .",
"lint:prettier": "prettier --check .",
"lint": "yarn lint:js && yarn lint:prettier",
"lintfix": "prettier --write --list-different . && yarn lint:js --fix"
},
"dependencies": {
"@fontsource/fira-code": "^4.5.13",
@ -28,12 +30,14 @@
"@vitejs/plugin-vue2": "^2.2.0",
"bootstrap": "^4.6.0",
"eslint": "^8.36.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-vue": "^9.10.0",
"popper.js": "^1.16.0",
"portal-vue": "^2.1.7",
"prettier": "^3.2.5",
"sass": "^1.60.0",
"standard": "^17.0.0",
"vite": "^4.2.1"
"vite": "^4.5.3"
},
"browserslist": [
"> 1%",

View file

@ -2,78 +2,93 @@
<div id="app" class="container">
<!-- HEADER -->
<header>
<b-navbar>
<b-navbar-brand
:to="{ name: 'home' }" :disabled="waiting"
exact exact-active-class="active"
<BNavbar>
<BNavbarBrand
:to="{ name: 'home' }"
:disabled="waiting"
exact
exact-active-class="active"
>
<span v-if="theme">
<img alt="YunoHost logo" src="./assets/logo_light.png" width="40">
<img alt="YunoHost logo" src="./assets/logo_light.png" width="40" />
</span>
<span v-else>
<img alt="YunoHost logo" src="./assets/logo_dark.png" width="40">
<img alt="YunoHost logo" src="./assets/logo_dark.png" width="40" />
</span>
</b-navbar-brand>
</BNavbarBrand>
<b-navbar-nav class="ml-auto">
<BNavbarNav class="ml-auto">
<li class="nav-item">
<b-button
href="/yunohost/sso"
variant="primary" size="sm" block
>
{{ $t('user_interface_link') }} <icon iname="user" />
</b-button>
<BButton :href="ssoLink" variant="primary" size="sm" block>
{{ $t('user_interface_link') }} <YIcon iname="user" />
</BButton>
</li>
<li class="nav-item" v-show="connected">
<b-button
<BButton
@click.prevent="logout"
variant="outline-dark" block size="sm"
variant="outline-dark"
block
size="sm"
>
{{ $t('logout') }} <icon iname="sign-out" />
</b-button>
{{ $t('logout') }} <YIcon iname="sign-out" />
</BButton>
</li>
</b-navbar-nav>
</b-navbar>
</BNavbarNav>
</BNavbar>
</header>
<!-- MAIN -->
<view-lock-overlay>
<breadcrumb />
<ViewLockOverlay>
<YBreadcrumb />
<main id="main">
<!-- The `key` on router-view make sure that if a link points to a page that
<!-- The `key` on RouterView make sure that if a link points to a page that
use the same component as the previous one, it will be refreshed -->
<transition v-if="transitions" :name="transitionName">
<router-view class="animated" :key="routerKey" />
</transition>
<router-view v-else class="static" :key="routerKey" />
<Transition v-if="transitions" :name="transitionName">
<RouterView class="animated" :key="routerKey" />
</Transition>
<RouterView v-else class="static" :key="routerKey" />
</main>
</view-lock-overlay>
</ViewLockOverlay>
<!-- HISTORY CONSOLE -->
<history-console />
<HistoryConsole />
<!-- FOOTER -->
<footer class="py-3 mt-auto">
<nav>
<b-nav class="justify-content-center">
<b-nav-item href="https://yunohost.org/docs" target="_blank" link-classes="text-secondary">
<icon iname="book" /> {{ $t('footer.documentation') }}
</b-nav-item>
<b-nav-item href="https://yunohost.org/help" target="_blank" link-classes="text-secondary">
<icon iname="life-ring" /> {{ $t('footer.help') }}
</b-nav-item>
<b-nav-item href="https://donate.yunohost.org/" target="_blank" link-classes="text-secondary">
<icon iname="heart" /> {{ $t('footer.donate') }}
</b-nav-item>
<BNav class="justify-content-center">
<BNavItem
href="https://yunohost.org/docs"
target="_blank"
link-classes="text-secondary"
>
<YIcon iname="book" /> {{ $t('footer.documentation') }}
</BNavItem>
<BNavItem
href="https://yunohost.org/help"
target="_blank"
link-classes="text-secondary"
>
<YIcon iname="life-ring" /> {{ $t('footer.help') }}
</BNavItem>
<BNavItem
href="https://donate.yunohost.org/"
target="_blank"
link-classes="text-secondary"
>
<YIcon iname="heart" /> {{ $t('footer.donate') }}
</BNavItem>
<b-nav-text
v-if="yunohost" id="yunohost-version" class="ml-md-auto text-center"
<BNavText
v-if="yunohost"
id="yunohost-version"
class="ml-md-auto text-center"
>
<span v-html="$t('footer_version', yunohost)" />
</b-nav-text>
</b-nav>
</BNavText>
</BNav>
</nav>
</footer>
</div>
@ -89,7 +104,7 @@ export default {
components: {
HistoryConsole,
ViewLockOverlay
ViewLockOverlay,
},
computed: {
@ -100,35 +115,32 @@ export default {
'transitions',
'transitionName',
'waiting',
'theme'
])
'theme',
'ssoLink',
]),
},
methods: {
async logout () {
async logout() {
this.$store.dispatch('LOGOUT')
}
},
},
// This hook is only triggered at page first load
created () {
// From this hook the value of `connected` always come from the localStorage.
// This state may be `true` but session may have expired, by querying
// yunohost infos, api may respond with `Unauthorized` in which case the `connected`
// state will be automaticly reseted and user will be prompt with the login view.
if (this.connected) {
this.$store.dispatch('GET_YUNOHOST_INFOS')
}
created() {
this.$store.dispatch('ON_APP_CREATED')
},
mounted () {
mounted() {
// Unlock copypasta on log view
const copypastaCode = ['ArrowDown', 'ArrowDown', 'ArrowUp', 'ArrowUp']
let copypastastep = 0
document.addEventListener('keydown', ({ key }) => {
if (key === copypastaCode[copypastastep++]) {
if (copypastastep === copypastaCode.length) {
document.getElementsByClassName('unselectable').forEach((element) => element.classList.remove('unselectable'))
document
.querySelectorAll('.unselectable')
.forEach((element) => element.classList.remove('unselectable'))
copypastastep = 0
}
} else {
@ -137,7 +149,18 @@ export default {
})
// Konamicode ;P
const konamiCode = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'b', 'a']
const konamiCode = [
'ArrowUp',
'ArrowUp',
'ArrowDown',
'ArrowDown',
'ArrowLeft',
'ArrowRight',
'ArrowLeft',
'ArrowRight',
'b',
'a',
]
let konamistep = 0
document.addEventListener('keydown', ({ key }) => {
if (key === konamiCode[konamistep++]) {
@ -162,7 +185,7 @@ export default {
}
document.documentElement.setAttribute('dark-theme', this.theme) // updates the data-theme attribute
}
},
}
</script>
@ -182,14 +205,14 @@ header {
padding: 1rem 0;
img {
width: 70px;
width: 70px;
}
.navbar-nav {
flex-direction: column;
li {
margin: .2rem 0;
margin: 0.2rem 0;
}
}
}
@ -200,21 +223,23 @@ main {
// Routes transition
.animated {
transition: all .15s ease-in-out;
transition: all 0.15s ease-in-out;
}
.slide-left-enter, .slide-right-leave-active {
.slide-left-enter,
.slide-right-leave-active {
position: absolute;
width: 100%;
top: 0;
transform: translate(100vw, 0);
}
.slide-left-leave-active, .slide-right-enter {
.slide-left-leave-active,
.slide-right-enter {
position: absolute;
width: 100%;
top: 0;
transform: translate(-100vw, 0);
}
// hack to hide last transition provoqued by the <router-view> element change
// hack to hide last transition provoqued by the <RouterView> element change
// while disabling the transitions in ToolWebAdmin
.static ~ .animated {
display: none;
@ -234,7 +259,7 @@ footer {
.nav-item {
& + .nav-item a::before {
content: "•";
content: '•';
width: 1rem;
display: inline-block;
margin-left: -1.15rem;

View file

@ -6,7 +6,6 @@
import store from '@/store'
import { openWebSocket, getResponseData, handleError } from './handlers'
/**
* Options available for an API call.
*
@ -17,7 +16,6 @@ import { openWebSocket, getResponseData, handleError } from './handlers'
* @property {Boolean} asFormData - if `true`, will send the data with a body encoded as `"multipart/form-data"` instead of `"x-www-form-urlencoded"`).
*/
/**
* Representation of an API call for `api.fetchAll`
*
@ -26,8 +24,7 @@ import { openWebSocket, getResponseData, handleError } from './handlers'
* @property {String|Object} 1 - "uri", uri to call as string or as an object for cached uris.
* @property {Object|null} 2 - "data"
* @property {Options} 3 - "options"
*/
*/
/**
* Converts an object literal into an `URLSearchParams` that can be turned into a
@ -38,11 +35,15 @@ import { openWebSocket, getResponseData, handleError } from './handlers'
* @param {Boolean} [options.addLocale=false] - Option to append the locale to the query string.
* @return {URLSearchParams}
*/
export function objectToParams (obj, { addLocale = false } = {}, formData = false) {
const urlParams = (formData) ? new FormData() : new URLSearchParams()
export function objectToParams(
obj,
{ addLocale = false } = {},
formData = false,
) {
const urlParams = formData ? new FormData() : new URLSearchParams()
for (const [key, value] of Object.entries(obj)) {
if (Array.isArray(value)) {
value.forEach(v => urlParams.append(key, v))
value.forEach((v) => urlParams.append(key, v))
} else {
urlParams.append(key, value)
}
@ -53,7 +54,6 @@ export function objectToParams (obj, { addLocale = false } = {}, formData = fals
return urlParams
}
export default {
options: {
credentials: 'include',
@ -64,11 +64,10 @@ export default {
// Auto header is :
// "Accept": "*/*",
'X-Requested-With': 'XMLHttpRequest'
}
'X-Requested-With': 'XMLHttpRequest',
},
},
/**
* Generic method to fetch the api without automatic response handling.
*
@ -78,15 +77,22 @@ export default {
* @param {Options} [options={ wait = true, websocket = true, initial = false, asFormData = false }]
* @return {Promise<Object|Error>} Promise that resolve the api response data or an error.
*/
async fetch (
async fetch(
method,
uri,
data = {},
humanKey = null,
{ wait = true, websocket = true, initial = false, asFormData = false } = {}
{ wait = true, websocket = true, initial = false, asFormData = false } = {},
) {
// `await` because Vuex actions returns promises by default.
const request = await store.dispatch('INIT_REQUEST', { method, uri, humanKey, initial, wait, websocket })
const request = await store.dispatch('INIT_REQUEST', {
method,
uri,
humanKey,
initial,
wait,
websocket,
})
if (websocket) {
await openWebSocket(request)
@ -96,17 +102,22 @@ export default {
if (method === 'GET') {
uri += `${uri.includes('?') ? '&' : '?'}locale=${store.getters.locale}`
} else {
options = { ...options, method, body: objectToParams(data, { addLocale: true }, true) }
options = {
...options,
method,
body: objectToParams(data, { addLocale: true }, true),
}
}
const response = await fetch('/yunohost/api/' + uri, options)
const responseData = await getResponseData(response)
store.dispatch('END_REQUEST', { request, success: response.ok, wait })
return response.ok ? responseData : handleError(request, response, responseData)
return response.ok
? responseData
: handleError(request, response, responseData)
},
/**
* Api multiple queries helper.
* Those calls will act as one (declare optional waiting for one but still create history entries for each)
@ -117,14 +128,16 @@ export default {
* @param {Boolean}
* @return {Promise<Array|Error>} Promise that resolve the api responses data or an error.
*/
async fetchAll (queries, { wait, initial } = {}) {
async fetchAll(queries, { wait, initial } = {}) {
const results = []
if (wait) store.commit('SET_WAITING', true)
try {
for (const [method, uri, data, humanKey, options = {}] of queries) {
if (wait) options.wait = false
if (initial) options.initial = true
results.push(await this[method.toLowerCase()](uri, data, humanKey, options))
results.push(
await this[method.toLowerCase()](uri, data, humanKey, options),
)
}
} finally {
// Stop waiting even if there is an error.
@ -134,7 +147,6 @@ export default {
return results
},
/**
* Api get helper function.
*
@ -143,13 +155,13 @@ export default {
* @param {Options} [options={}] - options to apply to the call (default is `{ websocket: false, wait: false }`)
* @return {Promise<Object|Error>} Promise that resolve the api response data or an error.
*/
get (uri, data = null, humanKey = null, options = {}) {
get(uri, data = null, humanKey = null, options = {}) {
options = { websocket: false, wait: false, ...options }
if (typeof uri === 'string') return this.fetch('GET', uri, null, humanKey, options)
if (typeof uri === 'string')
return this.fetch('GET', uri, null, humanKey, options)
return store.dispatch('GET', { ...uri, humanKey, options })
},
/**
* Api post helper function.
*
@ -158,12 +170,12 @@ export default {
* @param {Options} [options={}] - options to apply to the call
* @return {Promise<Object|Error>} Promise that resolve the api response data or an error.
*/
post (uri, data = {}, humanKey = null, options = {}) {
if (typeof uri === 'string') return this.fetch('POST', uri, data, humanKey, options)
post(uri, data = {}, humanKey = null, options = {}) {
if (typeof uri === 'string')
return this.fetch('POST', uri, data, humanKey, options)
return store.dispatch('POST', { ...uri, data, humanKey, options })
},
/**
* Api put helper function.
*
@ -172,12 +184,12 @@ export default {
* @param {Options} [options={}] - options to apply to the call
* @return {Promise<Object|Error>} Promise that resolve the api response data or an error.
*/
put (uri, data = {}, humanKey = null, options = {}) {
if (typeof uri === 'string') return this.fetch('PUT', uri, data, humanKey, options)
put(uri, data = {}, humanKey = null, options = {}) {
if (typeof uri === 'string')
return this.fetch('PUT', uri, data, humanKey, options)
return store.dispatch('PUT', { ...uri, data, humanKey, options })
},
/**
* Api delete helper function.
*
@ -186,8 +198,9 @@ export default {
* @param {Options} [options={}] - options to apply to the call (default is `{ websocket: false, wait: false }`)
* @return {Promise<Object|Error>} Promise that resolve the api response data or an error.
*/
delete (uri, data = {}, humanKey = null, options = {}) {
if (typeof uri === 'string') return this.fetch('DELETE', uri, data, humanKey, options)
delete(uri, data = {}, humanKey = null, options = {}) {
if (typeof uri === 'string')
return this.fetch('DELETE', uri, data, humanKey, options)
return store.dispatch('DELETE', { ...uri, data, humanKey, options })
},
@ -199,24 +212,27 @@ export default {
* @param {Number} initialDelay - delay before calling the API for the first time in ms.
* @return {Promise<undefined|Error>}
*/
tryToReconnect ({ attemps = 5, delay = 2000, initialDelay = 0 } = {}) {
tryToReconnect({ attemps = 5, delay = 2000, initialDelay = 0 } = {}) {
return new Promise((resolve, reject) => {
const api = this
function reconnect (n) {
api.get('logout', {}, { key: 'reconnecting' }).then(resolve).catch(err => {
if (err.name === 'APIUnauthorizedError') {
resolve()
} else if (n < 1) {
reject(err)
} else {
setTimeout(() => reconnect(n - 1), delay)
}
})
function reconnect(n) {
api
.get('logout', {}, { key: 'reconnecting' })
.then(resolve)
.catch((err) => {
if (err.name === 'APIUnauthorizedError') {
resolve()
} else if (n < 1) {
reject(err)
} else {
setTimeout(() => reconnect(n - 1), delay)
}
})
}
if (initialDelay > 0) setTimeout(() => reconnect(attemps), initialDelay)
else reconnect(attemps)
})
}
},
}

View file

@ -5,10 +5,13 @@
import i18n from '@/i18n'
class APIError extends Error {
constructor (request, { url, status, statusText }, { error }) {
super(error ? error.replaceAll('\n', '<br>') : i18n.t('error_server_unexpected'))
constructor(request, { url, status, statusText }, { error }) {
super(
error
? error.replaceAll('\n', '<br>')
: i18n.t('error_server_unexpected'),
)
const urlObj = new URL(url)
this.name = 'APIError'
this.code = status
@ -18,7 +21,7 @@ class APIError extends Error {
this.path = urlObj.pathname + urlObj.search
}
log () {
log() {
/* eslint-disable-next-line */
console.error(`${this.name} (${this.code}): ${this.uri}\n${this.message}`)
}
@ -26,26 +29,24 @@ class APIError extends Error {
// Log (Special error to trigger a redirect to a log page)
class APIErrorLog extends APIError {
constructor (method, response, errorData) {
constructor(method, response, errorData) {
super(method, response, errorData)
this.logRef = errorData.log_ref
this.name = 'APIErrorLog'
}
}
// 0 — (means "the connexion has been closed" apparently)
class APIConnexionError extends APIError {
constructor (method, response) {
constructor(method, response) {
super(method, response, { error: i18n.t('error_connection_interrupted') })
this.name = 'APIConnexionError'
}
}
// 400 — Bad Request
class APIBadRequestError extends APIError {
constructor (method, response, errorData) {
constructor(method, response, errorData) {
super(method, response, errorData)
this.name = 'APIBadRequestError'
this.key = errorData.error_key
@ -53,45 +54,40 @@ class APIBadRequestError extends APIError {
}
}
// 401 — Unauthorized
class APIUnauthorizedError extends APIError {
constructor (method, response, errorData) {
constructor(method, response, errorData) {
super(method, response, { error: i18n.t('unauthorized') })
this.name = 'APIUnauthorizedError'
}
}
// 404 — Not Found
class APINotFoundError extends APIError {
constructor (method, response, errorData) {
constructor(method, response, errorData) {
errorData.error = i18n.t('api_not_found')
super(method, response, errorData)
this.name = 'APINotFoundError'
}
}
// 500 — Server Internal Error
class APIInternalError extends APIError {
constructor (method, response, errorData) {
constructor(method, response, errorData) {
super(method, response, errorData)
this.traceback = errorData.traceback || null
this.name = 'APIInternalError'
}
}
// 502 — Bad gateway (means API is down)
class APINotRespondingError extends APIError {
constructor (method, response) {
constructor(method, response) {
super(method, response, { error: i18n.t('api_not_responding') })
this.name = 'APINotRespondingError'
}
}
// Temp factory
const errors = {
[undefined]: APIError,
@ -101,10 +97,9 @@ const errors = {
401: APIUnauthorizedError,
404: APINotFoundError,
500: APIInternalError,
502: APINotRespondingError
502: APINotRespondingError,
}
export {
errors as default,
APIError,
@ -114,5 +109,5 @@ export {
APIInternalError,
APINotFoundError,
APINotRespondingError,
APIUnauthorizedError
APIUnauthorizedError,
}

View file

@ -6,14 +6,13 @@
import store from '@/store'
import errors, { APIError } from './errors'
/**
* Try to get response content as json and if it's not as text.
*
* @param {Response} response - A fetch `Response` object.
* @return {(Object|String)} Parsed response's json or response's text.
*/
export async function getResponseData (response) {
export async function getResponseData(response) {
// FIXME the api should always return json as response
const responseText = await response.text()
try {
@ -23,7 +22,6 @@ export async function getResponseData (response) {
}
}
/**
* Opens a WebSocket connection to the server in case it sends messages.
* Currently, the connection is closed by the server right after an API call so
@ -33,11 +31,16 @@ export async function getResponseData (response) {
* @param {Object} request - Request info data.
* @return {Promise<Event>} Promise that resolve on websocket 'open' or 'error' event.
*/
export function openWebSocket (request) {
return new Promise(resolve => {
const ws = new WebSocket(`wss://${store.getters.host}/yunohost/api/messages`)
export function openWebSocket(request) {
return new Promise((resolve) => {
const ws = new WebSocket(
`wss://${store.getters.host}/yunohost/api/messages`,
)
ws.onmessage = ({ data }) => {
store.dispatch('DISPATCH_MESSAGE', { request, messages: JSON.parse(data) })
store.dispatch('DISPATCH_MESSAGE', {
request,
messages: JSON.parse(data),
})
}
// ws.onclose = (e) => {}
ws.onopen = resolve
@ -46,7 +49,6 @@ export function openWebSocket (request) {
})
}
/**
* Handler for API errors.
*
@ -55,7 +57,7 @@ export function openWebSocket (request) {
* @param {Object|String} errorData - The response parsed json/text.
* @throws Will throw a `APIError` with request and response data.
*/
export async function handleError (request, response, errorData) {
export async function handleError(request, response, errorData) {
let errorCode = response.status in errors ? response.status : undefined
if (typeof errorData === 'string') {
// FIXME API: Patching errors that are plain text or html.
@ -70,26 +72,24 @@ export async function handleError (request, response, errorData) {
throw new errors[errorCode](request, response, errorData)
}
/**
* If an APIError is not catched by a view it will be dispatched to the store so the
* error can be displayed in the error modal.
*
* @param {APIError} error
*/
export function onUnhandledAPIError (error) {
export function onUnhandledAPIError(error) {
error.log()
store.dispatch('HANDLE_ERROR', error)
}
/**
* Global catching of unhandled promise's rejections.
* Those errors (thrown or rejected from inside a promise) can't be catched by
* `window.onerror`.
*/
export function registerGlobalErrorHandlers () {
window.addEventListener('unhandledrejection', e => {
export function registerGlobalErrorHandlers() {
window.addEventListener('unhandledrejection', (e) => {
const error = e.reason
if (error instanceof APIError) {
onUnhandledAPIError(error)

View file

@ -1,6 +1,6 @@
<template>
<b-input-group v-bind="$attrs">
<input-item
<BInputGroup v-bind="$attrs">
<InputItem
:id="id"
:value="value.localPart"
:placeholder="placeholder"
@ -10,23 +10,31 @@
@blur="$parent.$emit('touch')"
/>
<b-input-group-append>
<b-input-group-text>{{ value.separator }}</b-input-group-text>
</b-input-group-append>
<BInputGroupAppend>
<BInputGroupText>{{ value.separator }}</BInputGroupText>
</BInputGroupAppend>
<b-input-group-append>
<select-item
<BInputGroupAppend>
<SelectItem
:value="value.domain"
:choices="choices"
:aria-describedby="id + 'domain-desc'"
@input="onInput('domain', $event)"
@blur="$parent.$emit('touch')"
/>
</b-input-group-append>
</BInputGroupAppend>
<span class="sr-only" :id="id + 'local-part-desc'" v-t="'address.local_part_description.' + type" />
<span class="sr-only" :id="id + 'domain-desc'" v-t="'address.domain_description.' + type" />
</b-input-group>
<span
class="sr-only"
:id="id + 'local-part-desc'"
v-t="'address.local_part_description.' + type"
/>
<span
class="sr-only"
:id="id + 'domain-desc'"
v-t="'address.domain_description.' + type"
/>
</BInputGroup>
</template>
<script>
@ -42,17 +50,17 @@ export default {
placeholder: { type: String, default: null },
id: { type: String, default: null },
state: { type: null, default: null },
type: { type: String, default: 'email' }
type: { type: String, default: 'email' },
},
methods: {
onInput (key, value) {
onInput(key, value) {
this.$emit('input', {
...this.value,
[key]: value
[key]: value,
})
}
}
},
},
}
</script>

View file

@ -1,47 +1,50 @@
<template>
<b-card
v-bind="$attrs"
no-body :class="_class"
>
<slot name="header" slot="header">
<h2>
<b-button v-b-toggle="id" :variant="variant" class="card-collapse-button">
{{ title }}
<icon class="ml-auto" iname="chevron-right" />
</b-button>
</h2>
</slot>
<BCard v-bind="$attrs" no-body :class="_class">
<template #header>
<slot name="header">
<h2>
<BButton
v-b-toggle="id"
:variant="variant"
class="card-collapse-button"
>
{{ title }}
<YIcon class="ml-auto" iname="chevron-right" />
</BButton>
</h2>
</slot>
</template>
<b-collapse :id="id" :visible="visible" role="region">
<BCollapse :id="id" :visible="visible" role="region">
<slot name="default" />
</b-collapse>
</b-card>
</BCollapse>
</BCard>
</template>
<script>
export default {
name: 'CollapseCard',
name: 'CardCollapse',
props: {
id: { type: String, required: true },
title: { type: String, required: true },
variant: { type: String, default: 'white' },
visible: { type: Boolean, default: false },
flush: { type: Boolean, default: false }
flush: { type: Boolean, default: false },
},
computed: {
_class () {
_class() {
const baseClass = 'card-collapse'
return [
baseClass,
{
[`${baseClass}-flush`]: this.flush,
[`${baseClass}-${this.variant}`]: this.variant
}
[`${baseClass}-${this.variant}`]: this.variant,
},
]
}
}
},
},
}
</script>
@ -55,10 +58,10 @@ export default {
display: flex;
width: 100%;
text-align: left;
padding-top: $spacer * .5;
padding-bottom: $spacer * .5;
padding-top: $spacer * 0.5;
padding-bottom: $spacer * 0.5;
border-radius: 0;
font: inherit
font: inherit;
}
&-flush {

View file

@ -6,25 +6,30 @@ export default {
name: 'CardDeckFeed',
props: {
stacks: { type: Number, default: 21 }
stacks: { type: Number, default: 21 },
},
data () {
data() {
return {
busy: false,
range: this.stacks,
childrenCount: this.$slots.default.length
childrenCount: this.$slots.default.length,
}
},
methods: {
getTopParent (prev) {
return prev.parentElement === this.$refs.feed ? prev : this.getTopParent(prev.parentElement)
getTopParent(prev) {
return prev.parentElement === this.$refs.feed
? prev
: this.getTopParent(prev.parentElement)
},
onScroll () {
onScroll() {
const elem = this.$refs.feed
if (window.innerHeight > elem.clientHeight + elem.getBoundingClientRect().top - 200) {
if (
window.innerHeight >
elem.clientHeight + elem.getBoundingClientRect().top - 200
) {
this.busy = true
this.range = Math.min(this.range + this.stacks, this.childrenCount)
this.$nextTick().then(() => {
@ -33,7 +38,7 @@ export default {
}
},
onKeydown (e) {
onKeydown(e) {
if (['PageUp', 'PageDown'].includes(e.code)) {
e.preventDefault()
const key = e.code === 'PageUp' ? 'previous' : 'next'
@ -44,16 +49,16 @@ export default {
}
}
// FIXME Add `Home` and `End` shorcuts
}
},
},
mounted () {
mounted() {
window.addEventListener('scroll', this.onScroll)
this.$refs.feed.addEventListener('keydown', this.onKeydown)
this.onScroll()
},
beforeUpdate () {
beforeUpdate() {
const slots = this.$slots.default
if (this.childrenCount !== slots.length) {
this.range = this.stacks
@ -61,21 +66,21 @@ export default {
}
},
render (h) {
render(h) {
return h(
'b-card-group',
'BCardGroup',
{
attrs: { role: 'feed', 'aria-busy': this.busy.toString() },
props: { deck: true },
ref: 'feed'
ref: 'feed',
},
this.$slots.default.slice(0, this.range)
this.$slots.default.slice(0, this.range),
)
},
beforeDestroy () {
beforeDestroy() {
window.removeEventListener('scroll', this.onScroll)
this.$refs.feed.removeEventListener('keydown', this.onKeydown)
}
},
}
</script>

View file

@ -1,6 +1,11 @@
<template>
<abstract-form
v-bind="{ id: panel.id + '-form', validation, serverError: panel.serverError }"
<AbstractForm
v-if="panel"
v-bind="{
id: panel.id + '-form',
validation,
serverError: panel.serverError,
}"
@submit.prevent.stop="onApply"
:no-footer="!panel.hasApplyButton"
>
@ -13,37 +18,41 @@
<slot name="tab-before" />
<template v-for="section in panel.sections">
<component
<Component
v-if="section.visible"
:is="section.name ? 'section' : 'div'"
:key="section.id"
class="panel-section"
>
<b-card-title v-if="section.name" title-tag="h3">
{{ section.name }} <small v-if="section.help">{{ section.help }}</small>
</b-card-title>
<BCardTitle v-if="section.name" title-tag="h3">
{{ section.name }}
<small v-if="section.help">{{ section.help }}</small>
</BCardTitle>
<template v-for="(field, fname) in section.fields">
<!-- FIXME rework the whole component chain to avoid direct mutation of the `forms` props -->
<!-- eslint-disable -->
<component
v-if="field.visible" :is="field.is" v-bind="field.props"
v-model="forms[panel.id][fname]" :validation="validation[fname]" :key="fname"
<Component
v-if="field.visible"
:is="field.is"
v-bind="field.props"
v-model="forms[panel.id][fname]"
:validation="validation[fname]"
:key="fname"
@action.stop="onAction(section.id, fname, section.fields)"
/>
<!-- eslint-enable -->
</template>
</component>
</Component>
</template>
<slot name="tab-after" />
</abstract-form>
</AbstractForm>
</template>
<script>
import { filterObject } from '@/helpers/commons'
export default {
name: 'ConfigPanel',
@ -51,41 +60,43 @@ export default {
tabId: { type: String, required: true },
panels: { type: Array, default: undefined },
forms: { type: Object, default: undefined },
v: { type: Object, default: undefined }
v: { type: Object, default: undefined },
},
computed: {
panel () {
return this.panels.find(panel => panel.id === this.tabId)
panel() {
return this.panels.find((panel) => panel.id === this.tabId)
},
validation () {
validation() {
return this.v.forms[this.panel.id]
}
},
},
methods: {
onApply () {
onApply() {
const panelId = this.panel.id
this.$emit('submit', {
id: panelId,
form: this.forms[panelId]
form: this.forms[panelId],
})
},
onAction (sectionId, actionId, actionFields) {
onAction(sectionId, actionId, actionFields) {
const panelId = this.panel.id
const actionFieldsKeys = Object.keys(actionFields)
this.$emit('submit', {
id: panelId,
form: filterObject(this.forms[panelId], ([key]) => actionFieldsKeys.includes(key)),
form: filterObject(this.forms[panelId], ([key]) =>
actionFieldsKeys.includes(key),
),
action: [panelId, sectionId, actionId].join('.'),
name: actionId
name: actionId,
})
}
}
},
},
}
</script>

View file

@ -1,6 +1,6 @@
<template>
<div class="config-panel">
<routable-tabs
<RoutableTabs
v-if="routes_.length > 1"
:routes="routes_"
v-bind="{ panels, forms, v: $v, ...$attrs }"
@ -15,13 +15,13 @@
<template #tab-after>
<slot name="tab-after" />
</template>
</routable-tabs>
</RoutableTabs>
<card v-else :title="routes_[0].text" :icon="routes_[0].icon">
<YCard v-else :title="routes_[0].text" :icon="routes_[0].icon">
<slot name="tab-top" />
<slot name="tab-before" />
<slot name="tab-after" />
</card>
</YCard>
</div>
</template>
@ -31,8 +31,10 @@ import { validationMixin } from 'vuelidate'
export default {
name: 'ConfigPanels',
inheritAttrs: false,
components: {
RoutableTabs: () => import('@/components/RoutableTabs.vue')
RoutableTabs: () => import('@/components/RoutableTabs.vue'),
},
mixins: [validationMixin],
@ -43,28 +45,28 @@ export default {
validations: { type: Object, default: undefined },
errors: { type: Object, default: undefined }, // never used
routes: { type: Array, default: null },
noRedirect: { type: Boolean, default: false }
noRedirect: { type: Boolean, default: false },
},
computed: {
routes_ () {
routes_() {
if (this.routes) return this.routes
return this.panels.map(panel => ({
return this.panels.map((panel) => ({
to: { params: { tabId: panel.id } },
text: panel.name,
icon: panel.icon || 'wrench'
icon: panel.icon || 'wrench',
}))
}
},
},
validations () {
validations() {
return { forms: this.validations }
},
created () {
created() {
if (!this.noRedirect && !this.$route.params.tabId) {
this.$router.replace({ params: { tabId: this.panels[0].id } })
}
}
},
}
</script>

View file

@ -13,58 +13,64 @@ export default {
minHeight: { type: Number, default: 0 },
renderDelay: { type: Number, default: 100 },
unrenderDelay: { type: Number, default: 2000 },
rootMargin: { type: String, default: '300px' }
rootMargin: { type: String, default: '300px' },
},
data () {
data() {
return {
observer: null,
render: false,
fixedMinHeight: this.minHeight
fixedMinHeight: this.minHeight,
}
},
mounted () {
mounted() {
let unrenderTimer
let renderTimer
this.observer = new IntersectionObserver(entries => {
let intersecting = entries[0].isIntersecting
this.observer = new IntersectionObserver(
(entries) => {
let intersecting = entries[0].isIntersecting
// Fix for weird bug when typing fast in app search or on slow client.
// Intersection is triggered but even if the element is indeed in the viewport,
// isIntersecting is `false`, so we have to manually check this
// FIXME Would be great to find out why this is happening
if (!intersecting && this.$el.offsetTop < window.innerHeight) {
intersecting = true
}
if (intersecting) {
clearTimeout(unrenderTimer)
// Show the component after a delay (to avoid rendering while scrolling fast)
renderTimer = setTimeout(() => {
this.render = true
}, this.unrender ? this.renderDelay : 0)
if (!this.unrender) {
// Stop listening to intersections after first appearance if unrendering is not activated
this.observer.disconnect()
// Fix for weird bug when typing fast in app search or on slow client.
// Intersection is triggered but even if the element is indeed in the viewport,
// isIntersecting is `false`, so we have to manually check this
// FIXME Would be great to find out why this is happening
if (!intersecting && this.$el.offsetTop < window.innerHeight) {
intersecting = true
}
} else if (this.unrender) {
clearTimeout(renderTimer)
// Hide the component after a delay if it's no longer in the viewport
unrenderTimer = setTimeout(() => {
this.fixedMinHeight = this.$el.clientHeight
this.render = false
}, this.unrenderDelay)
}
}, { rootMargin: this.rootMargin })
if (intersecting) {
clearTimeout(unrenderTimer)
// Show the component after a delay (to avoid rendering while scrolling fast)
renderTimer = setTimeout(
() => {
this.render = true
},
this.unrender ? this.renderDelay : 0,
)
if (!this.unrender) {
// Stop listening to intersections after first appearance if unrendering is not activated
this.observer.disconnect()
}
} else if (this.unrender) {
clearTimeout(renderTimer)
// Hide the component after a delay if it's no longer in the viewport
unrenderTimer = setTimeout(() => {
this.fixedMinHeight = this.$el.clientHeight
this.render = false
}, this.unrenderDelay)
}
},
{ rootMargin: this.rootMargin },
)
this.observer.observe(this.$el)
},
beforeDestroy () {
beforeDestroy() {
this.observer.disconnect()
}
},
}
</script>

View file

@ -1,21 +1,25 @@
<template>
<b-list-group
v-bind="$attrs" flush
:class="{ 'fixed-height': fixedHeight, 'bordered': bordered }"
<BListGroup
v-bind="$attrs"
flush
:class="{ 'fixed-height': fixedHeight, bordered: bordered }"
@scroll="onScroll"
>
<yuno-list-group-item
<YListGroupItem
v-if="limit && messages.length > limit"
variant="info" v-t="'api.partial_logs'"
variant="info"
v-t="'api.partial_logs'"
/>
<yuno-list-group-item
v-for="({ color, text }, i) in reducedMessages" :key="i"
:variant="color" size="xs"
<YListGroupItem
v-for="({ color, text }, i) in reducedMessages"
:key="i"
:variant="color"
size="xs"
>
<span v-html="text" />
</yuno-list-group-item>
</b-list-group>
</YListGroupItem>
</BListGroup>
</template>
<script>
@ -27,43 +31,43 @@ export default {
fixedHeight: { type: Boolean, default: false },
bordered: { type: Boolean, default: false },
autoScroll: { type: Boolean, default: false },
limit: { type: Number, default: null }
limit: { type: Number, default: null },
},
data () {
data() {
return {
auto: true
auto: true,
}
},
computed: {
reducedMessages () {
reducedMessages() {
const len = this.messages.length
if (!this.limit || len <= this.limit) {
return this.messages
}
return this.messages.slice(len - this.limit)
}
},
},
methods: {
scrollToEnd () {
scrollToEnd() {
if (!this.auto) return
this.$nextTick(() => {
this.$el.scrollTo(0, this.$el.lastElementChild.offsetTop)
})
},
onScroll ({ target }) {
onScroll({ target }) {
this.auto = target.scrollHeight === target.scrollTop + target.clientHeight
}
},
},
created () {
created() {
if (this.autoScroll) {
this.$watch('messages', this.scrollToEnd)
}
}
},
}
</script>

View file

@ -1,7 +1,11 @@
<template>
<div class="query-header w-100" v-on="$listeners" v-bind="$attrs">
<!-- STATUS -->
<span class="status" :class="['bg-' + color, statusSize]" :aria-label="$t('api.query_status.' + request.status)" />
<span
class="status"
:class="['bg-' + color, statusSize]"
:aria-label="$t('api.query_status.' + request.status)"
/>
<!-- REQUEST DESCRIPTION -->
<strong class="request-desc">
@ -11,28 +15,34 @@
<div v-if="request.errors || request.warnings">
<!-- WEBSOCKET ERRORS COUNT -->
<span class="count" v-if="request.errors">
{{ request.errors }}<icon iname="bug" class="text-danger ml-1" />
{{ request.errors }}<YIcon iname="bug" class="text-danger ml-1" />
</span>
<!-- WEBSOCKET WARNINGS COUNT -->
<span class="count" v-if="request.warnings">
{{ request.warnings }}<icon iname="warning" class="text-warning ml-1" />
{{ request.warnings
}}<YIcon iname="warning" class="text-warning ml-1" />
</span>
</div>
<!-- VIEW ERROR BUTTON -->
<b-button
<BButton
v-if="showError && request.error"
size="sm" pill
size="sm"
pill
class="error-btn ml-auto py-0"
variant="danger"
@click="reviewError"
>
<small v-t="'api_error.view_error'" />
</b-button>
</BButton>
<!-- TIME DISPLAY -->
<time v-if="showTime" :datetime="request.date | hour" :class="request.error ? 'ml-2' : 'ml-auto'">
{{ request.date | hour }}
<time
v-if="showTime"
:datetime="hour(request.date)"
:class="request.error ? 'ml-2' : 'ml-auto'"
>
{{ hour(request.date) }}
</time>
</div>
</template>
@ -45,44 +55,40 @@ export default {
request: { type: Object, required: true },
statusSize: { type: String, default: '' },
showTime: { type: Boolean, default: false },
showError: { type: Boolean, default: false }
showError: { type: Boolean, default: false },
},
computed: {
color () {
color() {
const statuses = {
pending: 'primary',
success: 'success',
warning: 'warning',
error: 'danger'
error: 'danger',
}
return statuses[this.request.status]
},
errorsCount () {
return this.request.messages.filter(({ type }) => type === 'danger').length
errorsCount() {
return this.request.messages.filter(({ type }) => type === 'danger')
.length
},
warningsCount () {
return this.request.messages.filter(({ type }) => type === 'warning').length
}
warningsCount() {
return this.request.messages.filter(({ type }) => type === 'warning')
.length
},
},
methods: {
reviewError () {
reviewError() {
this.$store.dispatch('REVIEW_ERROR', this.request)
}
},
filters: {
readableUri (uri) {
return uri.split('?')[0].split('/').join(' > ') // replace('/', ' > ')
},
hour (date) {
hour(date) {
return new Date(date).toLocaleTimeString()
}
}
},
},
}
</script>
@ -104,15 +110,15 @@ div {
.status {
display: inline-block;
border-radius: 50%;
width: .75rem;
min-width: .75rem;
height: .75rem;
margin-right: .25rem;
width: 0.75rem;
min-width: 0.75rem;
height: 0.75rem;
margin-right: 0.25rem;
&.lg {
width: 1rem;
height: 1rem;
margin-right: .5rem;
margin-right: 0.5rem;
}
}
@ -124,7 +130,7 @@ time {
.count {
display: flex;
align-items: center;
margin-left: .5rem;
margin-left: 0.5rem;
}
@include media-breakpoint-down(xs) {
@ -132,5 +138,4 @@ time {
display: none;
}
}
</style>

View file

@ -1,41 +1,48 @@
<template>
<b-list-group :flush="flush" :style="{ '--depth': tree.depth }">
<BListGroup :flush="flush" :style="{ '--depth': tree.depth }">
<template v-for="(node, i) in tree.children">
<b-list-group-item
<BListGroupItem
:key="node.id"
class="list-group-item-action" :class="getClasses(node, i)"
class="list-group-item-action"
:class="getClasses(node, i)"
@click="$router.push(node.data.to)"
>
<slot name="default" v-bind="node" />
<b-button
<BButton
v-if="node.children"
size="xs" variant="outline-secondary"
:aria-expanded="node.data.opened ? 'true' : 'false'" :aria-controls="'collapse-' + node.id"
:class="node.data.opened ? 'not-collapsed' : 'collapsed'" class="ml-2"
size="xs"
variant="outline-secondary"
:aria-expanded="node.data.opened ? 'true' : 'false'"
:aria-controls="'collapse-' + node.id"
:class="node.data.opened ? 'not-collapsed' : 'collapsed'"
class="ml-2"
@click.stop="node.data.opened = !node.data.opened"
>
<span class="sr-only">{{ toggleText }}</span>
<icon iname="chevron-right" />
</b-button>
</b-list-group-item>
<YIcon iname="chevron-right" />
</BButton>
</BListGroupItem>
<b-collapse
v-if="node.children" :key="'collapse-' + node.id"
v-model="node.data.opened" :id="'collapse-' + node.id"
<BCollapse
v-if="node.children"
:key="'collapse-' + node.id"
v-model="node.data.opened"
:id="'collapse-' + node.id"
>
<recursive-list-group
<RecursiveListGroup
:tree="node"
:last="last !== undefined ? last : i === tree.children.length - 1" flush
:last="last !== undefined ? last : i === tree.children.length - 1"
flush
>
<!-- PASS THE DEFAULT SLOT WITH SCOPE TO NEXT NESTED COMPONENT -->
<template slot="default" slot-scope="scope">
<slot name="default" v-bind="scope" />
</template>
</recursive-list-group>
</b-collapse>
</RecursiveListGroup>
</BCollapse>
</template>
</b-list-group>
</BListGroup>
</template>
<script>
@ -46,17 +53,20 @@ export default {
tree: { type: Object, required: true },
flush: { type: Boolean, default: false },
last: { type: Boolean, default: undefined },
toggleText: { type: String, default: null }
toggleText: { type: String, default: null },
},
methods: {
getClasses (node, i) {
getClasses(node, i) {
const children = node.height > 0
const opened = children && node.data.opened
const last = this.last !== false && (!children || !opened) && i === this.tree.children.length - 1
const last =
this.last !== false &&
(!children || !opened) &&
i === this.tree.children.length - 1
return { collapsible: children, uncollapsible: !children, opened, last }
}
}
},
},
}
</script>

View file

@ -1,19 +1,22 @@
<template>
<b-card no-body>
<b-card-header header-tag="nav">
<b-nav card-header fill pills>
<b-nav-item
v-for="route in routes" :key="route.text"
:to="route.to" exact exact-active-class="active"
<BCard no-body>
<BCardHeader header-tag="nav">
<BNav card-header fill pills>
<BNavItem
v-for="route in routes"
:key="route.text"
:to="route.to"
exact
exact-active-class="active"
>
<icon v-if="route.icon" :iname="route.icon" />
<YIcon v-if="route.icon" :iname="route.icon" />
{{ route.text }}
</b-nav-item>
</b-nav>
</b-card-header>
</BNavItem>
</BNav>
</BCardHeader>
<!-- Bind extra props to the child view and forward child events to parent -->
<router-view v-bind="$attrs" v-on="$listeners">
<RouterView v-bind="$attrs" v-on="$listeners">
<template #tab-top>
<slot name="tab-top" />
</template>
@ -23,8 +26,8 @@
<template #tab-after>
<slot name="tab-after" />
</template>
</router-view>
</b-card>
</RouterView>
</BCard>
</template>
<script>
@ -36,7 +39,7 @@ export default {
inheritAttrs: false,
props: {
routes: { type: Array, required: true }
}
routes: { type: Array, required: true },
},
}
</script>

View file

@ -1,32 +1,32 @@
<template>
<div>
<b-card-body>
<BCardBody>
<slot name="disclaimer" />
<b-form
:id="id" :inline="inline" :class="formClasses"
@submit.prevent="onSubmit" novalidate
<BForm
:id="id"
:inline="inline"
:class="formClasses"
@submit.prevent="onSubmit"
novalidate
>
<slot name="default" />
<slot name="server-error" v-bind="{ errorFeedback }">
<b-alert
v-if="errorFeedback"
variant="danger" class="my-3" icon="ban"
>
<BAlert v-if="errorFeedback" variant="danger" class="my-3" icon="ban">
<div v-html="errorFeedback" />
</b-alert>
</BAlert>
</slot>
</b-form>
</b-card-body>
</BForm>
</BCardBody>
<b-card-footer v-if="!noFooter">
<BCardFooter v-if="!noFooter">
<slot name="footer">
<b-button type="submit" variant="success" :form="id">
<BButton type="submit" variant="success" :form="id">
{{ submitText || $t('save') }}
</b-button>
</BButton>
</slot>
</b-card-footer>
</BCardFooter>
</div>
</template>
@ -41,28 +41,28 @@ export default {
serverError: { type: String, default: '' },
inline: { type: Boolean, default: false },
formClasses: { type: [Array, String, Object], default: null },
noFooter: { type: Boolean, default: false }
noFooter: { type: Boolean, default: false },
},
computed: {
errorFeedback () {
errorFeedback() {
if (this.serverError) return this.serverError
else if (this.validation && this.validation.$anyError) {
return this.$i18n.t('form_errors.invalid_form')
} else return ''
}
},
},
methods: {
onSubmit (e) {
onSubmit(e) {
const v = this.validation
if (v) {
v.$touch()
if (v.$pending || v.$invalid) return
}
this.$emit('submit', e)
}
}
},
},
}
</script>
@ -73,7 +73,7 @@ export default {
align-items: center;
& > *:not(:first-child) {
margin-left: .5rem;
margin-left: 0.5rem;
}
}
</style>

View file

@ -1,34 +0,0 @@
<template>
<b-breadcrumb v-if="breadcrumb.length">
<b-breadcrumb-item to="/">
<span class="sr-only">{{ $t('home') }}</span>
<icon iname="home" />
</b-breadcrumb-item>
<b-breadcrumb-item
v-for="({ name, text }, i) in breadcrumb" :key="name"
:to="{ name }" :active="i === breadcrumb.length - 1"
>
{{ text }}
</b-breadcrumb-item>
</b-breadcrumb>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
name: 'Breadcrumb',
computed: {
...mapGetters(['breadcrumb'])
}
}
</script>
<style lang="scss" scoped>
.breadcrumb {
border: none;
background-color: transparent;
}
</style>

View file

@ -1,33 +1,38 @@
<template>
<card v-bind="$attrs" class="card-form">
<YCard v-bind="$attrs" class="card-form">
<template #default>
<slot name="disclaimer" />
<b-form
:id="id" :inline="inline" :class="formClasses"
@submit.prevent="onSubmit" novalidate
<BForm
:id="id"
:inline="inline"
:class="formClasses"
@submit.prevent="onSubmit"
novalidate
>
<slot name="default" />
<slot name="server-error">
<b-alert
variant="danger" class="my-3" icon="ban"
<BAlert
variant="danger"
class="my-3"
icon="ban"
:show="errorFeedback !== ''"
>
<div v-html="errorFeedback" />
</b-alert>
</BAlert>
</slot>
</b-form>
</BForm>
</template>
<template v-if="!noFooter" #buttons>
<slot name="buttons">
<b-button type="submit" variant="success" :form="id">
<BButton type="submit" variant="success" :form="id">
{{ submitText ? submitText : $t('save') }}
</b-button>
</BButton>
</slot>
</template>
</card>
</YCard>
</template>
<script>
@ -41,30 +46,29 @@ export default {
serverError: { type: String, default: '' },
inline: { type: Boolean, default: false },
formClasses: { type: [Array, String, Object], default: null },
noFooter: { type: Boolean, default: false }
noFooter: { type: Boolean, default: false },
},
computed: {
errorFeedback () {
errorFeedback() {
if (this.serverError) return this.serverError
else if (this.validation && this.validation.$anyError) {
return this.$i18n.t('form_errors.invalid_form')
} else return ''
}
},
},
methods: {
onSubmit (e) {
onSubmit(e) {
const v = this.validation
if (v) {
v.$touch()
if (v.$pending || v.$invalid) return
}
this.$emit('submit', e)
}
}
},
},
}
</script>
<style lang="scss">
</style>
<style lang="scss"></style>

View file

@ -1,17 +1,17 @@
<template>
<b-row no-gutters class="description-row">
<b-col v-bind="cols_">
<BRow no-gutters class="description-row">
<BCol v-bind="cols_">
<slot name="term">
<strong>{{ term }}</strong>
</slot>
</b-col>
</BCol>
<b-col>
<BCol>
<slot name="default">
{{ details }}
</slot>
</b-col>
</b-row>
</BCol>
</BRow>
</template>
<script>
@ -21,21 +21,21 @@ export default {
props: {
term: { type: String, default: null },
details: { type: String, default: null },
cols: { type: Object, default: () => ({ md: 4, xl: 3 }) }
cols: { type: Object, default: () => ({ md: 4, xl: 3 }) },
},
computed: {
cols_ () {
cols_() {
return Object.assign({ md: 4, xl: 3 }, this.cols)
}
}
},
},
}
</script>
<style lang="scss" scoped>
.description-row {
@include media-breakpoint-up(md) {
margin: .25rem 0;
margin: 0.25rem 0;
&:hover {
background-color: rgba($black, 0.05);
border-radius: 0.2rem;

View file

@ -2,20 +2,22 @@
<span class="explain-what">
<slot name="default" />
<span class="explain-what-popover-container">
<b-button
:id="id" href="#"
variant="light"
>
<icon iname="question" />
<span class="sr-only">{{ $t('details_about', { subject: title }) }}</span>
</b-button>
<b-popover
<BButton :id="id" href="#" variant="light">
<YIcon iname="question" />
<span class="sr-only">
{{ $t('details_about', { subject: title }) }}
</span>
</BButton>
<BPopover
placement="auto"
:target="id" triggers="focus" custom-class="explain-what-popover"
:variant="variant" :title="title"
:target="id"
triggers="focus"
custom-class="explain-what-popover"
:variant="variant"
:title="title"
>
<span v-html="content" />
</b-popover>
</BPopover>
</span>
</span>
</template>
@ -28,14 +30,14 @@ export default {
id: { type: String, required: true },
title: { type: String, required: true },
content: { type: String, required: true },
variant: { type: String, default: 'info' }
variant: { type: String, default: 'info' },
},
computed: {
cols_ () {
cols_() {
return Object.assign({ md: 4, xl: 3 }, this.cols)
}
}
},
},
}
</script>
@ -45,7 +47,7 @@ export default {
.btn {
padding: 0;
margin-left: .1rem;
margin-left: 0.1rem;
border-radius: 50rem;
line-height: inherit;
font-size: inherit;

View file

@ -1,6 +1,6 @@
<template>
<!-- v-bind="$attrs" allow to pass default attrs not specified in this component slots -->
<b-form-group
<BFormGroup
v-bind="attrs"
:id="_id"
:label-for="$attrs['label-for'] || props.id"
@ -10,7 +10,7 @@
<!-- Make field props and state available as scoped slot data -->
<slot v-bind="{ self: { ...props, state }, touch }">
<!-- if no component was passed as slot, render a component from the props -->
<component
<Component
:is="component"
v-bind="props"
v-on="$listeners"
@ -28,24 +28,24 @@
<!-- Render description -->
<template v-if="description || link">
<div class="d-flex">
<b-link
v-if="link"
:to="link" :href="link.href" class="ml-auto"
>
<BLink v-if="link" :to="link" :href="link.href" class="ml-auto">
{{ link.text }}
</b-link>
</BLink>
</div>
<vue-showdown
<VueShowdown
v-if="description"
:markdown="description" flavor="github"
:class="{ ['alert p-1 px-2 alert-' + descriptionVariant]: descriptionVariant }"
:markdown="description"
flavor="github"
:class="{
['alert p-1 px-2 alert-' + descriptionVariant]: descriptionVariant,
}"
/>
</template>
<!-- Slot available to overwrite the one above -->
<slot name="description" />
</template>
</b-form-group>
</BFormGroup>
</template>
<script>
@ -64,23 +64,23 @@ export default {
component: { type: String, default: 'InputItem' },
value: { type: null, default: null },
props: { type: Object, default: () => ({}) },
validation: { type: Object, default: null }
validation: { type: Object, default: null },
},
computed: {
_id () {
_id() {
if (this.id) return this.id
const childId = this.props.id || this.$attrs['label-for']
return childId ? childId + '_group' : null
},
attrs () {
attrs() {
const attrs = { ...this.$attrs }
if ('label' in attrs) {
const defaultAttrs = {
'label-cols-md': 4,
'label-cols-lg': 3,
'label-class': ['font-weight-bold', 'py-0']
'label-class': ['font-weight-bold', 'py-0'],
}
if (!('label-cols' in attrs)) {
for (const attr in defaultAttrs) {
@ -93,7 +93,7 @@ export default {
return attrs
},
state () {
state() {
// Need to set state as null if no error, else component turn green
if (this.validation) {
return this.validation.$anyError === true ? false : null
@ -101,18 +101,18 @@ export default {
return null
},
errorMessage () {
errorMessage() {
const validation = this.validation
if (validation && validation.$anyError) {
const [type, errData] = this.findError(validation.$params, validation)
return this.$i18n.t('form_errors.' + type, errData)
}
return ''
}
},
},
methods: {
touch (name) {
touch(name) {
if (this.validation) {
// For fields that have multiple elements
if (name) {
@ -123,7 +123,7 @@ export default {
}
},
findError (params, obj, parent = obj) {
findError(params, obj, parent = obj) {
for (const key in params) {
if (!obj[key]) {
return [key, obj.$params[key]]
@ -132,8 +132,8 @@ export default {
return this.findError(obj[key].$params, obj[key], parent)
}
}
}
}
},
},
}
</script>

View file

@ -1,14 +1,14 @@
<template>
<b-row no-gutters class="description-row">
<b-col v-bind="cols_" class="font-weight-bold">
<BRow no-gutters class="description-row">
<BCol v-bind="cols_" class="font-weight-bold">
{{ label }}
</b-col>
</BCol>
<b-col>
<BCol>
<!-- FIXME not sure about rendering html -->
<div v-html="text" />
</b-col>
</b-row>
</BCol>
</BRow>
</template>
<script>
@ -21,32 +21,35 @@ export default {
label: { type: String, required: true },
component: { type: String, default: 'InputItem' },
value: { type: null, default: null },
cols: { type: Object, default: () => ({ md: 4, lg: 3 }) }
cols: { type: Object, default: () => ({ md: 4, lg: 3 }) },
},
computed: {
cols_ () {
cols_() {
return Object.assign({ md: 4, lg: 3 }, this.cols)
},
text () {
text() {
return this.parseValue(this.value)
}
},
},
methods: {
parseValue (value) {
parseValue(value) {
const item = this.component
if (item === 'FileItem') value = value.file ? value.file.name : null
if (item === 'CheckboxItem') value = this.$i18n.t(value ? 'yes' : 'no')
if (item === 'TextAreaItem') value = value.replaceAll('\n', '<br>')
if (Array.isArray(value)) {
value = value.length ? value.join(this.$i18n.t('words.separator')) : null
value = value.length
? value.join(this.$i18n.t('words.separator'))
: null
}
if ([null, undefined, ''].includes(this.value)) value = this.$i18n.t('words.none')
if ([null, undefined, ''].includes(this.value))
value = this.$i18n.t('words.none')
return value
}
}
},
},
}
</script>

View file

@ -1,83 +0,0 @@
<template>
<div :class="['custom-spinner', spinner]" />
</template>
<script>
import { mapGetters } from 'vuex'
export default {
name: 'Spinner',
computed: {
...mapGetters(['spinner'])
}
}
</script>
<style lang="scss" scoped>
.custom-spinner {
animation: 8s linear infinite;
background-repeat: no-repeat;
&.pacman {
height: 24px;
width: 24px;
background-image: url('../../assets/spinners/pacman_dark.gif');
animation-name: back-and-forth-pacman;
[dark-theme="true"] & {
background-image: url('../../assets/spinners/pacman_light.gif');
}
@keyframes back-and-forth-pacman {
0%, 100% { transform: scale(1); margin-left: 0; }
49% { transform: scale(1); margin-left: calc(100% - 24px);}
50% { transform: scale(-1); margin-left: calc(100% - 24px);}
99% { transform: scale(-1); margin-left: 0;}
}
}
&.magikarp {
height: 32px;
width: 32px;
background-image: url('../../assets/spinners/magikarp.gif');
animation-name: back-and-forth-magikarp;
@keyframes back-and-forth-magikarp {
0%, 100% { transform: scale(1, 1); margin-left: 0; }
49% { transform: scale(1, 1); margin-left: calc(100% - 32px);}
50% { transform: scale(-1, 1); margin-left: calc(100% - 32px);}
99% { transform: scale(-1, 1); margin-left: 0;}
}
}
&.nyancat {
height: 40px;
width: 100px;
background-image: url('../../assets/spinners/nyancat.gif');
animation-name: back-and-forth-nyancat;
@keyframes back-and-forth-nyancat {
0%, 100% { transform: scale(1, 1); margin-left: 0; }
49% { transform: scale(1, 1); margin-left: calc(100% - 100px);}
50% { transform: scale(-1, 1); margin-left: calc(100% - 100px);}
99% { transform: scale(-1, 1); margin-left: 0;}
}
}
&.spookycat {
height: 40px;
width: 65px;
background-image: url('../../assets/spinners/spookycat.gif');
animation-name: back-and-forth-spookycat;
@keyframes back-and-forth-spookycat {
0%, 100% { transform: scale(1, 1); margin-left: 0; }
49% { transform: scale(1, 1); margin-left: calc(100% - 100px);}
50% { transform: scale(-1, 1); margin-left: calc(100% - 100px);}
99% { transform: scale(-1, 1); margin-left: 0;}
}
}
}
</style>

View file

@ -1,5 +1,5 @@
<template>
<b-button-toolbar :aria-label="label" id="top-bar">
<BButtonToolbar :aria-label="label" id="top-bar">
<div id="top-bar-left" class="top-bar-group" v-if="hasLeftSlot">
<slot name="group-left" />
</div>
@ -7,11 +7,11 @@
<div id="top-bar-right" class="top-bar-group" v-if="hasRightSlot || button">
<slot v-if="hasRightSlot" name="group-right" />
<b-button v-else variant="success" :to="button.to">
<icon v-if="button.icon" :iname="button.icon" /> {{ button.text }}
</b-button>
<BButton v-else variant="success" :to="button.to">
<YIcon v-if="button.icon" :iname="button.icon" /> {{ button.text }}
</BButton>
</div>
</b-button-toolbar>
</BButtonToolbar>
</template>
<script>
@ -23,25 +23,25 @@ export default {
button: {
type: Object,
default: null,
validator (value) {
return ['text', 'to'].every(prop => (prop in value))
}
}
validator(value) {
return ['text', 'to'].every((prop) => prop in value)
},
},
},
data () {
data() {
return {
hasLeftSlot: null,
hasRightSlot: null
hasRightSlot: null,
}
},
created () {
created() {
this.$nextTick(() => {
this.hasLeftSlot = 'group-left' in this.$slots
this.hasRightSlot = 'group-right' in this.$slots
})
}
},
}
</script>
@ -65,10 +65,10 @@ export default {
flex-direction: column-reverse;
#top-bar-right {
margin-bottom: .75rem;
margin-bottom: 0.75rem;
::v-deep > * {
margin-bottom: .25rem;
margin-bottom: 0.25rem;
}
}
@ -89,7 +89,7 @@ export default {
}
::v-deep .btn {
margin-left: .5rem;
margin-left: 0.5rem;
&.dropdown-toggle-split {
margin-left: 0;
}

View file

@ -1,21 +1,21 @@
<template>
<div>
<top-bar v-if="hasTopBar">
<TopBar v-if="hasTopBar">
<template #group-left>
<slot name="top-bar-group-left" />
</template>
<template #group-right>
<slot name="top-bar-group-right" />
</template>
</top-bar>
</TopBar>
<slot v-else name="top-bar" />
<slot name="top" v-bind="{ loading: isLoading }" />
<b-skeleton-wrapper :loading="isLoading">
<BSkeletonWrapper :loading="isLoading">
<template #loading>
<slot name="skeleton">
<component :is="skeleton" />
<Component :is="skeleton" />
</slot>
</template>
@ -23,7 +23,7 @@
<div>
<slot name="default" v-bind="{ loading: isLoading }" />
</div>
</b-skeleton-wrapper>
</BSkeletonWrapper>
<slot name="bot" v-bind="{ loading: isLoading }" />
</div>
@ -40,44 +40,46 @@ export default {
queriesWait: { type: Boolean, default: false },
skeleton: { type: [String, Array], default: null },
// Optional prop to take control of the loading value
loading: { type: Boolean, default: null }
loading: { type: Boolean, default: null },
},
data () {
data() {
return {
fallback_loading: this.loading === null && this.queries !== null ? true : null
fallback_loading:
this.loading === null && this.queries !== null ? true : null,
}
},
computed: {
isLoading () {
isLoading() {
if (this.loading !== null) return this.loading
return this.fallback_loading
},
hasTopBar () {
return ['top-bar-group-left', 'top-bar-group-right'].some(slotName => (slotName in this.$slots))
}
hasTopBar() {
return ['top-bar-group-left', 'top-bar-group-right'].some(
(slotName) => slotName in this.$slots,
)
},
},
methods: {
fetchQueries ({ triggerLoading = false } = {}) {
fetchQueries({ triggerLoading = false } = {}) {
if (triggerLoading) {
this.fallback_loading = true
}
api.fetchAll(
this.queries,
{ wait: this.queriesWait, initial: true }
).then(responses => {
this.$emit('queries-response', ...responses)
this.fallback_loading = false
})
}
api
.fetchAll(this.queries, { wait: this.queriesWait, initial: true })
.then((responses) => {
this.$emit('queries-response', ...responses)
this.fallback_loading = false
})
},
},
created () {
created() {
if (this.queries) this.fetchQueries()
}
},
}
</script>

View file

@ -1,21 +1,24 @@
<template>
<view-base v-bind="$attrs" v-on="$listeners" :skeleton="skeleton">
<ViewBase v-bind="$attrs" v-on="$listeners" :skeleton="skeleton">
<template v-if="hasCustomTopBar" #top-bar>
<slot name="top-bar" />
</template>
<template v-if="!hasCustomTopBar" #top-bar-group-left>
<b-input-group class="w-100">
<b-input-group-prepend is-text>
<icon iname="search" />
</b-input-group-prepend>
<BInputGroup class="w-100">
<BInputGroupPrepend is-text>
<YIcon iname="search" />
</BInputGroupPrepend>
<b-form-input
<BFormInput
id="top-bar-search"
:value="search" @input="$emit('update:search', $event)"
:placeholder="$t('search.for', { items: $tc('items.' + itemsName, 2) })"
:value="search"
@input="$emit('update:search', $event)"
:placeholder="
$t('search.for', { items: $tc('items.' + itemsName, 2) })
"
:disabled="!items"
/>
</b-input-group>
</BInputGroup>
</template>
<template v-if="!hasCustomTopBar" #top-bar-group-right>
<slot name="top-bar-buttons" />
@ -26,12 +29,18 @@
</template>
<template #default>
<b-alert v-if="items === null || filteredItems === null" variant="warning">
<BAlert v-if="items === null || filteredItems === null" variant="warning">
<slot name="alert-message">
<icon iname="exclamation-triangle" />
{{ $tc(items === null ? 'items_verbose_count': 'search.not_found', 0, { items: $tc('items.' + itemsName, 0) }) }}
<YIcon iname="exclamation-triangle" />
{{
$tc(
items === null ? 'items_verbose_count' : 'search.not_found',
0,
{ items: $tc('items.' + itemsName, 0) },
)
}}
</slot>
</b-alert>
</BAlert>
<slot v-else name="default" />
</template>
@ -43,7 +52,7 @@
<template #skeleton>
<slot name="skeleton" />
</template>
</view-base>
</ViewBase>
</template>
<script>
@ -55,13 +64,13 @@ export default {
itemsName: { type: String, required: true },
filteredItems: { type: null, required: true },
search: { type: String, default: null },
skeleton: { type: String, default: 'list-group-skeleton' }
skeleton: { type: String, default: 'ListGroupSkeleton' },
},
computed: {
hasCustomTopBar () {
hasCustomTopBar() {
return 'top-bar' in this.$slots
}
}
},
},
}
</script>

View file

@ -1,36 +1,36 @@
<template>
<component
<Component
v-bind="$attrs"
:is="alert ? 'b-alert' : 'div'"
:is="alert ? 'BAlert' : 'div'"
:variant="alert ? variant : null"
:class="{ ['alert alert-' + variant]: !alert }"
class="yuno-alert d-flex flex-column flex-md-row align-items-center"
>
<icon :iname="_icon" class="mr-md-3 mb-md-0 mb-2 md" />
<YIcon :iname="_icon" class="mr-md-3 mb-md-0 mb-2 md" />
<div class="w-100">
<slot name="default" />
</div>
</component>
</Component>
</template>
<script>
import { DEFAULT_STATUS_ICON } from '@/helpers/yunohostArguments'
export default {
name: 'YunoAlert',
name: 'YAlert',
props: {
alert: { type: Boolean, default: false },
variant: { type: String, default: 'info' },
icon: { type: String, default: null }
icon: { type: String, default: null },
},
computed: {
_icon () {
_icon() {
if (this.icon) return this.icon
return DEFAULT_STATUS_ICON[this.variant]
}
}
},
},
}
</script>

View file

@ -0,0 +1,36 @@
<template>
<BBreadcrumb v-if="breadcrumb.length">
<BBreadcrumbItem to="/">
<span class="sr-only">{{ $t('home') }}</span>
<YIcon iname="home" />
</BBreadcrumbItem>
<BBreadcrumbItem
v-for="({ name, text }, i) in breadcrumb"
:key="name"
:to="{ name }"
:active="i === breadcrumb.length - 1"
>
{{ text }}
</BBreadcrumbItem>
</BBreadcrumb>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
name: 'YBreadcrumb',
computed: {
...mapGetters(['breadcrumb']),
},
}
</script>
<style lang="scss" scoped>
.breadcrumb {
border: none;
background-color: transparent;
}
</style>

View file

@ -1,35 +1,49 @@
<template>
<b-card v-bind="$attrs" :no-body="collapsable ? true : $attrs['no-body']">
<BCard v-bind="$attrs" :no-body="collapsable ? true : $attrs['no-body']">
<template #header>
<div class="w-100 d-flex align-items-center flex-wrap custom-header">
<slot name="header">
<component :is="titleTag" class="custom-header-title">
<icon v-if="icon" :iname="icon" class="mr-2" />{{ title }}
</component>
<Component :is="titleTag" class="custom-header-title">
<YIcon v-if="icon" :iname="icon" class="mr-2" />{{ title }}
</Component>
<slot name="header-next" />
</slot>
<div v-if="hasButtons" class="mt-2 w-100 custom-header-buttons" :class="{ [`ml-${buttonUnbreak}-auto mt-${buttonUnbreak}-0 w-${buttonUnbreak}-auto`]: buttonUnbreak }">
<div
v-if="hasButtons"
class="mt-2 w-100 custom-header-buttons"
:class="{
[`ml-${buttonUnbreak}-auto mt-${buttonUnbreak}-0 w-${buttonUnbreak}-auto`]:
buttonUnbreak,
}"
>
<slot name="header-buttons" />
</div>
</div>
<b-button
v-if="collapsable" @click="visible = !visible"
size="sm" variant="outline-secondary"
class="align-self-center ml-auto" :class="{ 'not-collapsed': visible, 'collapsed': !visible, [`ml-${buttonUnbreak}-2`]: buttonUnbreak }"
<BButton
v-if="collapsable"
@click="visible = !visible"
size="sm"
variant="outline-secondary"
class="align-self-center ml-auto"
:class="{
'not-collapsed': visible,
collapsed: !visible,
[`ml-${buttonUnbreak}-2`]: buttonUnbreak,
}"
>
<icon iname="chevron-right" />
<YIcon iname="chevron-right" />
<span class="sr-only">{{ $t('words.collapse') }}</span>
</b-button>
</BButton>
</template>
<b-collapse v-if="collapsable" :visible="visible">
<slot v-if="('no-body' in $attrs)" name="default" />
<b-card-body v-else>
<BCollapse v-if="collapsable" :visible="visible">
<slot v-if="'no-body' in $attrs" name="default" />
<BCardBody v-else>
<slot name="default" />
</b-card-body>
</b-collapse>
</BCardBody>
</BCollapse>
<template v-else>
<slot name="default" />
</template>
@ -37,13 +51,12 @@
<template #footer v-if="'buttons' in $slots">
<slot name="buttons" />
</template>
</b-card>
</BCard>
</template>
<script>
export default {
name: 'Card',
name: 'YCard',
props: {
id: { type: String, default: 'ynh-form' },
@ -52,20 +65,20 @@ export default {
icon: { type: String, default: null },
collapsable: { type: Boolean, default: false },
collapsed: { type: Boolean, default: false },
buttonUnbreak: { type: String, default: 'md' }
buttonUnbreak: { type: String, default: 'md' },
},
data () {
data() {
return {
visible: !this.collapsed
visible: !this.collapsed,
}
},
computed: {
hasButtons () {
hasButtons() {
return 'header-buttons' in this.$slots
}
}
},
},
}
</script>
@ -79,7 +92,7 @@ export default {
}
.btn + .btn {
margin-left: .5rem;
margin-left: 0.5rem;
}
}
}
@ -90,7 +103,7 @@ export default {
align-items: center;
& > *:not(:first-child) {
margin-left: .5rem;
margin-left: 0.5rem;
}
}
.collapse:not(.show) + .card-footer {

View file

@ -1,14 +1,17 @@
<template>
<span :class="['icon fa fa-' + iname, variant ? 'variant ' + variant : '']" aria-hidden="true" />
<span
:class="['icon fa fa-' + iname, variant ? 'variant ' + variant : '']"
aria-hidden="true"
/>
</template>
<script>
export default {
name: 'Icon',
name: 'YIcon',
props: {
iname: { type: String, required: true },
variant: { type: String, default: null }
}
variant: { type: String, default: null },
},
}
</script>
@ -35,7 +38,7 @@ export default {
}
&.variant {
font-size: .8rem;
font-size: 0.8rem;
width: 1.35rem;
min-width: 1.35rem;
height: 1.35rem;

View file

@ -1,26 +1,20 @@
<template>
<b-list-group-item
class="yuno-list-group-item" :class="_class"
v-bind="$attrs"
>
<BListGroupItem class="yuno-list-group-item" :class="_class" v-bind="$attrs">
<div v-if="!noStatus" class="yuno-list-group-item-status">
<icon
v-if="_icon" :iname="_icon"
:class="['icon-' + variant]"
/>
<YIcon v-if="_icon" :iname="_icon" :class="['icon-' + variant]" />
</div>
<div class="yuno-list-group-item-content">
<slot name="default" />
</div>
</b-list-group-item>
</BListGroupItem>
</template>
<script>
import { DEFAULT_STATUS_ICON } from '@/helpers/yunohostArguments'
export default {
name: 'YunoListGroupItem',
name: 'YListGroupItem',
props: {
variant: { type: String, default: 'white' },
@ -28,28 +22,27 @@ export default {
noIcon: { type: Boolean, default: false },
noStatus: { type: Boolean, default: false },
size: { type: String, default: 'md' },
faded: { type: Boolean, default: false }
faded: { type: Boolean, default: false },
},
computed: {
_icon () {
_icon() {
return this.noIcon ? null : this.icon || DEFAULT_STATUS_ICON[this.variant]
},
_class () {
_class() {
const baseClass = 'yuno-list-group-item-'
return [
baseClass + this.size,
baseClass + this.variant,
{ [baseClass + 'faded']: this.faded }
baseClass + this.size,
baseClass + this.variant,
{ [baseClass + 'faded']: this.faded },
]
}
}
},
},
}
</script>
<style lang="scss" scoped>
.yuno-list-group-item {
display: flex;
padding: 0;
@ -70,7 +63,7 @@ export default {
&-#{$color} {
color: theme-color-level($color, 6);
[dark-theme="true"] & {
[dark-theme='true'] & {
color: theme-color-level($color, -6);
}
@ -96,7 +89,7 @@ export default {
&-xs {
.yuno-list-group-item-status {
width: .4rem;
width: 0.4rem;
.icon {
display: none;
@ -109,7 +102,7 @@ export default {
}
&-faded > * {
opacity: .5;
opacity: 0.5;
}
}
</style>

View file

@ -0,0 +1,134 @@
<template>
<div :class="['custom-spinner', spinner]" />
</template>
<script>
import { mapGetters } from 'vuex'
export default {
name: 'YSpinner',
computed: {
...mapGetters(['spinner']),
},
}
</script>
<style lang="scss" scoped>
.custom-spinner {
animation: 8s linear infinite;
background-repeat: no-repeat;
&.pacman {
height: 24px;
width: 24px;
background-image: url('../../assets/spinners/pacman_dark.gif');
animation-name: back-and-forth-pacman;
[dark-theme='true'] & {
background-image: url('../../assets/spinners/pacman_light.gif');
}
@keyframes back-and-forth-pacman {
0%,
100% {
transform: scale(1);
margin-left: 0;
}
49% {
transform: scale(1);
margin-left: calc(100% - 24px);
}
50% {
transform: scale(-1);
margin-left: calc(100% - 24px);
}
99% {
transform: scale(-1);
margin-left: 0;
}
}
}
&.magikarp {
height: 32px;
width: 32px;
background-image: url('../../assets/spinners/magikarp.gif');
animation-name: back-and-forth-magikarp;
@keyframes back-and-forth-magikarp {
0%,
100% {
transform: scale(1, 1);
margin-left: 0;
}
49% {
transform: scale(1, 1);
margin-left: calc(100% - 32px);
}
50% {
transform: scale(-1, 1);
margin-left: calc(100% - 32px);
}
99% {
transform: scale(-1, 1);
margin-left: 0;
}
}
}
&.nyancat {
height: 40px;
width: 100px;
background-image: url('../../assets/spinners/nyancat.gif');
animation-name: back-and-forth-nyancat;
@keyframes back-and-forth-nyancat {
0%,
100% {
transform: scale(1, 1);
margin-left: 0;
}
49% {
transform: scale(1, 1);
margin-left: calc(100% - 100px);
}
50% {
transform: scale(-1, 1);
margin-left: calc(100% - 100px);
}
99% {
transform: scale(-1, 1);
margin-left: 0;
}
}
}
&.spookycat {
height: 40px;
width: 65px;
background-image: url('../../assets/spinners/spookycat.gif');
animation-name: back-and-forth-spookycat;
@keyframes back-and-forth-spookycat {
0%,
100% {
transform: scale(1, 1);
margin-left: 0;
}
49% {
transform: scale(1, 1);
margin-left: calc(100% - 100px);
}
50% {
transform: scale(-1, 1);
margin-left: calc(100% - 100px);
}
99% {
transform: scale(-1, 1);
margin-left: 0;
}
}
}
}
</style>

View file

@ -1,18 +1,17 @@
<template>
<b-button
<BButton
:id="id"
:variant="type"
@click="$emit('action', $event)"
:disabled="!enabled"
class="d-block mb-3"
>
<icon :iname="icon_" class="mr-2" />
<YIcon :iname="icon_" class="mr-2" />
<span v-html="label" />
</b-button>
</BButton>
</template>
<script>
export default {
name: 'ButtonItem',
@ -21,20 +20,20 @@ export default {
id: { type: String, default: null },
type: { type: String, default: 'success' },
icon: { type: String, default: null },
enabled: { type: [Boolean, String], default: true }
enabled: { type: [Boolean, String], default: true },
},
computed: {
icon_ () {
icon_() {
const icons = {
success: 'thumbs-up',
info: 'info',
warning: 'exclamation',
danger: 'times'
danger: 'times',
}
return this.icon || icons[this.type]
}
}
},
},
}
</script>

View file

@ -1,5 +1,5 @@
<template>
<b-checkbox
<BFormCheckbox
v-model="checked"
v-on="$listeners"
:id="id"
@ -7,7 +7,7 @@
switch
>
{{ label || $t(labels[checked]) }}
</b-checkbox>
</BFormCheckbox>
</template>
<script>
@ -18,13 +18,13 @@ export default {
value: { type: Boolean, required: true },
id: { type: String, default: null },
label: { type: String, default: null },
labels: { type: Object, default: () => ({ true: 'yes', false: 'no' }) }
labels: { type: Object, default: () => ({ true: 'yes', false: 'no' }) },
},
data () {
data() {
return {
checked: this.value
checked: this.value,
}
}
},
}
</script>

View file

@ -10,7 +10,7 @@ export default {
props: {
id: { type: String, default: null },
label: { type: String, default: null }
}
label: { type: String, default: null },
},
}
</script>

View file

@ -1,14 +1,15 @@
<template>
<b-button-group class="w-100">
<b-button
<BButtonGroup class="w-100">
<BButton
v-if="!this.required && this.value.file !== null"
@click="clearFiles" variant="danger"
@click="clearFiles"
variant="danger"
>
<span class="sr-only">{{ $t('delete') }}</span>
<icon iname="trash" />
</b-button>
<YIcon iname="trash" />
</BButton>
<b-form-file
<BFormFile
:value="value.file"
ref="input-file"
:id="id"
@ -22,7 +23,7 @@
@blur="$parent.$emit('touch', name)"
@focusout.native="$parent.$emit('touch', name)"
/>
</b-button-group>
</BButtonGroup>
</template>
<script>
@ -39,42 +40,42 @@ export default {
accept: { type: String, default: null },
state: { type: Boolean, default: null },
required: { type: Boolean, default: false },
name: { type: String, default: null }
name: { type: String, default: null },
},
computed: {
_placeholder: function () {
return this.value.file === null ? this.placeholder : this.value.file.name
}
},
},
methods: {
onInput (file) {
onInput(file) {
const value = {
file,
content: '',
current: false,
removed: false
removed: false,
}
// Update the value with the new File and an empty content for now
this.$emit('input', value)
// Asynchronously load the File content and update the value again
getFileContent(file).then(content => {
getFileContent(file).then((content) => {
this.$emit('input', { ...value, content })
})
},
clearFiles () {
clearFiles() {
this.$refs['input-file'].reset()
this.$emit('input', {
file: null,
content: '',
current: false,
removed: true
removed: true,
})
}
}
},
},
}
</script>

View file

@ -1,5 +1,5 @@
<template>
<b-input
<BFormInput
:value="value"
:id="id"
:placeholder="placeholder"
@ -17,7 +17,6 @@
</template>
<script>
export default {
name: 'InputItem',
@ -34,13 +33,17 @@ export default {
trim: { type: Boolean, default: true },
autocomplete: { type: String, default: null },
pattern: { type: Object, default: null },
name: { type: String, default: null }
name: { type: String, default: null },
},
data () {
data() {
return {
autocomplete_: (this.autocomplete) ? this.autocomplete : (this.type === 'password') ? 'new-password' : null
autocomplete_: this.autocomplete
? this.autocomplete
: this.type === 'password'
? 'new-password'
: null,
}
}
},
}
</script>

View file

@ -1,5 +1,5 @@
<template>
<vue-showdown :markdown="label" flavor="github" />
<VueShowdown :markdown="label" flavor="github" />
</template>
<script>
@ -8,7 +8,7 @@ export default {
props: {
id: { type: String, default: null },
label: { type: String, default: null }
}
label: { type: String, default: null },
},
}
</script>

View file

@ -1,12 +1,18 @@
<template>
<b-alert class="d-flex flex-column flex-md-row align-items-center" :variant="type" show>
<icon :iname="icon_" class="mr-md-3 mb-md-0 mb-2" :variant="type" />
<BAlert
class="d-flex flex-column flex-md-row align-items-center"
:variant="type"
show
>
<YIcon :iname="icon_" class="mr-md-3 mb-md-0 mb-2" :variant="type" />
<vue-showdown
:markdown="label" flavor="github"
tag="span" class="markdown"
<VueShowdown
:markdown="label"
flavor="github"
tag="span"
class="markdown"
/>
</b-alert>
</BAlert>
</template>
<script>
@ -17,19 +23,19 @@ export default {
id: { type: String, default: null },
label: { type: String, default: null },
type: { type: String, default: null },
icon: { type: String, default: null }
icon: { type: String, default: null },
},
computed: {
icon_ () {
icon_() {
const icons = {
success: 'thumbs-up',
info: 'info',
warning: 'exclamation',
danger: 'times'
danger: 'times',
}
return this.icon || icons[this.type]
}
}
},
},
}
</script>

View file

@ -1,5 +1,5 @@
<template>
<b-select
<BFormSelect
:value="value"
:id="id"
:options="choices"
@ -18,7 +18,7 @@ export default {
id: { type: String, default: null },
choices: { type: [Array, Object], required: true },
required: { type: Boolean, default: false },
name: { type: String, default: null }
}
name: { type: String, default: null },
},
}
</script>

View file

@ -1,5 +1,5 @@
<template>
<b-form-tags
<BFormTags
v-model="tags"
:id="id"
:placeholder="placeholder"
@ -8,6 +8,7 @@
:limit="limit"
remove-on-delete
:state="state"
:options="options"
v-on="$listeners"
@blur="$parent.$emit('touch', name)"
/>
@ -17,9 +18,9 @@
export default {
name: 'TagsItem',
data () {
data() {
return {
tags: this.value
tags: this.value,
}
},
props: {
@ -29,8 +30,8 @@ export default {
limit: { type: Number, default: null },
required: { type: Boolean, default: false },
state: { type: Boolean, default: null },
name: { type: String, default: null }
}
name: { type: String, default: null },
options: { type: Array, default: null },
},
}
</script>

View file

@ -1,66 +1,93 @@
<template>
<div class="tags-selectize">
<b-form-tags
v-bind="$attrs" v-on="$listeners"
:value="value" :id="id"
size="lg" class="p-0 border-0" no-outer-focus
<BFormTags
v-bind="$attrs"
v-on="$listeners"
:value="value"
:id="id"
size="lg"
class="p-0 border-0"
no-outer-focus
>
<template #default="{ tags, disabled, addTag, removeTag }">
<ul v-if="!noTags && tags.length > 0" class="list-inline d-inline-block mb-2">
<li v-for="tag in tags" :key="id + '-' + tag" class="list-inline-item">
<b-form-tag
<ul
v-if="!noTags && tags.length > 0"
class="list-inline d-inline-block mb-2"
>
<li
v-for="tag in tags"
:key="id + '-' + tag"
class="list-inline-item"
>
<BFormTag
@remove="onRemoveTag({ option: tag, removeTag })"
:title="tag"
:disabled="disabled || disabledItems.includes(tag)"
class="border border-dark mb-2"
>
<icon v-if="tagIcon" :iname="tagIcon" /> {{ tag }}
</b-form-tag>
<YIcon v-if="tagIcon" :iname="tagIcon" /> {{ tag }}
</BFormTag>
</li>
</ul>
<b-dropdown
<BDropdown
ref="dropdown"
variant="outline-dark" block menu-class="w-100"
variant="outline-dark"
block
menu-class="w-100"
@keydown.native="onDropdownKeydown"
>
<template #button-content>
<icon iname="search-plus" /> {{ label }}
<YIcon iname="search-plus" /> {{ label }}
</template>
<b-dropdown-group class="search-group">
<b-dropdown-form @submit.stop.prevent="() => {}">
<b-form-group
<BDropdownGroup class="search-group">
<BDropdownForm @submit.stop.prevent="() => {}">
<BFormGroup
:label="$t('search.for', { items: itemsName })"
label-cols-md="auto" label-size="sm" :label-for="id + '-search-input'"
:invalid-feedback="$tc('search.not_found', 0, { items: $tc('items.' + itemsName, 0) })"
:state="searchState" :disabled="disabled"
label-cols-md="auto"
label-size="sm"
:label-for="id + '-search-input'"
:invalid-feedback="
$tc('search.not_found', 0, {
items: $tc('items.' + itemsName, 0),
})
"
:state="searchState"
:disabled="disabled"
class="mb-0"
>
<b-form-input
ref="search-input" v-model="search"
<BFormInput
ref="search-input"
v-model="search"
:id="id + '-search-input'"
type="search" size="sm" autocomplete="off"
type="search"
size="sm"
autocomplete="off"
/>
</b-form-group>
</b-dropdown-form>
<b-dropdown-divider />
</b-dropdown-group>
</BFormGroup>
</BDropdownForm>
<BDropdownDivider />
</BDropdownGroup>
<b-dropdown-item-button
<BDropdownItemButton
v-for="option in availableOptions"
:key="option"
@click="onAddTag({ option, addTag })"
>
{{ option }}
</b-dropdown-item-button>
<b-dropdown-text v-if="!criteria && availableOptions.length === 0">
<icon iname="exclamation-triangle" />
{{ $tc('items_verbose_items_left', 0, { items: $tc('items.' + itemsName, 0) }) }}
</b-dropdown-text>
</b-dropdown>
</BDropdownItemButton>
<BDropdownText v-if="!criteria && availableOptions.length === 0">
<YIcon iname="exclamation-triangle" />
{{
$tc('items_verbose_items_left', 0, {
items: $tc('items.' + itemsName, 0),
})
}}
</BDropdownText>
</BDropdown>
</template>
</b-form-tags>
</BFormTags>
</div>
</template>
@ -68,6 +95,8 @@
export default {
name: 'TagsSelectizeItem',
inheritAttrs: false,
props: {
value: { type: Array, required: true },
options: { type: Array, required: true },
@ -76,43 +105,45 @@ export default {
limit: { type: Number, default: null },
name: { type: String, default: null },
itemsName: { type: String, required: true },
disabledItems: { type: Array, default: () => ([]) },
disabledItems: { type: Array, default: () => [] },
// By default `addTag` and `removeTag` have to be executed manually by listening to 'tag-update'.
auto: { type: Boolean, default: false },
noTags: { type: Boolean, default: false },
label: { type: String, default: null },
tagIcon: { type: String, default: null }
tagIcon: { type: String, default: null },
},
data () {
data() {
return {
search: ''
search: '',
}
},
computed: {
criteria () {
criteria() {
return this.search.trim().toLowerCase()
},
availableOptions () {
availableOptions() {
const criteria = this.criteria
const options = this.options.filter(opt => {
return this.value.indexOf(opt) === -1 && !this.disabledItems.includes(opt)
const options = this.options.filter((opt) => {
return (
this.value.indexOf(opt) === -1 && !this.disabledItems.includes(opt)
)
})
if (criteria) {
return options.filter(opt => opt.toLowerCase().indexOf(criteria) > -1)
return options.filter((opt) => opt.toLowerCase().indexOf(criteria) > -1)
}
return options
},
searchState () {
searchState() {
return this.criteria && this.availableOptions.length === 0 ? false : null
}
},
},
methods: {
onAddTag ({ option, addTag }) {
onAddTag({ option, addTag }) {
this.$emit('tag-update', { action: 'add', option, applyMethod: addTag })
this.search = ''
if (this.auto) {
@ -120,14 +151,18 @@ export default {
}
},
onRemoveTag ({ option, removeTag }) {
this.$emit('tag-update', { action: 'remove', option, applyMethod: removeTag })
onRemoveTag({ option, removeTag }) {
this.$emit('tag-update', {
action: 'remove',
option,
applyMethod: removeTag,
})
if (this.auto) {
removeTag(option)
}
},
onDropdownKeydown (e) {
onDropdownKeydown(e) {
// Allow to start searching after dropdown opening
if (
!['Tab', 'Space'].includes(e.code) &&
@ -135,8 +170,8 @@ export default {
) {
this.$refs['search-input'].focus()
}
}
}
},
},
}
</script>
@ -147,7 +182,7 @@ export default {
padding-top: 0;
.search-group {
padding-top: .5rem;
padding-top: 0.5rem;
position: sticky;
top: 0;
background-color: $white;

View file

@ -1,5 +1,5 @@
<template>
<b-form-textarea
<BFormTextarea
:value="value"
:id="id"
:placeholder="placeholder"
@ -22,7 +22,7 @@ export default {
type: { type: String, default: 'text' },
required: { type: Boolean, default: false },
state: { type: Boolean, default: null },
name: { type: String, default: null }
}
name: { type: String, default: null },
},
}
</script>

View file

@ -1,20 +1,20 @@
<template>
<b-card>
<BCard>
<template #header>
<b-skeleton width="30%" height="36px" class="m-0" />
<BSkeleton width="30%" height="36px" class="m-0" />
</template>
<div v-for="count in itemCount" :key="count">
<template v-if="randint(0, 1)">
<b-skeleton width="100%" height="24px" />
<b-skeleton :width="randint(15, 60) + '%'" height="24px" />
<BSkeleton width="100%" height="24px" />
<BSkeleton :width="randint(15, 60) + '%'" height="24px" />
</template>
<b-skeleton v-else :width="randint(45, 100) + '%'" height="24px" />
<BSkeleton v-else :width="randint(45, 100) + '%'" height="24px" />
<b-skeleton :width="randint(20, 30) + '%'" height="38px" class="mt-3" />
<hr>
<BSkeleton :width="randint(20, 30) + '%'" height="38px" class="mt-3" />
<hr />
</div>
</b-card>
</BCard>
</template>
<script>
@ -24,9 +24,9 @@ export default {
name: 'CardButtonsSkeleton',
props: {
itemCount: { type: Number, default: 5 }
itemCount: { type: Number, default: 5 },
},
methods: { randint }
methods: { randint },
}
</script>

View file

@ -1,39 +1,46 @@
<template>
<b-card>
<BCard>
<template #header>
<b-skeleton width="30%" height="36px" class="m-0" />
<BSkeleton width="30%" height="36px" class="m-0" />
</template>
<template v-for="count in itemCount">
<b-row :key="count" :class="{ 'd-block': cols === null }">
<b-col v-bind="cols">
<BRow :key="count" :class="{ 'd-block': cols === null }">
<BCol v-bind="cols">
<div style="height: 38px" class="d-flex align-items-center">
<b-skeleton class="m-0" :width="randint(45, 100) + '%'" height="24px" />
<BSkeleton
class="m-0"
:width="randint(45, 100) + '%'"
height="24px"
/>
</div>
</b-col>
</BCol>
<b-col>
<div class="w100 d-flex justify-content-between" v-if="count % 2 === 0">
<b-skeleton width="100%" height="38px" />
<BCol>
<div
class="w100 d-flex justify-content-between"
v-if="count % 2 === 0"
>
<BSkeleton width="100%" height="38px" />
<b-skeleton width="38px" height="38px" class="ml-2" />
<BSkeleton width="38px" height="38px" class="ml-2" />
</div>
<b-skeleton v-else width="100%" height="38px" />
<BSkeleton v-else width="100%" height="38px" />
<b-skeleton :width="randint(15, 35) + '%'" height="19px" />
</b-col>
</b-row>
<BSkeleton :width="randint(15, 35) + '%'" height="19px" />
</BCol>
</BRow>
<hr :key="count + '-hr'">
<hr :key="count + '-hr'" />
</template>
<template #footer>
<div class="d-flex justify-content-end w-100">
<b-skeleton width="100px" height="38px" />
<BSkeleton width="100px" height="38px" />
</div>
</template>
</b-card>
</BCard>
</template>
<script>
@ -44,9 +51,14 @@ export default {
props: {
itemCount: { type: Number, default: 5 },
cols: { type: [Object, null], default () { return { md: 4, lg: 2 } } }
cols: {
type: [Object, null],
default() {
return { md: 4, lg: 2 }
},
},
},
methods: { randint }
methods: { randint },
}
</script>

View file

@ -1,18 +1,18 @@
<template>
<b-card>
<BCard>
<template #header>
<b-skeleton width="30%" height="36px" class="m-0" />
<BSkeleton width="30%" height="36px" class="m-0" />
</template>
<b-row v-for="i in itemCount" :key="i" no-gutters>
<b-col cols="5" md="3" xl="3">
<b-skeleton :width="randint(45, 95) + '%'" height="19px" />
</b-col>
<b-col>
<b-skeleton :width="randint(10, 60) + '%'" height="19px" />
</b-col>
</b-row>
</b-card>
<BRow v-for="i in itemCount" :key="i" no-gutters>
<BCol cols="5" md="3" xl="3">
<BSkeleton :width="randint(45, 95) + '%'" height="19px" />
</BCol>
<BCol>
<BSkeleton :width="randint(10, 60) + '%'" height="19px" />
</BCol>
</BRow>
</BCard>
</template>
<script>
@ -22,9 +22,9 @@ export default {
name: 'CardInfoSkeleton',
props: {
itemCount: { type: Number, default: 5 }
itemCount: { type: Number, default: 5 },
},
methods: { randint }
methods: { randint },
}
</script>

View file

@ -1,18 +1,22 @@
<template>
<b-card no-body>
<BCard no-body>
<template #header>
<b-skeleton width="30%" height="36px" class="m-0" />
<BSkeleton width="30%" height="36px" class="m-0" />
</template>
<b-list-group flush>
<b-list-group-item v-for="count in itemCount" :key="count" class="d-flex">
<div style="width: 20%;">
<b-skeleton :width="randint(50, 100) + '%'" height="24px" class="mr-3" />
<BListGroup flush>
<BListGroupItem v-for="count in itemCount" :key="count" class="d-flex">
<div style="width: 20%">
<BSkeleton
:width="randint(50, 100) + '%'"
height="24px"
class="mr-3"
/>
</div>
<b-skeleton :width="randint(30, 80) + '%'" height="24px" class="m-0" />
</b-list-group-item>
</b-list-group>
</b-card>
<BSkeleton :width="randint(30, 80) + '%'" height="24px" class="m-0" />
</BListGroupItem>
</BListGroup>
</BCard>
</template>
<script>
@ -22,9 +26,9 @@ export default {
name: 'CardListSkeleton',
props: {
itemCount: { type: Number, default: 5 }
itemCount: { type: Number, default: 5 },
},
methods: { randint }
methods: { randint },
}
</script>

View file

@ -1,10 +1,10 @@
<template>
<b-list-group>
<b-list-group-item v-for="count in itemCount" :key="count">
<b-skeleton :width="randint(15, 25) + '%'" height="24px" class="mb-2" />
<b-skeleton :width="randint(25, 50) + '%'" height="24px" class="m-0" />
</b-list-group-item>
</b-list-group>
<BListGroup>
<BListGroupItem v-for="count in itemCount" :key="count">
<BSkeleton :width="randint(15, 25) + '%'" height="24px" class="mb-2" />
<BSkeleton :width="randint(25, 50) + '%'" height="24px" class="m-0" />
</BListGroupItem>
</BListGroup>
</template>
<script>
@ -14,9 +14,9 @@ export default {
name: 'ListGroupSkeleton',
props: {
itemCount: { type: Number, default: 5 }
itemCount: { type: Number, default: 5 },
},
methods: { randint }
methods: { randint },
}
</script>

View file

@ -7,7 +7,7 @@
* @param {Number} delay - delay after which the promise is rejected
* @return {Promise}
*/
export function timeout (promise, delay) {
export function timeout(promise, delay) {
return new Promise((resolve, reject) => {
// FIXME reject(new Error('api_not_responding')) for post-install
setTimeout(() => reject, delay)
@ -15,18 +15,20 @@ export function timeout (promise, delay) {
})
}
/**
* Check if passed value is an object literal.
*
* @param {*} value - Anything.
* @return {Boolean}
*/
export function isObjectLiteral (value) {
return value !== null && value !== undefined && Object.is(value.constructor, Object)
export function isObjectLiteral(value) {
return (
value !== null &&
value !== undefined &&
Object.is(value.constructor, Object)
)
}
/**
* Check if value is "empty" (`null`, `undefined`, `''`, `[]`, '{}').
* Note: `0` is not considered "empty" in that helper.
@ -34,12 +36,11 @@ export function isObjectLiteral (value) {
* @param {*} value - Anything.
* @return {Boolean}
*/
export function isEmptyValue (value) {
export function isEmptyValue(value) {
if (typeof value === 'number') return false
return !value || value.length === 0 || Object.keys(value).length === 0
}
/**
* Returns an flattened object literal, with all keys at first level and removing nested ones.
*
@ -47,8 +48,8 @@ export function isEmptyValue (value) {
* @param {Object} [flattened={}] - An object literal to add passed obj keys/values.
* @return {Object}
*/
export function flattenObjectLiteral (obj, flattened = {}) {
function flatten (objLit) {
export function flattenObjectLiteral(obj, flattened = {}) {
function flatten(objLit) {
for (const key in objLit) {
const value = objLit[key]
if (isObjectLiteral(value)) {
@ -62,7 +63,6 @@ export function flattenObjectLiteral (obj, flattened = {}) {
return flattened
}
/**
* Returns an new Object filtered with passed filter function.
* Each entry `[key, value]` will be forwarded to the `filter` function.
@ -71,11 +71,12 @@ export function flattenObjectLiteral (obj, flattened = {}) {
* @param {Function} filter - the filter function to call for each entry.
* @return {Object}
*/
export function filterObject (obj, filter) {
return Object.fromEntries(Object.entries(obj).filter((...args) => filter(...args)))
export function filterObject(obj, filter) {
return Object.fromEntries(
Object.entries(obj).filter((...args) => filter(...args)),
)
}
/**
* Returns an new array containing items that are in first array but not in the other.
*
@ -83,18 +84,17 @@ export function filterObject (obj, filter) {
* @param {Array} [arr2=[]]
* @return {Array}
*/
export function arrayDiff (arr1 = [], arr2 = []) {
return arr1.filter(item => !arr2.includes(item))
export function arrayDiff(arr1 = [], arr2 = []) {
return arr1.filter((item) => !arr2.includes(item))
}
/**
* Returns a new string with escaped HTML (`&<>"'` replaced by entities).
*
* @param {String} unsafe
* @return {String}
*/
export function escapeHtml (unsafe) {
export function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
@ -110,11 +110,10 @@ export function escapeHtml (unsafe) {
* @param {Number} max
* @return {Number}
*/
export function randint (min, max) {
export function randint(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
}
/**
* Returns a File content.
*
@ -123,7 +122,7 @@ export function randint (min, max) {
* @param {Boolean} [extraParams.base64] - returns a base64 representation of the file.
* @return {Promise<String>}
*/
export function getFileContent (file, { base64 = false } = {}) {
export function getFileContent(file, { base64 = false } = {}) {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.onerror = reject

View file

@ -2,7 +2,7 @@
* A Node that can have a parent and children.
*/
export class Node {
constructor (data) {
constructor(data) {
this.data = data
this.depth = 0
this.height = 0
@ -22,7 +22,7 @@ export class Node {
* @param {function} callback
* @return {Object}
*/
eachBefore (callback) {
eachBefore(callback) {
const nodes = []
let index = -1
let node = this
@ -49,7 +49,7 @@ export class Node {
* @param {function} callback
* @return {Object}
*/
eachAfter (callback) {
eachAfter(callback) {
const nodes = []
const next = []
let node = this
@ -81,7 +81,7 @@ export class Node {
* @param {String} [args.parentIdKey='name'] - the key name where we can find the parent identity.
* @return {Node}
*/
filter (callback) {
filter(callback) {
// Duplicates this tree and iter on nodes from leaves to root (post-order traversal)
return hierarchy(this).eachAfter((node, i) => {
// Since we create a new hierarchy from another, nodes's `data` contains the
@ -90,7 +90,7 @@ export class Node {
if (node.children) {
// Removed flagged children
node.children = node.children.filter(child => !child.remove)
node.children = node.children.filter((child) => !child.remove)
if (!node.children.length) delete node.children
}
@ -104,7 +104,6 @@ export class Node {
}
}
/**
* Generates a new hierarchy from the specified tabular `dataset`.
* The specified `dataset` must be an array of objects that contains at least a
@ -117,13 +116,16 @@ export class Node {
* @param {String} [args.parentIdKey='name'] - the key name where we can find the parent identity.
* @return {Node}
*/
export function stratify (dataset, { idKey = 'name', parentIdKey = 'parent' } = {}) {
export function stratify(
dataset,
{ idKey = 'name', parentIdKey = 'parent' } = {},
) {
const root = new Node(null, true)
root.children = []
const nodesMap = new Map()
// Creates all nodes that will be arranged in a hierarchy
const nodes = dataset.map(d => {
const nodes = dataset.map((d) => {
const node = new Node(d)
node.id = d[idKey]
nodesMap.set(node.id, node)
@ -148,7 +150,7 @@ export function stratify (dataset, { idKey = 'name', parentIdKey = 'parent' } =
}
})
root.eachBefore(node => {
root.eachBefore((node) => {
// Compute node depth
if (node.parent) {
node.depth = node.parent.depth + 1
@ -160,7 +162,6 @@ export function stratify (dataset, { idKey = 'name', parentIdKey = 'parent' } =
return root
}
/**
* Constructs a root node from the specified hierarchical `data`.
* The specified `data` must be an object representing the root node and its children.
@ -170,14 +171,14 @@ export function stratify (dataset, { idKey = 'name', parentIdKey = 'parent' } =
* @param {Node|Object} data - object representing a root node (a simple { id, children } object or a `Node`)
* @return {Node}
*/
export function hierarchy (data) {
export function hierarchy(data) {
const root = new Node(data)
const nodes = []
let node = root
while (node) {
if (node.data.children) {
node.children = node.data.children.map(child_ => {
node.children = node.data.children.map((child_) => {
const child = new Node(child_)
child.id = child_.id
child.parent = node === root ? null : node
@ -193,14 +194,13 @@ export function hierarchy (data) {
return root
}
/**
* Compute the node height by iterating on parents
* Code taken from d3.js https://github.com/d3/d3-hierarchy/blob/main/src/hierarchy/index.js#L62.
*
* @param {Node} node
*/
function computeNodeHeight (node) {
function computeNodeHeight(node) {
let height = 0
do {
node.height = height

View file

@ -3,17 +3,13 @@ import format from 'date-fns/format'
import { dateFnsLocale as locale } from '@/i18n/helpers'
export function distanceToNow (date, addSuffix = true, isTimestamp = false) {
return formatDistanceToNow(
new Date(isTimestamp ? date * 1000 : date),
{ addSuffix, locale }
)
export function distanceToNow(date, addSuffix = true, isTimestamp = false) {
return formatDistanceToNow(new Date(isTimestamp ? date * 1000 : date), {
addSuffix,
locale,
})
}
export function readableDate (date, isTimestamp = false) {
return format(
new Date(isTimestamp ? date * 1000 : date),
'PPPpp',
{ locale }
)
export function readableDate(date, isTimestamp = false) {
return format(new Date(isTimestamp ? date * 1000 : date), 'PPPpp', { locale })
}

View file

@ -1,13 +1,15 @@
export function humanSize (bytes) {
export function humanSize(bytes) {
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']
if (bytes === 0) return 'n/a'
const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)))
return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i]
}
export function humanPermissionName (text) {
return text.split('.')[1].replace('_', ' ').replace(/\w\S*/g, part => {
return part.charAt(0).toUpperCase() + part.substr(1).toLowerCase()
})
export function humanPermissionName(text) {
return text
.split('.')[1]
.replace('_', ' ')
.replace(/\w\S*/g, (part) => {
return part.charAt(0).toUpperCase() + part.substr(1).toLowerCase()
})
}

View file

@ -1,52 +1,70 @@
import { helpers } from 'vuelidate/lib/validators'
// Unicode ranges are taken from https://stackoverflow.com/a/37668315
const nonAsciiWordCharacters = '\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC'
const nonAsciiWordCharacters =
'\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC'
const alphalownumdot_ = helpers.regex('alphalownumdot_', /^[a-z0-9_.]+$/)
const domain = helpers.regex('domain', new RegExp(`^(?:[\\da-z${nonAsciiWordCharacters}]+(?:-*[\\da-z${nonAsciiWordCharacters}]+)*\\.)+(?:(?:xn--)?[\\da-z${nonAsciiWordCharacters}]{2,})$`))
const domain = helpers.regex(
'domain',
new RegExp(
`^(?:[\\da-z${nonAsciiWordCharacters}]+(?:-*[\\da-z${nonAsciiWordCharacters}]+)*\\.)+(?:(?:xn--)?[\\da-z${nonAsciiWordCharacters}]{2,})$`,
),
)
const dynDomain = helpers.regex('dynDomain', new RegExp(`^(?:xn--)?[\\da-z-${nonAsciiWordCharacters}]+$`))
const dynDomain = helpers.regex(
'dynDomain',
new RegExp(`^(?:xn--)?[\\da-z-${nonAsciiWordCharacters}]+$`),
)
const emailLocalPart = helpers.regex('emailLocalPart', /^[\w.-]+$/)
const emailLocalPart = helpers.regex('emailLocalPart', /^[\w+.-]+$/)
const emailForwardLocalPart = helpers.regex('emailForwardLocalPart', /^[\w+.-]+$/)
const emailForwardLocalPart = helpers.regex(
'emailForwardLocalPart',
/^[\w+.-]+$/,
)
const email = value => helpers.withParams(
{ type: 'email', value },
value => {
const email = (value) =>
helpers.withParams({ type: 'email', value }, (value) => {
const [localPart, domainPart] = value.split('@')
if (!domainPart) return !helpers.req(value) || false
return !helpers.req(value) || (emailLocalPart(localPart) && domain(domainPart))
}
)(value)
return (
!helpers.req(value) || (emailLocalPart(localPart) && domain(domainPart))
)
})(value)
// Same as email but with `+` allowed.
const emailForward = value => helpers.withParams(
{ type: 'emailForward', value },
value => {
const emailForward = (value) =>
helpers.withParams({ type: 'emailForward', value }, (value) => {
const [localPart, domainPart] = value.split('@')
if (!domainPart) return !helpers.req(value) || false
return !helpers.req(value) || (emailForwardLocalPart(localPart) && domain(domainPart))
}
)(value)
return (
!helpers.req(value) ||
(emailForwardLocalPart(localPart) && domain(domainPart))
)
})(value)
const appRepoUrl = helpers.regex('appRepoUrl', /^https:\/\/[a-zA-Z0-9-_.]+\/[a-zA-Z0-9-_./~]+\/[a-zA-Z0-9-_.]+_ynh(\/?(-\/)?tree\/[a-zA-Z0-9-_.]+)?(\.git)?\/?$/)
const appRepoUrl = helpers.regex(
'appRepoUrl',
/^https:\/\/[a-zA-Z0-9-_.]+\/[a-zA-Z0-9-_./~]+\/[a-zA-Z0-9-_.]+_ynh(\/?(-\/)?tree\/[a-zA-Z0-9-_.]+)?(\.git)?\/?$/,
)
const includes = items => item => helpers.withParams(
{ type: 'includes', value: item },
item => !helpers.req(item) || (items ? items.includes(item) : false)
)(item)
const includes = (items) => (item) =>
helpers.withParams(
{ type: 'includes', value: item },
(item) => !helpers.req(item) || (items ? items.includes(item) : false),
)(item)
const name = helpers.regex('name', new RegExp(`^(?:[A-Za-z${nonAsciiWordCharacters}]{1,30}[ ,.'-]{0,3})+$`))
const name = helpers.regex(
'name',
new RegExp(`^(?:[A-Za-z${nonAsciiWordCharacters}]{1,30}[ ,.'-]{0,3})+$`),
)
const unique = items => item => helpers.withParams(
{ type: 'unique', arg: items, value: item },
item => items ? !helpers.req(item) || !items.includes(item) : true
)(item)
const unique = (items) => (item) =>
helpers.withParams({ type: 'unique', arg: items, value: item }, (item) =>
items ? !helpers.req(item) || !items.includes(item) : true,
)(item)
export {
alphalownumdot_,
@ -59,5 +77,5 @@ export {
appRepoUrl,
includes,
name,
unique
unique,
}

View file

@ -8,5 +8,5 @@ export {
minLength,
minValue,
required,
sameAs
sameAs,
} from 'vuelidate/lib/validators'

View file

@ -6,16 +6,15 @@ import {
isObjectLiteral,
isEmptyValue,
flattenObjectLiteral,
getFileContent
getFileContent,
} from '@/helpers/commons'
const NO_VALUE_FIELDS = [
'ReadOnlyField',
'ReadOnlyAlertItem',
'MarkdownItem',
'DisplayTextItem',
'ButtonItem'
'ButtonItem',
]
export const DEFAULT_STATUS_ICON = {
@ -24,7 +23,7 @@ export const DEFAULT_STATUS_ICON = {
error: 'times',
info: 'info',
success: 'check',
warning: 'warning'
warning: 'warning',
}
/**
@ -34,20 +33,19 @@ export const DEFAULT_STATUS_ICON = {
* @param {(Object|String|undefined)} field - A field value containing a translation object or string
* @return {String}
*/
export function formatI18nField (field) {
export function formatI18nField(field) {
if (typeof field === 'string') return field
const { locale, fallbackLocale } = store.state
return field ? field[locale] || field[fallbackLocale] || field.en : ''
}
/**
* Returns a string size declaration to a M value.
*
* @param {String} sizeStr - A size declared like '500M' or '56k'
* @return {Number}
*/
export function sizeToM (sizeStr) {
export function sizeToM(sizeStr) {
const unit = sizeStr.slice(-1)
const value = sizeStr.slice(0, -1)
if (unit === 'M') return parseInt(value)
@ -57,20 +55,18 @@ export function sizeToM (sizeStr) {
if (unit === 'T') return Math.ceil(value * 1024 * 1024)
}
/**
* Returns a formatted address element to be used by AdressInputSelect component.
*
* @param {String} address - A string representing an adress (subdomain or email)
* @return {Object} - `{ localPart, separator, domain }`.
*/
export function adressToFormValue (address) {
export function adressToFormValue(address) {
const separator = address.includes('@') ? '@' : '.'
const [localPart, domain] = address.split(separator)
return { localPart, separator, domain }
}
/**
* Evaluate config panel string expression that can contain regular expressions.
* Expression are evaluated with the config panel form as context.
@ -79,16 +75,19 @@ export function adressToFormValue (address) {
* @param {Object} forms - A nested form used in config panels.
* @return {Boolean} - expression evaluation result.
*/
export function evaluateExpression (expression, forms) {
export function evaluateExpression(expression, form, nested = true) {
if (!expression) return true
if (expression === '"false"') return false
const context = Object.values(forms).reduce((ctx, args) => {
Object.entries(args).forEach(([id, value]) => {
ctx[id] = isObjectLiteral(value) && 'file' in value ? value.content : value
})
return ctx
}, {})
const context = nested
? Object.values(form).reduce((merged, next) => ({ ...merged, ...next }))
: form
for (const key in context) {
if (isObjectLiteral(context[key]) && 'file' in context[key]) {
context[key] = context[key].content
}
}
// Allow to use match(var,regexp) function
const matchRe = /match(\s*(\w+)\s*,\s*"([^"]+)"\s*)/g
@ -107,13 +106,12 @@ export function evaluateExpression (expression, forms) {
}
// Adds a property to an Object that will dynamically returns a expression evaluation result.
function addEvaluationGetter (prop, obj, expr, ctx) {
function addEvaluationGetter(prop, obj, expr, ctx, nested) {
Object.defineProperty(obj, prop, {
get: () => evaluateExpression(expr, ctx)
get: () => evaluateExpression(expr, ctx, nested),
})
}
/**
* Format app install, actions and config panel argument into a data structure that
* will be automaticly transformed into a component on screen.
@ -121,8 +119,13 @@ function addEvaluationGetter (prop, obj, expr, ctx) {
* @param {Object} arg - a yunohost arg options written by a packager.
* @return {Object} an formated argument containing formItem props, validation and base value.
*/
export function formatYunoHostArgument (arg) {
let value = (arg.value !== undefined) ? arg.value : (arg.current_value !== undefined) ? arg.current_value : null
export function formatYunoHostArgument(arg) {
let value =
arg.value !== undefined
? arg.value
: arg.current_value !== undefined
? arg.current_value
: null
const validation = {}
const error = { message: null }
arg.ask = formatI18nField(arg.ask)
@ -132,8 +135,8 @@ export function formatYunoHostArgument (arg) {
props: {
label: arg.ask,
component: undefined,
props: {}
}
props: {},
},
}
const defaultProps = ['id', 'placeholder:example']
@ -141,12 +144,12 @@ export function formatYunoHostArgument (arg) {
{
types: ['string', 'path'],
name: 'InputItem',
props: defaultProps.concat(['autocomplete', 'trim', 'choices'])
props: defaultProps.concat(['autocomplete', 'trim', 'choices']),
},
{
types: ['email', 'url', 'date', 'time', 'color'],
name: 'InputItem',
props: defaultProps.concat(['type', 'trim'])
props: defaultProps.concat(['type', 'trim']),
},
{
types: ['password'],
@ -158,7 +161,7 @@ export function formatYunoHostArgument (arg) {
}
arg.example = '••••••••••••'
validation.passwordLenght = validators.minLength(8)
}
},
},
{
types: ['number', 'range'],
@ -172,7 +175,7 @@ export function formatYunoHostArgument (arg) {
validation.maxValue = validators.maxValue(parseInt(arg.max))
}
validation.numValue = validators.integer
}
},
},
{
types: ['select', 'user', 'domain', 'app', 'group'],
@ -180,9 +183,12 @@ export function formatYunoHostArgument (arg) {
props: ['id', 'choices'],
callback: function () {
if (arg.type !== 'select') {
field.props.link = { name: arg.type + '-list', text: i18n.t(`manage_${arg.type}s`) }
field.props.link = {
name: arg.type + '-list',
text: i18n.t(`manage_${arg.type}s`),
}
}
}
},
},
{
types: ['file'],
@ -194,26 +200,31 @@ export function formatYunoHostArgument (arg) {
file: value ? new File([''], value) : null,
content: '',
current: !!value,
removed: false
removed: false,
}
}
},
},
{
types: ['text'],
name: 'TextAreaItem',
props: defaultProps
props: defaultProps,
},
{
types: ['tags'],
name: 'TagsItem',
props: defaultProps.concat(['limit', 'placeholder', 'options:choices', 'tagIcon:icon']),
props: defaultProps.concat([
'limit',
'placeholder',
'options:choices',
'tagIcon:icon',
]),
callback: function () {
if (arg.choices && arg.choices.length) {
this.name = 'TagsSelectizeItem'
Object.assign(field.props.props, {
auto: true,
itemsName: '',
label: arg.placeholder
label: arg.placeholder,
})
}
if (typeof value === 'string') {
@ -221,7 +232,7 @@ export function formatYunoHostArgument (arg) {
} else if (!value) {
value = []
}
}
},
},
{
types: ['boolean'],
@ -229,40 +240,44 @@ export function formatYunoHostArgument (arg) {
props: ['id', 'choices'],
callback: function () {
if (value !== null && value !== undefined) {
value = ['1', 'yes', 'y', 'true'].includes(String(value).toLowerCase())
value = ['1', 'yes', 'y', 'true'].includes(
String(value).toLowerCase(),
)
} else if (arg.default !== null && arg.default !== undefined) {
value = ['1', 'yes', 'y', 'true'].includes(String(arg.default).toLowerCase())
value = ['1', 'yes', 'y', 'true'].includes(
String(arg.default).toLowerCase(),
)
}
}
},
},
{
types: ['alert'],
name: 'ReadOnlyAlertItem',
props: ['type:style', 'label:ask', 'icon'],
renderSelf: true
renderSelf: true,
},
{
types: ['markdown'],
name: 'MarkdownItem',
props: ['label:ask'],
renderSelf: true
renderSelf: true,
},
{
types: ['display_text'],
name: 'DisplayTextItem',
props: ['label:ask'],
renderSelf: true
renderSelf: true,
},
{
types: ['button'],
name: 'ButtonItem',
props: ['type:style', 'label:ask', 'icon', 'enabled'],
renderSelf: true
}
renderSelf: true,
},
]
// Default type management if no one is filled
if (arg.choices && arg.choices.length) {
if (arg.type !== 'tags' && arg.choices && arg.choices.length) {
arg.type = 'select'
}
if (arg.type === undefined) {
@ -270,7 +285,9 @@ export function formatYunoHostArgument (arg) {
}
// Search the component bind to the type
const component = components.find(element => element.types.includes(arg.type))
const component = components.find((element) =>
element.types.includes(arg.type),
)
if (component === undefined) throw new TypeError('Unknown type: ' + arg.type)
// Callback use for specific behaviour
@ -287,11 +304,18 @@ export function formatYunoHostArgument (arg) {
}
// Required (no need for checkbox its value can't be null)
if (!component.renderSelf && arg.type !== 'boolean' && arg.optional !== true) {
if (
!component.renderSelf &&
arg.type !== 'boolean' &&
arg.optional !== true
) {
validation.required = validators.required
}
if (arg.pattern && arg.type !== 'tags') {
validation.pattern = validators.helpers.regex(formatI18nField(arg.pattern.error), new RegExp(arg.pattern.regexp))
validation.pattern = validators.helpers.regex(
formatI18nField(arg.pattern.error),
new RegExp(arg.pattern.regexp),
)
}
if (!component.renderSelf && !arg.readonly) {
@ -318,7 +342,10 @@ export function formatYunoHostArgument (arg) {
// Help message
if (arg.helpLink) {
field.props.link = { href: arg.helpLink.href, text: i18n.t(arg.helpLink.text) }
field.props.link = {
href: arg.helpLink.href,
text: i18n.t(arg.helpLink.text),
}
}
if (component.renderSelf) {
@ -331,11 +358,10 @@ export function formatYunoHostArgument (arg) {
field,
// Return null instead of empty object if there's no validation
validation: Object.keys(validation).length === 0 ? null : validation,
error
error,
}
}
/**
* Format app install, actions and config panel manifest args into a form that can be used
* as v-model values, fields that can be passed to a FormField component and validations.
@ -344,7 +370,7 @@ export function formatYunoHostArgument (arg) {
* @param {Object|null} forms - nested form used as the expression evualuations context.
* @return {Object} an object containing all parsed values to be used in vue views.
*/
export function formatYunoHostArguments (args, forms) {
export function formatYunoHostArguments(args, forms) {
const form = {}
const fields = {}
const validations = {}
@ -357,29 +383,45 @@ export function formatYunoHostArguments (args, forms) {
if (validation) validations[arg.id] = validation
errors[arg.id] = error
if ('visible' in arg && ![false, '"false"'].includes(arg.visible)) {
addEvaluationGetter('visible', field, arg.visible, forms)
if ('visible' in arg && typeof arg.visible === 'string') {
addEvaluationGetter(
'visible',
field,
arg.visible,
forms || form,
forms !== undefined,
)
}
if ('enabled' in arg) {
addEvaluationGetter('enabled', field.props, arg.enabled, forms)
if ('enabled' in arg && typeof arg.enabled === 'string') {
addEvaluationGetter(
'enabled',
field.props,
arg.enabled,
forms || form,
forms !== undefined,
)
}
}
return { form, fields, validations, errors }
}
export function formatYunoHostConfigPanels (data) {
export function formatYunoHostConfigPanels(data) {
const result = {
panels: [],
forms: {},
validations: {},
errors: {}
errors: {},
}
for (const { id: panelId, name, help, sections } of data.panels) {
const panel = { id: panelId, sections: [], serverError: '', hasApplyButton: false }
const panel = {
id: panelId,
sections: [],
serverError: '',
hasApplyButton: false,
}
result.forms[panelId] = {}
result.validations[panelId] = {}
result.errors[panelId] = {}
@ -391,7 +433,7 @@ export function formatYunoHostConfigPanels (data) {
const section = {
id: _section.id,
isActionSection: _section.is_action_section,
visible: [undefined, true, '"true"'].includes(_section.visible)
visible: [undefined, true, '"true"'].includes(_section.visible),
}
if (_section.help) section.help = formatI18nField(_section.help)
if (_section.name) section.name = formatI18nField(_section.name)
@ -399,12 +441,10 @@ export function formatYunoHostConfigPanels (data) {
addEvaluationGetter('visible', section, _section.visible, result.forms)
}
const {
form,
fields,
validations,
errors
} = formatYunoHostArguments(_section.options, result.forms)
const { form, fields, validations, errors } = formatYunoHostArguments(
_section.options,
result.forms,
)
// Merge all sections forms to the panel to get a unique form
Object.assign(result.forms[panelId], form)
Object.assign(result.validations[panelId], validations)
@ -412,7 +452,12 @@ export function formatYunoHostConfigPanels (data) {
section.fields = fields
panel.sections.push(section)
if (!section.isActionSection && Object.values(fields).some((field) => !NO_VALUE_FIELDS.includes(field.is))) {
if (
!section.isActionSection &&
Object.values(fields).some(
(field) => !NO_VALUE_FIELDS.includes(field.is),
)
) {
panel.hasApplyButton = true
}
}
@ -423,7 +468,6 @@ export function formatYunoHostConfigPanels (data) {
return result
}
/**
* Parse a front-end value to its API equivalent. This function returns a Promise or an
* Object `{ key: Promise }` if `key` is supplied. When parsing a form, all those
@ -436,11 +480,11 @@ export function formatYunoHostConfigPanels (data) {
* @param {*} value
* @return {*}
*/
export function formatFormDataValue (value, key = null) {
export function formatFormDataValue(value, key = null) {
if (Array.isArray(value)) {
return Promise.all(
value.map(value_ => formatFormDataValue(value_))
).then(resolvedValues => ({ [key]: resolvedValues }))
return Promise.all(value.map((value_) => formatFormDataValue(value_))).then(
(resolvedValues) => ({ [key]: resolvedValues }),
)
}
let result = value
@ -451,10 +495,10 @@ export function formatFormDataValue (value, key = null) {
// File has not changed (will not be sent)
else if (value.current || value.file === null) result = null
else {
return getFileContent(value.file, { base64: true }).then(content => {
return getFileContent(value.file, { base64: true }).then((content) => {
return {
[key]: content.replace(/data:[^;]*;base64,/, ''),
[key + '[name]']: value.file.name
[key + '[name]']: value.file.name,
}
})
}
@ -466,7 +510,6 @@ export function formatFormDataValue (value, key = null) {
return Promise.resolve(key ? { [key]: result } : result)
}
/**
* Convinient helper to properly parse a front-end form to its API equivalent.
* This parse each values asynchronously, allow to inject keys into the final form and
@ -475,17 +518,16 @@ export function formatFormDataValue (value, key = null) {
* @param {Object} formData
* @return {Object}
*/
function formatFormDataValues (formData) {
function formatFormDataValues(formData) {
const promisedValues = Object.entries(formData).map(([key, value]) => {
return formatFormDataValue(value, key)
})
return Promise.all(promisedValues).then(resolvedValues => {
return Promise.all(promisedValues).then((resolvedValues) => {
return resolvedValues.reduce((form, obj) => ({ ...form, ...obj }), {})
})
}
/**
* Format a form produced by a vue view to be sent to the server.
*
@ -496,13 +538,18 @@ function formatFormDataValues (formData) {
* @param {Boolean} [extraParams.removeEmpty=true] - Removes "empty" values from the object.
* @return {Object} the parsed data to be sent to the server, with extracted values if specified.
*/
export async function formatFormData (
export async function formatFormData(
formData,
{ extract = null, flatten = false, removeEmpty = true, removeNull = false } = {}
{
extract = null,
flatten = false,
removeEmpty = true,
removeNull = false,
} = {},
) {
const output = {
data: {},
extracted: {}
extracted: {},
}
const values = await formatFormDataValues(formData)

View file

@ -11,7 +11,7 @@ const loadedLanguages = []
*
* @return {string[]}
*/
function getDefaultLocales () {
function getDefaultLocales() {
const locale = store.getters.locale
const fallbackLocale = store.getters.fallbackLocale
if (locale && fallbackLocale) return [locale, fallbackLocale]
@ -34,7 +34,7 @@ function getDefaultLocales () {
return defaultLocales
}
function updateDocumentLocale (locale) {
function updateDocumentLocale(locale) {
document.documentElement.lang = locale
// FIXME can't currently change document direction easily since bootstrap still doesn't handle rtl.
// document.dir = locale === 'ar' ? 'rtl' : 'ltr'
@ -45,11 +45,11 @@ function updateDocumentLocale (locale) {
*
* @return {Promise<string>} Promise that resolve the given locale string
*/
function loadLocaleMessages (locale) {
function loadLocaleMessages(locale) {
if (loadedLanguages.includes(locale)) {
return Promise.resolve(locale)
}
return import(`@/i18n/locales/${locale}.json`).then(messages => {
return import(`@/i18n/locales/${locale}.json`).then((messages) => {
i18n.setLocaleMessage(locale, messages.default)
loadedLanguages.push(locale)
return locale
@ -59,17 +59,19 @@ function loadLocaleMessages (locale) {
/**
* Loads a date-fns locale object
*/
async function loadDateFnsLocale (locale) {
async function loadDateFnsLocale(locale) {
const dateFnsLocaleName = supportedLocales[locale].dateFnsLocale || locale
dateFnsLocale = (await import(
`../../node_modules/date-fns/esm/locale/${dateFnsLocaleName}/index.js`
)).default
dateFnsLocale = (
await import(
`../../node_modules/date-fns/esm/locale/${dateFnsLocaleName}/index.js`
)
).default
}
/**
* Initialize all locales
*/
function initDefaultLocales () {
function initDefaultLocales() {
// Get defined locales from `localStorage` or `navigator`
const [locale, fallbackLocale] = getDefaultLocales()
@ -83,5 +85,5 @@ export {
updateDocumentLocale,
loadLocaleMessages,
loadDateFnsLocale,
dateFnsLocale
dateFnsLocale,
}

View file

@ -342,7 +342,7 @@
"postinstall": "تنفيذ ما بعد التنصيب",
"upgrade": {
"apps": "تحديث كافة التطبيقات",
"app": "تحديث التطبيق '{name}'",
"app": "تحديث التطبيق '{app}'",
"system": "تحديث النظام"
},
"users": {
@ -424,7 +424,7 @@
"failed": "يبدو أن الخادم لا يستجيب. يمكنك محاولة إعادة الاتصال مرة أخرى أو محاولة تشغيل`systemctl restart yunohost-api` من خلال ssh.",
"success": "يمكن الآن الوصول إلى الخادم! يمكنك محاولة تسجيل الدخول"
},
"partial_logs": "[...] (تحقق من السجل للحصول على السجلات الكاملة)"
"partial_logs": "[] (تحقق من السجل للحصول على السجلات الكاملة)"
},
"dead": "غير نشط",
"unknown": "مجهول",

View file

@ -3,7 +3,7 @@
"add": "যুক্ত করুন",
"administration_password": "পরিচালনাকারীর পাসওয়ার্ড",
"all_apps": "সকল অ্যাপ্লিকেশান",
"api_not_responding": "এপিআই সাড়া দিচ্ছে না",
"api_not_responding": "এপিআই সাড়া দিচ্ছে না?",
"password": "পাসওয়ার্ড",
"ok": "ঠিক আছে"
}

View file

@ -29,7 +29,7 @@
"confirm_firewall_allow": "Està segur de voler obrir el port {port}? (protocol: {protocol}, connexió: {connection})",
"confirm_firewall_disallow": "Està segur de voler tancar el port {port}? (protocol: {protocol}, connexió: {connection})",
"confirm_install_custom_app": "ATENCIÓ! La instal·lació d'aplicacions de terceres parts pot comprometre la integritat i seguretat del seu sistema. No hauríeu d'instal·lar-ne a no ser que sapigueu el que feu. Esteu segurs de voler córrer aquest risc?",
"confirm_install_domain_root": "No podrà instal·lar cap altra aplicació {domain}. Vol continuar?",
"confirm_install_domain_root": "Segur voleu instal·lar aquesta aplicació a «/»? No podreu instal·lar cap altra aplicació a {domain}",
"confirm_migrations_skip": "Saltar-se les migracions no està recomanat. Està segur de voler continuar?",
"confirm_postinstall": "Està a punt de començar el procés de post-instal·lació en el domini {domain}. Pot tardar uns minuts, *no interrompi la operació*.",
"confirm_restore": "Està segur de voler restaurar {name}?",
@ -308,7 +308,7 @@
"error": "Error",
"enabled": "Activat",
"domain_delete_forbidden_desc": "No podeu eliminar «{domain}» ja que és el domini principal, heu d'escollir un altre domini (o <a href='#/domains/add'>afegir-ne un de nou</a>) i fer-lo el domini principal per a poder eliminar aquest.",
"domain_add_dyndns_forbidden": "Ja us heu registrat o subscrit a un domini DynDNS del projecte YunoHost. Per disseny, aquesta funció està limitada a un d'aquests dominis per servidor. Si voleu un subdomini del vostre domini ja subscrit, utilitzeu l'opció \"Afegeix un domini que tinc o un subdomini\" anterior. Si voleu utilitzar un domini completament diferent, primer heu d'eliminar el vostre domini DynDNS existent. Els dominis DynDNS són bons quan comenceu amb l'allotjament automàtic, però a mitjà/llarg termini, us recomanem comprar el vostre propi nom de domini a algun registrador per tenir la propietat total del vostre domini.",
"domain_add_dyndns_forbidden": "Ja us heu registrat o subscrit a un domini DynDNS del projecte YunoHost. Per disseny, aquesta funció està limitada a un d'aquests dominis per servidor. Si voleu afegir un subdomini del vostre domini ja subscrit, utilitzeu l'opció «Afegir un domini que tinc o un subdomini» anterior. Si voleu utilitzar un domini completament diferent, primer heu d'eliminar el vostre domini DynDNS existent. Els dominis DynDNS són bons quan comenceu amb l'allotjament automàtic, però a mitjà/llarg termini, us recomanem comprar el vostre propi nom de domini a algun registrador per tenir la propietat total del vostre domini.",
"disabled": "Desactivat",
"dead": "Inactiu",
"day_validity": " Expirat | 1 dia | {count} dies",
@ -349,8 +349,8 @@
}
},
"api": {
"processing": "El servidor està processant l'acció...",
"partial_logs": "[...] (consulteu l'historial per obtenir els registres complets)",
"processing": "El servidor està processant l'acció",
"partial_logs": "[] (consulteu l'historial per obtenir els registres complets)",
"query_status": {
"error": "Sense èxit",
"pending": "En progrés",
@ -364,7 +364,7 @@
"unknown": "La connexió amb el servidor s'ha tancat per motius desconeguts.",
"upgrade_system": "La connexió amb el servidor s'ha tancat a causa de l'actualització de YunoHost. S'està esperant que el servidor torni a ser accessible…"
},
"title": "S'està intentant comunicar amb el servidor...",
"title": "S'està intentant comunicar amb el servidor",
"failed": "Sembla que el servidor no respon. Podeu provar de tornar a connectar-vos o provar d'executar `systemctl restart yunohost-api` mitjançant ssh.",
"success": "Ja es pot accedir al servidor! Podeu provar d'iniciar sessió"
}
@ -450,7 +450,8 @@
"title": "Vincles",
"userdoc": "Documentació oficial d'usuari",
"website": "Pàgina web oficial",
"license": "Llicència"
"license": "Llicència de l'aplicació",
"package_license": "Llicència del paquet de YunoHost"
},
"potential_alternative_to": "Alternativa potencial a:",
"upgrade": {
@ -487,9 +488,9 @@
"from_registrar": "Vull afegir un domini que tinc o un subdomini",
"from_yunohost": "No tinc cap domini, vull registrar/utilitzar un domini DynDNS gratuït proporcionat pel projecte YunoHost",
"from_local": "Vull un domini per a ús local / només de prova",
"from_local_desc": "Si no voleu un nom de domini públic \"real\", podeu utilitzar qualsevol cosa que acabi en <code>.local</code> o <code>.test</code>. Els noms de domini que acaben en <code>.local</code> són especials en el sentit que es poden resoldre automàticament a la xarxa local, suposant que els clients admeten el protocol Bonjour. Alternativament, és possible que hàgiu de modificar el fitxer <code>/etc/hosts</code> (o l'equivalent a Windows) a cada client des del qual vulgueu utilitzar aquest domini, o bé configurar les entrades de DNS locals al vostre encaminador d'Internet.",
"from_local_desc": "Si no voleu un nom de domini públic \"real\", podeu utilitzar qualsevol cosa que acabi en <code>.local</code> o <code>.test</code>. Els noms de domini que acaben en <code>.local</code> són especials en el sentit que es poden resoldre automàticament a la xarxa local, suposant que els clients admeten el protocol Bonjour. Alternativament, és possible que hàgiu de modificar el fitxer <code>/etc/hosts</code> (o l'equivalent a Windows) a cada client des del qual vulgueu utilitzar aquest domini, o bé configurar les entrades de DNS locals al vostre encaminador d'Internet.",
"from_registrar_desc": "Haureu de configurar manualment els registres DNS al vostre registrador per finalitzar la configuració d'aquest domini. El diagnòstic de YunoHost us guiarà sobre quins registres DNS heu de configurar exactament.",
"from_yunohost_desc": "El projecte YunoHost manté un servei gratuït 'DynDNS'. Està limitat a un d'aquests dominis per servidor (tot i que també podeu afegir subdominis més tard utilitzant l'altra opció \"Afegeix un domini que tinc o un subdomini\" anterior). La configuració de DNS serà gestionada automàticament per YunoHost. Això és ideal quan comenceu amb l'allotjament automàtic en general i encara no voleu invertir en un nom de domini. Tanmateix, a mitjà/llarg termini, us recomanem que compreu el vostre propi nom de domini a algun registrador per tenir la propietat total del vostre domini."
"from_yunohost_desc": "El projecte YunoHost manté un servei gratuït 'DynDNS'. Està limitat a un d'aquests dominis per servidor (tot i que també podeu afegir subdominis més tard utilitzant l'altra opció \"Afegeix un domini que tinc o un subdomini\" anterior). La configuració de DNS serà gestionada automàticament per YunoHost. Això és ideal quan comenceu amb l'allotjament automàtic en general i encara no voleu invertir en un nom de domini. Tanmateix, a mitjà/llarg termini, us recomanem que compreu el vostre propi nom de domini a algun registrador per tenir la propietat total del vostre domini."
},
"cert": {
"types": {
@ -661,7 +662,7 @@
"retry": "Torna-ho a provar",
"search": {
"not_found": "Hi ha {items} que coincideixen amb els vostres criteris. | Hi ha 1 {items} que coincideix amb els vostres criteris. | Hi ha {items} que coincideixen amb els vostres criteris.",
"for": "Cerca {items}..."
"for": "Cerca {items}"
},
"tools_webadmin_settings": "Configuració de Webadmin",
"user_emailaliases_add": "Afegiu un àlies de correu",

View file

@ -11,7 +11,7 @@
"ok": "OK",
"postinstall_intro_3": "Pro více informací navštivte <a href='//yunohost.org/en/install/hardware:vps_debian#fa-cog-proceed-with-the-initial-configuration' target='_blank'>příslušnou stránku dokumentace</a>",
"app_choose_category": "Vybrat kategorii",
"api_waiting": "Čekáme na odpověď serveru...",
"api_waiting": "Čekáme na odpověď serveru",
"api_not_found": "Zdá se, že web-admin zkusil dotazovat něco, co neexistuje.",
"api_errors_titles": {
"APIConnexionError": "YunoHost zaznamenal chybu spojení",
@ -36,8 +36,8 @@
"pending": "Ve zpracování",
"error": "Neúspěšné"
},
"processing": "Server zpracovává akci...",
"partial_logs": "[...] (zkontrolujte historii v logách)",
"processing": "Server zpracovává akci",
"partial_logs": "[] (zkontrolujte historii v logách)",
"reconnecting": {
"reason": {
"upgrade_system": "Spojení se serverem bylo ukončeno kvůli povýšení YunoHostu na novou verzi. Čekám, až bude opět dostupný…",
@ -45,7 +45,7 @@
"reboot": "Váš server se restartuje a po nějakou dobu nebude dostupný. Jakmile se spojení naváže, zobrazí se přihlašovací okno.",
"shutdown": "Váš server se ukončuje a nebude dostupný. Když ho znovu zapnete, jakmile bude zase dosažitelný, zobrazí se přihlašovací okno."
},
"title": "Snažím se navázat spojení se serverem...",
"title": "Snažím se navázat spojení se serverem",
"success": "Server už odpovídá! Nyní se můžete přihlásit",
"failed": "Zdá se, že server neodpovídá. Zkuste se znovu připojit nebo na něm pustit `systemctl restart yunohost-api`přes ssh."
}
@ -232,7 +232,7 @@
"select_all": "Vybrat vše",
"search": {
"not_found": "Nalezeny {items} odpovídající vašemu zadání. | Nalezena 1 {items} odpovídající vašemu zadání. | Nalezeny {items} odpovídající vašemu zadání.",
"for": "Hledat {items}..."
"for": "Hledat {items}"
},
"save": "Uložit",
"running": "Provádí se",

View file

@ -4,8 +4,119 @@
"domain_description": {
"domain": "Vælg et domæne.",
"email": "Vælg et domæne til din e-mail."
},
"local_part_description": {
"domain": "Vælg et sub-domæne.",
"email": "Vælg en lokal del til dit domæne."
}
},
"administration_password": "Administratorkodeord",
"all": "Alle"
"all": "Alle",
"action": "Handling",
"api": {
"query_status": {
"success": "Fuldført",
"error": "Usuccesfuld",
"pending": "I gang",
"warning": "Fuldført med fejlmeldinger eller advarsler"
},
"processing": "Serveren er i færd med at behandle anmodningen…",
"reconnecting": {
"failed": "Det ser ud som om serveren ikke svarer. Du kan prøve at forbinde igen eller prøve at køre `systemctl restart yunohost-api` over ssh.",
"reason": {
"reboot": "Din server genstarter og vil ikke være kontaktbar i et stykke tid. En loginprompt vil blive synlig så snart serveren igen er kontaktbar.",
"unknown": "Forbindelsen til serveren er blevet lukket af ukendte årsager.",
"shutdown": "Din server lukker ned og er ikke længere kontaktbar. Tænd for den igen og en loginprompt vil blive synlig så snart den atter er kontaktbar.",
"upgrade_system": "Forbindelsen til serveren er blevet lukket på grund af YunoHost opdatering. Venter på at kunne kontakte serveren igen…"
},
"success": "Serveren er nu kontaktbar! Du kan prøve at logge ind",
"title": "Forsøger at kommunikere med serveren…"
},
"partial_logs": "[...] (se i historik for at finde hele loggen)"
},
"api_error": {
"error_message": "Fejlmelding:",
"info": "Følgende informationer kan være brugbare for den person der hjælper dig:",
"server_said": "Under behandlingen af anmodningen sagde serveren:",
"sorry": "Beklager meget.",
"view_error": "Se fejl",
"help": "Du bør søge hjælp på <a href=\"https://forum.yunohost.org/\">vores forum</a> eller <a href=\"https://chat.yunohost.org/\">chatten</a> til at ordne problemet eller rapportere fejlen i <a href=\"https://github.com/YunoHost/issues\">bugtrackeren</a>."
},
"all_apps": "Alle applikationer",
"api_errors_titles": {
"APIBadRequestError": "YunoHost stødte på en fejl",
"APIConnexionError": "YunoHost stødte på en forbindelsesfejl",
"APIError": "YunoHost stødte på en uventet fejl",
"APINotFoundError": "YunoHost API'en kunne ikke finde en rute",
"APINotRespondingError": "YunoHost API svarer ikke",
"APIInternalError": "YunoHost stødte på en intern fejl"
},
"api_not_found": "Det ser ud til at webadministratoren forespurgte efter noget der ikke findes.",
"api_not_responding": "YunoHost API'en svarer ikke. Måske er 'yunohost-api' nede eller blevet genstartet?",
"app": {
"doc": {
"about": {
"description": "Beskrivelse",
"title": "Om"
},
"admin": {
"title": "Admin doc"
},
"notifications": {
"understood": "Forstået",
"post_upgrade": "Post-opdatering noter",
"title": "Notifikationer",
"post_install": "Post-installation noter"
}
},
"info": {
"forum": "Søg eller spørg i forummet!",
"problem": "Et problem med denne app?",
"config_panel_error": "En fejl forhindrer konfigurationspanelet i at blive vist:",
"config_panel_error_please_report": "Vær venlig at rapportere denne fejl til YunoHost teamet, så den kan blive fikset!"
},
"install": {
"license": "Licens:{license}",
"notifs": {
"post": {
"title": "Post-installations-notifikationer for '{name}'",
"alert": "Det ser ud til at installationen gik godt!\nHer er nogle beskeder som udviklerne af pakken synes det er vigtigt, at du får.\nDu kan læse dem igen på app infosiden."
},
"pre": {
"warning": "Ting at være opmærksom på før installationen",
"critical": "Applikationen kan ikke installeres",
"danger": "Installation af applikationen vil sandsynligvis medføre problemer"
}
},
"problems": {
"ignore": "Jeg forstår at denne installation kan ødelægge mit system, men jeg vil stadig gerne prøve.",
"ram": "Denne applikation kræver {required} RAM for at kunne installere/opgradere, men der er kun {current} tilgængelige lige nu. Selv hvis denne app kunne køre, ville installationsprocessen kræve en stor mængde RAM, så din server risikerer at fryse og fejle horribelt.",
"arch": "Denne app kan kun installeres på specifikke arkitekturer ({required}) men din serverarkitektur er {current}.",
"broken": "YunoHosts automatiske tests har markeret denne applikation som \"VIRKER IKKE\", og den vil sandsynligvis ødelægge dit system! Du bør IKKE installere den medmindre du ved hvad du foretager dig.",
"inprogress": "Denne applikation er stadig i prøvefasen (eller den virker måske slet ikke) og den vil sandsynligvis ødelægge dit system! Du bør IKKE installere den medmindre du ved hvad du laver.",
"install": "Den er allerede installeret og kan ikke installeres flere gange.",
"lowquality": "Denne applikation virker måske, men er ikke velintegreret i YunoHost. Visse funktioner, såsom single sign-on og backup/restore er muligvis ikke tilgængelige, eller de respekterer ikke god praksis.",
"thirdparty": "Applikationen er ikke en del af det officielle YunoHost-katalog. Ved at installere tredjeparts-applikationer risikerer du at kompromittere integriteten og sikkerheden for dit system. Du bør undlade at installere, hvis du ikke er helt sikker på, hvad du gør.",
"version": "Applikationen kræver YunoHost >= {required}, men den nuværende version er {current}. Opgrader YunoHost først."
},
"try_demo": "Prøv demoen",
"version": "Nuværende version: {version}"
},
"antifeatures": "Denne app har komponenter du måske ikke vil bryde dig om:",
"integration": {
"ldap": {
"true": "Brug YunoHost-konti til at logge ind (LDAP)",
"?": "Ingen information om LDAP-integration",
"false": "Bruger ikke YunoHost-konti til at logge ind (LDAP)"
},
"archs": "Understøttede arkitekturer:",
"multi_instance": {
"true": "Kan installeres flere gange",
"false": "Kan kun installeres en gang"
},
"resources": "Typisk ressourceforbrug: {ram} RAM, {disk} disk"
},
"installed_version": "Installerede version:"
},
"api_waiting": "Venter på svar fra serveren…"
}

View file

@ -139,8 +139,8 @@
"confirm_update_apps": "Möchten Sie wirklich alle Applikationen aktualisieren?",
"confirm_upnp_enable": "Möchten Sie UPnP wirklich aktivieren?",
"confirm_upnp_disable": "Möchten Sie UPnP wirklich deaktivieren?",
"confirm_firewall_allow": "Sind Sie sicher, dass Sie den Port {port} (protocol: {protocol}, Verbindung: {connection}) öffnen wollen",
"confirm_firewall_disallow": "Sind Sie sicher, dass Sie den Port {port} (protocol: {protocol}, Verbindung {connection}) schliessen wollen",
"confirm_firewall_allow": "Sind Sie sicher, dass Sie den Port {port}? (protocol: {protocol}, Verbindung: {connection}) öffnen wollen",
"confirm_firewall_disallow": "Sind Sie sicher, dass Sie den Port {port}? (protocol: {protocol}, Verbindung {connection}) schliessen wollen",
"confirm_update_specific_app": "Möchten Sie {app} wirklich aktualisieren?",
"confirm_reboot_action_reboot": "Möchten Sie den Server wirklich neustarten?",
"confirm_reboot_action_shutdown": "Möchten Sie den Server wirklich herunterfahren?",
@ -285,7 +285,7 @@
"app_show_categories": "Kategorien anzeigen",
"app_manage_label_and_tiles": "Etiketten und Kacheln verwalten",
"app_choose_category": "Kategorie auswählen",
"api_waiting": "Warten auf Antwort des Servers...",
"api_waiting": "Warten auf Antwort des Servers",
"user_emailforward_add": "Fügen Sie eine Mail-Weiterleitung hinzu",
"user_emailaliases_add": "Fügen Sie einen Mail-Alias hinzu",
"unknown": "Unbekannt",
@ -304,7 +304,7 @@
},
"search": {
"not_found": "Es gibt {items}, die Ihren Auswahlkriterien entsprechen. | Es gibt 1 {items}, das Ihrem Auswahlkriterium entspricht. | Es gibt {items}, die Ihren Auswahlkriterien entsprechen.",
"for": "Suche nach {items} ..."
"for": "Suche nach {items}"
},
"readme": "Lies mich",
"postinstall_set_domain": "Hauptdomäne festlegen",
@ -374,7 +374,7 @@
"error": "Fehler",
"enabled": "Aktiviert",
"domain_delete_forbidden_desc": "Sie können '{domain}' nicht entfernen, da es sich um die Standarddomäne handelt. Sie müssen eine andere Domäne auswählen (oder <a href='#/domains/add'> eine neue hinzufügen </a>) und diese als Standarddomäne festlegen um die aktuelle entfernen zu können.",
"domain_add_dyndns_forbidden": "Sie haben bereits eine DynDNS-Domain vom YunoHost-Projekt registriert/abonniert. Es ist beabsichtigt, dass diese Funktion auf eine Domäne dieses Typs pro Server limitiert ist. Falls Sie eine Subdomain Ihrer bereits registrierten Domäne wünschen, benützen Sie bitte die obige Option 'Ich will eine Domäne, die in meinem Besitz ist, hinzufügen, oder eine Subdomain'. Falls Sie eine komplett andere Domäne verwenden möchten, sollten Sie vorher Ihre bereits existierende DynDNS-Domäne entfernen. DynDNS-Domänen sind gut, wenn Sie mit Self-Hosting gerade erst beginnen, aber mittel/-langfristig empfehlen wir, dass Sie ihre ganz eigene Domäne bei einem Registrar erwerben, um vollständiges Eigentum über Ihre Domäne zu erlangen.",
"domain_add_dyndns_forbidden": "Sie haben bereits eine DynDNS-Domain vom YunoHost-Projekt registriert/abonniert. Es ist beabsichtigt, dass diese Funktion auf eine Domain dieses Typs pro Server limitiert ist. Falls Sie eine Subdomain Ihrer bereits registrierten Domain hinzufügen möchten, benützen Sie bitte die obige Option 'Ich will eine Domain, die in meinem Besitz ist, hinzufügen, oder eine Subdomain'. Falls Sie eine komplett andere Domain verwenden möchten, sollten Sie vorher Ihre bereits existierende DynDNS-Domain entfernen. DynDNS-Domains sind gut, wenn Sie mit Self-Hosting gerade erst beginnen, aber mittel/-langfristig empfehlen wir, dass Sie ihre ganz eigene Domain bei einem Registrar erwerben, um vollständiges Eigentum über Ihre Domain zu erlangen.",
"disabled": "Deaktiviert",
"dead": "Inaktiv",
"day_validity": " Abgelaufen seit | einem Tag | {count} Tage",
@ -393,10 +393,10 @@
"pending": "In Bearbeitung",
"error": "Nicht erfolgreich"
},
"processing": "Der Server verarbeitet die Aktion...",
"partial_logs": "[...] (Schauen Sie für vollständige Logs bitte im Verlauf nach)",
"processing": "Der Server verarbeitet die Aktion",
"partial_logs": "[…] (in der Historie nach Logs suchen)",
"reconnecting": {
"title": "Versuche mit dem Server zu kommunizieren...",
"title": "Versuche mit dem Server zu kommunizieren",
"failed": "Der Server scheint nicht zu antworten. Sie können versuchen, sich neu zu verbinden oder probieren `systemctl restart yunohost-api` über ssh auszuführen.",
"reason": {
"unknown": "Die Verbindung mit dem Server wurde aus unbekannten Gründen beendet.",
@ -539,7 +539,7 @@
"apps_on_domain": "Auf der Domäne installierte Applikationen",
"certificate_authority": "SSL-Zeritifizierungsstelle",
"registrar": "Registrar",
"dyn_dns_remove_and_unsubscribe": "Die Domäne zusätzlich von YunoHosts DynDNS-Service abmelden"
"dyn_dns_remove_and_unsubscribe": "sie müssen auch die Domain beim Yunohost DynDNS Service abmelden"
},
"see_parent_domain": "Schauen Sie bitte bei der Hauptdomäne nach",
"types": {
@ -552,11 +552,11 @@
"add": {
"dyn_dns_password_desc": "Dieses Passwort erlaubt Ihnen zu einem späteren Zeitpunkt die Widerherstellung der Domäne wenn Sie Ihr System neu installieren. Wenn Sie diese Domäne vorher schon registriert haben, verwenden Sie hier dieses Wiederherstellungspasswort für die Wiederherstellung der Domäne.",
"from_local_desc": "Wenn Sie keinen \"echten\" öffentlichen Domänennamen wünschen, können Sie hier alles verwenden, was in <code>.local</code> oder <code>.test</code> endet. Domänennamen welche in <code>.local</code> enden, sind in dem Sinne speziell, als dass sie in Ihrem lokalen Netzwerk automatisch aufgelöst werden können, angenommen Ihre Clients unterstützen das Bonjour-Protokoll. Als Alternative dazu können Sie Ihre <code>/etc/hosts</code> -Datei ( oder äquivalent für Windows ) auf jedem Ihrer Clients so einstellen, von welchen aus Sie diese Domäne benützen wollen, oder indem Sie die lokalen DNS-Einträge in Ihrem Internet-Router entsprechend konfigurieren.",
"dyn_dns_password": "Passwort für die Wiederherstellung der Domäne",
"from_local": "Ich hätte gerne eine Domäne ausschliesslich für die lokale / testweise Verwerwendung",
"from_registrar": "Ich will eine Domäne, die in meinem Besitz ist, hinzufügen, oder eine Subdomain",
"from_registrar_desc": "Sie müssen gegebenenfalls die DNS-Konfiguration bei ihrem Registrar vervollständigen. Die Diagnose von Yunohost zeigt ihnen an, welche Einträge Sie noch konfigurieren müssen.",
"from_yunohost": "Ich bin nicht im Besitz einer Domäne, ich will eine kostenlose DynDNS-Domäne registrieren/benützen, welche vom YunoHost-Projekt bereitgestellt wird",
"dyn_dns_password": "Domainwiederherstellungspasswort",
"from_local": "Ich will eine Domain ausschließlich für die lokale / testweise Verwendung",
"from_registrar": "Ich möchte eine eigene Domain oder eine Subdomain hinzufügen",
"from_registrar_desc": "Sie müssen gegebenenfalls die DNS-Konfiguration bei ihrem Registrar vervollständigen. Die Diagnose von Yunohost zeigt Ihnen an, welche Records Sie noch konfigurieren müssen.",
"from_yunohost": "Ich besitze keine Domain, Ich möchte eine kostenlose DynDNS-Domain des Yunohost Projektes nutzen",
"from_yunohost_desc": "Das YunoHost-Projekt unterhält einen kostenlosen 'DynDNS'-Service. Dieser ist limitiert auf eine einzige solche Domäne pro Server (Sie können trotzdem später eine Subdomain mit der obigen Option 'Ich will eine Domäne, die in meinem Besitz ist, hinzufügen, oder eine Subdomain' hinzufügen). Die DNS-Konfiguration wird automatisch von YunoHost gehandhabt. Dies ist ideal, wenn Sie mit Self-Hosting überhaupt erst beginnen und Sie noch nicht in einen Domainname investieren möchten. Wie auch immer, mittel/-langfristig empfehlen wir der Kauf eines eigenen Domainnames bei einem Registrar, um das vollständige Eigentum über Ihre Domäne zu erlangen."
}
},
@ -604,7 +604,7 @@
"notifs": {
"post": {
"title": "Post-Installations-Benachrichtigungen für „{name}“",
"alert": "Die Aktualisierung scheint gut gelaufen zu sein!\nHier ein paar Informationen, die der/die Paketierer betreffend dieser Aktualisierung als wichtig erachtet hat. \nSie können sie auch auf der Informationsseite dieser App nochmal nachlesen."
"alert": "Die Aktualisierung scheint gut gelaufen zu sein!\nHier sind ein einige Informationen, die der Paketierer als wichtig zu wissen erachtet hat. \nSie können sie auch auf der Informationsseite dieser App noch einmal nachlesen."
},
"pre": {
"warning": "Wichtige Informationen vor der Installation",
@ -666,7 +666,8 @@
"title": "Links",
"userdoc": "Offizielle Dokumentation für Benutzer",
"website": "Offizielle Website",
"license": "Lizenz"
"license": "App-Lizenz",
"package_license": "YunoHost Paket Lizenz"
},
"potential_alternative_to": "Potenzielle Alternative für:",
"upgrade": {

View file

@ -32,5 +32,53 @@
"words": {
"default": "Προεπιλογή"
},
"ok": "Εντάξει"
"ok": "Εντάξει",
"action": "Ενέργεια",
"all_apps": "Όλες οι εφαρμογές",
"address": {
"domain_description": {
"domain": "Επιλέξτε domain.",
"email": "Επιλέξτε ένα domain για το email σας."
},
"local_part_description": {
"domain": "Επιλέξτε ένα subdomain.",
"email": "Επιλέξτε ένα τοπικό τμήμα για το email σας."
}
},
"api_error": {
"info": "Η ακόλουθη πληροφορία μπορεί να είναι χρήσιμη για το άτομο που σας βοηθάει:",
"sorry": "Πραγματικά λυπούμαστε για αυτό.",
"server_said": "Κατά τη διάρκεια επεξεργασίας της ενέργειας ο διακομιστής είπε:",
"view_error": "Προβολή σφάλματος",
"error_message": "Μήνυμα σφάλματος:"
},
"api_errors_titles": {
"APIBadRequestError": "Το YunoHost αντιμετώπισε ένα σφάλμα",
"APIError": "Το YunoHost αντιμετώπισε ένα μη αναμενόμενο σφάλμα",
"APIInternalError": "Το YunoHost αντιμετώπισε ένα εσωτερικό σφάλμα",
"APINotFoundError": "Το YunoHost API δεν μπόρεσε να βρεί δρομολόγηση",
"APINotRespondingError": "Το YunoHost API δεν ανταποκρίνεται",
"APIConnexionError": "Το YunoHost αντιμετώπισε ένα σφάλμα σύνδεσης"
},
"api": {
"reconnecting": {
"failed": "Φαίνεται πως ο διακομιστής δεν ανταποκρίνεται. Μπορείτε να προσπαθήσετε να ξανασυνδεθείτε ή να προσπαθήσετε να εκτελέσετε `systemctl restart yunohost-api` μέσω ssh.",
"reason": {
"unknown": "Η σύνδεση με το διακομιστή έχει τερματιστεί για άγνωστους λόγους.",
"upgrade_system": "Η σύνδεση με τον διακομιστή έχει τερματιστεί εξ'αιτίας αναβάθμισης του YunoHost. Αναμονή για τον διακομιστή μέχρι να είναι ξανά προσβάσιμος…",
"reboot": "Ο διακομιστής επανεκκινείται και δε θα είναι προσβάσιμος για κάποιο χρονικό διάστημα. Μία εντολή εισόδου θα είναι διαθέσιμη όταν ο διακομιστής θα είναι και πάλι προσβάσιμος.",
"shutdown": "Ο διακομιστής σας τερματίζεται και δεν είναι πια προσβάσιμος. Ενεργοποιήστε τον ξανά και μία εντολή εισόδου θα είναι διαθέσιμη με το που ο διακομιστής είναι ξανά προσβάσιμος."
},
"success": "Ο διακομιστής τώρα είναι προσβάσιμος! Μπορείτε να προσπαθήσετε να κάνετε είσοδο",
"title": "Προσπάθεια για επικοινωνία με το διακομιστή…"
},
"processing": "Ο διακομιστής επεξεργάζεται την ενέργεια…",
"query_status": {
"error": "Ανεπιτυχής",
"success": "Ολοκληρώθηκε επιτυχώς",
"warning": "Ολοκληρώθηκε επιτυχώς με σφάλματα ή προειδοποιήσεις",
"pending": "Υπό διεργασία"
}
},
"all": "Όλα"
}

View file

@ -15,8 +15,8 @@
"all": "All",
"all_apps": "All apps",
"api": {
"partial_logs": "[...] (check in history for full logs)",
"processing": "The server is processing the action...",
"partial_logs": "[] (check in history for full logs)",
"processing": "The server is processing the action",
"query_status": {
"error": "Unsuccessful",
"pending": "In progress",
@ -32,7 +32,7 @@
"upgrade_system": "Connection with the server has been closed due to YunoHost upgrade. Waiting for the server to be reachable again…"
},
"success": "The server is now reachable! You can try to login",
"title": "Trying to communicate with the server..."
"title": "Trying to communicate with the server"
}
},
"api_error": {
@ -53,7 +53,7 @@
},
"api_not_found": "Seems like the web-admin tried to query something that doesn't exist.",
"api_not_responding": "The YunoHost API is not responding. Maybe 'yunohost-api' is down or got restarted?",
"api_waiting": "Waiting for the server's response...",
"api_waiting": "Waiting for the server's response",
"app": {
"antifeatures": "This app has features you may not like:",
"doc": {
@ -128,8 +128,9 @@
"admindoc": "Official Admin documentation",
"code": "Official code repository",
"forum": "Topics about this app on YunoHost's forum",
"license": "License",
"license": "App license",
"package": "YunoHost package repository",
"package_license": "YunoHost package license",
"title": "Links",
"userdoc": "Official User documentation",
"website": "Official Website"
@ -202,8 +203,8 @@
"confirm_app_install": "Are you sure you want to install this application?",
"confirm_change_maindomain": "Are you sure you want to change the main domain?",
"confirm_delete": "Are you sure you want to delete {name}?",
"confirm_firewall_allow": "Are you sure you want to open port {port} (protocol: {protocol}, connection: {connection})",
"confirm_firewall_disallow": "Are you sure you want to close port {port} (protocol: {protocol}, connection: {connection})",
"confirm_firewall_allow": "Are you sure you want to open port {port}? (protocol: {protocol}, connection: {connection})",
"confirm_firewall_disallow": "Are you sure you want to close port {port}? (protocol: {protocol}, connection: {connection})",
"confirm_group_add_access_permission": "Are you sure you want to grant {perm} access to {name}? Such access significantly increases the attack surface if {name} happens to be a malicious person. You should only do so if you TRUST this person/group.",
"confirm_install_app_broken": "WARNING! This application is broken according to YunoHost's automatic tests and it is likely to break your system! You should probably NOT install it unless you know what you are doing. Are you willing to take that risk?",
"confirm_install_app_inprogress": "WARNING! This application is still experimental (if not explicitly not working) and it is likely to break your system! You should probably NOT install it unless you know what you are doing. Are you willing to take that risk?",
@ -279,7 +280,7 @@
},
"push": "Push DNS records to registrar",
"push_force": "Overwrite existing records",
"push_force_confirm": "Are you sure you want to force push all suggested dns records? Be aware that it may overwrite manually or important default records set by you or your registrar.",
"push_force_confirm": "Are you sure you want to force push all suggested dns records? Be aware that it may overwrite manual configuration or important default records set by you or your registrar.",
"push_force_warning": "It looks like some DNS records that YunoHost would have set are already in the registrar configuration. You can use the overwrite option if you know what you are doing."
},
"explain": {
@ -288,7 +289,7 @@
"info": {
"apps_on_domain": "Apps installed on domain",
"certificate_authority": "SSL Certification authority",
"dyn_dns_remove_and_unsubscribe": "Also unregister the domain from YunoHost's dyndns service",
"dyn_dns_remove_and_unsubscribe": "Also unregister the domain from YunoHost's DynDNS service",
"registrar": "Registrar"
},
"see_parent_domain": "See parent domain",
@ -298,7 +299,7 @@
}
},
"domain_add": "Add domain",
"domain_add_dyndns_forbidden": "You have already registered/subscribed to a DynDNS domain from the YunoHost project. By design, this feature is limited to one such domain per server. If you want to a subdomain of your already subscribed domain, please use the 'Add a domain I own, or a subdomain' option above. If you want to use a completely different domain, you should first remove your existing DynDNS domain. DynDNS domains are good when starting with self-hosting, but on the medium/long term, we recommend buying your very own domain name to some registrar to have full ownership of your domain.",
"domain_add_dyndns_forbidden": "You have already registered/subscribed to a DynDNS domain from the YunoHost project. By design, this feature is limited to one such domain per server. If you want to add a subdomain of your already subscribed domain, please use the 'Add a domain I own, or a subdomain' option above. If you want to use a completely different domain, you should first remove your existing DynDNS domain. DynDNS domains are good when starting with self-hosting, but on the medium/long term, we recommend buying your very own domain name to some registrar to have full ownership of your domain.",
"domain_default_desc": "The default domain is the connection domain where users log in.",
"domain_default_longdesc": "This is your default domain.",
"domain_delete_forbidden_desc": "You cannot remove '{domain}' since it's the default domain, you need to choose another domain (or <a href='#/domains/add'>add a new one</a>) and set it as the default domain to be able to remove this one.",
@ -599,7 +600,7 @@
"running": "Running",
"save": "Save",
"search": {
"for": "Search for {items}...",
"for": "Search for {items}",
"not_found": "There are {items} matching your criteria. | There is 1 {items} matching your criteria. | There are {items} matching your criteria."
},
"select_all": "Select all",

View file

@ -69,7 +69,7 @@
"hook_data_mail": "Poŝto",
"backup_create": "Krei sekurkopion",
"confirm_uninstall": "Ĉu vi certas, ke vi volas malinstali {name} ?",
"confirm_firewall_disallow": "Ĉu vi certas, ke vi volas fermi havenon {port} ? (protokolo: {protocol}, rilato: {connection})",
"confirm_firewall_disallow": "Ĉu vi certas, ke vi volas fermi havenon {port} ? (protokolo: {protocol}, rilato: {connection})",
"created_at": "Kreita ĉe",
"confirm_app_change_url": "Ĉu vi certas, ke vi volas ŝanĝi la URL-aliron de la aplikaĵo?",
"ipv6": "IPv6",
@ -251,7 +251,7 @@
"pending": "En progreso",
"error": "Malsukcesa"
},
"processing": "La servilo prilaboras la agon..."
"processing": "La servilo prilaboras la agon"
},
"address": {
"local_part_description": {

View file

@ -280,10 +280,10 @@
"pending": "En progreso",
"error": "No se ha podido realizar"
},
"processing": "El servidor está procesando la acción...",
"partial_logs": "[...] (comprueba el histórico para un log completo)",
"processing": "El servidor está procesando la acción",
"partial_logs": "[…] (comprueba el histórico para unos logs completos)",
"reconnecting": {
"title": "Intentado comunicarse con el servidor...",
"title": "Intentado comunicarse con el servidor",
"failed": "Al parecer el servidor no responde. Puedes intentarlo nuevamente o utilizar el comando `systemctl restart yunohost-api` a través de SSH.",
"reason": {
"unknown": "La conexión con el servidor ha sido cancelada por razones desconocidas.",
@ -345,7 +345,7 @@
"app_show_categories": "Mostrar categorías",
"app_install_parameters": "Instalar la configuración",
"app_choose_category": "Elige una categoría",
"api_waiting": "Esperando a la respuesta del servidor...",
"api_waiting": "Esperando a la respuesta del servidor",
"api_not_found": "Parece que la administración web ha intentado buscar algo que no existe.",
"hook_conf_manually_modified_files": "Configuraciones modificadas manualmente",
"hook_data_xmpp": "Datos XMPP",
@ -492,7 +492,7 @@
"manual_config": "Registros DNS recomendados para la configuración manual",
"push": "Publicar registros DNS al registrador",
"push_force": "Sobrescribir registros actuales",
"push_force_confirm": "¿Seguro que quieres forzar la publicación de los registros DNS recomendados? Ten en cuenta que puede sobreescribir registros por defecto o importantes configurados por tu registrador.",
"push_force_confirm": "¿Seguro que quieres forzar la publicación de los registros DNS recomendados? Ten en cuenta que puede sobrescribir registros por defecto o importantes configurados por tu registrador.",
"push_force_warning": "Parece que algunos registros DNS de YunoHost ya se encuentran en la configuración del registrador. Puedes usar la opción sobrescribir si sabes lo que haces.",
"info": "La configuración automática DNS es una función experimental.<br> Plantéate guardar tu zona DNS actual desde la interfaz DNS de tu registrador antes de publicar cambios desde aquí.",
"methods": {
@ -518,7 +518,7 @@
"apps_on_domain": "Aplicaciones instaladas en el dominio",
"certificate_authority": "Autoridad certificadora SSL",
"registrar": "Registrador",
"dyn_dns_remove_and_unsubscribe": "También eliminar el dominnio del servicio DynDNS de YunoHost"
"dyn_dns_remove_and_unsubscribe": "También eliminar el dominio del servicio DynDNS de YunoHost"
},
"see_parent_domain": "Ver dominio padre",
"types": {
@ -560,7 +560,7 @@
"users_import_confirm_destructive": "¿Seguro que quieres eliminar las cuentas que no se encuentran en este archivo?",
"readme": "Léeme",
"search": {
"for": "Busca {items}...",
"for": "Busca {items}",
"not_found": "Hay {items} coincidencias con tus criterios. | Hay 1 {items} coincidencia con tus criterios. | Hay {items} coincidencias con tus criterios."
},
"unknown": "Desconocido",
@ -666,7 +666,8 @@
"title": "Enlaces",
"userdoc": "Documentación oficial del usuario",
"website": "Página web oficial",
"license": "Licencia"
"license": "Licencia de la aplicación",
"package_license": "Licencia de paquete YunoHost"
},
"potential_alternative_to": "Alternativa potencial a:",
"upgrade": {

View file

@ -23,7 +23,7 @@
"success": "Arrakastaz amaitu da"
},
"processing": "Zerbitzaria eragiketa exekutatzen ari da…",
"partial_logs": "[...] (ikuskatu historia erregistro osoetarako)",
"partial_logs": "[] (ikuskatu historia erregistro osoetarako)",
"reconnecting": {
"title": "Zerbitzariarekin komunikatzeko ahaleginetan…",
"failed": "Badirudi zerbitzaria ez dela erantzuten ari. SSH bidez berriro konektatzen saia zaitezke `systemctl restart yunohost-api` exekutatuz.",
@ -38,15 +38,15 @@
},
"api_error": {
"view_error": "Ikusi errorea",
"error_message": "Errore mezua:",
"error_message": "Errore-mezua:",
"server_said": "Eragiketa exekutatzean zera adierazi du zerbitzariak:",
"help": "Laguntza eskatu beharko zenuke <a href=\"https://forum.yunohost.org/\">foroan</a> edo <a href=\"https://chat.yunohost.org/\">txat gelan</a> egoera hau konpontzeko, edo errore honen berri eman <a href=\"https://github.com/YunoHost/issues\">bugtracker</a> plataforman.",
"info": "Ondorengo informazioa baliagarria izan dakioke laguntza ematen ari zaionari:",
"sorry": "Barkatu."
},
"api_waiting": "Zerbitzariaren zain…",
"api_waiting": "Zerbitzariaren erantzunaren zain…",
"all": "Guztia",
"api_not_found": "Badirudi administrazio-webgunea existitzen ez den zerbait bilatzen saiatu dela.",
"api_not_found": "Badirudi administrazio-gunea existitzen ez den zerbait bilatzen saiatu dela.",
"api_not_responding": "YunoHosten APIa ez da erantzuten ari. Agian 'yunohost-api' ez dago martxan edo berrabiarazi da.",
"app_choose_category": "Aukeratu kategoria",
"api_errors_titles": {
@ -76,24 +76,24 @@
"domain": "Arazoa domeinu izenarekin: zenbakiak, hizki txikiak, puntuak eta gidoiak bakarrik erabili daitezke",
"dynDomain": "Arazoa domeinu izenarekin: zenbakiak, hizki txikiak eta gidoiak bakarrik erabil daitezke",
"emailForward": "Arazoa posta elektronikoaren birbidalketarekin: zenbakiak, hizkiak eta <code>_.-+</code> bakarrik erabil daitezke (esaterako izena+etiketa@adibidea.eus, iz3na-1+etiketa@adibidea.eus)",
"maxValue": "Zenbakia {max} edo {max} baino txikiagoa izan behar da.",
"maxValue": "Zenbakia {max} edo txikiagoa izan behar da.",
"passwordLenght": "Pasahitzak 8 karaktere izan behar ditu gutxienez.",
"between": "{min} eta {max} artean egon behar da.",
"email": "Arazoa posta elektronikoarekin: zenbakiak, hizkiak eta <code>_.-</code> bakarrik erabili daitezke (esaterako izena@adibidea.eus, iz3na-1@adibidea.eus)",
"minValue": "Zenbakia {min} edo {min} baino handiagoa izan behar da.",
"minValue": "Zenbakia {min} edo handiagoa izan behar da.",
"notInUsers": "Badago '{value}' izena duen erabiltzailea dagoeneko.",
"number": "Balioa zenbaki bat izan behar da.",
"alpha": "Hizkiak bakarrik izan daitezke.",
"alphalownumdot_": "Zenbakiak, hizki txikiak eta azpiko marra bakarrik erabili daitezke.",
"name": "Izenek ezin dituzte <code> ,.'-</code> ez diren karaktere bereziak eduki",
"appRepoUrl": "YunoHosten aplikazio-errepositorioko URLek honako itxura daukate: https://domain.tld/path/to/repo_ynh"
"appRepoUrl": "YunoHosten aplikazio-gordailuko URLek honako itxura daukate: https://domain.tld/path/to/repo_ynh"
},
"items": {
"backups": "babeskopia bat ere ez | babeskopia | {c} babeskopia",
"domains": "domeinu bat ere ez | domeinua | {c} domeinua",
"apps": "aplikazio bat ere ez | aplikazioa | {c} aplikazioa",
"groups": "talderik ez | taldea | {c} talde",
"installed_apps": "instalatutako aplikazio bat ere ez | instalatutako aplikazioa | {c} instalatutako aplikazioa",
"installed_apps": "ez dago aplikaziorik instalatuta | instalatutako aplikazioa | {c} aplikazio instalatuta",
"services": "zerbitzu bat ere ez | zerbitzua | {c} zerbitzua",
"users": "erabiltzaile bat ere ez | erabiltzailea | {c} erabiltzailea",
"logs": "erregistro bat ere ez | erregistroa | {c} erregistroa",
@ -115,7 +115,7 @@
"firstname": "Izena"
},
"confirm_upnp_enable": "Ziur UPnP gaitu nahi duzula?",
"group": "Taldea:",
"group": "Taldea",
"group_name": "Taldearen izena",
"group_all_users": "Erabiltzaile guztiak",
"group_visitors": "Bisitariak",
@ -184,7 +184,7 @@
"apps_on_domain": "Domeinuan instalatutako aplikazioak",
"certificate_authority": "SSL ziurtagiri jaulkitzailea",
"registrar": "Erregistro-enpresa",
"dyn_dns_remove_and_unsubscribe": "Eta utzi YunoHosten dyndns zerbitzuan domeinua erregistratzeari"
"dyn_dns_remove_and_unsubscribe": "Eta utzi YunoHosten DynDNS zerbitzuan domeinua erregistratzeari"
},
"see_parent_domain": "Ikus domeinu nagusia",
"types": {
@ -192,7 +192,7 @@
},
"toggle_subdomains": "Ikusi / Ezkutatu azpi-domeinuak",
"add": {
"from_local_desc": "Ez baduzu \"benetako\" domeinu publiko bat nahi, <code>.local</code> edo <code>.test</code> amaiera duen edozein domeinu erabil dezakezu. <code>.local</code> edo <code>.test</code> amaiera duten domeinuak bereziak dira: sare lokalak kudeatzen ditu (gailuek Bonjour protokoloa badarabilte). Beste aukera bat gailu bakoitzeko <code>/etc/hosts</code> fitxategia (edo Windows-en baliokide dena) moldatzea da, edo routerrean DNS sarrerak konfiguratzea.",
"from_local_desc": "Ez baduzu \"benetako\" domeinu publiko bat nahi, <code>.local</code> edo <code>.test</code> amaiera duen edozein domeinu erabil dezakezu. <code>.local</code> amaiera duten domeinuak bereziak dira: sare lokalak kudeatzen ditu (gailuek Bonjour protokoloa badarabilte). Beste aukera bat gailu bakoitzeko <code>/etc/hosts</code> fitxategia (edo Windows-en baliokide dena) moldatzea da, edo routerrean DNS sarrerak konfiguratzea.",
"from_yunohost_desc": "YunoHost proiektuak doako 'DynDNS' zerbitzu bat eskaintzen du. Zerbitzari bakoitzak mota honetako domeinu bakarra izan dezake (geroago azpidomeinu gehiago gehitu ditzakezu, 'Lehendik dudan domeinu edo azpidomeinu bat gehitu nahi dut' aukera erabiliz). DNS ezarpenak automatikoki kudeatuko ditu YunoHostek. Ideala da, orokorrean, norbera ostatatzen hasten denean eta oraindik domeinu bat erosteko prest ez dagoenarentzat. Hala ere, epe-ertain/luzean, domeinu propioa erostea gomendatzen dizugu, domeinuaren jabetza osoa izan dezazun.",
"dyn_dns_password": "Domeinuaren berreskuratze-pasahitza",
"dyn_dns_password_desc": "Pasahitz honek domeinuaren kontrola berreskuratzea ahalbidetuko dizu sistema berriz instalatzen baduzu. Domeinu hau aurretik ere erregistratu bazenuen, erabili berreskuratze-pasahitza hemen.",
@ -211,24 +211,24 @@
"app_state_highquality_explanation": "Aplikazio hau YunoHostera egoki egina dago gutxienez duela urtebetetik.",
"backup_new": "Babeskopia berria",
"confirm_delete": "Ziur {name} ezabatu nahi duzula?",
"confirm_firewall_allow": "Ziur {port} (protokoloa: {protocol}, konexioa: {connection}) ataka ireki nahi duzula?",
"confirm_firewall_allow": "Ziur {port} ataka ireki nahi duzula? (protokoloa: {protocol}, konexioa: {connection})",
"description": "Azalpena",
"group_new": "Talde berria",
"confirm_firewall_disallow": "Ziur {port} (protokoloa: {protocol}, konexioa: {connection}) ataka ixti nahi duzula?",
"confirm_firewall_disallow": "Ziur {port} ataka itxi nahi duzula? (protokoloa: {protocol}, konexioa: {connection})",
"diagnosis": "Diagnostikoak",
"confirm_service_restart": "Ziur {name} berrabiarazi nahi duzula?",
"confirm_reboot_action_shutdown": "Ziur zerbitzaria itzali nahi duzula?",
"connection": "Konexioa",
"diagnosis_first_run": "Diagnostikoa ohiko arazoak identifikatzen saiatuko da zerbitzaria ahalik eta hoberen ibili dadin. Ez larritu erroreak ikusten badituzu zerbitzaria konfiguratu eta berehala: horretarako dago pentsatuta zehazki, arazoak identifikatu eta konpontzen laguntzeko. Zerbitzariak egunean birritan egingo du diagnostikoa automatikoki eta administratzaileak aurkitutako arazoekin posta elektroniko bat jasoko du.",
"diagnosis_first_run": "Diagnostikoa ohiko arazoak identifikatzen saiatuko da zerbitzaria ahalik eta hoberen ibili dadin. Ez larritu erroreak ikusten badituzu zerbitzaria konfiguratu eta berehala: horretarako dago pentsatuta zehazki, arazoak identifikatu eta konpontzen laguntzeko. Zerbitzariak egunean birritan egingo du diagnostikoa automatikoki eta administratzaileak posta elektroniko bat jasoko du aurkitutako arazoekin.",
"domain_dns_config": "DNS ezarpenak",
"diagnosis_explanation": "Diagnostikoa ohiko arazoak identifikatzen saiatuko da zerbitzaria ahalik eta hoberen ibili dadin. Egunean birritan egingo du zerbitzariak eginkizun hau eta posta elektronikoa bidaliko dio administrariari arazoren bat ikusiz gero. Litekeena da emaitza batzuek garrantzirik ez izatea ezaugarri batzuk erabili nahi ez badira (XMPP adibidez) edo kale egin dezake zerbitzariaren konfigurazioa konplexua bada. Horrelako kasuetan, eta zertan ari zaren baldin badakizu, ez dago arazorik abisu edo jakinarazpenei muzin egiteko.",
"diagnosis_explanation": "Diagnostikoa ohiko arazoak identifikatzen saiatuko da zerbitzaria ahalik eta hoberen ibili dadin. Egunean birritan egingo du zerbitzariak eginkizun hau eta posta elektronikoa bidaliko dio administratzaileari arazoren bat ikusiz gero. Litekeena da emaitza batzuek garrantzirik ez izatea ezaugarri batzuk erabili nahi ez badira (XMPP adibidez) edo kale egin dezake zerbitzariaren konfigurazioa konplexua bada. Horrelako kasuetan, eta zertan ari zaren baldin badakizu, ez dago arazorik abisu edo jakinarazpenei muzin egiteko.",
"domain_default_desc": "Erabiltzaileek lehenetsitako domeinua erabiliko dute saioa hasteko.",
"domain_delete_forbidden_desc": "Ezinezkoa da '{domain}' ezabatzea lehenetsitako domeinua delako. Aukeratu beste domeinu bat (edo <a href='#/domains/add'>gehitu berri bat</a>) eta lehenetsi oraingo domeinua kendu ahal izateko.",
"domain_dns_push_managed_in_parent_domain": "DNS ezarpen automatikoen funtzioa <a href='#/domains/{parent_domain}/dns'>{parent_domain}</a> domeinu nagusiak kudeatzen du.",
"footer": {
"documentation": "Dokumentazioa",
"help": "Laguntza behar al duzu?",
"donate": "Dohaintza egin"
"donate": "Egin dohaintza"
},
"hook_data_home_desc": "Erabiltzaile-datuak /home/ERABILTZAILEA katalogoan daude",
"installed": "Instalatuta",
@ -253,7 +253,7 @@
"group_specific_permissions": "Erabiltzaile bakoitzaren baimenak",
"group_add_member": "Gehitu erabiltzailea",
"group_explain_all_users": "Zerbitzari honetan dauden erabiltzaile guztiak barne dituen talde berezia da",
"app_manage_label_and_tiles": "Kudeatu etiketak eta 'tile' delakoak",
"app_manage_label_and_tiles": "Kudeatu etiketak eta lauzak",
"group_add_permission": "Gehitu baimena",
"group_explain_visitors": "Saiorik hasi ez duten bisitariak barne hartzen dituen talde berezia da",
"groups_and_permissions_manage": "Kudeatu talde eta baimenak",
@ -278,7 +278,7 @@
"confirm_update_apps": "Ziur aplikazio guztiak eguneratu nahi dituzula?",
"confirm_update_specific_app": "Ziur {app} eguneratu nahi duzula?",
"confirm_reboot_action_reboot": "Ziur zerbitzaria berrabiarazi nahi duzula?",
"created_at": "Sortze data:",
"created_at": "Sortze-data",
"custom_app_install": "Instalatu norberaren aplikazioa",
"domain_dns_conf_is_just_a_recommendation": "Atal honetan *iradokitutako* ezarpenak agertzen dira. *Ez* du DNSa zure ordez konfiguratuko. Zure ardura da DNS guneak zure DNS erregistro-enpresaren gomendioen arabera ezartzea.",
"disable": "Desgaitu",
@ -310,7 +310,7 @@
"dead": "Ez dago aktibo",
"experimental": "Esperimentala",
"go_back": "Joan atzera",
"items_verbose_count": "{items} dago | {items} bat dago | {itmes} daude.",
"items_verbose_count": "{items} dago | {items} bat dago | {items} daude.",
"local_archives": "Artxibo lokalak",
"logs": "Erregistroak",
"logs_started_at": "Hasiera",
@ -422,14 +422,14 @@
"migrations_no_pending": "Ez dago egiteko migraziorik",
"password_confirmation": "Berridatzi pasahitza",
"logs_history": "Sisteman exekutatutako komandoen historia",
"permission_show_tile_enabled": "Erabiltzaile-atarian \"tile\" moduan ikusgai",
"permission_show_tile_enabled": "Erabiltzaileen atarian lauza moduan ikusgai",
"ports": "Atakak",
"postinstall": {
"force": "Abiarazi instalazio ondorengo prozesua",
"title": "Instalazio ondorengo prozesua",
"user": {
"title": "Sortu lehenengo administratzaile erabiltzailea",
"first_user_help": "Erabiltzaile honi administrazio ahalmenak esleituko zaizkio eta administrazio webgunea eta SSH konexioa erabiltzeko aukera izango du.\nErabiltzaile arrunta denez, erabiltzaileen ataria (SSO) erabiltzeko aukera ere izango du.\nInstalazio ondorengo prozesuek amaitzen dutenean, administratzaile gehiago sor ditzakezu 'admins' taldera gehituz."
"first_user_help": "Erabiltzaile honi administrazio-ahalmenak esleituko zaizkio eta administrazio-gunea eta SSH konexioa erabiltzeko aukera izango du.\nErabiltzaile arrunta denez, erabiltzaileen ataria (SSO) erabiltzeko aukera ere izango du.\nInstalazio ondorengo prozesuek amaitzen dutenean, administratzaile gehiago sor ditzakezu 'admins' taldera gehituz."
}
},
"postinstall_set_domain": "Aukeratu domeinu nagusia",
@ -465,7 +465,7 @@
"logs_ended_at": "Amaiera",
"logs_more": "Erakutsi lerro gehiago",
"postinstall_intro_1": "Bejon deizula! YunoHost arazorik gabe instalatu da.",
"postinstall_intro_3": "Argibide gehiago lor ditzakezu <a href='//yunohost.org/en/install/hardware:vps_debian#fa-cog-proceed-with-the-initial-configuration' target='_blank'>dokumentazio gunea</a> bisitatuz.",
"postinstall_intro_3": "Argibide gehiago lor ditzakezu <a href='//yunohost.org/en/install/hardware:vps_debian#fa-cog-proceed-with-the-initial-configuration' target='_blank'>dokumentazio gunea</a> bisitatuz",
"postinstall_intro_2": "Bi urrats gehiago behar dira zerbitzariko zerbitzuak gaitzeko.",
"mailbox_quota_example": "CD bat 700M dira, DVD bat 4700M",
"mailbox_quota_placeholder": "0 ezarriz gero ez da mugarik egongo.",
@ -489,7 +489,7 @@
"fallback_language": "Bigarren hizkuntza",
"fallback_language_description": "Hizkuntza lehenetsian mezuren bat itzulita ez badago, bigarren hizkuntzan erakutsiko da.",
"cache": "Katxea",
"cache_description": "Agian katxea desgaitu beharko zenuke administrazio-webgunea erabiltzeaz gain terminalarekin jardungo baduzu.",
"cache_description": "Agian katxea desgaitu beharko zenuke administrazio-gunea erabiltzeaz gain terminalarekin jardungo baduzu.",
"experimental": "Modu esperimentala",
"experimental_description": "Funtzio esperimentalei atea irekitzen die. Ezegonkorrak dira eta sistema kaltetu dezake.<br>Zertan ari zaren badakizu soilik gaitu aukera hau.",
"transitions": "Orrialdeen transtsizioetarako animazioak",
@ -546,7 +546,7 @@
"yes": "Bai",
"running": "Exekutatzen",
"search": {
"for": "Bilatu {items}",
"for": "Bilatu {items}",
"not_found": "Zuk zehaztutako baldintzak betetzen dituzten {items} aurkitu dira. | Zuk zehaztutako baldintzak betetzen dituen {items} bat aurkitu da. | Zuk zehaztutako baldintzak betetzen dituzten {items} aurkitu dira."
},
"traceback": "Atzera egin (traceback)",
@ -556,8 +556,8 @@
"users_export": "Esportatu erabiltzaileak",
"users_import_csv_file": "CSV fitxategia",
"users_import_update": "Eguneratu existitzen diren erabiltzaileak",
"tip_about_user_email": "Erabiltzaileak sortzerakoan postarako helbide elektroniko bat (eta XMPP kontu bat) esleitzen zaie erabiltzailea@domeinua.eus itxurarekin. Administrari eta erabiltzaileek helbide elektroniko gehiago eta birbidalketarako helbideak gehitu ditzakete geroago.",
"tools_webadmin_settings": "Administrazio-webgunearen ezarpenak",
"tip_about_user_email": "Erabiltzaileak sortzerakoan ePosta helbide bat (eta XMPP kontu bat) esleitzen zaie erabiltzailea@domeinua.eus itxurarekin. Administratzaile eta erabiltzaileek helbide elektroniko gehiago eta birbidalketarako helbideak gehitu ditzakete geroago.",
"tools_webadmin_settings": "Administrazio-gunearen ezarpenak",
"user_mailbox_use": "Posta elektronikorako erabilitako espazioa",
"users_new": "Erabiltzaile berria",
"users_import_csv_file_desc": "CSV fitxategia UTF-8 izan beharko litzateke eta zutabe hauek izan: erabiltzaile izena, pasahitza, taldeak, posta elektronikoa eta espazio kuota. Adibidez <a href='/yunohost/api/users/export' target='_BLANK'>erabiltzaileen CSV fitxategia</a> esporta dezakezu eta fitxategia moldatu.",
@ -568,7 +568,7 @@
"yunohost_admin": "YunoHosten administratzailea",
"skip": "Gerorako utzi",
"stop": "Geldiarazi",
"user_interface_link": "Erabiltzaile-ataria",
"user_interface_link": "Erabiltzaileen ataria",
"user_username_edit": "Aldatu {name}(r)en kontua",
"text_selection_is_disabled": "Ezinezkoa da testua hautatzea. Erregistroa partekatu nahi baduzu, erregistro *osoa* partekatu 'Partekatu Yunopastekin' botoiaren bidez.<br/><small>Edo testua hautatu nahi baduzu, sakatu tekla hauek: ↓↓↑↑. </small>",
"certificate_manage": "Kudeatu SSL ziurtagiria",
@ -586,10 +586,10 @@
"manage_groups": "Kudeatu taldeak",
"tools_yunohost_settings": "YunoHosten ezarpenak",
"wrong_password_or_username": "Pasahitz edo erabiltzaile-izen okerra",
"important_yunohost_upgrade": "YunoHosten bertsio nagusi bat dago eskuragai. Zinez gomendagarria da eguneraketaren oharrak arretaz irakurtzea foroan bertsio-berritu baino lehen: <a href='https://forum.yunohost.org/tag/ynh_release'>Irakurri oharrak foroan</a>.",
"important_yunohost_upgrade": "YunoHosten bertsio nagusi bat dago eskuragai. Zinez gomendagarria da eguneraketaren oharrak arretaz irakurtzea foroan bertsio-berritu baino lehen: <a href='https://forum.yunohost.org/tag/ynh_release'>Irakurri oharrak foroan</a>",
"app": {
"installed_version": "Instalatutako bertsioa:",
"open_this_app": "Ireki aplikazio hau",
"open_this_app": "Ireki aplikazioa",
"antifeatures": "Aplikazio honek gogoko izan ez ditzakezun ezaugarriak ditu:",
"doc": {
"about": {
@ -660,13 +660,14 @@
},
"links": {
"admindoc": "Administrazioaren dokumentazio ofiziala",
"code": "Errepositorio ofiziala",
"package": "YunoHosten pakete-errepositorioa",
"code": "Kode-gordailu ofiziala",
"package": "YunoHosten pakete-gordailua",
"title": "Estekak",
"userdoc": "Erabiltzaileen dokumentazio ofiziala",
"website": "Webgune ofiziala",
"license": "Lizentzia",
"forum": "Aplikazio honi buruzko eztabaidak YunoHosten foroan"
"license": "Aplikazioaren lizentzia",
"forum": "Aplikazio honi buruzko eztabaidak YunoHosten foroan",
"package_license": "YunoHost paketearen lizentzia"
},
"potential_alternative_to": "Honen baliokide izan daiteke:",
"upgrade": {

View file

@ -14,7 +14,7 @@
"pending": "در حال پیش رفت",
"error": "ناموفّق"
},
"processing": "سرور در حال پردازش دستورات است..."
"processing": "سرور در حال پردازش دستورات است"
},
"all": "همه",
"administration_password": "رمز مدیریت",
@ -152,7 +152,7 @@
"app_info_default_desc": "دامنه ریشه را به این برنامه هدایت کنید ({domain}).",
"app_info_access_desc": "گروه ها / کاربرانی که در حال حاضر مجاز به دسترسی این برنامه هستند :",
"app_choose_category": "یک دسته را انتخاب کنید",
"api_waiting": "در انتظار پاسخ سِرورها...",
"api_waiting": "در انتظار پاسخ سِرورها",
"api_not_responding": "رابط کاربری سیستم YunoHost پاسخ نمی دهد، شاید 'yunohost-api' خاموش و یا راه اندازی مجدد شده؟",
"purge_user_data_warning": "پاکسازی داده های کاربر برگشت پذیر نیست. مطمئن باشید که می دانید چه می کنید!",
"purge_user_data_checkbox": "داده های {name} پاک شود؟ (با این کار محتوای فهرست های خانه و ایمیل آن حذف می شود.)",
@ -228,8 +228,8 @@
"select_none": "انتخاب هیچکدام",
"select_all": "انتخاب همه",
"search": {
"not_found": "{item} با معیارهای شما مطابقت دارد.",
"for": "جستجو برای {items} ..."
"not_found": "{items} با معیارهای شما مطابقت دارد.",
"for": "جستجو برای {items}"
},
"save": "ذخیره",
"running": "درحال اجرا",

View file

@ -11,7 +11,7 @@
"app_info_default_desc": "Uudelleen ohjaa verkkotunnuksen juuri tähän sovellukseen ({domain}).",
"app_info_access_desc": "Ryhmät / käyttäjät jolla on oikeus tähän sovellukseen:",
"app_choose_category": "Valitse kategoria",
"api_waiting": "Odotetaan palvelimen vastausta...",
"api_waiting": "Odotetaan palvelimen vastausta",
"api_not_responding": "YunoHost API ei vastaa. Ehkä 'yunohost-api' on kaatunut tai käynnsityi uudelleen?",
"api_not_found": "Näyttää siltä, että web-järjestelmänvalvoja yritti kysyä jotain, jota ei ole olemassa.",
"all_apps": "Kaikki sovellukset",
@ -38,10 +38,10 @@
"pending": "Käynnissä",
"error": "Epäonnistui"
},
"processing": "Palvelin käsittelee toimintoa.",
"partial_logs": "[...](Katso historiasta täydet logit)",
"processing": "Palvelin käsittelee toimintoa",
"partial_logs": "[](Katso historiasta täydet logit)",
"reconnecting": {
"title": "Yritetään kommunikoida palvelimen kanssa...",
"title": "Yritetään kommunikoida palvelimen kanssa",
"failed": "Näyttää siltä, että palvelin ei vastaa. Voit yrittää muodostaa yhteyden uudelleen tai yrittää suorittaa `systemctl restart yunohost-api` ssh:n kautta.",
"reason": {
"unknown": "Yhteys palvelimeen on suljettu tuntemattomasta syystä.",
@ -270,7 +270,7 @@
"human_routes": {
"apps": {
"change_label": "Vaihda label '{prevName}' labeliksi '{nextName}'",
"change_url": "Vaihda '{nimi}' URL-osoite",
"change_url": "Vaihda '{name}' URL-osoite",
"uninstall": "Poista sovellus '{name}'",
"update_config": "Päivitä sovelluksen '{name}' konfiguraatio",
"install": "Asenna sovellus '{name}'",
@ -336,7 +336,7 @@
"reboot": "Käynnistä palvelin uudelleen",
"firewall": {
"ports": "{action} portti {port} ({protocol}, {connection})",
"upnp": "{action UPnP"
"upnp": "{action} UPnP"
},
"reconnecting": "Yhdistetään uudelleen"
},
@ -453,7 +453,7 @@
"restart": "Käynnistä uudelleen",
"search": {
"not_found": "Kriteerejäsi vastaavia {items} löytyy. | On 1 {items}, joka vastaa kriteerejäsi. | On {items}, jotka vastaavat kriteerejäsi.",
"for": "Etsi {items}..."
"for": "Etsi {items}"
},
"skip": "Ohita",
"users_export": "Vie käyttäjiä",
@ -471,7 +471,7 @@
"group_format_name_help": "Voit käyttää aakkosnumeerisia merkkejä ja alleviivausmerkkejä",
"hook_data_xmpp": "XMPP-data",
"hook_data_xmpp_desc": "Huone- ja käyttäjäkonfiguraatiot, ladatut tiedostot",
"ignored": "{count] ignoorattu",
"ignored": "{count} ignoorattu",
"install_time": "Asennusaika",
"ipv4": "IPv4",
"users_no": "Ei käyttäjiä.",

View file

@ -2,8 +2,8 @@
"action": "Action",
"add": "Ajouter",
"administration_password": "Mot de passe d'administration",
"api_not_responding": "L'API YunoHost ne répond pas. Peut-être que 'yunohost-api' est en panne ou a été redémarré ?",
"app_info_access_desc": "Groupes / utilisateurs actuellement autorisés à accéder à cette application :",
"api_not_responding": "L'API YunoHost ne répond pas. Peut-être que 'yunohost-api' est en panne ou a été redémarré?",
"app_info_access_desc": "Groupes / comptes actuellement autorisés à accéder à cette application:",
"app_info_default_desc": "Redirige la racine du domaine vers cette application ({domain}).",
"app_info_uninstall_desc": "Supprimer cette application.",
"app_install_custom_no_manifest": "Aucun fichier manifest.json",
@ -17,18 +17,18 @@
"backup_content": "Contenu de la sauvegarde",
"backup_create": "Créer une sauvegarde",
"backup_new": "Nouvelle sauvegarde",
"begin": "C'est parti !",
"begin": "C'est parti!",
"both": "Les deux",
"check": "Vérification",
"close": "Fermer",
"confirm_app_default": "Voulez-vous vraiment définir cette application par défaut ?",
"confirm_change_maindomain": "Voulez-vous vraiment changer le domaine principal ?",
"confirm_delete": "Voulez-vous vraiment supprimer {name} ?",
"confirm_install_custom_app": "AVERTISSEMENT ! L'installation d'applications tierces peut compromettre l'intégrité et la sécurité de votre système. Vous ne devriez probablement PAS l'installer si vous ne savez pas ce que vous faites. Êtes-vous prêt à prendre ce risque ?",
"confirm_install_domain_root": "Êtes-vous sûr de vouloir installer cette application sur '/'? Vous ne pourrez installer aucune autre application sur {domain}",
"confirm_app_default": "Voulez-vous vraiment définir cette application par défaut?",
"confirm_change_maindomain": "Voulez-vous vraiment changer le domaine principal?",
"confirm_delete": "Voulez-vous vraiment supprimer {name}?",
"confirm_install_custom_app": "AVERTISSEMENT! L'installation d'applications tierces peut compromettre l'intégrité et la sécurité de votre système. Vous ne devriez probablement PAS l'installer si vous ne savez pas ce que vous faites. Voulez-vous vraiment prendre ce risque?",
"confirm_install_domain_root": "Voulez-vous vraiment installer cette application sur '/'? Vous ne pourrez installer aucune autre application sur {domain}",
"confirm_postinstall": "Vous êtes sur le point de lancer le processus de post-installation sur le domaine {domain}. Cela peut prendre du temps, *n'interrompez pas l'opération avant la fin*.",
"confirm_restore": "Voulez-vous vraiment restaurer {name} ?",
"confirm_uninstall": "Voulez-vous vraiment désinstaller {name} ?",
"confirm_restore": "Voulez-vous vraiment restaurer {name}?",
"confirm_uninstall": "Voulez-vous vraiment désinstaller {name}?",
"connection": "Connexion",
"created_at": "Crée le",
"custom_app_install": "Installer une application personnalisée",
@ -38,7 +38,7 @@
"disable": "Désactiver",
"dns": "DNS",
"domain_add": "Ajouter un domaine",
"domain_default_desc": "Les utilisateurs se connecteront au domaine par défaut.",
"domain_default_desc": "Le domaine par défaut est le domaine à partir duquel les personnes doivent se connecter.",
"domain_default_longdesc": "Ceci est votre domaine par défaut.",
"domain_delete_longdesc": "Supprimer ce domaine",
"domain_dns_config": "Configuration DNS",
@ -52,16 +52,16 @@
"firewall": "Pare-feu",
"home": "Accueil",
"hook_adminjs_group_configuration": "Configurations système",
"hook_conf_ldap": "Annuaire des utilisateurs",
"hook_conf_ldap": "Annuaire des comptes",
"hook_conf_ynh_certs": "Certificats SSL",
"hook_conf_ynh_settings": "Configurations de YunoHost",
"hook_conf_manually_modified_files": "Fichiers de configuration modifiés manuellement",
"hook_data_home": "Données des utilisateurs",
"hook_data_home_desc": "Données utilisateurs situées dans /home/USER",
"hook_data_home": "Données des comptes",
"hook_data_home_desc": "Données comptes situées dans /home/USER",
"hook_data_mail": "Courriels",
"hook_data_mail_desc": "Courriels (au format brut) stockés sur le serveur",
"hook_data_xmpp": "Données XMPP",
"hook_data_xmpp_desc": "Configurations des salons et des utilisateurs, fichiers téléversés",
"hook_data_xmpp_desc": "Configurations des salons et des comptes, fichiers téléversés",
"id": "ID",
"infos": "Info",
"install": "Installer",
@ -80,7 +80,7 @@
"mailbox_quota_placeholder": "Laissez vide ou à zéro pour désactiver.",
"manage_apps": "Gérer les applications",
"manage_domains": "Gérer les domaines",
"manage_users": "Gérer les utilisateurs",
"manage_users": "Gérer les comptes",
"multi_instance": "Peut être installée plusieurs fois",
"next": "Suivant",
"no": "Non",
@ -91,8 +91,8 @@
"path": "Chemin",
"port": "Port",
"ports": "Ports",
"postinstall_domain": "Il s'agit du premier nom de domaine lié à votre serveur YunoHost. C'est également celui qui servira pour le portail d'authentification. Il sera donc visible pour tous vos utilisateurs, choisissez-le avec soin.",
"postinstall_intro_1": "Félicitations ! YunoHost a été installé avec succès.",
"postinstall_domain": "Il s'agit du premier nom de domaine lié à votre serveur YunoHost. C'est également celui qui servira pour le portail d'authentification. Il sera donc visible pour tout le monde, choisissez-le avec soin.",
"postinstall_intro_1": "Félicitations! YunoHost a été installé avec succès.",
"postinstall_intro_2": "Deux étapes de configuration supplémentaires sont nécessaires pour activer les services de votre serveur.",
"postinstall_intro_3": "Vous pouvez obtenir plus d'informations en vous rendant sur <a href='//yunohost.org/postinstall' target='_blank'>la page de documentation appropriée</a>",
"previous": "Précédent",
@ -110,9 +110,9 @@
"status": "Statut",
"stop": "Arrêter",
"system": "Système",
"system_apps_nothing": "Toutes les applications sont à jour !",
"system_packages_nothing": "Tous les packages système sont à jour !",
"system_update": "Mettre à jour le système",
"system_apps_nothing": "Toutes les applications sont à jour!",
"system_packages_nothing": "Tous les packages système sont à jour!",
"system_update": "Mise à jour du système",
"system_upgrade_btn": "Mettre à jour",
"tcp": "TCP",
"tools": "Outils",
@ -127,31 +127,31 @@
"user_emailaliases": "Alias de courriel",
"user_emailforward": "Adresses de transfert",
"user_fullname": "Nom complet",
"user_interface_link": "Interface utilisateur",
"user_interface_link": "Portail",
"user_mailbox_quota": "Quota de la boite aux lettres",
"user_new_forward": "nouveau_transfert@domainedistant.org",
"user_username": "Nom d'utilisateur",
"user_username": "Nom de compte",
"user_username_edit": "Éditer le compte de {name}",
"users": "Utilisateurs",
"users_new": "Nouvel utilisateur",
"users_no": "Aucun utilisateur.",
"users": "Comptes",
"users_new": "Nouveau compte",
"users_no": "Aucun compte.",
"yes": "Oui",
"form_input_example": "Exemple : {example}",
"form_input_example": "Exemple: {example}",
"footer_version": "Propulsé par <a href='https://yunohost.org'>YunoHost</a> {version} ({repo}).",
"certificate_manage": "Gérer les certificats SSL",
"certificate": "Certificat",
"user_mailbox_use": "Espace utilisé de la boite aux lettres",
"confirm_firewall_allow": "Êtes-vous sûr de vouloir ouvrir le port {port} (protocole : {protocol}, connexion : {connection})",
"confirm_firewall_disallow": "Êtes-vous sûr de vouloir fermer le port {port} (protocole : {protocol}, connexion : {connection})",
"confirm_service_start": "Voulez-vous vraiment démarrer {name} ?",
"confirm_service_stop": "Voulez-vous vraiment arrêter {name} ?",
"confirm_update_apps": "Voulez-vous vraiment mettre à jour toutes les applications ?",
"confirm_upnp_enable": "Voulez-vous vraiment activer l'UPnP ?",
"confirm_upnp_disable": "Voulez-vous vraiment désactiver l'UPnP ?",
"confirm_firewall_allow": "Voulez-vous vraiment ouvrir le port {port}? (protocole: {protocol}, connexion: {connection})",
"confirm_firewall_disallow": "Voulez-vous vraiment fermer le port {port}? (protocole: {protocol}, connexion: {connection})",
"confirm_service_start": "Voulez-vous vraiment démarrer {name}?",
"confirm_service_stop": "Voulez-vous vraiment arrêter {name}?",
"confirm_update_apps": "Voulez-vous vraiment mettre à jour toutes les applications?",
"confirm_upnp_enable": "Voulez-vous vraiment activer l'UPnP?",
"confirm_upnp_disable": "Voulez-vous vraiment désactiver l'UPnP?",
"domain_dns_conf_is_just_a_recommendation": "Cette section montre la configuration *recommandée*. Elle ne configure *pas* le DNS pour vous. Il est de votre responsabilité de configurer votre zone DNS, généralement depuis l'interface web de votre fournisseur de nom de domaine (registrar) en fonction de cette configurer recommandée.",
"confirm_reboot_action_reboot": "Êtes vous sûr de vouloir redémarrer votre serveur ?",
"confirm_reboot_action_shutdown": "Êtes vous sûr de vouloir éteindre votre serveur ?",
"confirm_update_specific_app": "Êtes vous sûr de vouloir mettre à jour {app} ?",
"confirm_reboot_action_reboot": "Voulez-vous vraiment redémarrer votre serveur?",
"confirm_reboot_action_shutdown": "Voulez-vous vraiment éteindre votre serveur?",
"confirm_update_specific_app": "Voulez-vous vraiment mettre à jour {app}?",
"ok": "OK",
"system_upgrade_all_applications_btn": "Mettre à jour toutes les applications",
"system_upgrade_all_packages_btn": "Mettre à jour tous les paquets",
@ -162,8 +162,8 @@
"tools_shutdown_reboot": "Arrêter/Redémarrer",
"app_info_changeurl_desc": "Modifier lURL daccès de cette application (domaine et/ou chemin).",
"app_info_change_url_disabled_tooltip": "Cette fonctionnalité na pas encore été implémentée pour cette application",
"confirm_app_change_url": "Voulez-vous vraiment modifier lURL daccès de cette application ?",
"confirm_migrations_skip": "Ne pas appliquer les migrations nest pas recommandé. Voulez-vous vraiment le faire ?",
"confirm_app_change_url": "Voulez-vous vraiment modifier lURL daccès de cette application?",
"confirm_migrations_skip": "Ne pas appliquer les migrations nest pas recommandé. Voulez-vous vraiment le faire?",
"migrations": "Migrations",
"migrations_pending": "Migrations en attente",
"migrations_done": "Migrations précédentes",
@ -172,12 +172,12 @@
"run": "Exécuter",
"skip": "Passer",
"all_apps": "Toutes les applications",
"confirm_install_app_lowquality": "Avertissement : cette application peut fonctionner mais nest pas bien intégrée dans YunoHost. Certaines fonctionnalités telles que lauthentification unique et la sauvegarde/restauration pourraient ne pas être disponibles.",
"confirm_install_app_inprogress": "AVERTISSEMENT ! Cette application est encore expérimentale et risque de casser votre système ! Vous ne devriez probablement PAS linstaller si vous ne savez pas ce que vous faites. Voulez-vous vraiment prendre ce risque ?",
"error_connection_interrupted": "Le serveur a fermé la connexion au lieu dy répondre. Est-ce que NGINX ou yunohost-api ont été redémarrés ou arrêtés pour une raison quelconque ?",
"experimental_warning": "Attention : cette fonctionnalité est expérimentale et ne doit pas être considérée comme stable, vous ne devriez pas lutiliser à moins que vous ne sachiez ce que vous faites...",
"good_practices_about_admin_password": "Vous êtes sur le point de définir un nouveau mot de passe administrateur. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et/ou d'utiliser une combinaison de caractères (majuscules, minuscules, chiffres et caractères spéciaux).",
"good_practices_about_user_password": "Vous êtes sur le point de définir un nouveau mot de passe utilisateur. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et/ou une combinaison de caractères (majuscules, minuscules, chiffres et caractères spéciaux).",
"confirm_install_app_lowquality": "Avertissement: cette application peut fonctionner mais nest pas bien intégrée dans YunoHost. Certaines fonctionnalités telles que lauthentification unique et la sauvegarde/restauration pourraient ne pas être disponibles.",
"confirm_install_app_inprogress": "AVERTISSEMENT! Cette application est encore expérimentale et risque de casser votre système! Vous ne devriez probablement PAS linstaller si vous ne savez pas ce que vous faites. Voulez-vous vraiment prendre ce risque?",
"error_connection_interrupted": "Le serveur a fermé la connexion au lieu dy répondre. Est-ce que NGINX ou yunohost-api ont été redémarrés ou arrêtés pour une raison quelconque?",
"experimental_warning": "Attention: cette fonctionnalité est expérimentale et ne doit pas être considérée comme stable, vous ne devriez pas lutiliser à moins que vous ne sachiez ce que vous faites.",
"good_practices_about_admin_password": "Vous êtes sur le point de définir un nouveau mot de passe de compte d'administration. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et/ou d'utiliser une combinaison de caractères (majuscules, minuscules, chiffres et caractères spéciaux).",
"good_practices_about_user_password": "Vous êtes sur le point de définir un nouveau mot de passe. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et/ou une combinaison de caractères (majuscules, minuscules, chiffres et caractères spéciaux).",
"only_working_apps": "Applications fonctionnelles uniquement",
"logs": "Journaux",
"logs_operation": "Opérations effectuées sur le système avec YunoHost",
@ -195,39 +195,39 @@
"logs_context": "Contexte",
"logs_share_with_yunopaste": "Partager les logs avec YunoPaste",
"logs_more": "Afficher plus de lignes",
"purge_user_data_checkbox": "Purger les données de l'utilisateur {name} ? (Cela supprimera ses e-mails et le contenu de son dossier personnel)",
"purge_user_data_warning": "La purge des données de lutilisateur est irréversible. Assurez-vous de savoir ce que vous faites !",
"purge_user_data_checkbox": "Purger les données du compte {name}? (Cela supprimera ses e-mails et le contenu de son dossier personnel)",
"purge_user_data_warning": "La purge des données de compte est irréversible. Assurez-vous de savoir ce que vous faites!",
"version": "Version",
"confirm_update_system": "Voulez-vous vraiment mettre à jour tous les paquets système ?",
"app_state_inprogress_explanation": "Le mainteneur de cette application a déclaré que celle-ci n'est pas prête pour un environnement de production. SOYEZ PRUDENT·E !",
"confirm_update_system": "Voulez-vous vraiment mettre à jour tous les paquets système?",
"app_state_inprogress_explanation": "Le mainteneur de cette application a déclaré que celle-ci n'est pas prête pour un environnement de production. FAITES PREUVE DE PRUDENCE!",
"app_state_highquality_explanation": "Cette application est bien intégrée à YunoHost depuis au moins un an.",
"license": "Licence",
"only_highquality_apps": "Seulement les applications de bonne qualité",
"only_decent_quality_apps": "Seulement les applications d'une qualité satisfaisante",
"orphaned": "Non maintenue",
"orphaned_details": "Cette application n'a pas été maintenue depuis un certain temps. Il peut encore fonctionner, mais ne recevra aucune mise à niveau jusqu'à ce que quelqu'un se porte volontaire pour s'en occuper. N'hésitez pas à contribuer à la faire revivre !",
"orphaned_details": "Cette application n'a pas été maintenue depuis un certain temps. Elle peut encore fonctionner, mais ne recevra aucune mise à niveau jusqu'à ce que quelqu'un se porte volontaire pour s'en occuper. N'hésitez pas à contribuer à la faire revivre!",
"from_to": "de {0} à {1}",
"group_name": "Nom du groupe",
"nobody": "Personne",
"group": "Groupe",
"group_all_users": "Tous les utilisateurs",
"group_all_users": "Tous les comptes",
"group_visitors": "Visiteurs",
"group_format_name_help": "Vous pouvez utiliser des caractères alphanumériques et des tirets bas",
"group_add_member": "Ajouter un utilisateur",
"group_add_member": "Ajouter un compte",
"group_add_permission": "Ajouter une permission",
"group_new": "Nouveau groupe",
"group_explain_all_users": "Ceci est un groupe spécial contenant tous les comptes d'utilisateurs sur le serveur",
"group_explain_all_users": "Ceci est un groupe spécial contenant tous les comptes des personnes inscrites sur le serveur",
"group_explain_visitors": "Ceci est un groupe spécial représentant les visiteurs anonymes",
"group_specific_permissions": "Autorisations pour des utilisateurs individuels",
"group_specific_permissions": "Autorisations pour des comptes individuels",
"groups_and_permissions": "Groupes et autorisations",
"groups_and_permissions_manage": "Gérer les groupes et les autorisations",
"permissions": "Permissions",
"rerun_diagnosis": "Relancer le diagnostic",
"details": "Détails",
"everything_good": "Tout est OK !",
"everything_good": "Tout est OK!",
"ignore": "Ignore",
"ignored": "{count} ignoré",
"last_ran": "Dernière exécution :",
"last_ran": "Dernière exécution:",
"unignore": "Cesser d'ignorer",
"warnings": "{count} avertissements",
"words": {
@ -246,18 +246,18 @@
"app_state_lowquality_explanation": "Cette application peut être fonctionnelle, mais peut toujours contenir des problèmes, ou n'est pas entièrement intégrée à YunoHost, ou elle ne respecte pas les bonnes pratiques.",
"catalog": "Catalogue",
"others": "Autres",
"diagnosis_first_run": "La fonctionnalité de diagnostic va tenter de trouver certains problèmes communs sur différents aspects de votre serveur pour être sûr que tout fonctionne normalement. Merci de ne pas paniquer si vous voyez une multitude d'erreurs après avoir configuré votre serveur : la fonctionnalité est précisément prévue pour les identifier et vous aider à les résoudre. Le diagnostic sera également effectué deux fois par jour et enverra un courriel à l'administrateur si des erreurs sont détectées.",
"diagnosis_first_run": "La fonctionnalité de diagnostic va tenter de trouver certains problèmes communs sur différents aspects de votre serveur pour être sûr que tout fonctionne normalement. Merci de ne pas paniquer si vous voyez une multitude d'erreurs après avoir configuré votre serveur: la fonctionnalité est précisément prévue pour les identifier et vous aider à les résoudre. Le diagnostic sera également effectué deux fois par jour et enverra un courriel au compte administrateur si des erreurs sont détectées.",
"run_first_diagnosis": "Démarrer le diagnostic initial",
"confirm_service_restart": "Êtes-vous certain de vouloir redémarrer {name} ?",
"confirm_service_restart": "Voulez-vous vraiment redémarrer {name}?",
"restart": "Redémarrer",
"group_explain_visitors_needed_for_external_client": "Veillez à ce que certaines applications soient autorisées pour les visiteurs si vous avez l'intention de les utiliser avec des clients externes. Par exemple, c'est le cas pour Nextcloud si vous souhaitez utiliser un client de synchronisation sur votre smartphone ou ordinateur de bureau.",
"issues": "{count} problèmes",
"operation_failed_explanation": "L'opération a échoué ! Veuillez-nous excuser pour ça :( Vous pouvez essayer de <a href='https://yunohost.org/help'>demander de l'aide</a>. Merci de fournir *le log complet* de l'opération pour les personnes qui vont vous aider. Vous pouvez cliquer sur le bouton vert 'Partager avec Yunopaste'. Quand vous partagez les logs, YunoHost essaie automatiquement d'anonymiser les informations privées comme le nom de domaine et l'adresses IP.",
"diagnosis_explanation": "La fonctionnalité de diagnostic va tenter de trouver certains problèmes communs sur différents aspects de votre serveur pour être sûr que tout fonctionne normalement. Le diagnostic sera également effectué deux fois par jour et enverra un courriel à l'administrateur si des erreurs sont détectées. À noter que certains tests ne seront pas montrés si vous n'utilisez pas certaines fonctions spécifiques (XMPP, par exemple) ou s'ils échouent à cause d'une configuration trop complexe. Dans ce cas, et si vous savez ce que vous avez modifié, vous pouvez ignorer les problèmes et les avertissements correspondantes.",
"operation_failed_explanation": "L'opération a échoué! Veuillez-nous excuser pour ça:( Vous pouvez essayer de <a href='https://yunohost.org/help'>demander de l'aide</a>. Merci de fournir *le log complet* de l'opération pour les personnes qui vont vous aider. Vous pouvez cliquer sur le bouton vert 'Partager avec Yunopaste'. Quand vous partagez les logs, YunoHost essaie automatiquement d'anonymiser les informations privées comme le nom de domaine et l'adresses IP.",
"diagnosis_explanation": "La fonctionnalité de diagnostic va tenter de trouver certains problèmes communs sur différents aspects de votre serveur pour être sûr que tout fonctionne normalement. Le diagnostic sera également effectué deux fois par jour et enverra un courriel au compte administrateur si des erreurs sont détectées. À noter que certains tests ne seront pas montrés si vous n'utilisez pas certaines fonctions spécifiques (XMPP, par exemple) ou s'ils échouent à cause d'une configuration trop complexe. Dans ce cas, et si vous savez ce que vous avez modifié, vous pouvez ignorer les problèmes et les avertissements correspondantes.",
"pending_migrations": "Il y a des migrations en attente d'exécution. Veuillez aller dans <a href='#/tools/migrations'>Outils > Migrations</a> pour les exécuter.",
"tip_about_user_email": "Les utilisateurs sont créés avec une adresse email associée (et un compte XMPP) au format username@domain.tld. Des alias d'email et des transferts d'emails supplémentaires peuvent être ajoutés ultérieurement par l'administrateur et l'utilisateur.",
"tip_about_user_email": "Les comptes sont créés avec une adresse email associée (et un compte XMPP) au format username@domain.tld. Des alias d'email et des transferts d'emails supplémentaires peuvent être ajoutés ultérieurement par les personnes administrant le serveur ainsi celles ayant accès au compte lui même.",
"logs_suboperations": "Sous-opérations",
"permission_show_tile_enabled": "Visible en tuile dans le portail utilisateur",
"permission_show_tile_enabled": "Visible en tuile dans le portail YunoHost",
"permission_main": "Label principal",
"permission_corresponding_url": "URL correspondante",
"app_manage_label_and_tiles": "Gérer les étiquettes et les tuiles",
@ -279,7 +279,7 @@
},
"search": {
"not_found": "Il y a des {items} qui correspondent à vos critères. | Il y a un {items} qui correspond à vos critères. | Il y a des {items} qui correspondent à vos critères.",
"for": "Rechercher {items}..."
"for": "Rechercher {items}"
},
"readme": "Lisez-moi",
"postinstall_set_domain": "Définir le domaine principal",
@ -298,7 +298,7 @@
"mailbox_quota_example": "700 M correspond à un CD, 4 700 M correspond à un DVD",
"items_verbose_count": "Il n'y a {items}. | Il y a un {items}. | Il y a des {items}.",
"items": {
"users": "aucun utilisateur | utilisateur | {c} utilisateurs",
"users": "aucun compte | compte | {c} comptes",
"services": "aucun service | service | {c} services",
"logs": "aucun historique/log | log | {c} logs",
"installed_apps": "aucune application installée | application installée | {c} applications installées",
@ -315,7 +315,7 @@
"POST": "créer/exécuter",
"GET": "lire"
},
"last_action": "Dernière action :",
"last_action": "Dernière action:",
"title": "Historique",
"is_empty": "Rien dans l'historique pour le moment."
},
@ -324,14 +324,14 @@
"passwordMatch": "Les mots de passe ne correspondent pas.",
"passwordLenght": "Le mot de passe doit comporter au moins 8 caractères.",
"number": "La valeur doit être un nombre.",
"notInUsers": "L'utilisateur '{value}' existe déjà.",
"notInUsers": "Le compte '{value}' existe déjà.",
"minValue": "La valeur doit être un nombre égal ou supérieur à {min}.",
"name": "Les noms ne peuvent pas comporter de caractères spéciaux, sauf <code> ,.'-</code>",
"appRepoUrl": "Les URLs de dêpôt d'app YunoHost doivent ressembler à https://domain.tld/path/to/repo_ynh",
"emailForward": "Adresse de transfert de courrier électronique invalide : elle doit être composée de caractères alphanumérique et de <code>_.-+</code> seulement (par exemple, someone+tag@example.com, s0me-1+tag@example.com)",
"email": "Adresse de courriel invalide : elle doit être composée de caractères alphanumérique et des caractères <code>_.-</code> seulement (par exemple someone@example.com, s0me-1@example.com)",
"dynDomain": "Nom de domaine invalide : Il doit être composé de minuscules alphanumériques et de tirets uniquement",
"domain": "Nom de domaine invalide : Il doit être composé de minuscules alphanumériques, de points et de tirets uniquement",
"emailForward": "Adresse de transfert de courrier électronique invalide: elle doit être composée de caractères alphanumérique et de <code>_.-+</code> seulement (par exemple, someone+tag@example.com, s0me-1+tag@example.com)",
"email": "Adresse de courriel invalide: elle doit être composée de caractères alphanumérique et des caractères <code>_.-</code> seulement (par exemple someone@example.com, s0me-1@example.com)",
"dynDomain": "Nom de domaine invalide: Il doit être composé de minuscules alphanumériques et de tirets uniquement",
"domain": "Nom de domaine invalide: Il doit être composé de minuscules alphanumériques, de points et de tirets uniquement",
"between": "La valeur doit être comprise entre {min} et {max}.",
"alpha": "La chaîne de caractères ne doit contenir que des lettres.",
"alphalownumdot_": "La chaîne de caractères doit être composé uniquement de caractères alphanumériques minuscules, de points et de tirets bas (aussi appelé tiret du 8 ou underscore).",
@ -342,7 +342,7 @@
},
"footer": {
"donate": "Faire un don",
"help": "Besoin d'aide ?",
"help": "Besoin d'aide?",
"documentation": "Documentation"
},
"experimental": "Expérimental",
@ -353,7 +353,7 @@
"disabled": "Désactivé",
"dead": "Inactif",
"day_validity": " Expiré | 1 jour | {count} jours",
"confirm_app_install": "Êtes-vous sûr de vouloir installer cette application ?",
"confirm_app_install": "Voulez-vous vraiment installer cette application?",
"common": {
"lastname": "Nom de famille",
"firstname": "Prénom"
@ -362,7 +362,7 @@
"cancel": "Annuler",
"app_show_categories": "Afficher les catégories",
"app_choose_category": "Choisissez une catégorie",
"api_waiting": "Attente de la réponse du serveur...",
"api_waiting": "Attente de la réponse du serveur",
"api_errors_titles": {
"APIConnexionError": "YunoHost a rencontré une erreur de connexion",
"APINotRespondingError": "L'API YunoHost ne répond pas",
@ -373,11 +373,11 @@
},
"api_error": {
"sorry": "Vraiment désolé de cela.",
"info": "Les informations suivantes peuvent être utiles à la personne qui vous aide :",
"info": "Les informations suivantes peuvent être utiles à la personne qui vous aide:",
"help": "Vous devez chercher de l'aide sur <a href=\"https://forum.yunohost.org/\"> le forum</a> ou <a href=\"https://chat.yunohost.org/\">le chat</a> pour corriger la situation, ou signaler le bug sur <a href=\"https://github.com/YunoHost/issues\"> le bugtracker</a>.",
"error_message": "Message d'erreur :",
"error_message": "Message d'erreur:",
"view_error": "Afficher l'erreur",
"server_said": "Pendant le traitement de l'action, le serveur a dit :"
"server_said": "Pendant le traitement de l'action, le serveur a dit:"
},
"address": {
"local_part_description": {
@ -389,7 +389,7 @@
"domain": "Choisissez un domaine."
}
},
"api_not_found": "L'administrateur a essayé d'accéder à quelque chose qui n'existe pas.",
"api_not_found": "Il semblerait que l'interface d'administration web ait essayé d'accéder à quelque chose qui n'existe pas.",
"api": {
"query_status": {
"error": "Échec",
@ -397,18 +397,18 @@
"warning": "Terminé avec succès avec des erreurs ou des alertes",
"pending": "En cours"
},
"processing": "Le serveur traite l'action...",
"partial_logs": "[...] ( voir l'historique pour les logs complets)",
"processing": "Le serveur traite l'action",
"partial_logs": "[…] (voir l'historique pour consulter les logs complets)",
"reconnecting": {
"title": "Tentative de communication avec le serveur...",
"title": "Tentative de communication avec le serveur",
"failed": "Le serveur ne répond pas. Vous pouvez essayer de vous reconnecter ou essayer d'exécuter `systemctl restart yunohost-api` via SSH.",
"reason": {
"unknown": "La connexion avec le serveur a été fermée pour des raisons inconnues.",
"reboot": "Votre serveur redémarre et ne sera pas joignable pendant un certain temps. Une invite de connexion sera disponible dès que le serveur sera accessible.",
"shutdown": "Votre serveur est en cours d'extinction et n'est plus joignable. Redémarrez-le et une invitation de connexion sera disponible dès que le serveur sera joignable.",
"upgrade_system": "La connexion avec le serveur a été fermée en raison de la mise à jour de YunoHost. Il vous faut patienter jusqu'à ce que le serveur soit à nouveau joignable …"
"upgrade_system": "La connexion avec le serveur a été fermée en raison de la mise à jour de YunoHost. Il vous faut patienter jusqu'à ce que le serveur soit à nouveau joignable…"
},
"success": "Le serveur est maintenant joignable ! Vous pouvez essayer de vous connecter"
"success": "Le serveur est maintenant joignable! Vous pouvez essayer de vous connecter"
}
},
"go_back": "Revenir",
@ -416,15 +416,15 @@
"force": "Forcer la post-installation",
"title": "Post-installation",
"user": {
"title": "Création du premier utilisateur (administrateur)",
"first_user_help": "Cet utilisateur se verra accorder des privilèges d'administrateur et sera autorisé à se connecter à cette interface d'administration ainsi que directement au serveur via SSH.\nComme il s'agit d'un utilisateur normal, vous pourrez également vous connecter au portail utilisateur (SSO) avec ses informations d'identification.\nUne fois la post-installation terminée, vous pourrez créer d'autres utilisateurs administrateurs en les ajoutant au groupe 'admins'."
"title": "Création du premier compte d'administration",
"first_user_help": "Ce compte se verra accorder des privilèges d'administration et sera autorisé à se connecter à cette interface d'administration ainsi que directement au serveur via SSH.\nComme il s'agit d'un compte normal, il pourra également se connecter au portail YunoHost (SSO) avec ses informations d'identification.\nUne fois la post-installation terminée, vous pourrez créer d'autres comptes d'administration en les ajoutant au groupe 'admins'."
}
},
"human_routes": {
"users": {
"update": "Mettre à jour l'utilisateur '{name}'",
"delete": "Supprimer l'utilisateur '{name}'",
"create": "Créer l'utilisateur '{name}'"
"update": "Mettre à jour le compte '{name}'",
"delete": "Supprimer le compte '{name}'",
"create": "Créer le compte '{name}'"
},
"upgrade": {
"app": "Mettre à jour l'application '{app}'",
@ -501,17 +501,17 @@
}
},
"items_verbose_items_left": "Il reste des {items}. | Il reste un {items}. | Il reste des {items}.",
"confirm_group_add_access_permission": "Voulez-vous vraiment accorder l'accès à {perm} à {name} ? Un tel accès augmente considérablement la surface d'attaque si {name} se trouve être une personne malveillante. Vous ne devriez le faire que si vous FAITES CONFIANCE à cette personne/ ce groupe.",
"users_import": "Importer des utilisateurs",
"users_export": "Exporter les utilisateurs",
"confirm_group_add_access_permission": "Voulez-vous vraiment accorder l'accès à {perm} à {name}? Un tel accès augmente considérablement la surface d'attaque si {name} se trouve être une personne malveillante. Vous ne devriez le faire que si vous FAITES CONFIANCE à cette personne/ ce groupe.",
"users_import": "Importer des comptes",
"users_export": "Exporter les comptes",
"users_import_csv_file": "Fichier CSV",
"users_import_update": "Mettre à jour les utilisateurs existants",
"users_import_delete": "Supprimer les utilisateurs non répertoriés",
"users_import_update_desc": "Si coché, tous les utilisateurs existants contenus dans le fichier CSV seront mis à jour avec les nouvelles valeurs",
"users_import_delete_desc": "Si coché, tous les utilisateurs existants qui ne sont pas dans le fichier CSV seront supprimés (et purgés).",
"users_import_confirm_destructive": "Êtes-vous sûr de vouloir supprimer les utilisateurs qui ne sont pas présents dans ce fichier ?",
"users_import_delete_others": "Supprimer les utilisateurs non répertoriés",
"users_import_csv_file_desc": "Le fichier CSV doit être au format UTF-8 et avec les colonnes nom d'utilisateur, mot de passe, groupes, email et quota. Pour un exemple d'importation de fichier CSV, vous pouvez <a href='/yunohost/api/users/export' target='_BLANK'>exporter vos utilisateurs dans un fichier CSV</a> et modifier le fichier.",
"users_import_update": "Mettre à jour les comptes existants",
"users_import_delete": "Supprimer les comptes non répertoriés",
"users_import_update_desc": "Si coché, tous les comptes existants contenus dans le fichier CSV seront mis à jour avec les nouvelles valeurs",
"users_import_delete_desc": "Si coché, tous les comptes existants qui ne sont pas dans le fichier CSV seront supprimés (et purgés).",
"users_import_confirm_destructive": "Voulez-vous vraiment supprimer les comptes qui ne sont pas présents dans ce fichier?",
"users_import_delete_others": "Supprimer les comptes non répertoriés",
"users_import_csv_file_desc": "Le fichier CSV doit être au format UTF-8 et avec les colonnes nom de compte, mot de passe, groupes, email et quota. Pour un exemple d'importation de fichier CSV, vous pouvez <a href='/yunohost/api/users/export' target='_BLANK'>exporter vos comptes dans un fichier CSV</a> et modifier le fichier.",
"yunohost_admin": "YunoHost Admin",
"domain": {
"config": {
@ -520,14 +520,14 @@
},
"dns": {
"auto_config": "Configuration automatique des enregistrements DNS",
"auto_config_ok": "La configuration automatique semble être OK !",
"auto_config_ok": "La configuration automatique semble être OK!",
"auto_config_zone": "Zone DNS actuelle",
"edit": "Modifier la configuration DNS",
"info": "La configuration automatique des enregistrements DNS est une fonctionnalité expérimentale. <br>Envisagez de sauvegarder votre zone DNS actuelle à partir de l'interface de votre registraire DNS avant de transférer les enregistrements à partir d'ici.",
"manual_config": "Enregistrements DNS suggérés pour la configuration manuelle",
"push_force": "Écraser les enregistrements existants",
"push_force_warning": "Il semble que certains enregistrements DNS que YunoHost aurait définis soient déjà dans la configuration du registrar. Vous pouvez utiliser l'option d'écrasement si vous savez ce que vous faites.",
"push_force_confirm": "Êtes-vous sûr de vouloir forcer tous les enregistrements DNS suggérés ? Sachez qu'il peut écraser manuellement ou des enregistrements par défaut importants définis par vous ou votre registrar.",
"push_force_confirm": "Voulez-vous vraiment forcer tous les enregistrements DNS suggérés? Sachez que cela peut écraser une configuration manuelle ou des enregistrements par défaut importants définis par vous ou votre registrar.",
"auto_config_ignored": "ignoré, ne sera pas modifié par YunoHost sauf si vous cochez l'option d'écrasement",
"push": "Envoyer les enregistrements DNS vers le registrar",
"methods": {
@ -547,13 +547,13 @@
"valid_for": "valable pendant {days}"
},
"explain": {
"main_domain": "Le domaine principal est le domaine à partir duquel les utilisateurs peuvent se connecter au portail (via \"{domain}/yunohost/sso\").<br>Il n'est donc pas possible de le supprimer.<br>Si vous voulez supprimer \"{domain}\", vous devrez d'abord choisir ou ajouter un autre domaine et le définir comme domaine principal."
"main_domain": "Le domaine principal est le domaine à partir duquel les personnes peuvent se connecter au portail (via \"{domain}/yunohost/sso\").<br>Il n'est donc pas possible de le supprimer.<br>Si vous voulez supprimer \"{domain}\", vous devrez d'abord choisir ou ajouter un autre domaine et le définir comme domaine principal."
},
"info": {
"apps_on_domain": "Applications installées sur le domaine",
"certificate_authority": "Autorité de certification SSL",
"registrar": "Registraire de nom de domaine",
"dyn_dns_remove_and_unsubscribe": "Annuler également l'enregistrement du domaine du service dyndns de YunoHost"
"dyn_dns_remove_and_unsubscribe": "Annuler également l'enregistrement du domaine du service DynDNS de YunoHost"
},
"see_parent_domain": "Voir le domaine parent",
"types": {
@ -566,47 +566,48 @@
"dyn_dns_password": "Mot de passe de récupération du domaine",
"dyn_dns_password_desc": "Ce mot de passe vous permettra de récupérer ultérieurement le contrôle du domaine si vous réinstallez votre système. Si vous avez déjà enregistré ce domaine auparavant, utilisez votre mot de passe de récupération ici pour le récupérer.",
"from_local": "Je veux un domaine pour un usage local / test uniquement",
"from_local_desc": "Si vous ne souhaitez pas un nom de domaine public \"réel\", vous pouvez utiliser n'importe quel nom se terminant par <code>.local</code> or <code>.test</code>.\nLes noms de domaine se terminant par <code>.local</code> sont particuliers en ce sens qu'ils peuvent être automatiquement résolus sur le réseau local, en supposant que les clients prennent en charge le protocole Bonjour. Il est également possible que vous deviez modifier le paramètre du fichier <code>/etc/hosts</code> (ou équivalent sous Windows) sur chaque client à partir duquel vous souhaitez utiliser ce domaine, ou de configurer des entrées DNS locales sur votre routeur internet.",
"from_local_desc": "Si vous ne souhaitez pas un nom de domaine public \"réel\", vous pouvez utiliser n'importe quel nom se terminant par <code>.local</code> or <code>.test</code>. Les noms de domaine se terminant par <code>.local</code> sont particuliers en ce sens qu'ils peuvent être automatiquement résolus sur le réseau local, en supposant que les clients prennent en charge le protocole Bonjour. Il est également possible que vous deviez modifier le paramètre du fichier <code>/etc/hosts</code> (ou équivalent sous Windows) sur chaque client à partir duquel vous souhaitez utiliser ce domaine, ou de configurer des entrées DNS locales sur votre routeur internet.",
"from_registrar": "Je veux ajouter un domaine que je possède, ou un sous-domaine",
"from_yunohost": "Je ne possède pas de domaine, je veux enregistrer/utiliser un domaine DynDNS gratuit fourni par le projet YunoHost"
}
},
"domain_dns_push_failed_to_authenticate": "Échec de l'authentification sur l'API du registraire. Très probablement les <a href='#/domains/{domain}/config'>informations d'identification</a> sont incorrectes ? (Erreur : {error})",
"domain_dns_push_failed_to_authenticate": "Échec de l'authentification sur l'API du registrar. Les <a href='#/domains/{domain}/config'>informations d'identification</a> sont elles justes? (Erreur: {error})",
"domain_dns_push_managed_in_parent_domain": "La fonctionnalité d'enregistrement DNS automatique est gérée dans le domaine parent <a href='#/domains/{parent_domain}/dns'>{parent_domain}</a>.",
"domain_dns_push_not_applicable": "La fonctionnalité d'enregistrements DNS automatiques n'est pas applicable au domaine {domain},<br> Vous devez configurer manuellement vos enregistrements DNS en suivant la <a href='https://yunohost.org/dns'>documentation</a> et les suggestions configuration ci-dessous.",
"text_selection_is_disabled": "La sélection du texte est désactivée. Si vous voulez partager ce log *complet*, vous pouvez le faire en cliquant sur le bouton 'Partager avec Yunopaste'.<br/><small>Ou, si vous voulez vraiment vraiment sélectionner du texte, appuyez sur ces touches : ↓↓↑↑.</small>",
"text_selection_is_disabled": "La sélection du texte est désactivée. Si vous voulez partager ce log *complet*, vous pouvez le faire en cliquant sur le bouton 'Partager avec Yunopaste'.<br/><small>Ou, si vous voulez vraiment vraiment sélectionner du texte, appuyez sur ces touches: ↓↓↑↑.</small>",
"retry": "Retenter",
"important_yunohost_upgrade": "Une mise à jour majeure de YunoHost est disponible. Il est fortement recommandé de lire attentivement les notes de mise à jour sur le forum avant de procéder à celle-ci : <a href='https://forum.yunohost.org/tag/ynh_release'>Consultez les notes de mise à jour sur le forum.</a>",
"important_yunohost_upgrade": "Une mise à jour majeure de YunoHost est disponible. Il est fortement recommandé de lire attentivement les notes de mise à jour sur le forum avant de procéder à celle-ci: <a href='https://forum.yunohost.org/tag/ynh_release'>Consultez les notes de mise à jour sur le forum.</a>",
"app_state_broken": "Cassée",
"app_state_broken_explanation": "Cette application est actuellement cassée et ne peut être installée selon les contrôles automatiques de YunoHost",
"details_about": "Afficher plus de détails sur {subject}",
"group_admins": "Administrateurs",
"group_explain_admins": "Il s'agit d'un groupe spécial correspondant aux utilisateurs dits administrateurs. Les utilisateurs de ce groupe ont, pour faire simple, tous les droits sur le serveur (modification, création, ajout et suppression). Ils peuvent donc accéder à l'administration en ligne de YunoHost (panel web), se connecter au serveur avec SSH et utiliser la commande `sudo`. Ils recevront également les courriels envoyés à root@, admin@, admins@, tels que les notifications de diagnostic. Vous ne devriez ajouter dans ce groupe que des personnes en qui vous avez absolument confiance !",
"label_for_manifestname_help": "Il s'agit du nom affiché dans le portail de l'utilisateur. Il peut être modifié ultérieurement.",
"group_admins": "Comptes administrateurs",
"group_explain_admins": "Il s'agit d'un groupe spécial correspondant aux comptes dits administrateurs. Les comptes affectés à ce groupe ont, pour faire simple, tous les droits sur le serveur (modification, création, ajout et suppression). Ils peuvent donc accéder à l'administration en ligne de YunoHost (panel web), se connecter au serveur avec SSH et utiliser la commande `sudo`. Ils recevront également les courriels envoyés à root@, admin@, admins@, tels que les notifications de diagnostic. Vous ne devriez ajouter dans ce groupe que des comptes de personnes en qui vous avez absolument confiance!",
"label_for_manifestname_help": "Il s'agit du nom affiché dans le portail d'utilisation de YunoHost. Il peut être modifié ultérieurement.",
"manage_groups": "Gestion des groupes",
"tools_yunohost_settings": "Paramètres de YunoHost",
"wrong_password_or_username": "Mot de passe ou nom d'utilisateur erroné",
"confirm_install_app_broken": "AVERTISSEMENT ! Cette application est cassée selon les contrôles automatiques de YunoHost et elle est susceptible de casser votre système ! Vous ne devriez probablement PAS l'installer à moins de savoir ce que vous faites. Êtes-vous prêt à prendre ce risque ?",
"wrong_password_or_username": "Mot de passe ou nom de compte erroné",
"confirm_install_app_broken": "AVERTISSEMENT! Cette application est cassée selon les contrôles automatiques de YunoHost et elle est susceptible de casser votre système! Vous ne devriez probablement PAS l'installer à moins de savoir ce que vous faites. Voulez-vous vraiment prendre ce risque?",
"app": {
"links": {
"code": "Dépôt officiel de code",
"admindoc": "Documentation officielle de l'administrateur",
"admindoc": "Documentation officielle d'administration",
"forum": "Sujets concernant cette application sur le forum de YunoHost",
"package": "Dépôt du paquet YunoHost",
"package_license": "Licence du paquet YunoHost",
"title": "Liens",
"userdoc": "Documentation officielle de l'utilisateur",
"userdoc": "Documentation officielle d'utilisation",
"website": "Site officiel",
"license": "Licence"
"license": "Licence de l'app"
},
"potential_alternative_to": "Alternative potentielle à :",
"upgrade": {
"notifs": {
"pre": {
"alert": "Vous devriez vérifier ces notifications avant de procéder à la mise à niveau, il pourrait y avoir des éléments d'information importants à connaître.",
"title": "Soyez averti !"
"title": "Avertissement!"
},
"post": {
"alert": "Il semble que la mise à jour se soit bien passée !\nVoici quelques informations que le responsable du paquet juge important de connaître à propos de cette mise à niveau.\nVous pouvez les retrouver dans la page d'information de l'application.",
"alert": "Il semble que la mise à jour se soit bien passée!\nVoici quelques informations que le responsable du paquet juge important de connaître à propos de cette mise à niveau.\nVous pouvez les retrouver dans la page d'information de l'application.",
"title": "Notifications post-mise à niveau pour '{name}'"
}
},
@ -617,16 +618,16 @@
"continue": "Passer à l'application suivante",
"stop": "Annuler les prochaines mises à niveau d'applications"
},
"installed_version": "Version installée :",
"installed_version": "Version installée:",
"open_this_app": "Ouvrez l'application",
"antifeatures": "Cette application a des fonctionnalités que vous n'aimerez peut-être pas :",
"antifeatures": "Cette application a des fonctionnalités que vous n'aimerez peut-être pas:",
"doc": {
"about": {
"title": "À propos",
"description": "Description"
},
"admin": {
"title": "Documentation de l'administrateur"
"title": "Documentation d'administration"
},
"notifications": {
"understood": "Compris",
@ -636,17 +637,17 @@
}
},
"info": {
"forum": "Cherchez ou demandez sur le forum !",
"problem": "Un problème avec cette application ?",
"config_panel_error": "Une erreur empêche l'affichage du panneau de configuration :",
"config_panel_error_please_report": "Merci de signaler cette erreur à l'équipe de YunoHost pour qu'elle soit corrigée !"
"forum": "Cherchez ou demandez sur le forum!",
"problem": "Un problème avec cette application?",
"config_panel_error": "Une erreur empêche l'affichage du panneau de configuration:",
"config_panel_error_please_report": "Merci de signaler cette erreur à l'équipe de YunoHost pour qu'elle soit corrigée!"
},
"install": {
"license": "Licence : {license}",
"license": "Licence: {license}",
"notifs": {
"post": {
"title": "Notifications de post-installation pour '{name}'",
"alert": "Il semble que l'installation se soit bien passée !\nVoici quelques notifications que le responsable du paquet considère comme importantes à connaître.\nVous pouvez les retrouver dans la page d'information de l'application."
"alert": "Il semble que l'installation se soit bien passée!\nVoici quelques notifications que le responsable du paquet considère comme importantes à connaître.\nVous pouvez les retrouver dans la page d'information de l'application."
},
"pre": {
"warning": "Ce qu'il faut savoir avant l'installation",
@ -656,20 +657,20 @@
},
"problems": {
"arch": "Cette application ne peut être installée que sur des architectures spécifiques ({required}). L'architecture de votre serveur est {current}.",
"broken": "Cette application est cassée selon les tests automatiques de YunoHost et elle est susceptible de casser votre système ! Vous ne devriez probablement PAS l'installer sauf si vous savez ce que vous faites.",
"broken": "Cette application est cassée selon les tests automatiques de YunoHost et elle est susceptible de casser votre système! Vous ne devriez probablement PAS l'installer sauf si vous savez ce que vous faites.",
"thirdparty": "Cette application ne fait pas partie du catalogue officiel de YunoHost, l'installation d'applications tierces peut compromettre l'intégrité et la sécurité de votre système. Vous ne devriez probablement PAS l'installer à moins de savoir ce que vous faites.",
"ignore": "Je comprends que cette installation peut casser mon système mais je veux quand même essayer.",
"inprogress": "Cette application est encore expérimentale (pour être plus clair elle ne fonctionne pas super bien et n'est pas encore bien intégrée dans YunoHost). En conséquence, elle est susceptible de casser votre système ! Vous ne devriez probablement PAS l'installer si vous ne savez pas ce que vous faites.",
"inprogress": "Cette application est encore expérimentale (pour être plus clair elle ne fonctionne pas super bien et n'est pas encore bien intégrée dans YunoHost). En conséquence, elle est susceptible de casser votre système! Vous ne devriez probablement PAS l'installer si vous ne savez pas ce que vous faites.",
"install": "Cette application est déjà installée et ne peut être installée plus d'une fois.",
"lowquality": "Cette application peut fonctionner mais n'est pas bien intégrée dans YunoHost. Certaines fonctionnalités telles que l'authentification unique (sso) et la sauvegarde/restauration peuvent ne pas être disponibles, ou ne pas respecter les bonnes pratiques.",
"ram": "Cette application nécessite {required} de RAM pour être installée/mise à niveau mais seul {current} est disponible actuellement. Même si cette application pouvait fonctionner, son processus d'installation nécessite une grande quantité de RAM. Votre serveur risque donc de geler (freezer) et de planter lamentablement.",
"version": "Cette application nécessite une version de YunoHost >= {required} et votre version installée est {current}, vous devriez envisager en premier lieu de mettre à niveau YunoHost."
},
"try_demo": "Essayer la démonstration",
"version": "Version actuelle : {version}"
"version": "Version actuelle: {version}"
},
"integration": {
"archs": "Architectures prises en charge :",
"archs": "Architectures prises en charge:",
"ldap": {
"false": "Ne permet pas d'utiliser les comptes YunoHost pour se connecter (LDAP)",
"true": "Utilise les comptes YunoHost pour se connecter (LDAP)",
@ -679,7 +680,7 @@
"false": "Ne peut être installé qu'une seule fois",
"true": "Peut être installée plusieurs fois"
},
"resources": "Utilisation classique des ressources : {ram} RAM, {disk} disque",
"resources": "Utilisation classique des ressources: {ram} RAM, {disk} disque",
"sso": {
"false": "Le système d'identification unique n'est pas disponible (SSO)",
"true": "Le système d'identification unique est disponible (SSO)",

View file

@ -15,7 +15,7 @@
"sorry": "Sentimos gran pesar por isto.",
"server_said": "Ao procesar a acción o servidor respondeu:",
"info": "A seguinte información podería ser útil para a persoa que che axude:",
"help": "Podes buscar axuda no <a href=\"https://forum.yunohost.org/\">foro</a> ou <a href=\"https://chat.yunohost.org/\">no chat</a> para arranxar a situación, ou informar do fallo no <a href=\"https://github.com/YunoHost/issues\">seguimento de fallos</a>.",
"help": "Podes buscar axuda no <a href=\"https://forum.yunohost.org/\">foro</a> ou na <a href=\"https://chat.yunohost.org/\">conversa</a> para arranxar a situación, ou informar do fallo no <a href=\"https://github.com/YunoHost/issues\">seguimento de fallos</a>.",
"error_message": "Mensaxe do erro:"
},
"api": {
@ -25,10 +25,10 @@
"pending": "En progreso",
"error": "Sen éxito"
},
"processing": "O servidor está procesando a acción...",
"partial_logs": "[...] (mira o historial para ver o rexistro completo)",
"processing": "O servidor está procesando a acción",
"partial_logs": "[] (mira o historial para ver o rexistro completo)",
"reconnecting": {
"title": "Intentando comunicarse co servidor...",
"title": "Intentando comunicarse co servidor",
"failed": "Semella que o servidor non responde. Podes intentar volver conectar ou intenta executar `systemctl restart yunohost-api`por ssh.",
"reason": {
"unknown": "Pechouse a conexión co servidor por razóns descoñecidas.",
@ -53,8 +53,8 @@
},
"add": "Engadir",
"action": "Acción",
"confirm_firewall_disallow": "Tes a certeza de querer pechar o porto {port} (protocolo: {protocol}, conexión: {connection})",
"confirm_firewall_allow": "Tes a certeza de querer abrir o porto {port} (protocolo: {protocol}, conexión: {connection})",
"confirm_firewall_disallow": "Tes a certeza de querer pechar o porto {port}? (protocolo: {protocol}, conexión: {connection})",
"confirm_firewall_allow": "Tes a certeza de querer abrir o porto {port}? (protocolo: {protocol}, conexión: {connection})",
"confirm_delete": "Tes a certeza de querer eliminar {name}?",
"confirm_change_maindomain": "Tes a certeza de querer cambiar o dominio principal?",
"confirm_app_default": "Tes a certeza de querer establecer esta como a app por defecto?",
@ -91,21 +91,21 @@
"app_info_default_desc": "Redireccionar a raíz do dominio a esta aplicación ({domain}).",
"app_info_access_desc": "Gupos / usuarias que actualmente teñen acceso a esta app:",
"app_choose_category": "Elixe unha categoría",
"api_waiting": "Agardando pola resposta do servidor...",
"api_waiting": "Agardando pola resposta do servidor",
"api_not_responding": "A API de YunoHost non responde. Pode que 'yunohost-api' esté caída ou esté reiniciando?",
"api_not_found": "Semella que o web-admin intentou solicitar algún recurso que non existe.",
"all_apps": "Tódalas apps",
"domain_delete_longdesc": "Eliminar este domino",
"domain_default_longdesc": "Este é o teu dominio por defecto.",
"domain_default_desc": "O dominio por defecto é o dominio de conexión onde accederán as usuarias.",
"domain_add_dyndns_forbidden": "Xa tes unha subscrición/rexistro dun dominio DynDNS do proxecto YunoHost. Por decisión propia, esta característica está limitada a un dominio por servidor. Se queres un subdominio pertencente ao dominio que xa tes utiliza a opción superior 'Engadir un dominio, ou subdominio, que xa posúo'. Se queres usar un dominio totalmente diferente, primeiro tes que eliminar o dominio DynDNS existente. Os dominios DynDNS son moi axeitados para aprender ao comezo dun proxecto de autohospedaxe, pero a medio/longo prazo recomendámosche mercar o teu propio nome de dominio nalgunha empresa rexistradora para ter a propiedade completa sobre o teu dominio.",
"domain_add_dyndns_forbidden": "Xa tes unha subscrición/rexistro dun dominio DynDNS do proxecto YunoHost. Por decisión propia, esta característica está limitada a un dominio por servidor. Se queres engadir un subdominio pertencente ao dominio que xa tes utiliza a opción superior 'Engadir un dominio, ou subdominio, que xa posúo'. Se queres usar un dominio totalmente diferente, primeiro tes que eliminar o dominio DynDNS existente. Os dominios DynDNS son moi axeitados para aprender ao comezo dun proxecto de autohospedaxe, pero a medio/longo prazo recomendámosche mercar o teu propio nome de dominio nalgunha empresa rexistradora para ter a propiedade completa sobre o teu dominio.",
"domain_add": "Engadir dominio",
"dns": "DNS",
"disabled": "Desactivado",
"disable": "Desactivar",
"run_first_diagnosis": "Executar diagnóstico inicial",
"diagnosis_explanation": "A ferramenta de diagnóstico intentará identificar problemas habituais en diferentes ámbitos do teu servidor para asegurarse de que todo funciona como debe. O diagnóstico realízase automáticamente un par de veces ao día e envíase un email á usuaria administradora se aparecen problemas. Ten en conta que algúns test poderían non ser relevantes se non utilizas dito servizo (por exemplo XMPP) ou poderían fallar se realizas unha configuración moi complexa. Nestos casos, e se sabes o que estás a facer, podes ignorar estos avisos ou problemas.",
"diagnosis_first_run": "A ferramenta de diagnóstico intentará identificar problemas habituais en diferentes ámbitos do teu servidor para ter a certeza de que todo funciona como debe. Non te preocupes se ves moitos erros cando finalizas a configuración do servidor: para iso está a ferramenta, para axudarche a identificar os problemas e guiarte coa solución. O diagnóstico execútase automáticamente un par de veces ao día e envíase un email á usuaria administradora se se atopan problemas.",
"diagnosis_first_run": "A ferramenta de diagnóstico intentará identificar problemas habituais en diferentes ámbitos do teu servidor para ter a certeza de que todo funciona como debe. Non te preocupes se ves moitos erros cando finalizas a configuración do servidor: para iso está a ferramenta, para axudarche a identificar os problemas e guiarte coa solución. O diagnóstico realízase automáticamente un par de veces ao día e envíase un email á usuaria administradora se atopa problemas.",
"diagnosis": "Diagnóstico",
"domain_dns_conf_is_just_a_recommendation": "Esta sección amósache a configuración *recomendada*. *Non configura* os rexistros DNS por ti. É responsabilidade túa configurar as zonas DNS seguindo esta recomendación na web da empresa onde rexistraches o dominio.",
"details": "Detalles",
@ -185,7 +185,7 @@
"domain_name": "Nome de dominio",
"domain_dns_longdesc": "Ver configuración DNS",
"domain_dns_config": "Configuración DNS",
"domain_delete_forbidden_desc": "Non podes eliminar '{domain}' porque é o dominio por defecto, tes que elexir outro dominio (ou <a href='#/domains/add'>engadir un novo</a>) e configuralo como dominio por defecto antes de poder eliminar este.",
"domain_delete_forbidden_desc": "Non podes eliminar '{domain}' porque é o dominio por defecto, tes que elixir outro dominio (ou <a href='#/domains/add'>engadir un novo</a>) e configuralo como dominio por defecto antes de poder eliminar este.",
"items": {
"groups": "sen grupos | grupo | {c} grupos",
"domains": "sen dominios | dominio | {c} dominios",
@ -323,11 +323,11 @@
"set_default": "Establecer por defecto",
"services": "Servizos",
"service_start_on_boot": "Executar no inicio",
"select_none": "Elexir ningún",
"select_all": "Elexir todo",
"select_none": "Seleccionar ningún",
"select_all": "Seleccionar todo",
"search": {
"not_found": "Non hai elementos que cumpran o criterio. | Hai 1 {items} que cumpre o teu criterio. | Hai {items} que cumpren o teu criterio.",
"for": "Buscar {items}..."
"not_found": "Hai {items} que cumpren o criterio. | Hai 1 {items} que cumpre o teu criterio. | Hai {items} que cumpren o teu criterio.",
"for": "Buscar {items}"
},
"save": "Gardar",
"running": "Executando",
@ -529,7 +529,7 @@
"push": "Enviar rexistros DNS á rexistradora",
"push_force": "Sobrescribir rexistros existentes",
"push_force_warning": "Semella que algúns rexistros DNS que YunoHost querería configurar xa están establecidos na configuración. Podes usar a sobrescritura se sabes o que estás a facer.",
"push_force_confirm": "Tes a certeza de que queres forzar a sobrescritura cos rexistros suxeridos? Ten en conta que poderías sobrescribir rexistros por defecto ou manuais establecidos na rexistradora.",
"push_force_confirm": "Tes a certeza de querer forzar a sobrescritura dos rexistros suxeridos? Ten en conta que poderías sobrescribir rexistros por defecto ou manuais establecidos na rexistradora.",
"methods": {
"auto": "Automático",
"handled_in_parent": "Xestionado polo dominio nai",
@ -550,7 +550,7 @@
"apps_on_domain": "Apps instaladas no dominio",
"certificate_authority": "Autoridade certificadora SSL",
"registrar": "Rexistradora",
"dyn_dns_remove_and_unsubscribe": "Tamén cancelar o rexistro do dominio no servizo dyndns de YunoHost"
"dyn_dns_remove_and_unsubscribe": "Tamén cancelar o rexistro do dominio no servizo DynDNS de YunoHost"
},
"see_parent_domain": "Ver dominio nai",
"types": {
@ -558,7 +558,7 @@
},
"toggle_subdomains": "Activar subdominios",
"explain": {
"main_domain": "O dominio principal é o dominio onde está o portal de acceso para as usuarias (vía \"{domain}/yunohost/sso\"). <br>Por tanto, non é posible eliminalo.<br>Se queres eliminar \"{domain}\", primeiro tes que elexir ou engadir outro dominio e establecelo como dominio principal."
"main_domain": "O dominio principal é o dominio onde está o portal de acceso para as usuarias (vía \"{domain}/yunohost/sso\"). <br>Por tanto, non é posible eliminalo.<br>Se queres eliminar \"{domain}\", primeiro tes que escoller ou engadir outro dominio e establecelo como dominio principal."
},
"add": {
"from_registrar_desc": "Deberás configurar manualmente os rexistros DNS na empresa rexistradora para finalizar a configuración do dominio. O sistema de diagnóstico de YNH dirache exactamente os rexistros DNS que debes configurar.",
@ -666,7 +666,8 @@
"title": "Ligazóns",
"userdoc": "Documentación oficial para usuarias",
"website": "Sitio Web Oficial",
"license": "Licenza"
"license": "Licenza da app",
"package_license": "Licenza do paquete YunoHost"
},
"potential_alternative_to": "Alternativa potencial para:",
"upgrade": {
@ -681,7 +682,7 @@
"title": "Ten coidado!"
},
"post": {
"alert": "Semella que todo foi ben!\n Esta é unha información acerca da actualización que as desenvolvedoras cren que debes coñecer.\nPodes lela cando queiras na páxina de información da app.",
"alert": "Semella que todo foi ben!\n Esta é unha información acerca da actualización que as desenvolvedoras cren que debes coñecer.\nPodes lela cando queiras na páxina de información da app.",
"title": "Notificacións post-actualización para '{name}'"
}
},

View file

@ -13,32 +13,32 @@
"administration_password": "Kata sandi administrasi",
"all": "Semua",
"api": {
"processing": "Peladen sedang memproses tindakan...",
"processing": "Server sedang memproses tindakan…",
"query_status": {
"error": "Gagal",
"pending": "Sedang berjalan",
"success": "Berhasil",
"warning": "Selesai dengan galat atau peringatan"
"success": "Berhasil diselesaikan",
"warning": "Berhasil diselesaikan disertai dengan galat atau peringatan"
},
"reconnecting": {
"reason": {
"reboot": "Peladen Anda sedang dimulai ulang dan tidak akan bisa dicapai selama beberapa saat. Layar masuk akan tersedia setelah peladen Anda bisa dicapai.",
"shutdown": "Peladen Anda telah dimatikan tidak dapat dicapai. Nyalakan kembali dan layar masuk akan tersedia setelah peladen Anda bisa dicapai.",
"upgrade_system": "Tidak dapat terhubung ke peladen dikarenakan YunoHost sedang pembaruan. Menunggu peladen bisa terhubung kembali…",
"unknown": "Tidak dapat terhubung ke peladen karena alasan yang tidak diketahui."
"reboot": "Server Anda sedang dimulai ulang dan tidak akan bisa dicapai selama beberapa saat. Layar masuk akan tersedia setelah server Anda bisa dicapai.",
"shutdown": "Server Anda telah dimatikan dan tidak lagi dapat dicapai. Nyalakan kembali dan layar masuk akan tersedia setelah server Anda bisa dicapai.",
"upgrade_system": "Koneksi dengan server telah ditutup untuk pemutakhiran YunoHost. Menunggu server sampai bisa dipergunakan lagi…",
"unknown": "Koneksi dengan server telah ditutup dengan alasan yang tidak diketahui."
},
"title": "Mencoba menghubungi peladen...",
"title": "Mencoba menghubungi server…",
"failed": "Sepertinya peladen tidak merespons. Anda bisa coba memuat ulang atau coba jalankan `systemctl restart yunohost-api` via SSH.",
"success": "Peladen bisa dicapai! Anda bisa mencoba masuk kembali"
"success": "Sekarang server bisa dipergunakan! Anda bisa mencoba untuk masuk"
},
"partial_logs": "[...] (periksa di riwayat untuk log penuhnya)"
"partial_logs": "[…] (periksa semua log di dalam riwayat)"
},
"api_error": {
"server_said": "Ketika memproses tindakan, peladen mengatakan:",
"sorry": "Maaf tentang itu.",
"info": "Informasi berikut mungkin berguna untuk orang yang membantu Anda:",
"server_said": "Ketika memproses tindakan tersebut server mengatakan:",
"sorry": "Mohon maaf mengenai hal tersebut.",
"info": "Informasi berikut mungkin bisa berguna untuk orang yang akan membantu Anda:",
"error_message": "Pesan galat:",
"help": "Anda dapat mencari bantuan di <a href=\"https://forum.yunohost.org/\">forum</a> atau <a href=\"https://chat.yunohost.org/\">di obrolan</a> untuk menangani situasinya, atau laporkan bug di <a href=\"https://github.com/YunoHost/issues\">bugtracker</a>.",
"help": "Anda bisa mencari bantuan di <a href=\"https://forum.yunohost.org/\">forum</a> atau <a href=\"https://chat.yunohost.org/\">obrolan</a> agar bisa memperbaiki keadaan, atau laporkan bug di <a href=\"https://github.com/YunoHost/issues\">bugtracker</a>.",
"view_error": "Lihat galat"
},
"api_errors_titles": {
@ -46,11 +46,11 @@
"APIError": "YunoHost mengalami galat tak terduga",
"APIBadRequestError": "YunoHost mengalami sebuah galat",
"APIInternalError": "YunoHost mengalami sebuah galat internal",
"APIConnexionError": "YunoHost mengalami galat hubungan",
"APIConnexionError": "YunoHost mengalami galat pada koneksi",
"APINotFoundError": "API YunoHost tidak dapat menemukan rutenya"
},
"all_apps": "Semua aplikasi",
"api_waiting": "Menunggu respons peladen...",
"api_waiting": "Menunggu respons peladen",
"app_choose_category": "Pilih sebuah kategori",
"app_info_access_desc": "Kelompok/pengguna yang diizinkan mengakses aplikasi ini:",
"app_info_change_url_disabled_tooltip": "Fitur ini belum diimplementasikan pada aplikasi ini",
@ -180,7 +180,7 @@
"remove": "Hapus izin '{name}' untuk mengakses '{perm}'",
"add": "Izinkan '{name}' untuk mengakses '{perm}'"
},
"postinstall": "Jalankan langkah setelah pemasangan",
"postinstall": "Jalankan pasca pemasangan",
"migrations": {
"run": "Jalankan migrasi",
"skip": "Lewati migrasi"
@ -191,8 +191,8 @@
},
"save": "Simpan",
"search": {
"not_found": "Ada {items} yang cocok dengan kriteria Anda.",
"for": "Cari {items}..."
"not_found": "Ada {items} yang sesuai dengan kriteria Anda. | Ada 1 {items} yang sesuai kriteria Anda. | Ada {items} yang sesuai kriteria Anda.",
"for": "Cari {items}"
},
"select_all": "Pilih semua",
"stop": "Berhenti",
@ -266,7 +266,7 @@
"remote": "{message}",
"passwordMatch": "Kata sandi tidak sama.",
"required": "Bidang ini diperlukan.",
"appRepoUrl": "URL repositori aplikasi YunoHost seharusnya seperti https://domain.tld/jalur/ke/repo_ynh",
"appRepoUrl": "URL depot aplikasi YunoHost seharusnya seperti https://domain.tld/jalur/ke/repo_ynh",
"invalid_form": "Ada galat di formulir ini.",
"maxValue": "Harus sama atau lebih kecil dari {max}.",
"alpha": "Harus berupa huruf alfabet saja.",
@ -277,7 +277,8 @@
"dynDomain": "Nama domain tidak valid: Huruf kecil, angka, dan tanda hubung saja",
"domain": "Nama domain tidak valid: Huruf kecil, angka, titik dan tanda hubung saja",
"email": "Surel tidak valid: Huruf, angka, dan <code>_.-</code> saja (cth. blabla@contoh.com, b1la-2@contoh.com)",
"alphalownumdot_": "Harus hanya berupa karakter alfanumerik kecil dan garis bawah."
"alphalownumdot_": "Harus hanya berupa karakter alfanumerik kecil dan garis bawah.",
"emailForward": "Penerusan surel tidak valid: harus alfanumerik dan hanya karakter <code>_.-+</code> (misal. someone+tag@example.com, s0me-1+tag@example.com)"
},
"form_input_example": "Contoh: {example}",
"group": "Kelompok",
@ -315,7 +316,7 @@
},
"dns": {
"auto_config_ok": "Konfigurasi otomatis sepertinya oke!",
"push_force": "Timpa rekaman yang telah ada",
"push_force": "Timpa rekaman yang ada",
"auto_config": "Konfigurasi rekaman DNS otomatis",
"auto_config_ignored": "diabaikan, tidak akan diubah oleh YunoHost kecuali Anda mencentang opsi timpa",
"auto_config_zone": "Zona DNS saat ini",
@ -328,7 +329,7 @@
},
"edit": "Sunting konfigurasi DNS",
"manual_config": "DNS yang disarankan untuk konfigurasi manual",
"push_force_confirm": "Apakah Anda yakin ingin mengirim paksa semua rekaman DNS ini? Perlu diketahui bahwa itu bisa menimpa rekaman manual atau baku yang diatur oleh Anda atau registrar Anda.",
"push_force_confirm": "Apakah Anda yakin ingin mengirim paksa semua rekaman DNS ini? Perlu diketahui bahwa itu bisa menimpa konfigurasi rekaman atau rekaman baku yang sudah diatur oleh Anda atau registrar Anda.",
"info": "Konfigurasi rekaman DNS otomatis merupakan fitur eksperimental. <br>Disarankan untuk menyimpan zona DNS Anda saat ini dari registrar DNS Anda sebelum mengirim rekaman dari sini.",
"push": "Kirim rekaman DNS ke registrar",
"push_force_warning": "Sepertinya ada beberapa rekaman DNS yang direkomendasikan YunoHost telah ada di konfigurasi registrar. Anda bisa menggunakan opsi untuk menimpa mereka jika Anda tahu apa yang Anda lakukan."
@ -336,11 +337,22 @@
"info": {
"apps_on_domain": "Aplikasi yang dipasang di domain",
"registrar": "Registrar",
"certificate_authority": "Otoritas Sertifikat SSL"
"certificate_authority": "Otoritas Sertifikat SSL",
"dyn_dns_remove_and_unsubscribe": "Sekaligus batalkan pendaftaran domain dari layanan DynDNS YunoHost"
},
"see_parent_domain": "Lihat domain induk",
"explain": {
"main_domain": "Domain utama adalah domain di mana pengguna terhubung ke portal (via \"{domain}/yunohost/sso\").<br>Karena itu, domain tersebut tidak bisa dihapus.<br>Jika Anda ingin menghapus \"{domain}\", Anda harus mengatur atau menambah domain lain dan menunjuknya menjadi domain utama."
},
"add": {
"dyn_dns_password": "Sandi pemulihan domain",
"dyn_dns_password_desc": "Sandi ini memungkinkan anda memulihkan kendali domain apabila nanti anda memasang ulang sistem anda. Jika anda sudah mendaftarkan domain ini sebelumnya, gunakan sandi pemulihan anda di sini untuk mengklaimnya.",
"from_local": "Saya ingin satu domain untuk penggunaan / tes lokal saja",
"from_registrar": "Saya ingin menambahkan satu domain yang saya miliki, atau satu subdomain",
"from_registrar_desc": "Anda perlu mengonfigurasi catatan DNS secara manual pada registrar anda untuk menyelesaikan konfigurasi domain ini. Diagnosa YunoHost akan memandu anda tentang catatan DNS apa yang harus dikonfigurasi secara tepat.",
"from_yunohost": "Saya tidak memiliki domain, Saya ingin mendaftar/menggunakan domain DynDNS gratis yang disediakan oleh proyek YunoHost",
"from_yunohost_desc": "Proyek YunoHost mempertahankan layanan 'DynDNS' gratis. Ini terbatas pada satu domain per server (meskipun anda juga dapat menambahkan sub-domain nanti menggunakan opsi 'Tambahkan domain yang saya miliki, atau subdomain' lainnya di atas). Konfigurasi DNS akan ditangani secara otomatis oleh YunoHost. Ini sangat ideal ketika memulai dengan hosting mandiri secara umum dan anda belum ingin berinvestasi dalam nama domain. Namun, dalam jangka menengah/panjang, kami sarankan untuk membeli nama domain anda sendiri ke beberapa registrar agar anda memiliki kepemilikan penuh atas domain anda.",
"from_local_desc": "Jika anda tidak ingin satu nama domain publik \"aktual\", anda dapat menggunakan apa saja yang berakhiran dengan <code>.local</code> atau <code>.test</code>. Nama domain yang diakhiri dengan <code>.local</code> adalah istimewa dalam artian bahwa mereka secara otomatis akan berubah kepada jaringan lokal, dengan asumsi klien mendukung protokol Bonjour. Alternatifnya, anda mungkin perlu melakukan penyesuaian pada berkas <code>/etc/hosts</code> (atau yang setara dengan Windows) pada setiap klien yang ingin anda gunakan dari domain ini, atau untuk mengkonfigurasi entri di router internet anda."
}
},
"error_server_unexpected": "Galat peladen tak terduga",
@ -355,7 +367,7 @@
"hook_conf_ynh_settings": "Konfigurasi YunoHost",
"restart": "Mulai ulang",
"protocol": "Protokol",
"readme": "Readme",
"readme": "Bacalah",
"rerun_diagnosis": "Jalankan diagnosis lagi",
"open": "Buka",
"hook_data_xmpp": "Data XMPP",
@ -381,9 +393,9 @@
"only_working_apps": "Hanya aplikasi yang dapat bekerja",
"only_decent_quality_apps": "Hanya aplikasi yang lumayan berkualitas",
"placeholder": {
"username": "samsmith",
"username": "mamat",
"firstname": "Sam",
"lastname": "Smith",
"lastname": "Bambang",
"domain": "domainku.com",
"groupname": "Nama kelompok saya",
"fullname": "John Doe",
@ -396,20 +408,20 @@
"notifs": {
"post": {
"title": "Catatan setelah pemasangan untuk '{name}'",
"alert": "Sepertinya pemasangannya lancar!\n Berikut beberapa catatan yang pengelola paket rasa cukup penting untuk diketahui.\nAnda bisa membacanya kembali di halaman informasi aplikasi."
"alert": "Sepertinya pemasangannya lancar!\nBerikut beberapa catatan pengelola paket yang cukup penting untuk diketahui.\nAnda bisa membacanya kembali di halaman informasi aplikasi."
},
"pre": {
"warning": "Hal-hal yang perlu diketahui sebelum pemasangan",
"danger": "Pemasangan aplikasi ini sepertinya akan membuat masalah",
"danger": "Pemasangan aplikasi ini sepertinya akan mengakibatkan beberapa isu",
"critical": "Aplikasi tidak dapat dipasang"
}
},
"problems": {
"arch": "Aplikasi ini hanya bisa dipasang pada arsitektur tertentu ({required}) tapi arsitektur peladen Anda adalah {current}.",
"broken": "Aplikasi ini rusak menurut uji coba otomatis YunoHost dan mungkin akan merusak sistem Anda! Anda sebaiknya TIDAK memasangnya kecuali Anda yakin dengan apa yang Anda lakukan.",
"broken": "Aplikasi ini rusak menurut uji coba otomatis YunoHost dan mungkin akan merusak sistem Anda! Sebaiknya Anda TIDAK memasangnya kecuali Anda yakin dengan apa yang Anda lakukan.",
"thirdparty": "Aplikasi ini bukan bagian dari katalog resmi YunoHost, memasang aplikasi pihak ketiga dapat membahayakan integritas serta keamanan sistem Anda. Anda sebaiknya TIDAK memasangnya kecuali Anda yakin dengan apa yang Anda lakukan.",
"ignore": "Saya mengerti bahwa pemasangan ini mungkin akan merusak sistem saya tapi saya tetap ingin mencobanya.",
"inprogress": "Aplikasi ini masih eksperimental dan mungkin akan merusak sistem Anda! Anda sebaiknya TIDAK memasangnya kecuali Anda yakin dengan apa yang Anda lakukan.",
"inprogress": "Aplikasi ini masih eksperimental (jika tidak secara jelas tidak bekerja) dan mungkin akan merusak sistem Anda! Sebaiknya Anda TIDAK memasangnya kecuali Anda yakin dengan apa yang Anda lakukan.",
"install": "Telah dipasang dan tidak dapat dipasang lebih dari sekali.",
"lowquality": "Aplikasi ini mungkin bisa bekerja tapi tidak terintegrasi dengan baik di YunoHost. Beberapa fitur seperti SSO dan pencadangan mungkin tidak tersedia.",
"ram": "Aplikasi ini memerlukan RAM sebanyak {required} untuk pemasangan/pembaruan tapi hanya {current} yang tersedia sekarang. Meski aplikasi ini bisa bekerja, proses pemasangannya memerlukan RAM yang banyak sehingga peladen Anda bisa rusak atau prosesnya gagal total.",
@ -440,13 +452,14 @@
},
"links": {
"admindoc": "Dokumentasi Admin Resmi",
"code": "Repositori Kode Resmi",
"code": "Depot Kode Resmi",
"forum": "Topik tentang aplikasi ini di forum YunoHost",
"package": "Repositori Paket YunoHost",
"package": "Depot Paket YunoHost",
"title": "Tautan",
"userdoc": "Dokumentasi Pengguna Resmi",
"website": "Situs Resmi",
"license": "Lisensi"
"license": "Lisensi aplikasi",
"package_license": "Lisensi paket YunoHost"
},
"potential_alternative_to": "Alternatif dari:",
"upgrade": {
@ -481,12 +494,18 @@
"notifications": {
"title": "Pemberitahuan",
"post_upgrade": "Catatan setelah pembaruan",
"post_install": "Catatan setelah pemasangan"
"post_install": "Catatan setelah pemasangan",
"understood": "Mengerti"
}
},
"info": {
"forum": "Cari atau tanyakan di forum!",
"problem": "Masalah dengan aplikasi ini?"
"problem": "Masalah dengan aplikasi ini?",
"config_panel_error": "Satu kesalahan mengakibatkan panel konfigurasi tidak dapat ditampilkan:",
"config_panel_error_please_report": "Harap melaporkan galat ini kepada tim YunoHost agar dapat diperbaiki!"
},
"uninstall": {
"purge_desc": "Singkirkan direktori data yang berkaitan dengan aplikasi (biasanya ini adalah data yang anda unggah sendiri menggunakan aplikasi)."
}
},
"app_state_inprogress_explanation": "Pengelola aplikasi ini menyatakan bahwa aplikasi ini belum siap untuk penggunaan umum. HATI-HATI!",
@ -555,11 +574,11 @@
"app_info_default_desc": "Alihkan pangkal domain ke aplikasi ini ({domain}).",
"diagnosis_explanation": "Fitur diagnosis akan berusaha mencari masalah umum di setiap aspek peladen Anda untuk memastikan semuanya berjalan dengan baik. Diagnosis akan berjalan secara otomatis dua kali sehari dan sebuah surel akan dikirim ke administrator jika ada masalah yang ditemukan. Perlu dicatat bahwa beberapa uji coba mungkin tidak akan relevan jika Anda tidak ingin beberapa fitur (seperti XMPP) atau mungkin gagal jika Anda memiliki pengaturan yang kompleks. Jika begitu dan jika Anda mengetahui apa yang Anda lakukan, dipersilakan untuk mengabaikan masalah atau peringatan tersebut.",
"diagnosis_first_run": "Fitur diagnosis akan berusaha mencari masalah umum di setiap aspek peladen Anda untuk memastikan semuanya berjalan dengan baik. Mohon jangan panik jika Anda melihat banyak galat setelah Anda mengatur peladen Anda, itu ditujukan untuk membantu Anda menemukan masalahnya dan membantu Anda memperbaikinya. Diagnosis juga akan berjalan secara otomatis dua kali sehari dan sebuah surel akan dikirim ke administrator jika ada masalah yang ditemukan.",
"domain_add_dyndns_forbidden": "Anda telah berlangganan ke domain DynDNS, Anda bisa meminta untuk menghapus domain DynDNS Anda saat ini di <a href='//forum.yunohost.org/t/nohost-domain-recovery-suppression-de-domaine-en-nohost-me-noho-st-et-ynh-fr/442'>bagian khusus</a> di forum.",
"domain_add_dyndns_forbidden": "Anda sudah terdaftar/berlangganan ke satu domain DynDNS dari proyek YunoHost. Sesuai desain, fitur ini terbatas pada satu domain per server. Apabila Anda ingin menambahkan satu subdomain di domain Anda yang sudah ada, harap menggunakan opsi 'Tambah satu domain yang sudah saya miliki, atau satu subdomain' di atas. Apabila Anda ingin menggunakan domain yang berbeda, Anda harus menghapus domain DynDNS yang sudah ada. Domain DynDNS bagus apabila dipergunakan untuk hos mandiri, tetapi untuk jangka menengah/panjang, kami merekomendasikan kepada Anda agar membeli nama domain Anda sendiri pada suatu regstrar untuk kepemilikan penuh atas domain Anda.",
"domain_default_desc": "Domain utama adalah domain di mana pengguna masuk ke SSO.",
"error_connection_interrupted": "Peladen menutup koneksi alih-alih menjawabnya. Apakah nginx atau yunohost-api dimulai ulang atau terhenti?",
"good_practices_about_admin_password": "Anda akan mengatur kata sandi administrator baru. Kata sandi tersebut sebaiknya sekurang-kurangnya 8 karakter, meskipun memang adalah hal yang baik jika menggunakan yang lebih panjang (cth. parafrasa) dan/atau menggunakan berbagai macam karakter (kapital, huruf kecil, angka, dan karakter lainnya).",
"good_practices_about_user_password": "Anda akan mengatur kata sandi pengguna baru. Kata sandi tersebut sebaiknya sekurang-kurangnya 8 karakter, meskipun memang adalah hal yang baik jika menggunakan yang lebih panjang (cth. parafrasa) dan/atau menggunakan berbagai macam karakter (kapital, huruf kecil, angka, dan karakter lainnya).",
"error_connection_interrupted": "Server menutup koneksi alih-alih menjawabnya. Apakah nginx atau yunohost-api dimulai ulang atau terhenti untuk beberapa alasan?",
"good_practices_about_admin_password": "Sekarang Anda akan menentukan kata sandi admin baru. Kata sandi harus terdiri dari minimal 8 karakter - meskipun sebaiknya menggunakan kata sandi yang lebih panjang (misalnya parafrasa) dan/atau menggunakan beragam karakter (huruf besar, huruf kecil, angka, dan karakter khusus).",
"good_practices_about_user_password": "Sekarang Anda akan menentukan kata sandi pengguna baru. Kata sandi harus terdiri dari minimal 8 karakter - meskipun sebaiknya menggunakan kata sandi yang lebih panjang (misalnya parafrasa) dan/atau menggunakan beragam karakter (huruf besar, huruf kecil, angka, dan karakter khusus).",
"label_for_manifestname_help": "Ini adalah nama yang ditampilkan di portal pengguna. Bisa diubah lagi nanti.",
"manage_apps": "Kelola aplikasi",
"postinstall": {
@ -576,7 +595,7 @@
"text_selection_is_disabled": "Pemilihan teks dinonaktifkan. Jika Anda ingin membagikan log ini, silakan bagikan log dengan tombol 'Bagikan dengan Yunopaste'.<br/><small>Atau jika Anda benar-benar ingin pemilihan teks, tekan tombol ini: ↓↓↑↑.</small>",
"confirm_group_add_access_permission": "Apakah Anda yakin ingin memberi akses {perm} ke {name}? Akses tersebut bisa meningkatkan ancaman jika {name} merupakan orang jahat. Anda sebaiknya lakukan ini jika Anda PERCAYA kepada orang tersebut.",
"confirm_migrations_skip": "Melewati migrasi tidak direkomendasikan. Apakah Anda yakin ingin melewatinya?",
"confirm_install_app_inprogress": "PERINGATAN! Aplikasi ini masih eksperimental dan mungkin akan merusak sistem Anda! Anda sebaiknya TIDAK memasangnya kecuali Anda yakin dengan apa yang Anda lakukan. Apakah Anda yakin ingin memasangnya?",
"confirm_install_app_inprogress": "PERINGATAN! Aplikasi ini masih bersifat eksperimental (bila tidak secara jelas tidak dapat bekerja) dan mungkin akan merusak sistem Anda! Sebaiknya Anda TIDAK memasangnya kecuali Anda yakin dengan apa yang Anda lakukan. Apakah Anda ingin mengambil risiko tersebut?",
"run_first_diagnosis": "Jalankan diagnosis pertama",
"domain_delete_forbidden_desc": "Anda tidak bisa menghapus '{domain}' dikarenakan itu adalah domain utama, Anda harus memilih domain lain (atau <a href='#/domains/add'>tambahkan yang baru</a>) dan atur itu menjadi domain utama supaya bisa menghapus domain ini.",
"hook_data_xmpp_desc": "Konfigurasi pengguna dan ruangan, berkas unggahan",
@ -608,10 +627,10 @@
"logs": "Log",
"logs_suboperations": "Sub-tindakan",
"logs_context": "Konteks",
"logs_history": "Riwayat perintah yang dijalankan di sistem",
"logs_history": "Riwayat perintah yang dijalankan pada sistem",
"logs_more": "Tampilkan lebih banyak",
"logs_package": "Riwayat pengelolaan paket Debian",
"mailbox_quota_example": "700M adalah CD, 4700M adalah DVD",
"mailbox_quota_example": "700M pada CD, 4700M pada DVD",
"mailbox_quota_placeholder": "Atur ke 0 untuk menonaktifkan.",
"manage_groups": "Kelola kelompok",
"logs_error": "Galat",
@ -620,9 +639,9 @@
"user_emailaliases": "Alias surel",
"users_import_delete_others": "Hapus pengguna yang tidak ada di daftar",
"app_manage_label_and_tiles": "Kelola label dan kisi",
"confirm_app_default": "Apakah Anda yakin ingin membuat aplikasi ini yang diarahkan dari pangkal domain?",
"confirm_app_default": "Apakah Anda yakin ingin menjadikan aplikasi ini sebagai default?",
"unauthorized": "Tidak terotoriasasi",
"logs_ended_at": "Terakhir",
"logs_ended_at": "Akhir",
"permission_main": "Label utama",
"uninstall": "Lepas",
"users_import_update": "Perbarui pengguna yang telah ada",
@ -632,16 +651,16 @@
"migrations_disclaimer_not_checked": "Migrasi ini memerlukan Anda mengetahui peringatannya sebelum bisa dijalankan.",
"logs_path": "Jalur",
"permission_show_tile_enabled": "Terlihat sebagai kisi di portal pengguna",
"confirm_firewall_allow": "Apakah Anda yakin ingin membuka porta {port} (protokol: {protocol}, koneksi: {connection})",
"confirm_firewall_disallow": "Apakah Anda yakin ingin menutup porta {port} (protokol: {protocol}, koneksi: {connection})",
"confirm_firewall_allow": "Apakah Anda yakin ingin membuka port {port}? (protokol: {protocol}, koneksi: {connection})",
"confirm_firewall_disallow": "Apakah Anda yakin ingin menutup port {port}? (protokol: {protocol}, koneksi: {connection})",
"manage_domains": "Kelola domain",
"migrations_pending": "Migrasi yang tertunda",
"operations": "Tindakan",
"orphaned": "Tidak dikelola",
"postinstall_intro_2": "Dua langkah konfigurasi lagi diperlukan untuk mengaktifkan layanan peladen Anda.",
"confirm_install_app_broken": "PERINGATAN! Aplikasi ini rusak menurut uji coba otomatis YunoHost dan mungkin akan merusak sistem Anda! Anda sebaiknya TIDAK memasangnya kecuali Anda yakin dengan apa yang Anda lakukan. Apakah Anda yakin ingin memasangnya?",
"confirm_install_app_broken": "PERINGATAN! Aplikasi ini rusak menurut uji coba otomatis YunoHost dan mungkin akan merusak sistem Anda! Sebaiknya Anda TIDAK memasangnya kecuali Anda yakin dengan apa yang Anda lakukan. Apakah Anda yakin ingin memasangnya?",
"domain_dns_conf_is_just_a_recommendation": "Bagian ini hanya menampilkan kepada Anda konfigurasi *yang direkomendasikan*. Ini *tidak* mengonfigurasi DNS untuk Anda. Merupakan tugas Anda untuk mengonfigurasi zona DNS Anda di registrar DNS Anda menurut rekomendasi ini.",
"domain_dns_push_failed_to_authenticate": "Tidak dapat mengautentikasi API registrar. Sepertinya <a href='#/domains/{domain}/config'>kredensialnya</a> salah? (Galat: {error})",
"domain_dns_push_failed_to_authenticate": "Autentikasi gagal pada API registrar. Besar kemungkinan karena <a href='#/domains/{domain}/config'>kredensial</a> tidak sesuai? (Galat: {error})",
"ignore": "Abaikan",
"label_for_manifestname": "Label untuk {name}",
"local_archives": "Arsip lokal",
@ -653,20 +672,24 @@
"migrations": "Migrasi",
"next": "Selanjutnya",
"domain_dns_push_not_applicable": "Fitur rekaman DNS otomatis tidak tersedia untuk domain {domain},<br> Anda harus secara manual mengonfigurasi rekaman DNS Anda dengan mengikuti <a href='https://yunohost.org/dns'>dokumentasi</a> dan konfigurasi yang disarankan di bawah ini.",
"logs_system": "Log kernel dan operasi sistem tingkat dasar lainnya",
"logs_system": "Log kernel dan peristiwa tingkat dasar lainnya",
"operation_failed_explanation": "Tindakan ini gagal! Sangat maaf sekali :( Anda bisa mencoba <a href='https://yunohost.org/help'>tanya-tanya</a>. Mohon sediakan *log penuh* dari tindakan tersebut kepada yang membantu Anda. Anda bisa melakukan tersebut dengan tombol 'Bagikan dengan Yunopaste'. Ketika membagikan log tersebut, YunoHost akan secara otomatis mencoba menyembunyikan data pribadi seperti nama domain dan IP.",
"items_verbose_count": "Ada {items}. | Ada 1 {items}. | Ada {items}.",
"perform": "Lakukan",
"perform": "Laksanakan",
"domain_dns_push_managed_in_parent_domain": "Fitur rekaman DNS otomatis dikelola di domain induk <a href='#/domains/{parent_domain}/dns'>{parent_domain}</a>.",
"confirm_install_app_lowquality": "Peringatan: aplikasi ini mungkin bisa bekerja tapi tidak terintegrasi dengan baik di YunoHost. Beberapa fitur seperti SSO dan pencadangan mungkin tidak tersedia.",
"logs_access": "Daftar akses dan blokiran",
"permission_corresponding_url": "URL Aplikasi",
"permission_corresponding_url": "URL yang sesuai",
"users_import_delete_desc": "Jika dipilih, semua pengguna yang telah ada yang tidak ada di berkas CSV akan dihapus (dan dibersihkan).",
"users_import_update_desc": "Jika dipilih, semua pengguna yang telah ada yang ada di berkas CSV akan diperbarui",
"users_import_update_desc": "Jika dipilih, semua pengguna yang ada di dalam berkas CSV akan diperbarui dengan nilai baru",
"users_import_delete": "Hapus pengguna yang tidak ada di daftar",
"users_import_csv_file_desc": "Berkas CSV harus dalam UTF-8 dan dengan kolom nama pengguna, kata sandi, kelompok, surel, dan kuota surel. Sebagai contoh berkas CSV impornya, Anda bisa <a href='/yunohost/api/users/export' target='_BLANK'>mengekspor daftar pengguna Anda ke berkas CSV</a> dan mengubah berkas tersebut.",
"pending_migrations": "Terdapat migrasi tertunda yang menunggu untuk dijalankan. Silakan ke <a href='#/tools/migrations'>Alat > Migrasi</a> untuk memulai mereka.",
"error_modify_something": "Anda harus mengubah sesuatu",
"group_format_name_help": "Anda bisa menggunakan karakter alfanumerik dan garis bawah",
"items_verbose_items_left": "Ada {items} yang tersisa."
"items_verbose_items_left": "Ada {items} tersisa. | Ada 1 {items} tersisa. | Ada {items} tersisa.",
"traceback": "Telusur",
"select_none": "Pilih tidak sama sekali",
"nobody": "Bukan siapa-siapa",
"confirm_postinstall": "Anda akan meluncurkan proses pasca instalasi pada domain {domain}. Mungkin memerlukan waktu beberapa menit, *jangan hentikan pengoperasian*."
}

View file

@ -274,7 +274,7 @@
},
"search": {
"not_found": "Ci sono {items} che corrispondono ai tuoi criteri. | Cè un {items} che corrisponde ai tuoi criteri. | Ci sono {items} che corrispondono ai tuoi criteri.",
"for": "Cerca per {items}..."
"for": "Cerca per {items}"
},
"readme": "Leggimi",
"postinstall_set_domain": "Imposta dominio principale",
@ -345,7 +345,7 @@
"error": "Errore",
"enabled": "Abilitato",
"domain_delete_forbidden_desc": "Non puoi rimuovere '{domain}' fintanto che è il tuo dominio principale, devi prima selezionare un altro dominio (o <a href='#/domains/add'>crearne un'altro</a>) e impostarlo come dominio principale.",
"domain_add_dyndns_forbidden": "Hai già sottoscritto un dominio DynDNS, puoi richiedere di rimuovere il tuo dominio DynDNS corrente sul forum <a href='//forum.yunohost.org/t/nohost-domain-recovery-suppression-de-domaine-en-nohost-me-noho-st-et-ynh-fr/442'>nel thread dedicato</a>.",
"domain_add_dyndns_forbidden": "Hai già registrato/sottoscritto un dominio DynDNS dal progetto YunoHost. Questopzione è intenzionalmente limitata a un solo dominio di questo genere per ciascun server. Se vuoi aggiungere un sottodominio al tuo dominio già sottoscritto, usa lopzione “Aggiungi un dominio o un sottodominio che possiedo” qui sopra. Se vuoi usare un dominio completamente differente, dovresti prima rimuovere il tuo dominio DynDNS esistente. I domini DynDNS sono unottima possibilità per esordire nel self-hosting, ma nel medio/lungo termine raccomandiamo di acquistare il proprio nome dominio, per averne un controllo completo.",
"disabled": "Disabilitato",
"dead": "Inattivo",
"day_validity": " Scaduto | 1 giorno | {count} giorni",
@ -357,7 +357,7 @@
"code": "Codice",
"app_show_categories": "Mostra categorie",
"app_choose_category": "Scegli una categoria",
"api_waiting": "Aspetto la risposta del server...",
"api_waiting": "Aspetto la risposta del server",
"api_not_found": "Sembra che l'amministratore ha provato a richiedere qualcosa che non esiste.",
"api_errors_titles": {
"APIConnexionError": "YunoHost ha riscontrato un errore di connessione",
@ -382,10 +382,10 @@
"pending": "In corso",
"error": "Fallito"
},
"processing": "Il server sta processando la richiesta...",
"partial_logs": "[...] (controlla i log completi nella cronologia)",
"processing": "Il server sta processando la richiesta",
"partial_logs": "[] (controlla i log completi nella cronologia)",
"reconnecting": {
"title": "Sto cercando di comunicare con il server...",
"title": "Sto cercando di comunicare con il server",
"failed": "Sembra che il server non stia rispondendo. Puoi riprovare a collegarti oppure prova a dare il comando `systemctl restart yunohost-api` da ssh.",
"reason": {
"shutdown": "Il tuo server si sta spegnendo e non è più raggiungibile. Accendilo nuovamente e un prompt di login sarà visualizzato appena il server tornerà raggiungibile.",
@ -437,7 +437,7 @@
"run": "Esegui migrazioni"
},
"groups": {
"remove": "Rimuovi {'user'} dal gruppo '{name}'",
"remove": "Rimuovi '{user}' dal gruppo '{name}'",
"add": "Aggiungi '{user}' al gruppo '{name}'",
"delete": "Elimina gruppo '{name}'",
"create": "Crea gruppo '{name}'"
@ -523,17 +523,25 @@
"semi_auto": "Semi-automatico",
"manual": "Manuale",
"none": "Nessuno",
"handled_in_parent": "Gestito nel dominio genitore"
"handled_in_parent": "Gestito nel dominio genitore",
"auto": "Automatico"
}
},
"info": {
"apps_on_domain": "App installate in questo dominio",
"dyn_dns_remove_and_unsubscribe": "De-registra inoltre il dominio dal servizio dynDNS di YunoHost",
"dyn_dns_remove_and_unsubscribe": "De-registra inoltre il dominio dal servizio DynDNS di YunoHost",
"certificate_authority": "Autorità di certificazione SSL",
"registrar": "Registro"
},
"add": {
"dyn_dns_password": "Password per il recupero del dominio"
"dyn_dns_password": "Password per il recupero del dominio",
"dyn_dns_password_desc": "Questa password ti permetterà di recuperare il controllo del dominio qualora scegliessi di reinstallare il tuo sistema in un secondo momento. Se hai già registrato questo dominio in precedenza, usa qui la tua password di recupero per riottenerlo.",
"from_local": "Voglio un dominio per uso locale/solo test",
"from_yunohost_desc": "Il progetto YunoHost mantiene un servizio “DynDNS” gratuito. È limitato a un dominio per server (anche se puoi anche aggiungere sottodomini successivamente, usando lopzione “Aggiungi un dominio o un sottodominio che possiedo” qui sopra). La configurazione DNS sarà gestita da YunoHost. Questopzione è lideale per esordire nel self-hosting e se non vuoi investire in un nome dominio per il momento. Tuttavia, nel medio/lungo termine raccomandiamo di acquistare il tuo nome dominio da un registrar, per avere un controllo completo del tuo dominio.",
"from_local_desc": "Se non vuoi un “vero” nome di dominio pubblico, puoi usare qualunque cosa che termini con <code>.local</code> o <code>.test</code>. I nomi dominio che terminano con <code>.local</code> sono speciali perché possono essere risolti automaticamente dal network locale, assumendo che i client supportino il protocollo Bonjour. Alternativamente potresti dover modificare il file <code>/etc/hosts</code> (o lequivalente di Windows) su ogni client da cui desideri utilizzare questo dominio, o dover configurare parametri DNS locali sul tuo router internet.",
"from_registrar": "Vorrei aggiungere un dominio o un sottodominio che possiedo",
"from_registrar_desc": "Dovrai configurare manualmente i registri DNS sul tuo registrar per finalizzare la configurazione di questo dominio. La diagnosi di YunoHost ti guiderà per individuare quali registri DNS devi configurare.",
"from_yunohost": "Non possiedo un dominio, voglio registrare/usare un dominio DynDNS gratuito, offerto dal progetto YunoHost"
},
"toggle_subdomains": "Attiva o disattiva i sottodomini",
"types": {
@ -541,7 +549,16 @@
},
"explain": {
"main_domain": "Il dominio principale è il dominio da cui gli utenti possono connettersi al portale (via “{domain}/yunohost/sso”).<br>Per questa ragione non è possibile eliminarlo.<br>Se vuoi eliminare “{domain}”, devi prima scegliere o aggiungere un altro dominio come principale."
}
},
"cert": {
"valid_for": "Valido per {days}",
"types": {
"selfsigned": "Auto-verificato",
"other": "Altro/Sconosciuto",
"letsencrypt": "Lets Encrypt"
}
},
"see_parent_domain": "Vedi il dominio genitore"
},
"users_import_csv_file_desc": "Il file CSV dovrebbe essere in UTF-8 e con le colonne username, password , gruppi, email e quota. Per avere un esempio di un file CSV da importare, puoi <a href='/yunohost/api/users/export' target='_blank'>esportare i tuoi attuali utenti in un file CSV</a> e modificarlo.",
"users_import_delete_others": "Elimina utenti non in lista",
@ -638,8 +655,9 @@
"website": "Sito web ufficiale",
"admindoc": "Documentazione Admin ufficiale",
"code": "Repository ufficiale del codice sorgente",
"license": "Licenza",
"forum": "Argomenti collegati a questapp nel forum di YunoHost"
"license": "Licenza dellapp",
"forum": "Argomenti collegati a questapp nel forum di YunoHost",
"package_license": "Licenza del pacchetto YunoHost"
},
"upgrade": {
"confirm": {

View file

@ -15,8 +15,8 @@
"all": "すべて",
"all_apps": "すべてのアプリ",
"api": {
"partial_logs": "[...] (詳細ログで履歴を確認)",
"processing": "サーバーはアクションを実行中です...",
"partial_logs": "[] (詳細ログで履歴を確認)",
"processing": "サーバーはアクションを実行中です",
"query_status": {
"error": "失敗",
"pending": "実行中",
@ -31,7 +31,7 @@
"reboot": "サーバーが再起動中のため、接続が途切れることがあります。再起動後、すぐにログイン画面が利用可能になります。"
},
"success": "サーバーが利用可能になりました!ログインが可能です",
"title": "サーバーと通信中...",
"title": "サーバーと通信中",
"failed": "サーバーが応答していないようです。再接続するか、SSH経由で`systemctl restart yunohost-api`を実行してみてください。"
}
},
@ -52,7 +52,7 @@
"APINotRespondingError": "YunoHost APIが応答していません"
},
"api_not_responding": "YunoHost APIは応答していません。'yunohost-api'が停止しているか、再起動中ではありませんか?",
"api_waiting": "サーバーの応答を待っています...",
"api_waiting": "サーバーの応答を待っています",
"app": {
"installed_version": "インストール済バージョン:",
"open_this_app": "このアプリを開く",
@ -226,7 +226,7 @@
"other": "その他/不明",
"selfsigned": "自己署名"
},
"valid_for": "あと {days) 日有効"
"valid_for": "あと {days} 日有効"
},
"config": {
"edit": "ドメイン設定を編集する",
@ -302,7 +302,7 @@
"email": "不正な電子メール: 小文字の英数字、<code>_.-</code> である必要があります (例: someone@example.com, s0me-1@example.com)",
"emailForward": "不正な電子メール転送: 小文字の英数字、<code>_.-</code> である必要があります (例: someone+tag@example.com, s0me-1+tag@example.com)",
"pattern": "{type}",
"remote": "{mesage}",
"remote": "{message}",
"required": "フィールドは必要です。",
"appRepoUrl": "YunoHostアプリリポジトリのURLは次のようになります https://domain.tld/path/to/repo_ynh",
"name": "名前に次の特殊文字を含めることはできません。 <code> ,.'-</code>",
@ -649,7 +649,7 @@
"postinstall_intro_1": "やりましたYunoHostは正常にインストールされました。",
"postinstall_intro_2": "サーバーのサービスを有効化するには、さらに 2 つの設定手順が必要です。",
"search": {
"for": "{items}について検索...",
"for": "{items}について検索",
"not_found": "条件に合致する {items} が存在する。 | 条件に合致する1つの {items} が存在する。 | 条件に合致する {items} が存在する。"
},
"since": "から",

View file

@ -15,8 +15,8 @@
"all": "모두",
"all_apps": "모든 앱",
"api": {
"partial_logs": "[...] (전체 로그는 기록에 있음)",
"processing": "서버가 동작을 수행 중입니다...",
"partial_logs": "[] (전체 로그는 기록에 있음)",
"processing": "서버가 동작을 수행 중입니다",
"query_status": {
"error": "실패",
"pending": "실행 중",
@ -31,7 +31,7 @@
"upgrade_system": "YunoHost 업그레이드를 위해 서버와의 연결이 종료되었습니다. 다시 연결될 때까지 잠시 기다리세요…"
},
"success": "서버와 연결되었습니다! 다시 로그인할 수 있습니다",
"title": "서버와 통신중...",
"title": "서버와 통신중",
"failed": "서버가 응답하지 않는 것 같습니다. 다시 연결하거나 ssh를 통해 `systemctl restart yunohost-api` 명령을 실행하세요."
}
},

View file

@ -10,7 +10,7 @@
}
},
"api": {
"partial_logs": "[...] (visas išvestis rasite istorijoje)",
"partial_logs": "[] (visas išvestis rasite istorijoje)",
"reconnecting": {
"failed": "Atrodo, kad serveris neatsako. Galite pabandyti dar kartą prisijungti arba per ssh paleisti `systemctl restart yunohost-api`.",
"reason": {
@ -20,9 +20,9 @@
"upgrade_system": "Ryšys su serveriu nutrauktas dėl YunoHost atnaujinimo. Laukiama, kol serveris vėl bus pasiekiamas…"
},
"success": "Dabar serveris pasiekiamas! Galite pabandyti prisijungti",
"title": "Bandoma susisiekti su serveriu..."
"title": "Bandoma susisiekti su serveriu"
},
"processing": "Serveris apdoroja veiksmą...",
"processing": "Serveris apdoroja veiksmą",
"query_status": {
"error": "Nesėkminga",
"pending": "Vykdoma",
@ -40,7 +40,7 @@
},
"api_not_found": "Atrodo, kad žiniatinklio administratorius bandė pateikti užklausą apie tai, ko nėra.",
"api_not_responding": "\"YunoHost\" API neatsako. Galbūt 'yunohost-api' neveikia arba buvo paleista iš naujo?",
"api_waiting": "Laukiama serverio atsakymo...",
"api_waiting": "Laukiama serverio atsakymo",
"app": {
"open_this_app": "Atidarykite šią programėlę",
"doc": {

View file

@ -7,7 +7,7 @@
"email": "одбери домен за вашиот емаил"
},
"local_part_description": {
"domain": "одбери под домен"
"domain": "одбери под домен"
}
}
}

View file

@ -22,8 +22,8 @@
"confirm_app_default": "Ben je zeker dat je dit de standaardapplicatie wil maken?",
"confirm_change_maindomain": "Ben je zeker dat je de domeinnaam wil wijzigen?",
"confirm_delete": "Ben je zeker dat je {name} wil verwijderen?",
"confirm_install_custom_app": "Waarschuwing: applicaties van derden installeren kan de veiligheid van je systeem in gevaar brengen. Gebruik op eigen risico.",
"confirm_install_domain_root": "Het zal niet meer mogelijk zijn om een andere app te installeren op {domain}. Verdergaan?",
"confirm_install_custom_app": "Waarschuwing: applicaties van derden installeren kan de veiligheid van je systeem in gevaar brengen. Gebruik op eigen risico?",
"confirm_install_domain_root": "Ben je zeker dat je deze app wilt installeren op '/'? Het zal niet meer mogelijk zijn om een andere app te installeren op {domain}",
"confirm_postinstall": "Je gaat zo het post-installatieproces starten op domein {domain}. Dit kan enkele minuten duren, *onderbreek het proces niet*.",
"confirm_restore": "Weet je zeker dat je {name} wilt herstellen?",
"confirm_uninstall": "Ben je zeker dat je de installatie van {name} ongedaan wilt maken?",
@ -66,7 +66,7 @@
"manage_apps": "Apps beheren",
"manage_domains": "Domeinnamen beheren",
"manage_users": "Gebruikers beheren",
"multi_instance": "Meerdere instanties",
"multi_instance": "Meerdere installaties mogelijk",
"next": "Volgende",
"no": "No",
"open": "Openen",
@ -119,14 +119,20 @@
"users_new": "Nieuwe gebruiker",
"users_no": "Geen gebruikers.",
"words": {
"default": "Standaard"
"default": "Standaard",
"link": "Link",
"separator": ", ",
"browse": "Blader",
"none": "Geen",
"valid": "Geldig",
"collapse": "Inklappen"
},
"yes": "Ja",
"app_info_changeurl_desc": "URL van deze applicatie veranderen (domein en/of locatie).",
"app_info_change_url_disabled_tooltip": "Functie is nog niet geïmplementeerd voor deze applicatie",
"app_state_inprogress": "functioneert nog niet",
"ok": "OK",
"app_state_highquality_explanation": "Deze applicatie is goed geïntegreerd met Yunohost. Ze werd en wordt beoordeel door de applicatie ploeg van Yunohost. Er kan gesteld worden dat ze veilig werkt en op lange termijn onderhouden zal worden.",
"app_state_highquality_explanation": "Deze applicatie is al minstens een jaar goed geïntegreerd met Yunohost.",
"app_state_lowquality_explanation": "Deze applicatie kan functioneren maar er zijn nog steeds openstaande problemen of ze is nog niet volledig geïntegreerd met Yunohost of ze respecteert de regels van de kunst niet.",
"app_state_lowquality": "lage kwaliteit",
"app_state_inprogress_explanation": "De persoon die deze applicatie onderhoudt, heeft verklaard dat ze nog niet klaar is voor een gebruik in productie. WEES VOORZICHTIG!",
@ -134,7 +140,7 @@
"all": "Alles",
"app_manage_label_and_tiles": "Naam en tegels beheren",
"app_choose_category": "Kies een categorie",
"api_waiting": "Aan het wachten op de reactie van de server...",
"api_waiting": "Aan het wachten op de reactie van de server",
"api_errors_titles": {
"APINotRespondingError": "YunoHost API reageert niet",
"APIError": "YunoHost kwam een onverwachte fout tegen",
@ -158,8 +164,19 @@
"pending": "Bezig",
"error": "Niet geslaagd"
},
"processing": "De server is aan het verwerken...",
"partial_logs": "[...] (kijk in de geschiedenis voor het volledige log)"
"processing": "De server is aan het verwerken…",
"partial_logs": "[…] (kijk in de geschiedenis voor het volledige log)",
"reconnecting": {
"failed": "De server lijkt niet te reageren. Je kunt proberen opnieuw verbinding te maken of je kunt de opdracht systemctl restart yunohost-api`uitvoeren via ssh.",
"reason": {
"shutdown": "Je server wordt afgesloten en is niet langer bereikbaar. Zet 'm weer aan en er verschijnt een login-prompt zodra de server bereikt kan worden.",
"unknown": "De verbinding met de server werd om onbekende reden gesloten.",
"reboot": "Je server is aan het herstarten en zal enige tijd niet bereikbaar zijn. Een login-prompt komt beschikbaar zodra de server terug is.",
"upgrade_system": "De verbinding met de server is gesloten vanwege een YunoHost upgrade. Wacht tot de server weer bereikbaar is…"
},
"success": "De server is nu bereikbaar! Je kan proberen in te loggen",
"title": "Poging met de server te communiceren…"
}
},
"address": {
"local_part_description": {
@ -208,7 +225,46 @@
"push": "Stuurd de DNS-records door naar de registrar",
"push_force": "Bestaande records overschrijven",
"push_force_confirm": "Weet je zeker dat je alle voorgestelde DNS-records geforceerd wilt doorsturen? Houd er rekening mee dat handmatig ingerichte records kan overschrijven, of belangrijke standaardrecords die door je registrar ingericht zijn.",
"info": "De automatische DNS-record-inrichting is een experimentele functie. <br>Overweeg je huidige DNS zone op te slaan in de omgeving van je DNS-registratie voor je de inrichting vanuit hier door laat sturen."
"info": "De automatische DNS-record-inrichting is een experimentele functie. <br>Overweeg je huidige DNS zone op te slaan in de omgeving van je DNS-registratie voor je de inrichting vanuit hier door laat sturen.",
"methods": {
"auto": "Automatisch",
"handled_in_parent": "Beheerd door hoofddomein",
"manual": "Handmatig",
"none": "Geen",
"semi_auto": "Semi-automatisch"
}
},
"info": {
"certificate_authority": "SSL certificaat authoriteit",
"registrar": "register",
"dyn_dns_remove_and_unsubscribe": "Annuleer ook de registratie van dit domein bij de DynDNS dienst van YunoHost",
"apps_on_domain": "Apps geïnstalleerd op domein"
},
"cert": {
"types": {
"letsencrypt": "Let's Encrypt",
"other": "Andere/Onbekend",
"selfsigned": "Zelfondertekend"
},
"valid_for": "geldig voor {days}"
},
"see_parent_domain": "Zie moederdomein",
"toggle_subdomains": "Toon subdomeinen",
"add": {
"dyn_dns_password_desc": "Dit wachtwoord laat toe om later de controle over je domein terug te krijgen wanneer je jouw systeem herinstalleerd. Als je al eerder je domein geregistreerd hebt, gebruik dan hier je herstelwachtwoord om het terug te winnen.",
"dyn_dns_password": "Domein herstel wachtwoord",
"from_local": "Ik wil een domein enkel voor lokaal gebruik / tests",
"from_yunohost": "Ik bezit geen domein, ik wil een gratis DynDNS domein aangeboden door het YunoHost project registreren/gebruiken",
"from_local_desc": "Als je geen \"echt\" publiek domein wilt, kan je alles gebruiken dat eindigt met <code>.local</code> of <code>.test</code>. Domeinnamen eindigend in <code>.local</code> zijn bijzonder in de betekenis dat ze automatisch worden verwerkt door het lokaal netwerk, aangenomen dat de cliënt het Bonjour protocol ondersteund. Een alternatief is om het <code>/etc/hosts</code> bestand (of equivalent op Windows) aan te passen op elke cliënt waarop je dit domein wilt gebruiken, of om je lokale DNS invoer van je internetrouter te configereren.",
"from_registrar": "Ik wil een domein toevoegen dat ik al bezit, of een subdomein",
"from_yunohost_desc": "Het YunoHost project onderhoudt een gratis 'DynDNS' dienst. Deze is beperkt tot één domein per server (al kan je later wel sub-domeinen toevoegen via 'voeg een domein toe dat ik al bezit, of een subdomein' optie hierboven). De DNS configuratie zal automatisch worden behandeld door YunoHost. Dit is ideaal wanneer je begint met zelf te hosten in het algemeen en je nog niet wilt investeren in een domeinnaam. Maar, in de medium/langetermijn, raden we wel aan om een echt eigen domeinnaam te komen bij een register zodat je volledige eigendom hebt over je domein.",
"from_registrar_desc": "Je zal manueel je DNS-gegevens bij jouw register moeten afmaken om dit domein te configureren. De YunoHost diagnose zal je leiden naar wat je exact moet configureren in je DNS-gegevens."
},
"explain": {
"main_domain": "Het hoofddomein is het domein waarop de gebruikers connecteren op het portaal (via \"{domain}/yunohost/sso\").<br>Daarom is het niet mogelijk om het te verwijderen.<br>Als je \"{domain}\" wilt verwijderen, zul je eerst een ander domein moeten kiezen of toevoegen en als hoofddomein aanduiden."
},
"types": {
"main_domain": "Hoofddomein"
}
},
"disabled": "Uitgeschakeld",
@ -223,14 +279,417 @@
"diagnosis": "Diagnose",
"dns": "DNS",
"details": "Details",
"confirm_firewall_disallow": "Weet je zeker dat je poort {port} (protocol: {protocol}, verbinding: {connection}) wilt sluiten",
"domain_dns_conf_is_just_a_recommendation": "Deze pagina toont de *aanbevolen\" inrichting. De pagina richt DNS *niet* voor je in. Je moet zelf de DNS-zones bij je DNS-registratie inrichten volgens deze aanbeveling.",
"confirm_firewall_disallow": "Weet je zeker dat je poort {port} wilt sluiten? (protocol: {protocol}, verbinding: {connection})",
"domain_dns_conf_is_just_a_recommendation": "Deze sectie toont de *aanbevolen\" inrichting. De pagina richt DNS *niet* voor je in. Je moet zelf de DNS-zones bij je DNS-registratie inrichten volgens deze aanbeveling.",
"app_install_parameters": "Installatieparameters",
"confirm_firewall_allow": "Weet je zeker, dat je poort {port} (protocol: {protocol}, connectie: {connection}) wilt openen",
"confirm_firewall_allow": "Weet je zeker, dat je poort {port} wilt openen? (protocol: {protocol}, connectie: {connection})",
"confirm_install_app_inprogress": "WAARSCHUWING! Deze toepassing is nog experimenteel (als hij al niet volledig kapot is) en het kan maar zo zijn, dat hij je systeem om zeep helpt! Je kunt hem beter NIET installeren, behalve als je weet waar je mee bezig bent. Neem je het risico?",
"diagnosis_first_run": "De diagnosefunctie probeert veel voorkomende problemen in verschillende aspecten van je server in kaart te brengen, om er zeker van te zijn dat alles gladjes verloopt. Geen paniek als er iets mis is meteen nadat je je server geïnstalleerd hebt: de diagnose is precies bedoeld voor het opsporen van problemen en het bieden van hulp bij het oplossen ervan. De diagnose draait ook automatisch tweemaal per dag, en er wordt een email naar de beheerder gestuurd als er problemen gevonden worden.",
"diagnosis_first_run": "De diagnosefunctie probeert veel voorkomende problemen in verschillende aspecten van je server in kaart te brengen, om er zeker van te zijn dat alles vlot verloopt. Geen paniek als er iets mis is meteen nadat je je server geïnstalleerd hebt: de diagnose is precies bedoeld voor het opsporen van problemen en het bieden van hulp bij het oplossen ervan. De diagnose draait ook automatisch tweemaal per dag, en er wordt een email naar de beheerder gestuurd als er problemen gevonden worden.",
"diagnosis_explanation": "De diagnosefunctie probeert veel voorkomende problemen op verschillende aspecten van je server boven water te krijgen, zodat alles gladjes blijft lopen. De diagnose draait tweemaal per dag, er wordt een email naar de beheerder gestuurd als er problemen geconstateerd worden. Houdt er rekening mee dat niet alle controles per definitie relevant zijn als je specifieke functionaliteit niet gebruikt (XMPP, bijvoorbeeld) en dat er bij complexe opbouw van je server misschien vals alarm geslagen wordt. In die gevallen, en als je weet waar je mee bezig bent, is het geen probleem om de overeenkomstige waarschuwingen te negeren.",
"good_practices_about_user_password": "Je gaat nu een nieuw wachtwoord opgeven. Het wachtwoord moet minimaal 8 tekens lang zijn - hoewel het een goede gewoonte is om een langer wachtwoord te gebruiken (d.w.z. een wachtwoordzin) en/of verschillende soorten tekens te gebruiken (hoofdletters, kleine letters, cijfers en speciale tekens).",
"certificate_manage": "SSL-certificaat beheren",
"certificate": "Certificaat"
"certificate": "Certificaat",
"app": {
"info": {
"config_panel_error": "Een fout zorgt ervoor dat het configuratiepaneel niet getoond kan worden:",
"config_panel_error_please_report": "Rapporteer deze fout alsjeblieft aan het YunoHost-team om hem verholpen te krijgen!",
"forum": "Zoek of vraag op het forum!",
"problem": "Een probleem met deze app?"
},
"install": {
"license": "Licentie:{license}",
"notifs": {
"post": {
"title": "Post-install opmerkingen voor '{name}'",
"alert": "De installatie lijkt goed verlopen te zijn!\nHier zijn wat opmerkingen waarvan de packager denkt dat ze van belang zijn.\nJe kan het teruglezen op de informatiepagina van de app."
},
"pre": {
"critical": "De applicatie kan niet geinstalleerd worden",
"danger": "De installatie van de applicatie zal hoogstwaarschijnlijk tot problemen leiden",
"warning": "Belangrijk om te weten voorafgaand aan de installatie"
}
},
"problems": {
"arch": "Deze app kan enkel op specifieke architecturen ({required}) geinstalleerd worden, maar de architectuur van je YunoHost is {current}.",
"install": "Deze app is reeds geinstalleerd en kan niet meermaals geinstaleerd worden.",
"version": "Deze app heeft Yunohost >={required} nodig, maar de actieve versie is {current}. Overweeg om eerst YunoHost te upgraden.",
"broken": "Deze applicatie is kapot volgens de automatische tests van Yunohost, en draait waarschijnlijk je systeem in de soep! Je kan hem beter NIET installeren als je niet precies weet waar je mee bezig bent.",
"thirdparty": "Deze app is geen onderdeel van de officiele YunoHost-catalogus. De installatie van apps door derden kan de integriteit en veiligheid van je systeem ondermijnen. Je kan hem beter NIET installeren, als je niet precies weet waar je mee bezig bent.",
"ignore": "Ik begrijp dat deze installatie mijn Yunohost totaal in de war kan schoppen, maar ik wil het toch proberen.",
"inprogress": "Deze app is nog experimenteel (of zelfs totaal niet-werkend) end gooit waarschijnlijk je systeem in de soep! Je kunt hem beter NIET installeren als je niet precies weet waar je mee bezig bent.",
"lowquality": "Deze app doet het waarschijnlijk wel, maar hij is niet zo goed geintegreerd in YunoHost. Sommige functies, zoals bijvoorbeeld single-sign-on of backup/restore zijn niet beschikbaar, of de best-practices worden niet gevolgd.",
"ram": "Deze app heeft {required} RAM nodig ter installatie of upgrade, maar er is slechts {current} beschikbaar. Zelfs als de installatie slaagt, heeft de app zoveel geheugen nodig dat je server vast zou kunnen lopen."
},
"try_demo": "Probeer de demo",
"version": "Huidige versie: {version}"
},
"integration": {
"archs": "Ondersteunde architecturen:",
"ldap": {
"?": "Geen informatie over LDAP-integratie",
"false": "Geen ondersteuning voor inloggen met Yunohost-gebruikers (LDAP)",
"true": "Ondersteuning van inloggen met Yunohost-gebruikers (LDAP)"
},
"multi_instance": {
"false": "Kan slechts eenmaal geinstalleerd worden",
"true": "Kan meermaals geinstalleerd worden"
},
"resources": "Typisch gebruik van systeembronnen: {ram} RAM, {disk} opslagruimte",
"sso": {
"?": "Geen informatie over SSO-integratie",
"false": "Single-sign-on is niet beschikbaar (SSO)",
"true": "Single-sign-on is beschikbaar (SSO)"
},
"title": "Integratie met Yunohost"
},
"doc": {
"notifications": {
"understood": "Begrepen",
"post_install": "Post-install opmerkingen",
"post_upgrade": "Post-upgrade opmerkingen",
"title": "Notificaties"
},
"about": {
"description": "Omschrijving",
"title": "Over"
},
"admin": {
"title": "Documentatie voor beheerders"
}
},
"installed_version": "Geinstalleerde versie:",
"antifeatures": "Deze app heeft functionaliteit, die je mogelijk niet op prijs stelt:",
"links": {
"admindoc": "Officiële beheersdocumentatie",
"userdoc": "Officiële gebruikersdocumentatie",
"website": "Officiële website",
"forum": "Onderwerpen over deze app op het Yunohost-forum",
"code": "Officiële opslagplaats van code",
"package": "Opslagplaats van Yunohost-pakket",
"title": "Links",
"license": "App licentie",
"package_license": "Licentie Yunohost-pakket"
},
"potential_alternative_to": "Potentieel alternatief voor:",
"upgrade": {
"notifs": {
"pre": {
"alert": "Je zou deze meldingen moeten bekijken voor het upgraden, er kan belangrijke informatie om te weten zijn.",
"title": "Wees gewaarschuwd!"
},
"post": {
"title": "Meldingen na upgrade voor '{name}'",
"alert": "Het lijkt dat de upgrade goed is verlopen!\n Hier zijn een aantal meldingen die de pakket-ontwikkelaars belangrijk om te weten vinden over deze upgrade.\nJe kan deze opnieuw lezen op de infopagina van de app."
}
},
"stop": "Annuleer de upgrade van de volgende app",
"confirm": {
"apps": "Apps die zullen worden geüpgraded",
"title": "Bevestig app upgrade"
},
"continue": "Ga verder naar volgende app"
},
"uninstall": {
"purge_desc": "Verwijder de map met data die geassocieerd is met de app (dit is gewoonlijk de data die je zelf hebt geüpload bij het gebruiken van de app)."
},
"open_this_app": "Open deze app"
},
"human_routes": {
"migrations": {
"run": "Voer migratie uit",
"skip": "Sla migratie over"
},
"permissions": {
"remove": "Verwijder toegang van '{name}' tot '{perm}'",
"add": "Sta '{name}' toegang toe tot '{perm}'"
},
"share_logs": "Genereer link voor de log '{name}'",
"shutdown": "Sluit de server af",
"update": "Check voor updates",
"upgrade": {
"apps": "Upgrade alle apps",
"system": "Upgrade het systeem",
"app": "Upgrade '{app}' app"
},
"apps": {
"dismiss_notification": "Wijs melding voor '{name}' af",
"uninstall": "deïnstalleer app '{name}'",
"action_config": "Voer actie '{action}' van app '{name}' configuratie uit",
"change_url": "Verander toegangs-URL van '{name}'",
"install": "Installeer app '{name}'",
"update_config": "Update paneel '{id}' van app '{name}' configuratie",
"change_label": "Verander label van {prevName}' naar '{nextName}'",
"set_default": "Leid domein '{domain}' root naar '{name}' om"
},
"backups": {
"restore": "Herstel backup '{name}'",
"create": "Maak een backup",
"delete": "Verwijder backup '{name}'"
},
"domains": {
"add": "Voeg domein '{name}' toe",
"push_dns_changes": "Verzend DNS gegevens naar register voor '{name}'",
"set_default": "Zet '{name}' als standaarddomein",
"update_config": "Update paneel '{id}' van domein '{name}' configuratie",
"cert_install": "Installeer certificaat voor '{name}'",
"cert_renew": "Hernieuw certificaat voor '{name}'",
"delete": "Verwijder domein '{name}'"
},
"users": {
"create": "Maak gebruiker '{name}' aan",
"delete": "Verwijder gebruiker '{name}'",
"update": "Update gebruiker '{name}'"
},
"diagnosis": {
"run": "Voer diagnose uit",
"unignore": {
"warning": "Een waarschuwing niet negeren",
"error": "Een foutmelding niet negeren"
},
"ignore": {
"warning": "Negeer een waarschuwing",
"error": "Negeer een foutmelding"
},
"run_specific": "Voer '{description}'-diagnose uit"
},
"services": {
"restart": "Herstart de dienst '{name}'",
"stop": "Stop de dienst '{name}'",
"start": "Start de dienst '{name}'"
},
"firewall": {
"ports": "{action} port {port} ({protocol}, {connection})",
"upnp": "{action} UPnP"
},
"postinstall": "Voer de post-installatie uit",
"groups": {
"delete": "Verwijder groep '{name}'",
"create": "Maak groep '{name}'",
"add": "voeg '{user}' toe aan groep '{name}'",
"remove": "Verwijder '{user}' van groep '{name}'"
},
"settings": {
"update": "Update '{panel}' globale instellingen"
},
"reboot": "Herstart de server",
"reconnecting": "Herconnecteer"
},
"form_errors": {
"emailForward": "Ongeldig doorstuur-e-mailadres: mag enkel alfanumerische en <code>_.-+</code> tekens zijn (vb. iemand+label@voorbeeld.com, v00rbeeld-1+label@voorbeeld.com)",
"maxValue": "Waarde moet een getal gelijk aan of kleiner dan {max} zijn.",
"between": "De waarde moet tussen {min} en {max} zijn.",
"remote": "{message}",
"pattern": "{type}",
"domain": "Ongeldig domeinnaam: Mag enkel alfanumerische kleine letters, punten en streepjes-tekens zijn",
"alpha": "Invoer moeten uitsluitend alfabettekens zijn.",
"minValue": "Waarde moet een getal gelijk aan of groter dan {min} zijn.",
"name": "Namen mogen geen speciale tekens bevatten buiten <code> ,.'-</code>",
"dynDomain": "Ongeldige domeinnaam: Mag enkel alfanumerische kleine letters en streepjes-tekens zijn",
"required": "Veld is verplicht.",
"invalid_form": "Het formulier bevat een aantal fouten.",
"alphalownumdot_": "Invoer moet uitsluitend bestaan uit alfanumerische kleine letters, punten en liggende-streepjes-tekens zijn.",
"email": "Ongeldig e-mailadres: mag enkel alfanumerische en <code>_.-</code> tekens zijn (vb. iemand@voorbeeld.com, v00rbeeld-1@voorbeeld.com)",
"appRepoUrl": "YunoHost app opslagplaats URLs worden verwacht om eruit te zien als https://domain.tld/path/to/repo_ynh",
"notInUsers": "De gebruiker '{value}' bestaat al.",
"number": "Waarde moet een getal zijn.",
"passwordLenght": "Wachtwoord moet minstens 8 tekens lang zijn.",
"passwordMatch": "Wachtwoord komt niet overeen."
},
"group_visitors": "Bezoekers",
"history": {
"title": "Geschiedenis",
"last_action": "Laatste actie:",
"methods": {
"DELETE": "verwijder",
"POST": "maak/voer uit",
"PUT": "aanpassen",
"GET": "lees"
},
"is_empty": "Niets in geschiedenis op dit moment."
},
"items": {
"apps": "geen apps | app | {c} apps",
"logs": "geen logs | log | {c} logs",
"permissions": "geen privileges | privilege | {c} privilege",
"services": "geen diensten | dienst | {c} diensten",
"backups": "geen backups | backup | {c} backups",
"groups": "geen groepen | groep | {c} groepen",
"domains": "geen domein | domein | {c} domeins",
"users": "geen gebruikers | gebruiker | {c} gebruikers",
"installed_apps": "geen geïnstalleerde apps | geïnstalleerde app | {c} geïnstalleerde apps"
},
"hook_data_xmpp_desc": "Kamer en gebruiker configuraties, geüploade bestanden",
"ignored": "{count} genegeerd",
"tools_webadmin": {
"language": "Taal",
"cache": "Cache",
"fallback_language": "Terugvaltaal",
"transitions": "Paginatransitie animatie",
"fallback_language_description": "Taal die zal worden gebruikt in het geval er geen vertaling beschikbaar is in je hoofdtaal.",
"experimental": "Experimentele modus",
"theme": "Schakel nachtmodus in",
"cache_description": "Overweeg om de cache uit te schakelen als je van plan bent te werken met CLI terwijl je ook door dit beheersportaal navigeert.",
"experimental_description": "Geeft je toegang tot experimentele functies. Deze worden geacht onstabiel te zijn en kunnen je systeem kapot maken.<br>Schakel dit enkel in als je weet wat je doet."
},
"items_verbose_items_left": "Er zijn {items} over. | Er is 1 {items} over. | Er zijn {items} over.",
"logs_app": "Logbestanden van apps",
"logs_history": "Geschiedenis van commando uitgevoerd op systeem",
"logs_no_logs_registered": "Geen logbestanden geregistreerd in deze categorie",
"logs_service": "Logbestanden van services",
"migrations_disclaimer_not_checked": "Deze migratie vereist de erkenning van de disclaimer voor uitvoering.",
"migrations_done": "Vorige migraties",
"nobody": "Niemand",
"perform": "Uitvoeren",
"permissions": "Privileges",
"placeholder": {
"fullname": "Sam Smith",
"file": "Blader door bestanden of sleep en drop het",
"firstname": "Sam",
"username": "samsmith",
"domain": "mijn-domein.com",
"groupname": "Mijn groepsnaam",
"lastname": "Smith"
},
"restart": "Opnieuw opstarten",
"retry": "Opnieuw proberen",
"search": {
"for": "Zoeken voor {items}…",
"not_found": "Er zijn {items} die overeenkomen met jouw criteria. | Er is 1 {items} dat overeenkomt met jouw criteria. | Er zijn {items} die overeenkomen met jouw criteria."
},
"since": "sinds",
"system_upgrade_all_applications_btn": "Alle applicaties updaten",
"tools_webadmin_settings": "Web-beheersportaal instellingen",
"traceback": "Traceren",
"user_emailforward_add": "Voeg een e-mail-forward toe",
"users_export": "Exporteer gebruikers",
"users_import": "Importeer gebruikers",
"experimental_warning": "Waarschuwing: deze functie is experimenteel en nog niet stabiel. Je moet deze functie alleen gebruiken als je weet wat je doet.",
"logs_path": "Pad",
"users_import_delete_desc": "Als aangevinkt, zullen alle gebruikers die niet in het CSV bestand aanwezig zijn worden verwijderd (en gewist).",
"logs_started_at": "Start",
"logs_context": "Context",
"select_all": "Selecteer alles",
"run": "Uitvoeren",
"select_none": "Selecteer niets",
"skip": "Overslaan",
"purge_user_data_warning": "Het compleet verwijderen van de data van een gebruiker is onomkeerbaar. Zorg ervoor dat je weet wat je doet!",
"version": "Versie",
"only_decent_quality_apps": "Alleen apps van redelijke kwaliteit",
"from_to": "van {0} tot {1}",
"group_format_name_help": "Je kan alfanumerieke tekens en liggende streepjes gebruiken",
"group_name": "Groepsnaam",
"group": "Groep",
"group_all_users": "Alle gebruikers",
"ignore": "Negeren",
"everything_good": "Alles is OK!",
"warnings": "{count} waarschuwingen",
"rerun_diagnosis": "Voer diagnose opnieuw uit",
"others": "Anderen",
"issues": "{count} problemen",
"permission_show_tile_enabled": "Zichtbaar als tegel in het gebruikersportaal",
"migrations_no_pending": "Geen migraties in behandeling",
"tools_shutdown": "Server afsluiten",
"logs": "Logbestanden",
"logs_suboperations": "Deeloperaties",
"hook_conf_ynh_settings": "YunoHost configuraties",
"logs_ended_at": "Einde",
"logs_more": "Meer regels weergeven",
"migrations": "Migraties",
"unknown": "Onbekend",
"only_highquality_apps": "Alleen hoge-kwaliteit apps",
"migrations_no_done": "Geen vorige migraties",
"postinstall": {
"force": "Forceer de post-installatie",
"title": "Post-installatie",
"user": {
"title": "Maak eerste beheerder aan",
"first_user_help": "De gebruiker zal beheersprivileges krijgen en zal worden toegestaan om contact te maken via zowel de beheersinterface als rechtstreeks met SSH tot de server.\nAangezien het ook een gewone gebruiker is, zal je ook met deze gegevens contact kunnen maken met het gebruikersportaal (SSO).\nEenmaal de post-installatie volledig is, zal je de mogelijkheid hebben om andere beheerders te maken door ze toe te voegen in de 'beheerders'-groep."
}
},
"users_import_csv_file": "CSV Bestand",
"users_import_delete_others": "Verwijder gebruikers buiten deze lijst",
"good_practices_about_admin_password": "Je staat op het punt een nieuw beheerderswachtwoord in te voeren. Dit wachtwoord moet minimaal 8 tekens bevatten. Het is verstandig om een langer wachtwoord te gebruiken (zoals een lange lijst met woorden die niet makkelijk te raden zijn) en/of door verschillende tekens door elkaar heen te gebruiken (hoofdletters, kleine letters, cijfers en leestekens).",
"go_back": "Teruggaan",
"logs_share_with_yunopaste": "Deel met YunoPaste",
"logs_system": "Kernel-logbestanden en andere low-level gebeurtenissen",
"logs_operation": "Operaties gemaakt op systeem met YunoHost",
"logs_package": "Managementgeschiedenis van Debian-pakketten",
"orphaned": "Niet onderhouden",
"tools_reboot_btn": "Opnieuw opstarten",
"users_import_update": "Update bestaande gebruikers",
"yunohost_admin": "YunoHost beheerder",
"users_import_delete": "Verwijder gebruikers buiten de lijst",
"enabled": "ingeschakeld",
"experimental": "Experimenteel",
"footer": {
"help": "Hulp nodig?",
"documentation": "Documentatie",
"donate": "Doneer"
},
"form_input_example": "Voorbeeld: {example}",
"last_ran": "Laatste scan:",
"postinstall_set_domain": "Bepaal hoofddomein",
"license": "Licentie",
"user_emailaliases_add": "Voeg een e-mail alias toe",
"group_add_member": "Gebruiker toevoegen",
"group_new": "Nieuwe groep",
"group_explain_all_users": "Dit is een speciale groep die alle gebruikersaccounts op de server bevat",
"group_specific_permissions": "Gebruiker-specifieke toestemmingen",
"pending_migrations": "Er moeten nog een paar migraties uitgevoerd worden. Ga naar <a href='#/tools/migrations'>Tools > Migraties</a> om ze uit te voeren.",
"groups_and_permissions_manage": "Groepen en privileges beheren",
"unignore": "Niet negeren",
"domain_delete_longdesc": "Verwijder dit domein",
"domain_dns_config": "DNS-configuratie",
"domain_dns_longdesc": "DNS-configuratie weergeven",
"error_server_unexpected": "Onverwachte serverfout",
"error_connection_interrupted": "De server heeft de connectie verbroken in plaats van deze te beantwoorden. Zijn nginx of de yunohost-api opnieuw opgestart of gestopt?",
"app_state_broken": "kapot",
"domain_dns_push_failed_to_authenticate": "De authenticatie bij de API van het register is mislukt. Waarschijnlijk zijn de <a href='#/domains/{domain}/config'>credentials</a> incorrect? (Error: {error})",
"group_admins": "Beheerders",
"group_explain_visitors": "Dit is een speciale groep die anonieme bezoekers voorstelt",
"mailbox_quota_description": "Zet een opslaglimiet voor de e-mail inhoud.<br>Zet deze op 0 om uit te schakelen.",
"mailbox_quota_placeholder": "Vul 0 in om te deactiveren.",
"manage_groups": "Beheer groepen",
"only_working_apps": "Alleen werkende apps",
"migrations_pending": "Migraties in behandeling",
"permission_main": "Hoofdlabel",
"logs_access": "Lijst van toegang en bans",
"tools_yunohost_settings": "YunoHost instellingen",
"tools_reboot": "Server herstarten",
"user_mailbox_use": "Gebruikte ruimte door mailbox",
"tools_shutdown_reboot": "Afsluiten/Herstarten",
"tools_shutdown_btn": "Afsluiten",
"purge_user_data_checkbox": "Data van {name} verwijderen? (Dit zal de inhoud van hun home en mail-mappen volledig verwijderen.)",
"readme": "Lees-mij",
"groups_and_permissions": "Groepen en toestemmingen",
"items_verbose_count": "Er zijn {items}. | Er is 1 {items}. | Er zijn {items}.",
"hook_data_xmpp": "XMPP gegevens",
"domain_dns_push_managed_in_parent_domain": "De automatische DNS gegevens functie is beheerd door het moederdomein <a href='#/domains/{parent_domain}/dns'>{parent_domain}</a>.",
"hook_conf_manually_modified_files": "Handmatig aangepaste configuraties",
"label_for_manifestname_help": "Dit is de naam die wordt weergegeven op het gebruikersportaal. Dit kan later worden aangepast.",
"migrations_disclaimer_check_message": "Ik heb deze disclaimer gelezen en begrepen",
"system_upgrade_all_packages_btn": "Alle pakketten upgraden",
"users_import_update_desc": "Als aangevinkt, zullen alle bestaande gebruikers opgenomen in het CSV bestand worden geüpdated met de nieuwe waarde",
"details_about": "Toon meer details over {subject}",
"domain_add_dyndns_forbidden": "Je bent al geregistereerd/geabbonneerd op een DynDNS domein van het YunoHost project. Per ontwerp is deze toepassing gelimiteerd tot één zulk domein per server. Als je een ander subdomein van je bestaand geregistreerd domein wilt toevoegen, gebruik dan de 'voeg domein toe dat ik bezit, of subdomein' optie hierboven. Als je een totaal ander domein wilt gebruiken, zal je eerst je bestaande DynDNS domein moeten verwijderen. DynDNS domeinen zijn goed wanneer je start met zelf te hosten, maar op de medium/lange termijn raden we aan om je eigen domeinnaam te kopen bij een register zodat je volledige eigendom hebt van je domein.",
"confirm_install_app_broken": "WAARSCHUWING! Deze applicatie is kapot volgens de automatische tests van Yunhost en zal waarschijnlijk je systeem kapot maken! Je moet deze app waarschijnlijk NIET installeren tenzij je weet wat je doet. Wil je dat risico nemen?",
"group_add_permission": "Toestemming toevoegen",
"group_explain_admins": "Deze groep komt overeen met beheerders. Gebruikers in deze groep hebben toegang tot de YunoHost webadmin, kunnen connecteren met de server via SSH en kunnen het 'sudo' commando gebruiken. Ze zullen ook de e-mails verzonden aan root@, admin@ en admins@, en zulkse diagnose notificaties krijgen. Je zou enkel personen die je volledig vertrouwd mogen toevoegen in deze groep!",
"group_explain_visitors_needed_for_external_client": "Let op dat je sommige applicaties toegankelijk houdt voor bezoekers als je deze wilt gebruiken met externe cliënts. Dit is bijvoorbeeld het geval bij Nextcloud als je jouw smartphone of desktopcomputer wilt gebruiken als synchronisatiecliënt.",
"tip_about_user_email": "Gebruikers worden aangemaakt met een bijbehorend emailadres (en XMPP-account) in de vorm username@domain.tld. Extra email-aliassen en email-forwards kunnen later toegevoegd worden door de beheerders en de gebruiker.",
"mailbox_quota_example": "700M is een CD, 4700M is een DVD",
"operation_failed_explanation": "De operatie ging fout! Onze excuses :( Je kan proberen <a href='https://yunohost.org/help'>om hulp te vragen</a>. Toon alstublieft het *volledige logbestand* van de operatie aan de mensen die je helpen. Je kan dit doen door te klikken op de groene knop 'Deel met Yunopaste'. Bij het delen van deze logbestanden zal YunoHost automatisch proberem om de privédata, zoals domeinnamen en IP-addressen, te anonymiseren.",
"orphaned_details": "Deze app is al langere tijd niet onderhouden. Het zou nog kunnen werken, maar het zal geen updates meer ontvangen tot een vrijwilliger dit op zich neemt. Help mee om deze app nieuw leven in te blazen!",
"permission_corresponding_url": "Bijbehorende URL",
"text_selection_is_disabled": "Tekstselectie is uitgeschakeld. Als je de log wilt delen, deel dan de volledige log met de 'Deel met Yunopaste' knop.<br/><small>Of als je echt tekst wilt selecteren, druk dan de toetsen: ↓↓↑↑.</small>",
"users_import_confirm_destructive": "Ben je zeker dat je gebruikers wilt verwijderen die niet aanwezig zijn in dit bestand?",
"domain_delete_forbidden_desc": "je kan '{domain}' niet verwijderen aangezien het je standaarddomein is, je zal een ander domein moeten kiezen (of <a href='#/domains/add'>voeg nieuwe toe</a>) en het als je standaarddomein zetten om deze te kunnen verwijderen.",
"important_yunohost_upgrade": "Een belangrijke YunoHost upgrade is beschikbaar. Het is zeer sterk aangeraden om nauwgezet de uitgaveopmerking(en) op het forum te lezen voor het upgraden: <a href='https://forum.yunohost.org/tag/ynh_release'>Blader door de uitgaveopmerkingen op het forum</a>",
"logs_error": "Foutmelding",
"users_import_csv_file_desc": "Het CSV bestand moet in UTF-8 zijn en met de kolommen gebruikersnaam, wachtwoord, groepen, e-mail en quota. Als voorbeeld van een CSV bestand om te importeren, kan je <a href='/yunohost/api/users/export' target='_BLANK'>gebruikers exporteren in een CSV bestand</a> en het bestand aanpassen.",
"footer_version": "Mogelijk gemaakt door <a href='https://yunohost.org'>YunoHost</a> {version} ({repo}).",
"wrong_password_or_username": "Fout wachtwoord of gebruikersnaam",
"app_state_broken_explanation": "Deze applicatie is op dit moment kapot en is niet-installeerbaar volgens de automatische testen van YunoHost",
"domain_default_longdesc": "Dit is jouw standaarddomein.",
"domain_dns_push_not_applicable": "De automatische DNS gegevens functie is niet van toepassing op de domein {domain},<br> Je zal de DNS gegevens manueel moeten configureren volgens de <a href='https://yunohost.org/dns'>documentatie</a> en de aangeraden configuratie hieronder."
}

View file

@ -339,7 +339,7 @@
"reconnecting": "Reconnexion"
},
"search": {
"for": "Recercar {items}...",
"for": "Recercar {items}",
"not_found": "I a {items} que correspondon a vòstres critèris. | I a 1 {items} que correspond a vòstres critèris. | I a {items} que correspondon a vòstres critèris."
},
"tools_webadmin": {
@ -440,7 +440,7 @@
"app_show_categories": "Mostrar las categorias",
"app_install_parameters": "Paramètres dinstallacion",
"app_choose_category": "Causissètz una categoria",
"api_waiting": "En espèra de la responsa del servidor...",
"api_waiting": "En espèra de la responsa del servidor",
"api_errors_titles": {
"APIConnexionError": "YunoHost a rescontrat una error de connexion",
"APIInternalError": "YunoHost a rescontrat una error intèrna",
@ -464,10 +464,10 @@
"pending": "En cors",
"error": "Fracàs"
},
"processing": "Lo servidor es a tractar laccion...",
"partial_logs": "[...] (veire listoric pels logs complèts)",
"processing": "Lo servidor es a tractar laccion",
"partial_logs": "[] (veire listoric pels logs complèts)",
"reconnecting": {
"title": "Temptativa de comunicacion amb lo servidor...",
"title": "Temptativa de comunicacion amb lo servidor",
"reason": {
"unknown": "La connexion amb lo servidor es estada copada per una rason desconeguda.",
"reboot": "Vòstre servidor tòrna aviar e serà pas contactable pendent un moment. Una fenèstra de connexion serà disponibla tre que lo servidor serà accessible.",

View file

@ -45,7 +45,7 @@
"app_state_inprogress_explanation": "Opiekun tej aplikacji zadeklarował, że ta aplikacja nie jest jeszcze gotowa do użytku zewnętrznego. BĄDŹ OSTROŻNY!",
"app_show_categories": "Pokaż kategorie",
"app_choose_category": "Wybierz kategorię",
"api_waiting": "Czekam na odpowiedź serwera...",
"api_waiting": "Czekam na odpowiedź serwera",
"all_apps": "Wszystkie aplikacje",
"api_errors_titles": {
"APIConnexionError": "YunoHost napotkał błąd połączenia",
@ -57,7 +57,7 @@
},
"api_error": {
"view_error": "Zobacz błąd",
"sorry": "Bardzo przepraszam za to.",
"sorry": "Bardzo za to przepraszam.",
"server_said": "Podczas wykonywania zadania serwer odpowiedział:",
"info": "Poniższe informacje mogą być przydatne dla osoby udzielającej Ci pomocy:",
"error_message": "Wiadomość błędu:",
@ -70,7 +70,7 @@
"pending": "W trakcie",
"error": "Nieudane"
},
"processing": "Serwer w trakcie wykonywania zadania...",
"processing": "Serwer w trakcie wykonywania zadania",
"reconnecting": {
"failed": "Wygląda na to, że serwer nie odpowiada. Spróbuj połączyć się ponownie lub poprzez SSH uruchom komendę `systemctl restart yunohost-api`.",
"reason": {
@ -79,10 +79,10 @@
"reboot": "Serwer jest uruchamiany ponownie i będzie nieosiągalny przez pewien czas. Logowanie stanie się możliwe, gdy serwer będzie ponownie dostępny.",
"upgrade_system": "Połączenie z serwerem przerwane z powodu aktualizacji YunoHost. Trwa oczekiwanie na połączenie…"
},
"title": "Trwa próba połączenia z serwerem...",
"title": "Trwa próba połączenia z serwerem",
"success": "Serwer jest już dostępny! Możesz się zalogować"
},
"partial_logs": "[...] sprawdź w historii pełne logi"
"partial_logs": "[] sprawdź w historii pełne logi"
},
"all": "Wszystko",
"address": {
@ -174,7 +174,8 @@
"info": {
"apps_on_domain": "Aplikacje zainstalowane w domenie",
"certificate_authority": "Urząd certyfikacji SSL",
"registrar": "Rejestrator"
"registrar": "Rejestrator",
"dyn_dns_remove_and_unsubscribe": "Wyrejestruj także domenę z usługi DynDNS YunoHost"
},
"see_parent_domain": "Zobacz domenę nadrzędną",
"types": {
@ -183,6 +184,13 @@
"toggle_subdomains": "Przełącz subdomeny",
"explain": {
"main_domain": "Główna domena to taka domena, z której użytkownicy mogą łączyć się z portalem (przez \"{domain}/yunohost/sso\").<br> W związku z tym nie ma możliwości jej usunięcia. <br> Jeśli chcesz usunąć \"{domain}\", najpierw musisz zmienić lub dodać nową domenę i ustawić ją jako domenę główną."
},
"add": {
"dyn_dns_password": "Hasło odzyskiwania domeny",
"dyn_dns_password_desc": "To hasło pozwoli Ci później odzyskać kontrolę nad domeną, jeśli ponownie zainstalujesz system. Jeśli zarejestrowałeś już tę domenę wcześniej, użyj tutaj hasła odzyskiwania, aby ją odzyskać.",
"from_registrar": "Chcę dodać domenę, której jestem właścicielem, lub subdomenę",
"from_yunohost": "Nie posiadam domeny, chcę zarejestrować/korzystać z darmowej domeny DynDNS udostępnionej przez projekt YunoHost",
"from_local": "Chcę domenę wyłącznie do użytku lokalnego/testowania"
}
},
"domain_add_dyndns_forbidden": "Już subskrybujesz domenę DynDNS. Możesz poprosić o usunięcie aktualnej domeny DynDNS w <a href='//forum.yunohost.org/t/nohost-domain-recovery-suppression-de-domaine-en-nohost-me-noho-st-et-ynh-fr/442'>odpowiednim wątki w forum</a>.",
@ -411,7 +419,7 @@
"skip": "Pomiń migracje"
},
"permissions": {
"remove": "Usuń '{name}' z dostępu do '{name}'",
"remove": "Usuń '{name}' z dostępu do '{perm}'",
"add": "Pozwól '{name}' na dostęp do '{perm}'"
},
"postinstall": "Uruchom post-instalację",
@ -478,7 +486,7 @@
"services": "Usługi",
"running": "W toku",
"search": {
"for": "Wyszukaj {items}...",
"for": "Wyszukaj {items}",
"not_found": "Znaleziono {items} pasujące do podanych kryteriów. | Jest 1 {items} pasujące do podanych kryteriów. | Znaleziono {items} pasujące do podanych kryteriów."
},
"save": "Zapisz",
@ -619,7 +627,7 @@
"title": "Powiadomienia",
"post_upgrade": "Uwagi po aktualizacji",
"post_install": "Uwagi po instalacji",
"understood": "Domyślny"
"understood": "Domyślny/Zrozumiano"
}
},
"info": {

View file

@ -65,7 +65,7 @@
"restore": "Restaurar",
"running": "Em execução",
"save": "Guardar",
"service_start_on_boot": "Iniciar no arranque: ",
"service_start_on_boot": "Iniciar no arranque",
"services": "Serviços",
"set_default": "Aplicar pré-definição",
"size": "Tamanho",
@ -73,8 +73,8 @@
"status": "Estado",
"stop": "Parar",
"system": "Sistema",
"system_apps_nothing": "Não existem aplicações para atualizar.",
"system_packages_nothing": "Não existem pacotes para atualizar.",
"system_apps_nothing": "Não existem aplicações para atualizar!",
"system_packages_nothing": "Não existem pacotes para atualizar!",
"system_update": "Atualização do sistema",
"system_upgrade_btn": "Atualizar",
"tcp": "TCP",
@ -157,7 +157,7 @@
"confirm_service_restart": "Tem certeza que deseja reiniciar {name}?",
"cancel": "Cancelar",
"items_verbose_items_left": "Faltam {items}.",
"items_verbose_count": "Não há {items}. | Existe 1 {item}. | Existem {items}.",
"items_verbose_count": "Não há {items}. | Existe 1 {items}. | Existem {items}.",
"items": {
"users": "nenhum usuário | usuário | {c} usuários",
"services": "nenhum serviço | serviço | {c} serviços",
@ -206,7 +206,7 @@
"group": "Grupo",
"go_back": "Voltar",
"from_to": "de {0} a {1}",
"form_input_example": "Exemplo: {exemple}",
"form_input_example": "Exemplo: {example}",
"form_errors": {
"required": "Campo obrigatório.",
"passwordMatch": "As senhas não são iguais.",
@ -259,7 +259,7 @@
"app_manage_label_and_tiles": "Gerir etiquetas e tiles",
"app_install_parameters": "Configurações de instalação",
"app_choose_category": "Escolha uma categoria",
"api_waiting": "Esperando a resposta do servidor...",
"api_waiting": "Esperando a resposta do servidor",
"api_errors_titles": {
"APIConnexionError": "YunoHost encontrou um erro de conexão",
"APINotRespondingError": "A YunoHost API não está respondendo",
@ -283,8 +283,8 @@
"pending": "Em progresso",
"error": "Falhou"
},
"processing": "O servidor está processando a ação...",
"partial_logs": "[...] (verifique no histórico para logs completos)",
"processing": "O servidor está processando a ação",
"partial_logs": "[] (verifique no histórico para logs completos)",
"reconnecting": {
"failed": "Parece que o servidor não está respondendo. Você pode tentar se reconectar novamente ou tentar executar `systemctl restart yunohost-api` através do ssh.",
"success": "O servidor agora está acessível! Você pode tentar fazer o login",
@ -294,7 +294,7 @@
"shutdown": "Seu servidor está sendo desligado e não está mais acessível. Ligue-o novamente e um prompt de login estará disponível assim que o servidor estiver acessível.",
"unknown": "A conexão com o servidor foi encerrada por motivos desconhecidos."
},
"title": "Tentando se comunicar com o servidor..."
"title": "Tentando se comunicar com o servidor"
}
},
"address": {
@ -346,7 +346,7 @@
"select_all": "Selecionar tudo",
"search": {
"not_found": "Existem {items} que correspondem ao seu critério.",
"for": "Procurar por {items}..."
"for": "Procurar por {items}"
},
"run": "Executar",
"human_routes": {
@ -407,7 +407,7 @@
},
"backups": {
"restore": "Restaurar backup '{name}'",
"delete": "Deletar backup '{name]'",
"delete": "Deletar backup '{name}'",
"create": "Criar um backup"
},
"apps": {

View file

@ -14,8 +14,8 @@
"administration_password": "Senha de administração",
"all": "Todos",
"api": {
"partial_logs": "[...] (confira no histórico para logs completos)",
"processing": "O servidor está processando a ação...",
"partial_logs": "[] (confira no histórico para logs completos)",
"processing": "O servidor está processando a ação",
"query_status": {
"pending": "Em progresso",
"success": "Finalizado com sucesso"
@ -28,7 +28,7 @@
"upgrade_system": "A conexão com o servidor foi encerrada devido a atualização do YunoHost. Aguardando a disponibilidade do servidor…",
"reboot": "Seu servidor está reiniciando e não poderá funcionar por algum tempo. A tela de login estará disponível assim que o servidor estiver online."
},
"title": "Tentando se comunicar com o servidor...",
"title": "Tentando se comunicar com o servidor",
"success": "O servidor agora está online! Tente fazer login novamente"
}
},

View file

@ -30,8 +30,8 @@
"confirm_app_default": "Вы хотите сделать это приложение приложением по умолчанию?",
"confirm_change_maindomain": "Вы хотите изменить главный домен?",
"confirm_delete": "Вы хотите удалить {name}1 ?",
"confirm_firewall_allow": "Вы хотите открыть порт {port}1 ? (протокол {protocol}2, соединение {connection}3)",
"confirm_firewall_disallow": "Вы хотите закрыть порт {port}1 ? (протокол {protocol}2, соединение {connection}3)",
"confirm_firewall_allow": "Вы точно хотите открыть порт {port}? (протокол: {protocol}, соединение: {connection})",
"confirm_firewall_disallow": "Вы точно хотите закрыть порт {port}? (протокол: {protocol}, соединение: {connection})",
"confirm_install_custom_app": "ВНИМАНИЕ! Установка сторонних приложений может нарушить целостность и безопасность вашей системы. Устанавливаейте только если вы понимаете, что делаете. Вы уверены, что хотите взять этот риск на себя?",
"confirm_install_domain_root": "Вы уверены, что хотите установить это приложение на '/'? Вы больше не сможете устанавливать другие приложения на {domain}",
"confirm_restore": "Вы хотите восстановить {name}1 ?",
@ -67,7 +67,7 @@
"error_server_unexpected": "Неожиданная ошибка сервера",
"experimental_warning": "Внимание: это экспериментальная функция и она может работать нестабильно; используйте её, только если понимаете, что делаете.",
"firewall": "Файрволл",
"footer_version": "Создано<a href='https://yunohost.org'></a> {version} ({repo}).",
"footer_version": "Работает на <a href='https://yunohost.org'>YunoHost</a> {version} ({repo}).",
"form_input_example": "Например: {example}",
"home": "Дом",
"hook_adminjs_group_configuration": "Конфигурация",
@ -143,7 +143,11 @@
"words": {
"default": "По умолчанию",
"browse": "Обзор",
"collapse": "Крах"
"collapse": "Свернуть",
"link": "Ссылка",
"valid": "Верно",
"separator": ", ",
"none": "Ничего"
},
"yes": "Да",
"certificate_manage": "Управлять SSL-сертификатом",
@ -182,11 +186,11 @@
"between": "Значение должно быть между {min} и {max}.",
"alphalownumdot_": "В значении могут быть только буквы в нижнем регистре, цифры и символ подчёркивания.",
"alpha": "Значением могут быть только буквы.",
"notInUsers": "Пользователь '{значение}' уже существует.",
"notInUsers": "Пользователь «{value}» уже существует.",
"number": "Значение должно быть числом.",
"maxValue": "Значение должно быть числом, меньшим или равным {min}.",
"remote": "{сообщение}",
"pattern": "{тип}",
"maxValue": "Значение должно быть меньше или равно {max}.",
"remote": "{message}",
"pattern": "{type}",
"invalid_form": "Форма содержит ошибки.",
"email": "Недействительный email: используйте только буквы, цифры и <code>_.-</code> символы (например, someone@example.com, s0me-1@example.com)",
"minValue": "Значение должно быть числом, большим или равным {min}.",
@ -210,7 +214,7 @@
"error": "Ошибка",
"enabled": "Включено",
"domain_delete_forbidden_desc": "Вы не можете удалить домен '{domain}', так как он является доменом по умолчанию. Вы должны сначала выбрать другой домен по умолчанию (либо <a href='#/domains/add'>создать новый</a>), после чего можно будет его удалить.",
"domain_add_dyndns_forbidden": "Вы уже подписаны на домен DynDNS, вы можете попросить удалить ваш домен DynDNS на форуме <a href='//forum.yunohost.org/t/nohost-domain-recovery-suppression-de-domaine-en-nohost-me-noho-st-et-ynh-fr/442'>в этой выделенной ветке</a>.",
"domain_add_dyndns_forbidden": "Вы уже зарегистрировали/подписались на домен DynDNS от проекта YunoHost. Эта функция ограничена одним доменом на сервер. Если вы хотите добавить поддомен домена, на который вы уже подписаны, пожалуйста, используйте опцию «Я хочу добавить свой домен или поддомен» выше. Если вы хотите использовать совершенно другой домен, вы должны сначала удалить ваш существующий домен DynDNS. Домены DynDNS хороши для начинающих, но в долгосрочной перспективе, мы рекомендуем купить ваше собственное доменное имя у какого-нибудь регистратора, чтобы иметь полный доступ к домену.",
"disabled": "Отключено",
"run_first_diagnosis": "Провести начальную диагностику",
"diagnosis_first_run": "Функция диагностики попробует найти типичные проблемы разных аспектов вашего сервера, для того, чтобы убедиться, что сервер работает стабильно. Пожалуйста, не паникуйте, если видите кучу ошибок сразу после поднятия сервера: данная функция создана как раз для того, чтобы найти ошибки и помочь вам их исправить. Диагностика будет запускаться дважды в день, после чего по электронной почте будет направляться отчёт администратору в случае обнаружения проблем.",
@ -238,7 +242,7 @@
"app_show_categories": "Показать категории",
"app_manage_label_and_tiles": "Управление меткой и заголовками",
"app_choose_category": "Выберите категорию",
"api_waiting": "Ожидание ответа сервера...",
"api_waiting": "Ожидание ответа сервера",
"all_apps": "Все приложения",
"api_errors_titles": {
"APIConnexionError": "YunoHost столкнулся с ошибкой подключения",
@ -275,7 +279,7 @@
"error": "Неудачно"
},
"processing": "Сервер обрабатывает действие…",
"partial_logs": "[...] (посмотрите логи полностью в журнале логов)",
"partial_logs": "[…] (посмотрите логи полностью в истории)",
"reconnecting": {
"reason": {
"upgrade_system": "Соединение с сервером было закрыто в связи с обновлением YunoHost. Ждем, когда сервер снова станет доступным…",
@ -284,7 +288,7 @@
"reboot": "Ваш сервер перезагружается и будет недоступен некоторое время. Как только сервер будет доступен, появится приглашение к входу."
},
"failed": "Похоже, что сервер не отвечает. Вы можете попробовать подключиться снова или запустить `systemctl restart yunohost-api` через ssh.",
"title": "Пытаюсь установить связь с сервером...",
"title": "Пытаюсь установить связь с сервером",
"success": "Сервер снова доступен! Попробуйте войти"
}
},
@ -308,9 +312,13 @@
"auto_config_ok": "Автоматическая конфигурация, похоже, в порядке!",
"push_force_warning": "Похоже, что некоторые записи DNS, которые YunoHost должен установить, уже есть в конфигурации регистратора. Вы можете использовать опцию перезаписи, если знаете, что делаете.",
"auto_config_ignored": "игнорируется, YunoHost не будет изменен пока вы не отметите опцию перезаписи",
"push_force_confirm": "Вы уверены, что хотите принудительно перезаписать все предложенные записи dns? Имейте ввиду, что это может изменить важные записи: установленные по умолчанию, а также вами или вашим регистратором.",
"push_force_confirm": "Вы уверены, что хотите принудительно перезаписать все предложенные записи DNS? Имейте ввиду, что это может изменить важные записи, установленные по умолчанию, а также вами или вашим регистратором.",
"methods": {
"auto": "Автоматически"
"auto": "Автоматически",
"none": "Ничего",
"manual": "Вручную",
"semi_auto": "Полуавтоматически",
"handled_in_parent": "Осуществляется в родительском домене"
}
},
"cert": {
@ -320,6 +328,30 @@
"letsencrypt": "Let's Encrypt"
},
"valid_for": "действует в течение {days}"
},
"add": {
"dyn_dns_password": "Пароль восстановления домена",
"from_local": "Я хочу домен только для внутреннего использования / тестов",
"from_registrar": "Я хочу добавить свой домен или поддомен",
"from_yunohost": "У меня нет домена, я хочу зарегистрировать/использовать бесплатный DynDNS-домен, предоставленный проектом YunoHost",
"dyn_dns_password_desc": "Это пароль, который позволит вам восстановить контроль над доменом, если вы переустановите вашу систему. Если вы уже зарегистрировали этот домен, используйте пароль восстановления, чтобы восстановить доступ.",
"from_local_desc": "Если вы не хотите публичное доменное имя, вы можете использовать что-либо заканчивающееся на <code>.local</code> или <code>.test</code>. Доменные имена, заканчивающиеся на <code>.local</code> является специальными из-за того, что они автоматически распознаются в локальной сети, если клиенты поддерживают протокол Bonjour. Вам также может понадобиться отредактировать файл <code>/etc/hosts</code> (или эквивалент в Windows) на каждом клиенте, на которых вы хотите использовать локальные домены или настроить их на вашем маршрутизаторе.",
"from_registrar_desc": "Вам нужно будет вручную настроить DNS-записи у вашего регистратора, чтобы завершить настройку домена. Диагностика YunoHost покажет вам, какие DNS-записи вам нужно настроить.",
"from_yunohost_desc": "Проект YunoHost сопровождает бесплатный сервис «DynDNS». Этот сервис имеет ограничение на один домен на сервер (однако вы можете позже добавить поддомены используя опцию «Я хочу добавить свой домен или поддомен» выше. Настройка DNS будет автоматически осуществлена YunoHost. Этот вариант отлично подходит тогда, когда вы только начинаете администрировать и пока не хотите вкладываться в доменное имя. Однако в долгосрочной перспективе, мы рекомендуем купить ваше собственное доменное имя у какого-нибудь регистратора, чтобы иметь полный доступ к домену."
},
"info": {
"certificate_authority": "Орган сертификации SSL",
"registrar": "Регистратор",
"dyn_dns_remove_and_unsubscribe": "Также удалить домен с сервиса DynDNS",
"apps_on_domain": "Приложение, установленные на домен"
},
"see_parent_domain": "Смотрите родителский домен",
"toggle_subdomains": "Переключить поддомены",
"types": {
"main_domain": "Главный домен"
},
"explain": {
"main_domain": "Главный домен - это тот, с которого пользователи могут подключаться к порталу (через « {domain}/yunohost/sso»).<br>Исходя из этого, его нельзя удалить.<br>Если вы хотите удалить « {domain}», вам сначала нужно будет выбрать или добавить другой домен и пометить его как главный."
}
},
"select_all": "Выбрать все",
@ -343,7 +375,9 @@
"delete": "Удалить домен '{name}'",
"push_dns_changes": "Установить записи DNS для домена '{name}'",
"set_default": "Сделать '{name}' доменом по умолчанию",
"update_config": "Обновление панели '{id}' конфигурации домена '{name}'"
"update_config": "Обновление панели '{id}' конфигурации домена '{name}'",
"cert_install": "Установить сертификат для «{name}»",
"cert_renew": "Обновить сертификат для «{name}»"
},
"groups": {
"create": "Создать группу '{name}'",
@ -382,7 +416,9 @@
"install": "Установить приложение '{name}'",
"uninstall": "Удалить приложение '{name}'",
"update_config": "Обновление панели '{id}' конфигурации приложения '{name}'",
"set_default": "Перенаправление корневого домена '{domain}' на '{name}'"
"set_default": "Перенаправление корневого домена '{domain}' на '{name}'",
"action_config": "Выполнить действие «{action}» конфигурации приложения «{name}»",
"dismiss_notification": "Пропустить уведомление для «{name}»"
},
"backups": {
"create": "Создать резервную копию",
@ -396,10 +432,13 @@
"postinstall": "Запустить программу post-install",
"share_logs": "Создать ссылку для лога '{name}'",
"shutdown": "Выключить сервер",
"reconnecting": "Переподключение"
"reconnecting": "Переподключение",
"settings": {
"update": "Обновить глобальные настройки «{panel}»"
}
},
"search": {
"for": "Искать {items}...",
"for": "Искать {items}",
"not_found": "Есть {items}, соответствующие вашим критериям. | Есть 1 {items}, соответствующий вашим критериям. | Есть {items}, соответствующие вашим критериям."
},
"select_none": "Не выбирать ничего",
@ -412,11 +451,12 @@
"experimental_description": "Дает вам доступ к экспериментальным функциям. Они считаются нестабильными и могут сломать вашу систему.<br> Включайте эту опцию, только если вы знаете, что делаете.",
"transitions": "Анимация перехода страниц",
"fallback_language": "Вспомогательный язык",
"cache_description": "Подумайте об отключении кэша, если вы планируете работать с CLI и одновременно осуществлять навигацию в веб-админке."
"cache_description": "Подумайте об отключении кэша, если вы планируете работать с CLI и одновременно осуществлять навигацию в веб-админке.",
"theme": "Переключить тёмный режим"
},
"domain_dns_push_managed_in_parent_domain": "Функция автоматической записи DNS управляется в родительском домене <a href='#/domains/{parent_domain}/dns'>{parent_domain}</a>.",
"purge_user_data_warning": "Очистка данных пользователя необратима. Надеемся, вы знаете, что делаете!",
"warnings": "{count} предупреждение",
"warnings": "{count} предупреждений",
"users_import_csv_file_desc": "CSV-файл должен быть в формате UTF-8 и содержать колонки: имя пользователя, пароль, группы, email и квоту. Для примера импорта CSV файла вы можете <a href='/yunohost/api/users/export' target='_BLANK'>экспортировать своих пользователей в CSV файл</a> и изменить его.",
"users_import_update_desc": "Если флажок установлен, всем пользователям в CSV-файле будут присвоены новые значения",
"users_import_delete_desc": "Если флажок установлен, все существующие пользователи, которых нет в CSV-файле, будут удалены (и очищены).",
@ -426,7 +466,7 @@
"user_mailbox_quota": "Квота почтового ящика",
"version": "Версия",
"api_not_found": "Похоже, что веб-администратор пытался запросить что-то несуществующее.",
"domain_dns_push_failed_to_authenticate": "Не удалось пройти аутентификацию на API регистратора. Может быть <a href='#/domains/{domain}/config'>учетные данные</a> указаны неверно? (Ошибка: {error})",
"domain_dns_push_failed_to_authenticate": "Не удалось пройти аутентификацию через API регистратора. Может быть <a href='#/domains/{domain}/config'>учетные данные</a> указаны неверно? (Ошибка: {error})",
"users_import": "Импорт пользователей",
"users_export": "Экспорт пользователей",
"users_import_csv_file": "CSV файл",
@ -454,7 +494,8 @@
"domain": "my-domain.com",
"lastname": "Смит",
"file": "Выберите файл или перетяните его",
"username": "samsmith"
"username": "ivanivanov",
"fullname": "Иван Иванов"
},
"only_highquality_apps": "Только высококачественные приложения",
"only_decent_quality_apps": "Только приложения достойного качества",
@ -496,7 +537,7 @@
"hook_data_xmpp": "Данные XMPP",
"hook_data_xmpp_desc": "Конфигурации комнат и пользователей, загрузка файлов",
"mailbox_quota_example": "700M размер CD-диска, а 4700M DVD",
"good_practices_about_admin_password": "Сейчас Вам предстоит установить новый пароль администратора. Пароль должен состоять как минимум из 8 символов хотя хорошей практикой является использование более длинного пароля (например фразы) и/или использование различных символов (прописных и строчных букв, цифр и специальных символов).",
"good_practices_about_admin_password": "Сейчас Вам предстоит установить новый пароль администратора. Пароль должен состоять как минимум из 8 символов хотя хорошей практикой является использование более длинного пароля (например, фразы) и/или использование различных символов (прописных и строчных букв, цифр и специальных символов).",
"group_add_member": "Добавить пользователя",
"group_explain_all_users": "Это специальная группа, содержащая учетные записи всех пользователей на сервере",
"group_explain_visitors": "Это специальная группа, представляющая анонимных посетителей",
@ -520,7 +561,11 @@
},
"postinstall": {
"force": "Принудительная пост-установка",
"title": "Пост-установка"
"title": "Пост-установка",
"user": {
"title": "Создать первого администратора",
"first_user_help": "Этому пользователю будут выданы права администартора и разрешено подключаться к этому веб-интерфейсу, также как и напрямую к серверу по SSH.\nТак как это также обычный пользователь, вы также сможете подключаться к порталу пользователя (SSO) со своими учётными данными.\nКогда первоначальная настройка будет завершена, вы сможете создать ещё администраторов, добавляя их в группу «admins»."
}
},
"items_verbose_items_left": "Осталось {items}. | Осталось 1 {items}. | Осталось {items}.",
"permission_main": "Основной ярлык",
@ -545,7 +590,8 @@
"notifications": {
"title": "Уведомления",
"post_upgrade": "Примечания после обновления",
"post_install": "Примечания после установки"
"post_install": "Примечания после установки",
"understood": "Понятно"
}
},
"info": {
@ -559,7 +605,7 @@
"notifs": {
"post": {
"title": "Уведомления после установки для '{name}'",
"alert": "Похоже, что установка прошла успешно!\n Вот некоторые уведомления, которые, по мнению упаковщика, важно знать.\nВы можете прочитать их снова на странице информации о приложении."
"alert": "Похоже, что установка прошла успешно!\nВот некоторые уведомления, которые, по мнению упаковщика, важно знать.\nВы можете прочитать их снова на странице информации о приложении."
},
"pre": {
"warning": "Что нужно знать перед установкой",
@ -607,8 +653,9 @@
"title": "Ссылки",
"userdoc": "Официальная документация для пользователей",
"website": "Официальный сайт",
"license": "Лицензия",
"package": "Репозиторий пакетов YunoHost"
"license": "Лицензия приложения",
"package": "Репозиторий пакетов YunoHost",
"package_license": "Лицензия пакета YunoHost"
},
"upgrade": {
"confirm": {
@ -629,10 +676,20 @@
"stop": "Отменить следующие обновления приложений"
},
"potential_alternative_to": "Возможная альтернатива:",
"installed_version": "Установленная версия:"
"installed_version": "Установленная версия:",
"uninstall": {
"purge_desc": "Удалить директорию с данными этого приложения (обычно это данные, которые вы сами загрузили используя это приложение)."
}
},
"app_state_broken": "сломано",
"app_state_broken_explanation": "Это приложение в настоящее время сломано и не может быть установлено согласно автоматическим тестам YunoHost",
"confirm_install_app_broken": "ВНИМАНИЕ! Это приложение сломано согласно автоматическим тестам YunoHost и, скорее всего, сломает вашу систему! Вам НЕ следует устанавливать его, если вы не знаете, что делаете. Вы готовы пойти на такой риск?",
"details_about": "Показать больше подробностей о {subject}"
"details_about": "Показать больше подробностей о {subject}",
"group_admins": "Администраторы",
"manage_groups": "Управлять группами",
"wrong_password_or_username": "Неправильный пароль или имя пользователя",
"label_for_manifestname_help": "Это имя, которое отображается в портале пользователя. Оно может быть изменено позже.",
"tools_yunohost_settings": "Настройки YunoHost",
"group_explain_admins": "Это специальная группа для пользователей-администраторов. Пользователи в этой группе имеют доступ к администраторскому веб-интерфейсу YunoHost, SSH-соединению и использованию команды `sudo`. Они также будут получать письма, отправленные на почтовые ящики root@, admin@ и admins@, такие как уведомления диагностики. Вы должны добавлять сюда только тех, кому полностью доверяете!",
"important_yunohost_upgrade": "Доступен большое обновление YunoHost. Очень рекомендуется внимательно прочитать заметки о выпуске на форуме перед обновлением :<a href='https://forum.yunohost.org/tag/ynh_release'>Найти заметки о выпуске на форуме</a>"
}

View file

@ -160,7 +160,8 @@
"cert": {
"types": {
"letsencrypt": "Let's Encrypt",
"other": "Iné/Neznáme"
"other": "Iné/Neznáme",
"selfsigned": "Vlastnoručne podpísaný (self-signed)"
},
"valid_for": "platný počas {days}"
},
@ -173,7 +174,11 @@
"types": {
"main_domain": "Hlavná doména"
},
"toggle_subdomains": "Prepnúť subdomény"
"toggle_subdomains": "Prepnúť subdomény",
"add": {
"from_registrar": "Chcem pridať doménu, ktorú vlastník alebo subdoménu",
"from_yunohost": "Nevlastním doménu, chcem zaregistrovať/používať voľnú doménu DynDNS poskytovanú projektom YunoHost"
}
},
"domain_add": "Pridať doménu",
"domain_add_dyndns_forbidden": "Svoju doménu ste už na DynDNS zaregistrovali. V diskusnom fóre môžete požiadať o odobratie Vašej súčasnej DynDNS domény v <a href='//forum.yunohost.org/t/nohost-domain-recovery-suppression-de-domaine-en-nohost-me-noho-st-et-ynh-fr/442'>samostatnom príspevku</a>.",
@ -461,7 +466,7 @@
"save": "Uložiť",
"search": {
"for": "Hľadanie {items}…",
"not_found": "Nájdených {item} zodpovedajúcich Vášmu zadaniu. | Nájdená 1 {items} zodpovedajúca Vášmu zadaniu. | Nájdené {items} zodpovedajúce Vášmu zadaniu."
"not_found": "Nájdených {items} zodpovedajúcich Vášmu zadaniu. | Nájdená 1 {items} zodpovedajúca Vášmu zadaniu. | Nájdené {items} zodpovedajúce Vášmu zadaniu."
},
"select_all": "Vybrať všetko",
"select_none": "Nevybrať nič",
@ -478,7 +483,7 @@
"status": "Stav",
"stop": "Zastaviť",
"system_packages_nothing": "Všetky systémové balíčky sú aktuálne!",
"system_upgrade_btn": "Aktualizácia",
"system_upgrade_btn": "Aktualizovať",
"system_upgrade_all_packages_btn": "Aktualizovať všetky balíčky",
"tcp": "TCP",
"tip_about_user_email": "Pri vytvorení používateľa je mu tiež pridelená e-mailová adresa (a účet XMPP) vo formáte menopouzivatela@domena.sk. Ďalšie e-mailové aliasy a presmerovania môžu pridať neskôr administrátor alebo samotný používateľ.",
@ -531,7 +536,8 @@
"words": {
"browse": "Prehliadať",
"collapse": "Zabaliť",
"default": "Predvolené"
"default": "Predvolené",
"none": "Žiadne"
},
"yes": "Áno",
"yunohost_admin": "Správca YunoHost",
@ -575,7 +581,8 @@
"notifications": {
"title": "Upozornenia",
"post_upgrade": "Upozornenia o aktualizácii",
"post_install": "Upozornenia o inštalácii"
"post_install": "Upozornenia o inštalácii",
"understood": "Rozumiem"
}
},
"install": {
@ -587,13 +594,16 @@
"critical": "Aplikáciu nie je možné nainštalovať"
},
"post": {
"title": "Poinštalačné upozornenie pre '{name}'"
"title": "Poinštalačné upozornenie pre '{name}'",
"alert": "Zdá sa, že inštalácia úspešne skončila!\nTu je niekoľko upozornení, ktoré autor(ka) balíčku považuje za dôležité.\nMôžete si ich znova prečítať na stránke s informáciami o aplikácii."
}
},
"problems": {
"ignore": "Beriem na zreteľ, že inštalovaním tejto aplikácie si môžem rozbiť systém, no i napriek tomu to chcem urobiť.",
"install": "Aplikácia je už nainštalovaná a nie je možné ju nainštalovať viac ako jedenkrát.",
"arch": "Túto aplikáciu je možné nainštalovať iba na konkrétnych architektúrach ({required}), no vaša architektúra je {current}."
"arch": "Túto aplikáciu je možné nainštalovať iba na konkrétnych architektúrach ({required}), no vaša architektúra je {current}.",
"broken": "Automatické testy YunoHost označili túto aplikáciu za rozbitú a je možné, že vám poškodí systém! Preto by ste ju pravdepodobne NEMALI inštalovať, pokiaľ si nie ste istý, že to tak chcete.",
"thirdparty": "Táto aplikácia nie je súčasťou oficiálneho katalógu YunoHost, inštalovaním aplikácií tretích strán môžete ohroziť integritu a bezpečnosť vášho systému. Pokiaľ neviete, čo robíte, aplikáciu by ste NEMALI inštalovať."
},
"version": "Aktuálna verzia: {version}",
"try_demo": "Vyskúšať demo"
@ -602,7 +612,8 @@
"integration": {
"ldap": {
"false": "Nepoužíva na prihlasovanie účty YunoHost (LDAP)",
"true": "Používa na prihlasovanie účty YunoHost (LDAP)"
"true": "Používa na prihlasovanie účty YunoHost (LDAP)",
"?": "Chýbajú informácie o LDAP integrácii"
},
"title": "Integrácia s YunoHost",
"archs": "Podporované architektúry:",

View file

@ -13,14 +13,14 @@
"administration_password": "Upravljalno geslo",
"all": "Vse",
"api": {
"processing": "Strežnik obdeluje dejanje...",
"processing": "Strežnik obdeluje dejanje",
"query_status": {
"error": "Neuspešno",
"pending": "V teku",
"success": "Uspešno končano",
"warning": "Uspešno končano z napakami ali opozorili"
},
"partial_logs": "[...] (preveri zgodovino za polne zapise",
"partial_logs": "[] (preveri zgodovino za polne zapise",
"reconnecting": {
"reason": {
"upgrade_system": "Povezava s strežnikom se je zaprla zaradi YunoHost nadgradnje. Čakanje na strežnik, da bo ponovno dosegljiv…",
@ -28,7 +28,7 @@
"unknown": "Povezava s strežnikom je bila prekinjena iz neznanih razlogov.",
"shutdown": "Tvoj strežnik se ugaša in ni več dosegljiv. Ponovno ga vklopi in poziv za prijavo bo na razpolago takoj, ko bo strežnik dosegljiv."
},
"title": "Poskušam se povezati s strežnikom...",
"title": "Poskušam se povezati s strežnikom",
"failed": "Videti je, da se strežnik ne odziva. Lahko se poskusiš ponovno povezati ali poskusi zagnati `systemctl restart yunohost-api` thru ssh.",
"success": "Strežnik je zdaj dosegljiv! Lahko se poskusiš vpisati"
}
@ -51,7 +51,7 @@
},
"all_apps": "Vse aplikacije",
"api_not_found": "Kaže da je spletni-admin poskusil poizvesti po nečem neobstoječem.",
"api_waiting": "Čakam na strežnikov odziv...",
"api_waiting": "Čakam na strežnikov odziv",
"app_choose_category": "Izberi kategorijo",
"app_info_access_desc": "Skupine / uporabniki, ki imajo dostop do te aplikacije:",
"app_info_default_desc": "Preusmeri korensko domeno na to aplikacijo ({domain}).",
@ -100,7 +100,7 @@
"confirm_group_add_access_permission": "Ste prepričani da želi dodeliti {name} dostop do {perm}? Takšen dostop bistveno razširi napadalo polje, če se {name} izkaže za škodoželjo osebo. Stori to samo če res ZAUPAŠ tej osebi ali skupini.",
"confirm_install_custom_app": "POZOR! Namestitev neuradnih aplikacij lahko ogrozi celovitost in varnost vašega sistema. Verjetno NI dobro namestiti, razen če res veš kaj počneš. Si pripravljen_a sprejeti tveganje?",
"confirm_install_app_lowquality": "Pozor: aplikacija bi lahko delovala vendar ni dobro vključena v YunoHost. Nekatere funkcionalnosti, kot so poenoten vpis ter varnostno kopiranje/povrnitev, morda niso na voljo.",
"confirm_install_app_inprogress": "POZOR! Ta aplikacija je še vedno poskusna (če eksplicitno ne dela) in bo verjetno poškodovala tvoj sistem! Verjetno ga ne bi smel_a naložiti, razen če veš, kaj počneš. Ali si pripravljen_a tvegati?",
"confirm_install_app_inprogress": "POZOR! Ta aplikacija je še vedno poskusna (če eksplicitno ne dela) in bo verjetno poškodovala tvoj sistem! Verjetno ga ne bi smel_a naložiti, razen če veš, kaj počneš. Ali si pripravljen_a tvegati?",
"confirm_migrations_skip": "Ni priporočljivo preskočiti selitev podatkov. Ali si prepričan_a, da želiš to storiti?",
"confirm_postinstall": "Kmalu se bo začel post-namestitveni proces na domeni {domain}. Morda ti bo vzelo nekaj minut, *ne prekini operacije*.",
"confirm_restore": "Ali si prepričan_a, da želiš obnoviti {name}?",

View file

@ -54,7 +54,7 @@
"download": "Ladda ner",
"open": "Öppen",
"hook_data_home_desc": "Användardata i /home/ANVÄNDARE",
"service_start_on_boot": "Kör vid uppstart: ",
"service_start_on_boot": "Kör vid uppstart",
"migrations_no_pending": "Inga kommande förflyttningar",
"domain_default_desc": "Standarddomänen är den domän du vill att användare loggar in på.",
"logs_context": "Sammanhang",
@ -104,7 +104,7 @@
"view_error": "Se fel",
"help": "Du borde leta hjälp på <a href=\"https://forum.yunohost.org/\">forumet</a> eller <a href=\"https://chat.yunohost.org/\">chatten</a> för att lösa situationen, eller rapportera buggen i <a href=\"https://github.com/YunoHost/issues\">buggrapporteraren</a>."
},
"api_waiting": "Väntar på serverns svar...",
"api_waiting": "Väntar på serverns svar",
"app_install_parameters": "Installera inställningar",
"all": "Alla",
"api_not_responding": "YunoHost APIet svarar inte. Är \"yunohost-api\" nere eller är under omstart?",
@ -117,7 +117,7 @@
"reboot": "Din server håller på att starta om och kommer inte att kunna nås på ett tag. En inloggningsfråga kommer att finnas tillgänglig så snart servern är tillgänglig."
},
"failed": "Verkar som om servern inte svarar. Du kan försöka att återansluta eller försök köra `systemctl restart yunohost-api`genom ssh.",
"title": "Försöker kommunicera med servern...",
"title": "Försöker kommunicera med servern",
"success": "Servern är nu åtkomlig! Du kan försöka att logga in"
},
"query_status": {
@ -126,8 +126,8 @@
"success": "Framgångsrikt slutfört",
"warning": "Framgångsrikt slutfört med fel eller varningar"
},
"partial_logs": "[...](Kolla i historiken för hela loggar)",
"processing": "Servern processar åtgärden..."
"partial_logs": "[](Kolla i historiken för hela loggar)",
"processing": "Servern processar åtgärden"
},
"api_errors_titles": {
"APINotFoundError": "YunoHost API kunde inte hitta en rutt",

View file

@ -28,11 +28,11 @@
"upgrade_system": "YunoHost అప్ గ్రేడ్ కారణంగా సర్వర్తో కనెక్షన్ మూసివేయబడింది. సర్వర్ మళ్లీ చేరుకునే వరకు వేచి ఉంది…"
},
"success": "సర్వర్ ఇప్పుడు చేరుకోవచ్చు! మీరు లాగిన్ చేయడానికి ప్రయత్నించవచ్చు",
"title": "సర్వర్తో కమ్యూనికేట్ చేయడానికి ప్రయత్నిస్తోంది...",
"title": "సర్వర్తో కమ్యూనికేట్ చేయడానికి ప్రయత్నిస్తోంది",
"failed": "సర్వర్ ప్రతిస్పందించడం లేదని కనిపిస్తోంది. మీరు మళ్లీ కనెక్ట్ చేయడానికి ప్రయత్నించవచ్చు లేదా ssh ద్వారా 'systemctl restart yunohost-api'ని రన్ చేయడానికి ప్రయత్నించవచ్చు."
},
"partial_logs": "[...] (పూర్తి లాగ్ ల కోసం చరిత్రలో తనిఖీ చేయండి)",
"processing": "సర్వర్ చర్యను ప్రాసెస్ చేస్తోంది..."
"partial_logs": "[] (పూర్తి లాగ్ ల కోసం చరిత్రలో తనిఖీ చేయండి)",
"processing": "సర్వర్ చర్యను ప్రాసెస్ చేస్తోంది"
},
"api_error": {
"error_message": "దోష సందేశం:",
@ -51,10 +51,10 @@
"APIConnexionError": "YunoHost ఒక కనెక్షన్ దోషాన్ని ఎదుర్కొంది"
},
"all_apps": "అన్ని అనువర్తనాలు",
"api_waiting": "సర్వర్ ప్రతిస్పందన కోసం వేచి ఉంది...",
"api_waiting": "సర్వర్ ప్రతిస్పందన కోసం వేచి ఉంది",
"app_choose_category": "ఒక వర్గాన్ని ఎంచుకోండి",
"app_info_access_desc": "సమూహాలు / వినియోగదారులు ప్రస్తుతం ఈ అనువర్తనాన్ని యాక్సెస్ చేయడానికి అనుమతించారు:",
"app_info_default_desc": "ఈ అనువర్తనానికి డొమైన్ రూట్‌ను మళ్ళించండి ({డొమైన్}).",
"app_info_default_desc": "ఈ అనువర్తనానికి డొమైన్ రూట్‌ను మళ్ళించండి ({domain}).",
"app_info_changeurl_desc": "ఈ అప్లికేషన్ యొక్క యాక్సెస్ URL ను మార్చండి (డొమైన్ మరియు/లేదా మార్గం).",
"app_info_change_url_disabled_tooltip": "ఈ లక్షణం ఈ అనువర్తనంలో ఇంకా అమలు చేయబడలేదు",
"app_info_uninstall_desc": "ఈ అనువర్తనాన్ని తొలగించండి.",

View file

@ -41,7 +41,11 @@
"words": {
"default": "Varsayılan",
"collapse": "Kapat",
"browse": "Tara"
"browse": "Tara",
"link": "Bağlantı",
"none": "Hiçbiri",
"valid": "Geçerli",
"separator": ", "
},
"yes": "Evet",
"ok": "Tamam",
@ -58,7 +62,7 @@
"app_state_lowquality_explanation": "Bu uygulama işlevsel olabilir, ancak yine de sorunlar içerebilir veya YunoHost ile tamamen entegre değildir veya iyi uygulamalara uymaz.",
"purge_user_data_checkbox": "{name} verileri temizlensin mi? (Bu işlem ana ve posta dizinlerinin içeriğini silecektir.)",
"app_info_change_url_disabled_tooltip": "Bu özellik bu uygulamada henüz uygulanmadı",
"app_info_default_desc": "Alan adı kökünü bu uygulamaya yönlendirin (% s).",
"app_info_default_desc": "Alan adı kökünü bu uygulamaya yönlendirin ({domain}).",
"app_state_inprogress": "Henüz çalışmıyor",
"app_info_changeurl_desc": "Bu uygulamanın erişim URL'sini değiştirin (alan adı ve / veya yol).",
"app_make_default": "Varsayılan yap",
@ -138,7 +142,8 @@
"username": "ahmetatici",
"firstname": "Ahmet",
"lastname": "Atıcı",
"domain": "domain.com"
"domain": "domain.com",
"fullname": "Sam Smith"
},
"from_to": "{0} ile {1} arasında",
"go_back": "Geri dön",
@ -153,7 +158,9 @@
"change_label": "'{prevName}' etiketini '{nextName}' ile değiştirin",
"change_url": "'{name}' erişim URL'sini değiştir",
"set_default": "'{domain}' alan kökünü '{name}' olarak yönlendirin",
"update_config": "{id}. paneldeki '{name}' uygulamasının yapılandırmasını güncelleyin"
"update_config": "{id}. paneldeki '{name}' uygulamasının yapılandırmasını güncelleyin",
"action_config": "Uygulama {name} için {action} eylemini çalıştır",
"dismiss_notification": "'{name}' için bildirimi iptal et"
},
"diagnosis": {
"run_specific": "'{description}' tanılamasını çalıştır",
@ -172,7 +179,9 @@
"add": "'{name}' alan adını ekle",
"update_config": "{id}. paneldeki '{name}' yapılandırmasını güncelleyin",
"delete": "'{name}' alan adını sil",
"set_default": "'{name}' alan adını varsayılan yap"
"set_default": "'{name}' alan adını varsayılan yap",
"cert_install": "{name} için sertifika kur",
"cert_renew": "{name} için sertifika yenile"
},
"firewall": {
"upnp": "{action} UPnP",
@ -217,7 +226,10 @@
},
"reconnecting": "Yeniden bağlanıyor",
"share_logs": "'{name}' günlüğü için bağlantı oluştur",
"update": "Güncellemeleri kontrol et"
"update": "Güncellemeleri kontrol et",
"settings": {
"update": "{panel} global ayarlarını güncelle"
}
},
"hook_data_xmpp": "XMPP verileri",
"domain": {
@ -236,7 +248,46 @@
"auto_config_zone": "Geçerli DNS bölgesi",
"info": "Otomatik DNS kayıtları yapılandırması deneysel bir özelliktir. <br>Kayıtları buradan göndermeden önce, mevcut DNS bölgenizi DNS kayıt operatörünüzün arayüzünden kaydetmeyi düşünün.",
"manual_config": "Manuel yapılandırma için önerilen DNS kayıtları",
"push_force_warning": "YunoHost'un ayarladığı bazı DNS kayıtları, kayıt operatörü yapılandırmasında zaten var gibi görünüyor. Ne yaptığınızı biliyorsanız, üzerine yazma seçeneğini kullanabilirsiniz."
"push_force_warning": "YunoHost'un ayarladığı bazı DNS kayıtları, kayıt operatörü yapılandırmasında zaten var gibi görünüyor. Ne yaptığınızı biliyorsanız, üzerine yazma seçeneğini kullanabilirsiniz.",
"methods": {
"handled_in_parent": "Ana alan adında işlenir",
"manual": "El ile",
"auto": "Otomatik",
"semi_auto": "Yarı otomatik",
"none": "Hiçbiri"
}
},
"cert": {
"types": {
"other": "Diğer/Bilinmeyen",
"letsencrypt": "Let's Encrypt (Ücretsiz SSL)",
"selfsigned": "Kendinden imzalı"
},
"valid_for": "{days} süresince geçerli"
},
"info": {
"apps_on_domain": "Alan adı üzerinde yüklü olan uygulamalar",
"certificate_authority": "SSL Sertifikası yetkilisi",
"dyn_dns_remove_and_unsubscribe": "Ayrıca YunoHost'un DynDNS hizmetinden alan adının kaydını kaldırın",
"registrar": "Kaydedici"
},
"see_parent_domain": "Ana alan adına bakın",
"toggle_subdomains": "Alt alan adlarını değiştir",
"add": {
"dyn_dns_password_desc": "Bu parola, sisteminizi yeniden yüklediğinizde alan adının kontrolünü tekrardan geri almanızı sağlayacaktır. Bu alan adını daha önce kaydettirdiyseniz, geri almak için kurtarma parolanızı burada kullanın.",
"from_yunohost_desc": "YunoHost projesi ücretsiz bir 'DynDNS' hizmeti sunmaktadır. Sunucu başına bir alan adı ile sınırlıdır (ancak daha sonra yukarıdaki diğer 'Sahip olduğum bir alan adını veya bir alt alan adını ekle' seçeneğini kullanarak alt alan adları da ekleyebilirsiniz). DNS yapılandırması YunoHost tarafından otomatik olarak yapılacaktır. Bu, genel olarak kendiniz üzerinde barındarmaya başlarken ve henüz bir alan adına yatırım yapmak istemediğinizde idealdir. Ancak, orta/uzun vadede, alan adınızın tam mülkiyetine sahip olmak için kendi alan adınızı bir kayıt kuruluşundan satın almanızı öneririz.",
"dyn_dns_password": "Alan adı kurtarma parolası",
"from_local": "Yalnızca lokalde kullanım / test için bir alan adı istiyorum",
"from_local_desc": "\"Gerçek\" bir genel alan adı istemiyorsanız, <code>.local</code> veya <code>.test</code> ile biten herhangi bir şey kullanabilirsiniz. <code>.local</code> ile biten alan adları, istemcilerin Bonjour protokolünü desteklediği varsayılarak, yerel ağda otomatik olarak çözülebilmeleri için özel anlam taşır. Alternatif olarak, bu alanı kullanmak istediğiniz her istemcide <code>/etc/hosts</code> dosyasını (veya Windows'ta eşdeğerini) ayarlamanız veya ağ ayarlarınızda yerel DNS girişlerini yapılandırmanız gerekebilir.",
"from_registrar": "Sahip olduğum bir alan adını veya bir alt alan adını (subdomain) eklemek istiyorum",
"from_registrar_desc": "Bu alan adının yapılandırmasını tamamlamak için kayıt kuruluşunuzda DNS kayıtlarını manuel olarak yapılandırmanız gerekecektir. YunoHost'un teşhis sistemi, tam olarak hangi DNS kayıtlarının yapılandırılacağı konusunda size yol gösterecektir.",
"from_yunohost": "Bir alan adım yok, YunoHost projesi tarafından sağlanan ücretsiz bir DynDNS alan adını kaydetmek/kullanmak istiyorum"
},
"explain": {
"main_domain": "Ana alan adı, kullanıcıların giriş yapabildiği alan adıdır (\"{domain}/yunohost/sso\"). <br> Bu nedenle silinmesi mümkün değildir. <br> {domain} 'u silmek istiyorsanız, önce başka bir alan adı seçmeniz veya eklemeniz ve bunu ana alan adı olarak ayarlamanız gerekir."
},
"types": {
"main_domain": "Ana alan adı"
}
},
"migrations_disclaimer_check_message": "Bu sorumluluk reddini okudum ve anladım",
@ -246,7 +297,7 @@
"groups_and_permissions_manage": "Gruplar ve izinleri yönet",
"confirm_restore": "{name}'yi geri yüklemek istediğinizden emin misiniz?",
"confirm_upnp_enable": "UPnP'yi etkinleştirmek istediğinizden emin misiniz?",
"created_at": "Oluşturuldu:",
"created_at": "Oluşturuldu",
"domain_default_longdesc": "Bu, varsayılan alan adınızdır.",
"domain_dns_config": "DNS yapılandırması",
"firewall": "Güvenlik Duvarı",
@ -282,11 +333,11 @@
"reboot": "Sunucunuz yeniden başlatılıyor ve bir süreliğine erişilemeyecek. Sunucu tekrar erişilebilir olduğunda bir oturum açma ekranı sunulacaktır."
},
"success": "Sunucu artık erişilebilir durumda! Giriş yapabilirsiniz",
"title": "Sunucuyla iletişim kurulmaya çalışılıyor...",
"title": "Sunucuyla iletişim kurulmaya çalışılıyor",
"failed": "Sunucu yanıt vermiyor gibi görünüyor. Yeniden bağlanmayı deneyebilir veya ssh aracılığıyla `systemctl restart yunohost-api` çalıştırmayı deneyebilirsiniz."
},
"partial_logs": "[...] (tam günlükler için geçmişe bakın)",
"processing": "Sunucu eylemi işliyor..."
"partial_logs": "[] (tam günlükler için geçmişe bakın)",
"processing": "Sunucu eylemi işliyor"
},
"install": "Yükle",
"readme": "Beni oku",
@ -315,14 +366,18 @@
"APIInternalError": "YunoHost \"internal\" bir hata ile karşılaştı"
},
"app_show_categories": "Kategorileri göster",
"confirm_firewall_allow": "{port} bağlantı noktasını açmak istediğinizden emin misiniz? (protokol: {protokol}, bağlantı: {connection})",
"confirm_firewall_allow": "{port} bağlantı noktasını açmak istediğinizden emin misiniz? (protokol: {protocol}, bağlantı: {connection})",
"domain_add_dyndns_forbidden": "Zaten bir DynDNS etki alanına abone oldunuz, mevcut DynDNS etki alanınızı <a href='//forum.yunohost.org/t/nohost-domain-recovery-suppression-de-domaine-en-nohost-me-noho-st-et-ynh-fr/442'>bu linkteki forumundan kaldırmayı isteyebilirsiniz. </a>.",
"domain_dns_push_failed_to_authenticate": "Kayıt şirketinin API'sinde kimlik doğrulanamadı. <a href='#/domains/{domain}/config'>kimlik bilgileri</a> yanlış olabilir mi? (Hata: {error})",
"experimental_warning": "Uyarı: Bu özellik deneyseldir ve istikrarlı olarak kabul edilmez, ne yaptığınızı bilmiyorsanız kullanmamalısınız.",
"mailbox_quota_example": "Bir CD 700 MB, bir DVD 4.7GB'dir",
"postinstall": {
"force": "Post-install işlemini zorla yap",
"title": "Kurulum sonrası"
"title": "Kurulum sonrası",
"user": {
"title": "İlk yöneticiyi oluşturma",
"first_user_help": "Bu kullanıcıya yönetici ayrıcalıkları verilecek ve bu yönetim arayüzünün yanı sıra SSH aracılığıyla doğrudan sunucuya bağlanmasına izin verilecektir.\nNormal bir kullanıcı olduğu için, kimlik bilgileriyle kullanıcı portalına (SSO) da bağlanabileceksiniz.\nKurulum sonrası tamamlandığında, 'admins' grubuna ekleyerek başka yönetici kullanıcılar oluşturabileceksiniz."
}
},
"retry": "Tekrar dene",
"backup": "Yedek",
@ -338,14 +393,14 @@
}
},
"api_not_found": "Görünüşe göre web yöneticisi var olmayan bir şeyi sorgulamaya çalıştı.",
"api_waiting": "Sunucunun yanıtı bekleniyor...",
"api_waiting": "Sunucunun yanıtı bekleniyor",
"app_install_parameters": "Kurulum ayarları",
"backup_content": "Yedek içeriği",
"backup_create": "Yedek oluştur",
"backup_new": "Yeni yedek",
"confirm_app_change_url": "Uygulama erişim URL'sini değiştirmek istediğinizden emin misiniz?",
"confirm_app_default": "Bu uygulamayı varsayılan yapmak istediğinizden emin misiniz?",
"confirm_firewall_disallow": "{port} bağlantı noktasını kapatmak istediğinizden emin misiniz? (protokol: {protokol}, bağlantı: {connection})",
"confirm_firewall_disallow": "{port} bağlantı noktasını kapatmak istediğinizden emin misiniz? (protokol: {protocol}, bağlantı: {connection})",
"confirm_group_add_access_permission": "{name} için {perm} erişimi vermek istediğinizden emin misiniz? {name} kötü niyetli bir kişi olursa, bu tür erişim saldırı yüzeyini önemli ölçüde artırır. Bunu yalnızca bu kişiye/gruba GÜVENİYORSANIZ yapmalısınız.",
"confirm_install_custom_app": "UYARI! 3. taraf uygulamaları yüklemek, sisteminizin bütünlüğünü ve güvenliğini tehlikeye atabilir. Ne yaptığınızı bilmiyorsanız muhtemelen KURMAMALISINIZ. Bu riski almaya hazır mısınız?",
"confirm_install_domain_root": "Bu uygulamayı kök dizin '/' üzerine kurmak istediğinizden emin misiniz? {domain} alan adına başka bir uygulama yükleyemeyeceksiniz",
@ -454,7 +509,8 @@
"fallback_language_description": "Çevirinin ana dilde olmaması durumunda kullanılacak dil.",
"cache": "Önbellek",
"cache_description": "Bu web-yöneticisi ile aynı anda CLI ile de çalışmayı planlıyorsanız, önbelleği devre dışı bırakın.",
"transitions": "Sayfa geçiş animasyonları"
"transitions": "Sayfa geçiş animasyonları",
"theme": "Karanlık modu aç / kapat"
},
"users_import_update": "Varolan kullanıcıları güncelle",
"items_verbose_items_left": "{items} öğe kaldı. | {items} öğe kaldı. | {items} öğe kaldı.",
@ -472,8 +528,8 @@
"user_username_edit": "{name} adlı kullanıcının hesabını düzenleyin",
"tools_shutdown": "Sunucuyu kapat",
"search": {
"for": "{items} öğelerini ara...",
"not_found": "Kriterlerinizle eşleşen {items} öğe var. | Kriterlerinize uyan 1 {item} öğe var. | Kriterlerinizle eşleşen {items} öğe var."
"for": "{items} öğelerini ara",
"not_found": "Kriterlerinizle eşleşen {items} öğe var. | Kriterlerinize uyan 1 {items} öğe var. | Kriterlerinizle eşleşen {items} öğe var."
},
"users_import": "Kullanıcıları içe aktar",
"users_export": "Kullanıcıları dışa aktar",
@ -560,12 +616,15 @@
"notifications": {
"title": "Bildirimler",
"post_upgrade": "Yükseltme sonrası notları",
"post_install": "Kurulum sonrası notları"
"post_install": "Kurulum sonrası notları",
"understood": "Anlaşıldı"
}
},
"info": {
"forum": "Ara veya foruma sor!",
"problem": "Uygulamayla ilgili bir sorun mu var?"
"problem": "Uygulamayla ilgili bir sorun mu var?",
"config_panel_error_please_report": "Düzeltilmesi için lütfen bu hatayı YunoHost ekibine bildirin!",
"config_panel_error": "Bir hata yapılandırma panelinin görüntülenmesini engelliyor:"
},
"integration": {
"archs": "Desteklenen işlemci mimarileri:",
@ -581,8 +640,56 @@
"resources": "Olağan kaynak kullanımı: {ram} RAM, {disk} disk",
"sso": {
"false": "Çoklu oturum açma kullanılabilir değil (SSO)",
"true": "Çoklu oturum açma kullanılabilir (SSO)"
}
"true": "Çoklu oturum açma kullanılabilir (SSO)",
"?": "SSO entegrasyonu hakkında bilgi yok"
},
"title": "YunoHost Entegrasyonu"
},
"links": {
"admindoc": "Resmi Yönetici belgeleri",
"code": "Resmi kod deposu",
"package": "YunoHost paket deposu",
"forum": "YunoHost'un forumunda bu uygulama hakkında konular",
"package_license": "YunoHost paket lisansı",
"title": "Bağlantılar",
"userdoc": "Resmi Kullanıcı dökümantasyonları",
"website": "Resmi Website",
"license": "Uygulama Lisansı"
},
"potential_alternative_to": "Potansiyel alternatif:",
"upgrade": {
"continue": "Sonraki uygulamaya devam et",
"notifs": {
"post": {
"title": "{name} yükseltme sonrası bildirimler",
"alert": "Görünüşe göre yükseltme sorunsuz tamamlandı!\n İşte yapımcının bu yükseltme hakkında bilinmesi gerektiğini düşündüğü bazı bildirimler.\nUygulama bilgi sayfasından da tekrar okuyabilirsiniz."
},
"pre": {
"alert": "Yükseltmeden önce bu bildirimleri kontrol etmelisiniz, bilmeniz gereken önemli şeyler olabilir.",
"title": "Dikkatli olun!"
}
},
"confirm": {
"apps": "Yükseltme yapılacak uygulamalar",
"title": "Uygulama yükseltmelerini onayla"
},
"stop": "Sonraki uygulama yükseltmelerini iptal et"
},
"uninstall": {
"purge_desc": "Uygulama ile ilişkili verileri kaldırın (bu genellikle uygulamayı kullanarak kendi yüklediğiniz verilerdir)."
}
}
},
"since": "beri",
"traceback": "Geri izleme",
"group_admins": "Yöneticiler",
"app_state_broken": "Hatalı",
"app_state_broken_explanation": "YunoHost'un otomatik testlerine göre bu uygulama şu anda hatalı ve yüklenemiyor",
"label_for_manifestname_help": "Bu, kullanıcı portalında görüntülenen addır. Bu daha sonra değiştirilebilir.",
"group_explain_admins": "Bu, yönetici haklarına sahip kullanıcılara karşılık gelen özel bir gruptur. Bu gruptaki kullanıcılar YunoHost'un web yöneticisine erişebilir, SSH ile sunucuya bağlanabilir ve `sudo` komutunu kullanabilir. Ayrıca root@, admin@ ve admins@'e gönderilen özel bildirimler gibi e-postaları da alacaklardır. Bu gruba yalnızca kesinlikle güvendiğiniz kişileri eklemelisiniz!",
"confirm_install_app_broken": "UYARI! Bu uygulama YunoHost'un otomatik testlerine göre hatalıdır ve sisteminizi bozması muhtemeldir! Ne yaptığınızı emin değilseniz yüklememelisiniz. Bu riski yine de almak istiyor musunuz?",
"wrong_password_or_username": "Yanlış şifre veya kullanıcı adı",
"manage_groups": "Grupları yönet",
"details_about": "{subject} hakkında daha fazla ayrıntı göster",
"important_yunohost_upgrade": "Büyük bir YunoHost yükseltmesi mevcuttur. Yükseltme yapmadan önce forumdaki sürüm notlarını dikkatlice okumanız şiddetle tavsiye edilir: <a href='https://forum.yunohost.org/tag/ynh_release'>Forumdaki sürüm notlarına göz atın</a>",
"tools_yunohost_settings": "YunoHost ayarları"
}

View file

@ -20,7 +20,7 @@
"confirm_migrations_skip": "Не рекомендовано пропускати міграції. Ви точно в цьому впевнені?",
"confirm_install_app_lowquality": "Увага: цей застосунок може працювати, але його погано інтегровано з YunoHost. Деякі можливості типу SSO або резервних копій можуть бути не доступні.",
"confirm_app_install": "Ви справді бажаєте встановити цей застосунок?",
"confirm_install_domain_root": "Ви впевнені, що хочете встановити цю програму на '/'? Ви не зможете встановити іншу програму на {домен}",
"confirm_install_domain_root": "Ви впевнені, що хочете встановити цю програму на '/'? Ви не зможете встановити іншу програму на {domain}",
"confirm_install_custom_app": "ПОПЕРЕДЖЕННЯ! Встановлення застосунків сторонніх виробників може порушити цілісність і безпеку вашої системи. Вам, імовірно, НЕ слід встановлювати їх, якщо ви не знаєте, що робите. Чи готові ви піти на такий ризик?",
"confirm_group_add_access_permission": "Ви справді бажаєте надати {perm} доступ до {name}? Такий доступ значно збільшує ділянку нападу, якщо {name} виявиться зловмисником. Ви повинні робити це тільки в тому випадку, якщо ви довіряєте цій людині/групі.",
"confirm_firewall_disallow": "Ви справді бажаєте закрити порт {port} (протокол: {protocol}, з'єднання: {connection})",
@ -63,7 +63,7 @@
"app_info_changeurl_desc": "Змінити посилання доступу до цього застосунку (домен і/чи шлях).",
"app_info_access_desc": "Групи / користувачі, у яких є доступ до цього застосунку:",
"app_choose_category": "Оберіть категорію",
"api_waiting": "Очікування відповіді сервера...",
"api_waiting": "Очікування відповіді сервера",
"api_not_responding": "API YunoHost не відповідає. Може 'yunohost-api' не працює або щойно перезапускався?",
"api_not_found": "Схоже, що вебадміністрування намагалося запросити щось відсутнє.",
"all_apps": "Усі застосунки",
@ -90,8 +90,8 @@
"pending": "Обробляється",
"error": "Невдало"
},
"processing": "Оброблення дії сервером...",
"partial_logs": "[...] (перевірте в історії повні журнали)",
"processing": "Оброблення дії сервером",
"partial_logs": "[] (перевірте в історії повні журнали)",
"reconnecting": {
"failed": "Схоже, сервер не відповідає. Ви можете спробувати знову з'єднатися або спробувати запустити `systemctl restart yunohost-api` через ssh.",
"reason": {
@ -100,7 +100,7 @@
"shutdown": "Ваш сервер вимикається, і він більше не доступний. Увімкніть його знову, і запит на вхід з’явиться, щойно сервер стане доступним.",
"upgrade_system": "З'єднання з сервером було закрито через оновлення YunoHost. Очікуємо, поки сервер знову буде доступний…"
},
"title": "Спробування зв'язатися з сервером...",
"title": "Спробування зв'язатися з сервером",
"success": "Тепер сервер доступний! Ви можете спробувати увійти"
}
},
@ -391,7 +391,7 @@
"running": "Виконується",
"save": "Зберегти",
"search": {
"for": "Пошук {items}...",
"for": "Пошук {items}",
"not_found": "Наявно {items}, що відповідають критеріям. | Наявний {items}, що відповідає критеріям. | Наявно {items}, що відповідають критеріям."
},
"select_all": "Вибрати все",
@ -500,7 +500,7 @@
"tools_shutdown": "Вимкнути цей сервер",
"user_mailbox_quota": "Квота поштової скриньки",
"users": "Користувачі",
"purge_user_data_checkbox": "Очистити дані {name}? (Це призведе до видалення вмісту домашньої та поштової директорій).",
"purge_user_data_checkbox": "Очистити дані {name}? (Це призведе до видалення вмісту домашньої та поштової директорій.)",
"purge_user_data_warning": "Очищення даних користувача не є відновлюваним. Будьте впевнені, що ви знаєте, що робите!",
"users_import": "Імпорт користувачів",
"users_export": "Експорт користувачів",

View file

@ -138,7 +138,7 @@
"lastname": "姓",
"firstname": "名"
},
"api_waiting": "正在等待服务器的响应...",
"api_waiting": "正在等待服务器的响应",
"address": {
"domain_description": {
"email": "为您的邮箱选择一个域。",
@ -185,7 +185,7 @@
"error_modify_something": "您应该修改一些东西",
"domain_delete_forbidden_desc": "您无法删除 '{domain}',因为它是默认域,您需要选择另一个域(或<a href='#/domains/add'>添加一个新域</a>)并将其设置为默认域能够删除它。",
"domain_default_desc": "默认域是用户登录的连接域。",
"domain_add_dyndns_forbidden": "您已经在 YunoHost 项目中注册/订阅了一个 DynDNS 域。根据设计,每个服务器只能使用一个这样的域。如果您想使用已订阅域的子域,请使用上面的“添加一个我拥有的域或子域”选项。如果您想使用一个完全不同的域,应首先删除现有的 DynDNS 域名。DynDNS 域在开始使用自托管时是个不错的选择,但从中长期来看,我们建议您向某些注册商购买自己的域名,以拥有域的完全所有权。",
"domain_add_dyndns_forbidden": "您已经在 YunoHost 项目中注册/订阅了一个 DynDNS 域。根据设计,每个服务器只能使用一个这样的域。如果您想添加一个已订阅域的子域,请使用上面的“添加一个我拥有的域或子域”选项。如果您想使用一个完全不同的域,应首先删除现有的 DynDNS 域名。DynDNS 域在开始使用自托管时是个不错的选择,但从中长期来看,我们建议您向某些注册商购买自己的域名,以拥有域的完全所有权。",
"diagnosis_explanation": "诊断功能将尝试识别服务器不同方面的常见问题,以确保一切顺利运行。诊断每天自动运行两次,如果发现问题,会向管理员发送电子邮件。请注意,如果您不想使用某些特定功能(例如 XMPP则某些测试可能不相关或者如果您有复杂的设置则可能会失败。在这种情况下如果您知道自己在做什么则可以忽略相应的问题或警告。",
"diagnosis_first_run": "诊断功能将尝试识别服务器不同方面的常见问题,以确保一切顺利运行。如果您在设置服务器后立即看到一堆错误,请不要惊慌:它正是为了帮助您识别问题并指导您修复它们。诊断还将每天自动运行两次,如果发现问题,则会向管理员发送电子邮件。",
"domain_dns_conf_is_just_a_recommendation": "本节向您展示*推荐*配置。它*不会*为您配置 DNS。您有责任根据此建议在您的 DNS 注册商中配置您的 DNS 区域。",
@ -232,8 +232,8 @@
"pending": "进行中",
"error": "未成功"
},
"processing": "服务器正在处理操作...",
"partial_logs": "[...](查看完整日志的历史记录)",
"processing": "服务器正在处理操作",
"partial_logs": "[](查看完整日志的历史记录)",
"reconnecting": {
"failed": "看起来服务器没有响应。您可以尝试重新连接或尝试通过 ssh 运行 `systemctl restart yunohost-api`。",
"reason": {
@ -243,7 +243,7 @@
"shutdown": "您的服务器正在关闭并且无法再访问。请重新启机,当服务器可以访问时,登录提示将会出现。"
},
"success": "服务器现在可以访问了!您可以尝试登录",
"title": "正在尝试与服务器通信..."
"title": "正在尝试与服务器通信"
}
},
"ignored": "{count} 已忽略",
@ -397,7 +397,7 @@
"select_all": "全选",
"search": {
"not_found": "{items}符合您的条件。 | 有 1 个{items}符合您的条件。 | 共有{items}符合您的条件。",
"for": "搜索{items}..."
"for": "搜索{items}"
},
"save": "保存",
"running": "正在运行",
@ -539,7 +539,7 @@
"apps_on_domain": "安装在域上的应用",
"certificate_authority": "SSL 证书颁发机构",
"registrar": "注册商",
"dyn_dns_remove_and_unsubscribe": "同时从 YunoHost 的 dyndns 服务中取消注册此域"
"dyn_dns_remove_and_unsubscribe": "同时从 YunoHost 的 DynDNS 服务中取消注册此域"
},
"explain": {
"main_domain": "主域是用户可以连接到门户的域(通过 \"{domain}/yunohost/sso\")。<br>因此,无法删除它。<br>如果想要删除\"{domain}\",您首先必须选择或添加另一个域并将其设置为主域。"
@ -585,7 +585,7 @@
"install": {
"notifs": {
"post": {
"alert": "看来安装进展顺利!\n 以下是打包者认为重要的一些通知。\n您可以在应用信息页面中再次阅读。",
"alert": "看来安装进展顺利!\n以下是打包者认为重要的一些通知。\n您可以在应用信息页面中再次阅读。",
"title": "'{name}' 的安装后通知"
},
"pre": {
@ -631,12 +631,13 @@
"links": {
"userdoc": "官方用户文档",
"website": "官方网站",
"license": "许可证",
"license": "应用许可证",
"admindoc": "官方管理文档",
"code": "官方代码仓库",
"forum": "YunoHost 论坛上有关此应用的主题",
"package": "Yunohost 软件包存储库",
"title": "链接"
"title": "链接",
"package_license": "YunoHost 软件包许可证"
},
"potential_alternative_to": "潜在的替代方案:",
"upgrade": {

View file

@ -6,135 +6,135 @@
export default {
ar: {
name: 'عربي'
name: 'عربي',
},
bn_BD: {
name: 'বাংলা',
dateFnsLocale: 'bn'
dateFnsLocale: 'bn',
},
br: {
name: 'Brezhoneg',
dateFnsLocale: 'fr'
dateFnsLocale: 'fr',
},
ca: {
name: 'Català'
name: 'Català',
},
ckb: {
name: 'کوردی',
dateFnsLocale: 'fa-IR'
dateFnsLocale: 'fa-IR',
// FIXME fallback to Farsi (`fa-IR`) is arbitrary, some would probably prefer Arabic (`ar`)...
},
cs: {
name: 'Čeština'
name: 'Čeština',
},
da: {
name: 'Dansk'
name: 'Dansk',
},
de: {
name: 'Deutsch'
name: 'Deutsch',
},
el: {
name: 'Eλληνικά'
name: 'Eλληνικά',
},
en: {
name: 'English',
dateFnsLocale: 'en-GB'
dateFnsLocale: 'en-GB',
},
eo: {
name: 'Esperanto'
name: 'Esperanto',
},
es: {
name: 'Español'
name: 'Español',
},
eu: {
name: 'Euskara'
name: 'Euskara',
},
fa: {
name: 'فارسی',
dateFnsLocale: 'fa-IR'
dateFnsLocale: 'fa-IR',
},
fi: {
name: 'Suomi'
name: 'Suomi',
},
fr: {
name: 'Français'
name: 'Français',
},
gl: {
name: 'Galego'
name: 'Galego',
},
he: {
name: 'עברית'
name: 'עברית',
},
hi: {
name: 'हिन्दी'
name: 'हिन्दी',
},
hu: {
name: 'Magyar'
name: 'Magyar',
},
id: {
name: 'Bahasa Indonesia'
name: 'Bahasa Indonesia',
},
it: {
name: 'Italiano'
name: 'Italiano',
},
kab: {
name: 'Taqbaylit',
dateFnsLocale: 'ar-DZ'
dateFnsLocale: 'ar-DZ',
},
lt: {
name: 'Lietuvių'
name: 'Lietuvių',
},
mk: {
name: 'македонски'
name: 'македонски',
},
nb_NO: {
name: 'Norsk bokmål',
dateFnsLocale: 'nb'
dateFnsLocale: 'nb',
},
ne: {
name: 'नेपाली',
dateFnsLocale: 'en-GB'
dateFnsLocale: 'en-GB',
},
nl: {
name: 'Nederlands'
name: 'Nederlands',
},
oc: {
name: 'Occitan',
dateFnsLocale: 'ca'
dateFnsLocale: 'ca',
},
pl: {
name: 'Polski'
name: 'Polski',
},
pt: {
name: 'Português'
name: 'Português',
},
pt_BR: {
name: 'Português brasileiro',
dateFnsLocale: 'pt-BR'
dateFnsLocale: 'pt-BR',
},
ru: {
name: 'Русский'
name: 'Русский',
},
sk: {
name: 'Slovak'
name: 'Slovak',
},
sl: {
name: 'Slovenščina'
name: 'Slovenščina',
},
sv: {
name: 'Svenska'
name: 'Svenska',
},
te: {
name: 'Telugu'
name: 'Telugu',
},
tr: {
name: 'Türkçe'
name: 'Türkçe',
},
uk: {
name: 'Українська'
name: 'Українська',
},
zh_Hans: {
name: '简化字',
dateFnsLocale: 'zh-CN'
}
dateFnsLocale: 'zh-CN',
},
}

View file

@ -10,20 +10,19 @@ import i18n from './i18n'
import { registerGlobalErrorHandlers } from './api'
import { initDefaultLocales } from './i18n/helpers'
Vue.config.productionTip = false
// Styles are imported in `src/App.vue` <style>
Vue.use(BootstrapVue, {
BSkeleton: { animation: 'none' },
BAlert: { show: true },
BBadge: { pill: true }
BBadge: { pill: true },
})
Vue.use(VueShowdown, {
options: {
emoji: true
}
emoji: true,
},
})
// Ugly wrapper for `$bvModal.msgBoxConfirm` to set default i18n button titles
@ -34,14 +33,18 @@ Vue.prototype.$askConfirmation = function (message, props) {
cancelTitle: this.$i18n.t('cancel'),
bodyBgVariant: 'warning',
centered: true,
bodyClass: ['font-weight-bold', 'rounded-top', store.state.theme ? 'text-white' : 'text-black'],
...props
bodyClass: [
'font-weight-bold',
'rounded-top',
store.state.theme ? 'text-white' : 'text-black',
],
...props,
})
}
Vue.prototype.$askMdConfirmation = function (markdown, props, ok = false) {
const content = this.$createElement('vue-showdown', {
props: { markdown, flavor: 'github', options: { headerLevelStart: 4 } }
props: { markdown, flavor: 'github', options: { headerLevelStart: 4 } },
})
return this.$bvModal['msgBox' + (ok ? 'Ok' : 'Confirm')](content, {
okTitle: this.$i18n.t('yes'),
@ -49,15 +52,15 @@ Vue.prototype.$askMdConfirmation = function (markdown, props, ok = false) {
headerBgVariant: 'warning',
headerClass: store.state.theme ? 'text-white' : 'text-black',
centered: true,
...props
...props,
})
}
// Register global components
const globalComponentsModules = import.meta.glob([
'@/components/globals/*.vue',
'@/components/globals/*/*.vue'
], { eager: true })
const globalComponentsModules = import.meta.glob(
['@/components/globals/*.vue', '@/components/globals/*/*.vue'],
{ eager: true },
)
Object.values(globalComponentsModules).forEach((module) => {
const component = module.default
Vue.component(component.name, component)
@ -71,7 +74,7 @@ initDefaultLocales().then(() => {
store,
router,
i18n,
render: h => h(App)
render: (h) => h(App),
})
app.$mount('#app')

View file

@ -10,7 +10,7 @@ const router = new VueRouter({
base: import.meta.env.BASE_URL,
routes,
scrollBehavior (to, from, savedPosition) {
scrollBehavior(to, from, savedPosition) {
// Mimics the native scroll behavior of the browser.
// This allows the user to find his way back to the scroll level of the previous/next route.
@ -18,13 +18,13 @@ const router = new VueRouter({
// scroll state because the component probably hasn't updated the window height yet.
// Note: this will only work with routes that use stored data or that has static content
if (store.getters.transitions && savedPosition) {
return new Promise(resolve => {
return new Promise((resolve) => {
setTimeout(() => resolve(savedPosition), 0)
})
} else {
return savedPosition || { x: 0, y: 0 }
}
}
},
})
router.beforeEach((to, from, next) => {
@ -35,6 +35,10 @@ router.beforeEach((to, from, next) => {
if (store.getters.error) {
store.dispatch('DISMISS_ERROR', true)
}
if (to.name === 'post-install' && store.getters.installed) {
return next('/')
}
// Allow if connected or route is not protected
if (store.getters.connected || to.meta.noAuth) {
next()

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