mirror of
https://github.com/YunoHost/yunohost-admin.git
synced 2024-09-03 20:06:15 +02:00
Compare commits
179 commits
debian/11.
...
dev
Author | SHA1 | Date | |
---|---|---|---|
|
99873caa7c | ||
|
f077b8415a | ||
|
a2647f6cec | ||
|
e0857f184d | ||
|
26fdebc57b | ||
|
bf785a11e3 | ||
|
b4769273fa | ||
|
6bf0b9ec29 | ||
|
f26e15c0c8 | ||
|
215ee68044 | ||
|
a59cd08e30 | ||
|
b33e76fd3f | ||
|
3b11a8c0fa | ||
|
39f198fcb4 | ||
|
fbb8305e86 | ||
|
aac77cb8af | ||
|
9d48b3429f | ||
|
c5d86e27c3 | ||
|
03ae379aea | ||
|
ca449b6c59 | ||
|
9c389c208e | ||
|
a35a54aaaf | ||
|
18dfd23e81 | ||
|
a88afebd1d | ||
|
c87af75bd7 | ||
|
f003c17e51 | ||
|
c7be3db41c | ||
|
ccc9cb03ba | ||
|
27009ef854 | ||
|
c0b8fb1a68 | ||
|
937f158e5b | ||
|
d670555f59 | ||
|
763c779547 | ||
|
4e1f411eed | ||
|
0e1fcfd4b6 | ||
|
737af32352 | ||
|
a309c2eb1c | ||
|
3b50606ff8 | ||
|
ad7c927aa1 | ||
|
653689e8ae | ||
|
5685bf9934 | ||
|
5f499a4d61 | ||
|
dde2bf168d | ||
|
4aec50c0b9 | ||
|
b8c2b46d72 | ||
|
f3de655143 | ||
|
8a5bcb64f5 | ||
|
a50344a9f7 | ||
|
9d81fa42cd | ||
|
a0cf68e6bc | ||
|
225c1a9eab | ||
|
f68dc4170d | ||
|
8d9f201622 | ||
|
f2ec80a0e4 | ||
|
fc00adb21a | ||
|
571c44f3da | ||
|
16e5d5b429 | ||
|
c4650ebd62 | ||
|
72cb162f7e | ||
|
5a805463bb | ||
|
e9d9aa36cb | ||
|
968b109b0c | ||
|
09baea5320 | ||
|
cecbdc9184 | ||
|
df6825de08 | ||
|
1e297a1ea5 | ||
|
399965ddbb | ||
|
9f41a0eabb | ||
|
d52b520c98 | ||
|
b7fdb98b62 | ||
|
d8309461f3 | ||
|
3a40bfd121 | ||
|
ffc6b7e448 | ||
|
7553def2b2 | ||
|
b3fda97bf2 | ||
|
dedaf98c50 | ||
|
2ec73a9383 | ||
|
e1b2630138 | ||
|
ab4dc8fd4e | ||
|
8479fe4a20 | ||
|
a5e0022fb5 | ||
|
4b484a0396 | ||
|
2db437c622 | ||
|
dd7bd0b489 | ||
|
2ff1bff4a9 | ||
|
28332c9092 | ||
|
c29f11407e | ||
|
2fb3a03cdc | ||
|
4a23002172 | ||
|
d386bf5035 | ||
|
4f905d88d7 | ||
|
ca9e399ca6 | ||
|
0d4bd13579 | ||
|
7c7cfa7e24 | ||
|
671be81a54 | ||
|
094ce99166 | ||
|
8ca25bbeba | ||
|
d50626e789 | ||
|
c7d66f5332 | ||
|
418c9c2a63 | ||
|
937f732fd4 | ||
|
4dc8fc2699 | ||
|
8395b2d95b | ||
|
8e765e9fb7 | ||
|
fdabed55cb | ||
|
f2cdd949ca | ||
|
230dc8b14a | ||
|
122e2482de | ||
|
b6bdf0854d | ||
|
53fcfa72b3 | ||
|
a22fa45807 | ||
|
0b2a736c1c | ||
|
62741c3c4f | ||
|
8adca39e7e | ||
|
8536c0c035 | ||
|
825df1ee9b | ||
|
d85cd961ab | ||
|
e460fb3ad9 | ||
|
a0bbc40e74 | ||
|
e219718ef0 | ||
|
3f286bc2c3 | ||
|
2db95e5c94 | ||
|
66330fb6e7 | ||
|
dcecb81a71 | ||
|
21b3e9d01f | ||
|
59dc6e99e8 | ||
|
88a994b294 | ||
|
311b70eed0 | ||
|
40f6908565 | ||
|
7aa481198f | ||
|
ee5ab71e8a | ||
|
54fdb42e87 | ||
|
25b7f3f79f | ||
|
d5bf2709de | ||
|
4a4058aa4e | ||
|
e355f1ab42 | ||
|
030d637073 | ||
|
a248f5eab4 | ||
|
4bbb526d33 | ||
|
f3c2670d20 | ||
|
791a9fe9c7 | ||
|
8fe6a2aef4 | ||
|
f8daac618f | ||
|
fc30ec1560 | ||
|
d657f1acba | ||
|
21f604826f | ||
|
061fad90bb | ||
|
b82b79decf | ||
|
182a74c91e | ||
|
5e211588b4 | ||
|
d0cca4d423 | ||
|
6a7e79794c | ||
|
b01b06c918 | ||
|
f81008c150 | ||
|
93a31c3843 | ||
|
61e6af94b3 | ||
|
225f46bc0d | ||
|
4101310b89 | ||
|
fb0ec742f5 | ||
|
d5c91135bb | ||
|
732c1147a3 | ||
|
0c433ac71f | ||
|
fea5730a29 | ||
|
85a4178549 | ||
|
c47d7e187d | ||
|
8f89e4a8bc | ||
|
159f1b5a1a | ||
|
e5a3f5df2b | ||
|
237b36e2e2 | ||
|
10f4fb86b5 | ||
|
51c9f1a03f | ||
|
b44046d478 | ||
|
53bab95ef2 | ||
|
66f0d00e25 | ||
|
607842b668 | ||
|
1b33d36870 | ||
|
590724ab46 | ||
|
c6f4506308 | ||
|
c720330969 |
157 changed files with 8628 additions and 7393 deletions
8
.github/workflows/eslint.yml
vendored
8
.github/workflows/eslint.yml
vendored
|
@ -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
|
||||
|
|
26
README.md
26
README.md
|
@ -1,41 +1,37 @@
|
|||
<h1 align="center">YunoHost Admin</h1>
|
||||
|
||||
<div align="center">
|
||||
|
||||

|
||||
[](https://github.com/YunoHost/yunohost-admin/actions/workflows/eslint.yml)
|
||||
[](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).
|
||||
|
||||

|
||||
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).
|
||||
|
||||

|
||||
</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.
|
||||
|
|
|
@ -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
1
app/.prettierignore
Normal file
|
@ -0,0 +1 @@
|
|||
dist/
|
19
app/.prettierrc
Normal file
19
app/.prettierrc
Normal file
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"semi": false,
|
||||
"tabWidth": 2,
|
||||
"singleQuote": true,
|
||||
"overrides": [
|
||||
{
|
||||
"files": "**/*.json",
|
||||
"options": {
|
||||
"tabWidth": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": "./*.json",
|
||||
"options": {
|
||||
"tabWidth": 2
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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
2703
app/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -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%",
|
||||
|
|
159
app/src/App.vue
159
app/src/App.vue
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
36
app/src/components/globals/YBreadcrumb.vue
Normal file
36
app/src/components/globals/YBreadcrumb.vue
Normal 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>
|
|
@ -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 {
|
|
@ -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;
|
|
@ -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>
|
134
app/src/components/globals/YSpinner.vue
Normal file
134
app/src/components/globals/YSpinner.vue
Normal 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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -10,7 +10,7 @@ export default {
|
|||
|
||||
props: {
|
||||
id: { type: String, default: null },
|
||||
label: { type: String, default: null }
|
||||
}
|
||||
label: { type: String, default: null },
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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, '&')
|
||||
.replace(/</g, '<')
|
||||
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 })
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -8,5 +8,5 @@ export {
|
|||
minLength,
|
||||
minValue,
|
||||
required,
|
||||
sameAs
|
||||
sameAs,
|
||||
} from 'vuelidate/lib/validators'
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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": "مجهول",
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
"add": "যুক্ত করুন",
|
||||
"administration_password": "পরিচালনাকারীর পাসওয়ার্ড",
|
||||
"all_apps": "সকল অ্যাপ্লিকেশান",
|
||||
"api_not_responding": "এপিআই সাড়া দিচ্ছে না",
|
||||
"api_not_responding": "এপিআই সাড়া দিচ্ছে না?",
|
||||
"password": "পাসওয়ার্ড",
|
||||
"ok": "ঠিক আছে"
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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…"
|
||||
}
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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": "Όλα"
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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": "درحال اجرا",
|
||||
|
|
|
@ -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ä.",
|
||||
|
|
|
@ -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 l’URL d’accès de cette application (domaine et/ou chemin).",
|
||||
"app_info_change_url_disabled_tooltip": "Cette fonctionnalité n’a pas encore été implémentée pour cette application",
|
||||
"confirm_app_change_url": "Voulez-vous vraiment modifier l’URL d’accès de cette application ?",
|
||||
"confirm_migrations_skip": "Ne pas appliquer les migrations n’est pas recommandé. Voulez-vous vraiment le faire ?",
|
||||
"confirm_app_change_url": "Voulez-vous vraiment modifier l’URL d’accès de cette application ?",
|
||||
"confirm_migrations_skip": "Ne pas appliquer les migrations n’est 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 n’est pas bien intégrée dans YunoHost. Certaines fonctionnalités telles que l’authentification 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 l’installer 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 d’y 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 l’utiliser à 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 n’est pas bien intégrée dans YunoHost. Certaines fonctionnalités telles que l’authentification 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 l’installer 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 d’y 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 l’utiliser à 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 l’utilisateur 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)",
|
||||
|
|
|
@ -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}'"
|
||||
}
|
||||
},
|
||||
|
|
|
@ -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*."
|
||||
}
|
||||
|
|
|
@ -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. Quest’opzione è intenzionalmente limitata a un solo dominio di questo genere per ciascun server. Se vuoi aggiungere un sottodominio al tuo dominio già sottoscritto, usa l’opzione “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 un’ottima 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 l’opzione “Aggiungi un dominio o un sottodominio che possiedo” qui sopra). La configurazione DNS sarà gestita da YunoHost. Quest’opzione è l’ideale 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 l’equivalente 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": "Let’s 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 quest’app nel forum di YunoHost"
|
||||
"license": "Licenza dell’app",
|
||||
"forum": "Argomenti collegati a quest’app nel forum di YunoHost",
|
||||
"package_license": "Licenza del pacchetto YunoHost"
|
||||
},
|
||||
"upgrade": {
|
||||
"confirm": {
|
||||
|
|
|
@ -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": "から",
|
||||
|
|
|
@ -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` 명령을 실행하세요."
|
||||
}
|
||||
},
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"email": "одбери домен за вашиот емаил"
|
||||
},
|
||||
"local_part_description": {
|
||||
"domain": "одбери под домен"
|
||||
"domain": "одбери под домен"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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."
|
||||
}
|
||||
|
|
|
@ -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 d’installacion",
|
||||
"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 l’accion...",
|
||||
"partial_logs": "[...] (veire l’istoric pels logs complèts)",
|
||||
"processing": "Lo servidor es a tractar l’accion…",
|
||||
"partial_logs": "[…] (veire l’istoric 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.",
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
},
|
||||
|
|
|
@ -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>"
|
||||
}
|
||||
|
|
|
@ -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:",
|
||||
|
|
|
@ -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}?",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "ఈ అనువర్తనాన్ని తొలగించండి.",
|
||||
|
|
|
@ -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ı"
|
||||
}
|
||||
|
|
|
@ -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": "Експорт користувачів",
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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',
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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
Loading…
Add table
Reference in a new issue