@synopackageland/sdk 0.9.8 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -1
- package/dist/i18n/background/de.json +0 -1
- package/dist/i18n/background/en.json +0 -1
- package/dist/i18n/background/es.json +0 -1
- package/dist/i18n/background/fr.json +0 -1
- package/dist/i18n/background/it.json +0 -1
- package/dist/i18n/background/ja.json +2 -3
- package/dist/i18n/background/ko.json +0 -1
- package/dist/i18n/background/zh-CN.json +0 -1
- package/dist/i18n/background/zh-TW.json +0 -1
- package/dist/i18n/bridge/de.json +6 -0
- package/dist/i18n/bridge/en.json +6 -0
- package/dist/i18n/bridge/es.json +6 -0
- package/dist/i18n/bridge/fr.json +6 -0
- package/dist/i18n/bridge/it.json +6 -0
- package/dist/i18n/bridge/ja.json +6 -0
- package/dist/i18n/bridge/ko.json +6 -0
- package/dist/i18n/bridge/zh-CN.json +6 -0
- package/dist/i18n/bridge/zh-TW.json +6 -0
- package/dist/i18n/delegate/de.json +10 -2
- package/dist/i18n/delegate/en.json +10 -2
- package/dist/i18n/delegate/es.json +10 -2
- package/dist/i18n/delegate/fr.json +10 -2
- package/dist/i18n/delegate/it.json +10 -2
- package/dist/i18n/delegate/ja.json +10 -2
- package/dist/i18n/delegate/ko.json +10 -2
- package/dist/i18n/delegate/zh-CN.json +10 -2
- package/dist/i18n/delegate/zh-TW.json +10 -2
- package/dist/i18n/files/de.json +1 -0
- package/dist/i18n/files/en.json +1 -0
- package/dist/i18n/files/es.json +1 -0
- package/dist/i18n/files/fr.json +1 -0
- package/dist/i18n/files/it.json +1 -0
- package/dist/i18n/files/ja.json +1 -0
- package/dist/i18n/files/ko.json +1 -0
- package/dist/i18n/files/zh-CN.json +1 -0
- package/dist/i18n/files/zh-TW.json +1 -0
- package/dist/i18n/identity/de.json +2 -0
- package/dist/i18n/identity/en.json +2 -0
- package/dist/i18n/identity/es.json +2 -0
- package/dist/i18n/identity/fr.json +2 -0
- package/dist/i18n/identity/it.json +2 -0
- package/dist/i18n/identity/ja.json +2 -0
- package/dist/i18n/identity/ko.json +2 -0
- package/dist/i18n/identity/zh-CN.json +2 -0
- package/dist/i18n/identity/zh-TW.json +2 -0
- package/dist/i18n/portal/de.json +21 -0
- package/dist/i18n/portal/en.json +21 -0
- package/dist/i18n/portal/es.json +21 -0
- package/dist/i18n/portal/fr.json +21 -0
- package/dist/i18n/portal/it.json +21 -0
- package/dist/i18n/portal/ja.json +21 -0
- package/dist/i18n/portal/ko.json +21 -0
- package/dist/i18n/portal/zh-CN.json +21 -0
- package/dist/i18n/portal/zh-TW.json +21 -0
- package/dist/i18n/save/de.json +12 -2
- package/dist/i18n/save/en.json +12 -2
- package/dist/i18n/save/es.json +12 -2
- package/dist/i18n/save/fr.json +12 -2
- package/dist/i18n/save/it.json +12 -2
- package/dist/i18n/save/ja.json +12 -2
- package/dist/i18n/save/ko.json +12 -2
- package/dist/i18n/save/zh-CN.json +12 -2
- package/dist/i18n/save/zh-TW.json +12 -2
- package/dist/i18n/shell/de.json +5 -1
- package/dist/i18n/shell/en.json +5 -1
- package/dist/i18n/shell/es.json +5 -1
- package/dist/i18n/shell/fr.json +5 -1
- package/dist/i18n/shell/it.json +5 -1
- package/dist/i18n/shell/ja.json +5 -1
- package/dist/i18n/shell/ko.json +5 -1
- package/dist/i18n/shell/zh-CN.json +5 -1
- package/dist/i18n/shell/zh-TW.json +5 -1
- package/dist/index.js +2820 -2206
- package/dist/src/background/BackgroundPanel.vue.d.ts +4 -1
- package/dist/src/background/i18n.d.ts +0 -1
- package/dist/src/background/picker-provider.d.ts +1 -1
- package/dist/src/bridge/i18n.d.ts +5 -0
- package/dist/src/context.d.ts +26 -2
- package/dist/src/delegate/BackgroundSavePanel.vue.d.ts +6 -1
- package/dist/src/delegate/DelegatePanel.vue.d.ts +3 -1
- package/dist/src/delegate/ExecutorSettings.vue.d.ts +4 -1
- package/dist/src/delegate/copy.d.ts +18 -2
- package/dist/src/delegate/root.d.ts +40 -0
- package/dist/src/delegate/save-copy.d.ts +34 -4
- package/dist/src/i18n.d.ts +2 -0
- package/dist/src/identity/i18n.d.ts +2 -0
- package/dist/src/index.d.ts +8 -2
- package/dist/src/nas/NasPicker.vue.d.ts +3 -0
- package/dist/src/nas/locale.d.ts +1 -0
- package/dist/src/nas/provider.d.ts +2 -2
- package/dist/src/portal/access.d.ts +16 -0
- package/dist/src/portal/i18n.d.ts +3 -0
- package/dist/src/protocol/v1.d.ts +49 -4
- package/dist/src/shell/AppShell.vue.d.ts +31 -10
- package/dist/src/shell/app-pages.d.ts +37 -0
- package/dist/src/shell/i18n.d.ts +4 -0
- package/dist/src/shell/pages.d.ts +7 -2
- package/dist/src/shell/slot-content.d.ts +2 -0
- package/dist/src/standalone.d.ts +5 -0
- package/dist/src/vue.d.ts +1 -0
- package/dist/style.css +1 -1
- package/dist/vue.js +1966 -1581
- package/package.json +4 -4
- package/spec/protocol/v1/README.md +154 -3
- package/spec/protocol/v1/errors.json +36 -4
- package/spec/protocol/v1/schema/root.jobs.get.json +19 -0
- package/spec/protocol/v1/schema/root.jobs.list.json +11 -0
- package/spec/protocol/v1/schema/root.jobs.stop.json +19 -0
- package/spec/protocol/v1/schema/root.run.json +6 -2
- package/spec/protocol/v1/schema/root.start.json +23 -0
- package/spec/protocol/v1/vectors/files.jsonl +11 -0
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ App's `backend/go.mod`.
|
|
|
6
6
|
|
|
7
7
|
| Import | Contents |
|
|
8
8
|
|---|---|
|
|
9
|
-
| `@synopackageland/sdk` | Headless: `Context` and the other types, `createBackgroundSaveFacade`, `createNasProvider`, `scopedPicker`, copy catalogs (`uiLocale`, `saveCopy`, …). Never imports Vue. |
|
|
9
|
+
| `@synopackageland/sdk` | Headless: `Context` and the other types, `createBackgroundSaveFacade`, `createNasProvider`, `scopedPicker`, `createPortalAccess`, copy catalogs (`uiLocale`, `saveCopy`, …). Never imports Vue. |
|
|
10
10
|
| `@synopackageland/sdk/vue` | Everything above plus the components (`AppShell`, `FilesPage`, `NasPicker`, `LoginPage`, `PortalSettings`, `BackgroundPanel`, `ExecutorSettings`, `DelegatePanel`, `BackgroundSavePanel`, `AuthorizationGate`, `AuthorizationSettings`) and composables (`createSession`, `useExecutorSetup`, `ExecutorSetupKey`, `useAuthorization`). |
|
|
11
11
|
| `@synopackageland/sdk/vue/style.css` | The component stylesheet. Import it once next to `@synopackageland/ui`'s theme in the App entry. |
|
|
12
12
|
| `@synopackageland/sdk/i18n/<capability>/<locale>.json` | Copy in `en`, `zh-TW`, `zh-CN`, `ja`, `ko`, `de`, `fr`, `es`, `it`. |
|
|
@@ -23,6 +23,128 @@ was launched: outside DSM, for an empty path, or when DSM reports File Station
|
|
|
23
23
|
disabled or not launchable. File Station reports no completion and applies the
|
|
24
24
|
signed-in user's own permissions.
|
|
25
25
|
|
|
26
|
+
## Application Portal
|
|
27
|
+
|
|
28
|
+
The DSM window that synopkgland generates hands a portal App `ctx.portal`. An
|
|
29
|
+
App that mounts itself in DSM builds the same access with
|
|
30
|
+
`createPortalAccess({appId, defaultAlias, locale, location, call, send, isAdmin, launch, entry})`
|
|
31
|
+
and passes it to `PortalSettings`. `call` reaches the package backend's
|
|
32
|
+
`portal.status` (and, with `entry` below DSM 7.2, `portal.register` and
|
|
33
|
+
`portal.unregister`); `send` is DSM's WebAPI in the signed-in user's session.
|
|
34
|
+
Its `messages` are `portalMessages(locale)`, the panel text from
|
|
35
|
+
`i18n/portal/<locale>.json` (`portalCatalogs`). It has no plain `mountPanel`.
|
|
36
|
+
|
|
37
|
+
## Full page
|
|
38
|
+
|
|
39
|
+
A Portal or standalone launch gives the App the whole page; the DSM window
|
|
40
|
+
passes `ctx.fullPage`, `ctx.displayName` and `ctx.appIcon`. `isFullPage(ctx)`
|
|
41
|
+
reads it, and with an older CLI that passes no `fullPage` treats everything
|
|
42
|
+
but a DSM desktop window as a full page. Pass `ctx` to `AppShell` and a full
|
|
43
|
+
page takes the web layout and a device-width viewport, names the App in the
|
|
44
|
+
sidebar and shows the signed-in user, administrator or DSM user, at its foot;
|
|
45
|
+
a DSM window keeps its window layout and title bar. `AppShell` reads only
|
|
46
|
+
`fullPage` (or `host`), `displayName`, `appIcon` and `user` (`ShellContext`),
|
|
47
|
+
so the DSM window's ctx works as it is.
|
|
48
|
+
|
|
49
|
+
```vue
|
|
50
|
+
<AppShell v-model="page" :ctx="ctx" :locale="ctx.locale" :pages="pages" sidebar-storage-key="HelloGo" />
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Outside DSM
|
|
54
|
+
|
|
55
|
+
A development page, a preview or a test owns the browser page and has no DSM
|
|
56
|
+
window. `createStandaloneContext({call})` gives it a full-page `Context`
|
|
57
|
+
(`locale: 'en'`, `fullPage: true`, a no-op `reopen`) around the App's own
|
|
58
|
+
`call`; any other field overrides. `createStandaloneHost(platform?)` is its
|
|
59
|
+
`HostAdapter`: `setTitle` titles the document, `openURL` opens an http(s)
|
|
60
|
+
URL in a new tab, `subscribe('window-resize')` follows the browser window,
|
|
61
|
+
and the DSM desktop actions answer `{status: 'unsupported'}`. Platform fields
|
|
62
|
+
override the snapshot, so a test can stand in for a DSM window
|
|
63
|
+
(`createStandaloneHost({host: 'dsm', dsmStandalone: false})`).
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
const ctx = createStandaloneContext({locale: 'zh-TW', call: (method, params) => post('/api', {method, params})})
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## App pages
|
|
70
|
+
|
|
71
|
+
`AppShell` lays out the App's own pages too. Each `AppShellPage` has an `id`,
|
|
72
|
+
a `title` the App has already translated, and optionally an `icon`, a `group`
|
|
73
|
+
label (pages with the same label sit together), a `badge`, a `component` to
|
|
74
|
+
render while it is the current page, `hidden` (reachable through `v-model`
|
|
75
|
+
but not in the sidebar), its own `description`, and `header: false` for a
|
|
76
|
+
page that draws its own header. `fill: true` gives the page's body the height under
|
|
77
|
+
its header and notices; the page does not scroll, so the content scrolls
|
|
78
|
+
itself (a treemap, a table paged by height, a log viewer). The shell then
|
|
79
|
+
holds to `100dvh`, so a phone's address bar does not leave a gap. The built-in `'status'` and `'background'`
|
|
80
|
+
may sit in the same list.
|
|
81
|
+
|
|
82
|
+
```vue
|
|
83
|
+
<AppShell v-model="page" :ctx="ctx" :locale="ctx.locale" :pages="[
|
|
84
|
+
{id: 'downloads', title: t('downloads'), icon: Download, badge: running || undefined, component: DownloadsPage},
|
|
85
|
+
{id: 'settings', title: t('settings'), icon: Settings, group: t('admin')},
|
|
86
|
+
'background',
|
|
87
|
+
]" page-width="fill">
|
|
88
|
+
<template #actions="{page}"><Button v-if="page === 'downloads'" @click="add">{{ t('add') }}</Button></template>
|
|
89
|
+
<template #notices><JobStrip v-for="job in jobs" :key="job.id" :job="job" /></template>
|
|
90
|
+
<template #default="{page}"><SettingsPage v-show="page === 'settings'" /></template>
|
|
91
|
+
</AppShell>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Moving to another page starts it at the top; `keep-scroll` keeps the
|
|
95
|
+
position. The `toolbar` slot sits above the page (in `AppLayout`'s toolbar)
|
|
96
|
+
and `notices` in the page, under its header and inside the same padding, and
|
|
97
|
+
scrolls with it. `activePage(current, pages)` keeps a selection that still exists and
|
|
98
|
+
otherwise picks the first page the sidebar shows. A router drives the shell
|
|
99
|
+
through `v-model`:
|
|
100
|
+
`:model-value="route.name" @update:model-value="name => router.push({name})"`.
|
|
101
|
+
|
|
102
|
+
## App root
|
|
103
|
+
|
|
104
|
+
`app-root` wraps the shell in an app-local `AppRoot`
|
|
105
|
+
(`modal-scope="app"`, `height: 100%`) and a `ConfigProvider` with the
|
|
106
|
+
shell's `locale`, so the UI components' own text follows it. In a DSM desktop window (a `ctx` that
|
|
107
|
+
is not a full page) its dialogs may leave the window (`dialog-bounds=
|
|
108
|
+
"viewport"`), and a press on a floating dialog calls
|
|
109
|
+
`ctx.host.activateWindow()`, which brings the window to the front; a full
|
|
110
|
+
page and a shell without `ctx` keep dialogs in the App. Use it in place of
|
|
111
|
+
the App's own `AppRoot`: app-local roots do not nest.
|
|
112
|
+
|
|
113
|
+
```vue
|
|
114
|
+
<AppShell app-root v-model="page" :ctx="ctx" :locale="ctx.locale" :pages="pages" />
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Denied access
|
|
118
|
+
|
|
119
|
+
`denied` replaces the App's pages with one page that says the account may
|
|
120
|
+
not use the App: a `No access` header and a message pointing to DSM
|
|
121
|
+
Application Privileges, in every UI locale (`shellCopy`'s `deniedTitle` and
|
|
122
|
+
`deniedMessage`). `denied` is `true` or an `AppShellDenied` (`title`,
|
|
123
|
+
`message`, `header: false`); the `denied` slot replaces the message, for
|
|
124
|
+
example with a sign-in form. The sidebar, the notices and the default slot
|
|
125
|
+
are not rendered meanwhile.
|
|
126
|
+
|
|
127
|
+
```vue
|
|
128
|
+
<AppShell v-model="page" :ctx="ctx" :locale="ctx.locale" :pages="pages" :denied="!authorized && {title: t('privilegeTitle')}" />
|
|
129
|
+
<AppShell v-model="page" :ctx="ctx" :locale="ctx.locale" :pages="pages" :denied="signInNeeded && {header: false}">
|
|
130
|
+
<template #denied><LoginPage :session="login" :locale="ctx.locale" /></template>
|
|
131
|
+
</AppShell>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Calling the backend
|
|
135
|
+
|
|
136
|
+
`ctx.call(method, params, {signal})` posts to the package backend. An abort of
|
|
137
|
+
`signal` rejects it with `{code: 'request_canceled'}`, for a page the user
|
|
138
|
+
leaves; past `clientTimeout(ctx.requestTimeout)` it rejects with `{code:
|
|
139
|
+
'request_timeout'}`.
|
|
140
|
+
Without `ctx.requestTimeout` the deadline is `DEFAULT_REQUEST_TIMEOUT`, 60
|
|
141
|
+
seconds like the backend's, and the client waits 62.
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
const controller = new AbortController()
|
|
145
|
+
const items = await ctx.call<Item[]>('items.list', {}, {signal: controller.signal})
|
|
146
|
+
```
|
|
147
|
+
|
|
26
148
|
## Localized copy
|
|
27
149
|
|
|
28
150
|
`format(message, values, locale)` fills `{key}` placeholders from `values`; a
|
|
@@ -41,6 +163,12 @@ format(copy[locale].files, {count: 3, folder: 'photo'}, locale) // {"one": "{cou
|
|
|
41
163
|
`mergeCatalogs` layers the App's catalogs over the SDK's, key by key; for each
|
|
42
164
|
key the order is the App's locale, the SDK's locale, then `en`.
|
|
43
165
|
|
|
166
|
+
`bridgeErrorCopy(error, locale)` is the text of a code that the bridge runtime
|
|
167
|
+
adds for Python, Node and Rust Apps: `app_unavailable`, and the services'
|
|
168
|
+
`limit_exceeded`, `read_failed` and `identity_unavailable`. For any other code
|
|
169
|
+
it returns `undefined`, so the App falls back to its own text. Its catalogs,
|
|
170
|
+
`i18n/bridge/<locale>.json`, are generated from `spec/bridge/v1/errors.json`.
|
|
171
|
+
|
|
44
172
|
The Vue entry needs the peer dependencies `vue`, `@synopackageland/ui` and
|
|
45
173
|
`@lucide/vue`. The headless entry needs none.
|
|
46
174
|
|
|
@@ -53,6 +181,10 @@ npm run typecheck
|
|
|
53
181
|
npm run build
|
|
54
182
|
```
|
|
55
183
|
|
|
184
|
+
After a change to `../spec/bridge/v1/errors.json`, run `node
|
|
185
|
+
scripts/gen-bridge-i18n.mjs`; `npm test` fails while `i18n/bridge/` differs
|
|
186
|
+
from it.
|
|
187
|
+
|
|
56
188
|
`npm run build` also copies `../spec` into `spec/`. Run `npm ci` before
|
|
57
189
|
`npm pack`: `prepack` builds and needs `node_modules`. `npm install
|
|
58
190
|
--install-links` from a checkout does not run `prepack`, so build first.
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"pickerTitle": "Datei zum Importieren auswählen",
|
|
10
10
|
"pickerConsent": "Die ausgewählte Datei wird einmalig mit Ihrer aktuellen DSM-Anmeldung gelesen und an den Hintergrundjob übergeben. Es wird keine Berechtigung gespeichert.",
|
|
11
11
|
"submit": "Importieren und senden",
|
|
12
|
-
"refresh": "Aktualisieren",
|
|
13
12
|
"cancel": "Abbrechen",
|
|
14
13
|
"result": "Ergebnis",
|
|
15
14
|
"download": "Ergebnis herunterladen",
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"pickerTitle": "Choose a file to import",
|
|
10
10
|
"pickerConsent": "The selected file is read once with your current DSM sign-in and handed to the background job. No permission is saved.",
|
|
11
11
|
"submit": "Import and submit",
|
|
12
|
-
"refresh": "Refresh",
|
|
13
12
|
"cancel": "Cancel",
|
|
14
13
|
"result": "Result",
|
|
15
14
|
"download": "Download result",
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"pickerTitle": "Elegir un archivo para importar",
|
|
10
10
|
"pickerConsent": "El archivo seleccionado se lee una sola vez con su inicio de sesión de DSM actual y se entrega al trabajo en segundo plano. No se guarda ningún permiso.",
|
|
11
11
|
"submit": "Importar y enviar",
|
|
12
|
-
"refresh": "Actualizar",
|
|
13
12
|
"cancel": "Cancelar",
|
|
14
13
|
"result": "Resultado",
|
|
15
14
|
"download": "Descargar resultado",
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"pickerTitle": "Choisir un fichier à importer",
|
|
10
10
|
"pickerConsent": "Le fichier sélectionné est lu une seule fois avec votre connexion DSM actuelle et transmis à la tâche en arrière-plan. Aucune autorisation n'est enregistrée.",
|
|
11
11
|
"submit": "Importer et envoyer",
|
|
12
|
-
"refresh": "Actualiser",
|
|
13
12
|
"cancel": "Annuler",
|
|
14
13
|
"result": "Résultat",
|
|
15
14
|
"download": "Télécharger le résultat",
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"pickerTitle": "Scegli un file da importare",
|
|
10
10
|
"pickerConsent": "Il file selezionato viene letto una sola volta con l'accesso DSM corrente e passato al processo in background. Nessuna autorizzazione viene salvata.",
|
|
11
11
|
"submit": "Importa e invia",
|
|
12
|
-
"refresh": "Aggiorna",
|
|
13
12
|
"cancel": "Annulla",
|
|
14
13
|
"result": "Risultato",
|
|
15
14
|
"download": "Scarica il risultato",
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
"workerRunning": "ワーカーは {user} として実行中です",
|
|
6
6
|
"workerStopped": "ワーカーは停止しています",
|
|
7
7
|
"chooseFile": "ファイルを選択",
|
|
8
|
-
"chosen": "
|
|
8
|
+
"chosen": "選択したファイル:{path}",
|
|
9
9
|
"pickerTitle": "インポートするファイルを選択",
|
|
10
10
|
"pickerConsent": "選択したファイルは現在の DSM サインインで一度だけ読み取られ、バックグラウンドジョブに渡されます。権限は保存されません。",
|
|
11
11
|
"submit": "インポートして送信",
|
|
12
|
-
"refresh": "最新の情報に更新",
|
|
13
12
|
"cancel": "キャンセル",
|
|
14
13
|
"result": "結果",
|
|
15
14
|
"download": "結果をダウンロード",
|
|
@@ -28,7 +27,7 @@
|
|
|
28
27
|
"other": "{done} / {count} 項目"
|
|
29
28
|
},
|
|
30
29
|
"progressBytes": "{done} / {total}",
|
|
31
|
-
"progressItem": "
|
|
30
|
+
"progressItem": "現在の項目:{item}",
|
|
32
31
|
"limits": "1 ファイル最大 {size} KB、キュー {queue} 件、1 ジョブ {seconds} 秒。",
|
|
33
32
|
"errors": {
|
|
34
33
|
"jobs_busy": "処理が混み合っています。しばらくしてから再試行してください。",
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app_unavailable": "Die App ist derzeit nicht verfügbar. Versuchen Sie es später erneut.",
|
|
3
|
+
"limit_exceeded": "Die Datei ist größer als zulässig.",
|
|
4
|
+
"read_failed": "Die Datei kann nicht gelesen werden. Bitte versuchen Sie es später erneut.",
|
|
5
|
+
"identity_unavailable": "Dieses Benutzerkonto kann nicht ermittelt werden. Bitte versuchen Sie es später erneut."
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app_unavailable": "The App is not available right now. Try again later.",
|
|
3
|
+
"limit_exceeded": "The file is larger than allowed.",
|
|
4
|
+
"read_failed": "Unable to read the file. Please try again later.",
|
|
5
|
+
"identity_unavailable": "Unable to identify this user account. Please try again later."
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app_unavailable": "La App no está disponible en este momento. Vuelva a intentarlo más tarde.",
|
|
3
|
+
"limit_exceeded": "El archivo supera el tamaño permitido.",
|
|
4
|
+
"read_failed": "No se puede leer el archivo. Vuelva a intentarlo más tarde.",
|
|
5
|
+
"identity_unavailable": "No se puede identificar esta cuenta de usuario. Vuelva a intentarlo más tarde."
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app_unavailable": "L’App n’est pas disponible pour le moment. Réessayez plus tard.",
|
|
3
|
+
"limit_exceeded": "Le fichier dépasse la taille autorisée.",
|
|
4
|
+
"read_failed": "Impossible de lire le fichier. Veuillez réessayer ultérieurement.",
|
|
5
|
+
"identity_unavailable": "Impossible d'identifier ce compte utilisateur. Veuillez réessayer ultérieurement."
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app_unavailable": "L’App non è al momento disponibile. Riprovare più tardi.",
|
|
3
|
+
"limit_exceeded": "Il file supera le dimensioni consentite.",
|
|
4
|
+
"read_failed": "Impossibile leggere il file. Riprovare più tardi.",
|
|
5
|
+
"identity_unavailable": "Impossibile identificare questo account utente. Riprovare più tardi."
|
|
6
|
+
}
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"blocked": "Der Dateizugriff im Hintergrund ist nicht verfügbar. Bitten Sie einen Administrator, die App-Einrichtung zu prüfen.",
|
|
14
14
|
"loading": "Wird geladen…",
|
|
15
15
|
"details": "Details",
|
|
16
|
-
"refresh": "Aktualisieren",
|
|
17
16
|
"revoke": "Widerrufen",
|
|
18
17
|
"cancel": "Auftrag abbrechen",
|
|
19
18
|
"noDelegations": "Sie haben keine aktiven Delegierungen.",
|
|
@@ -46,5 +45,14 @@
|
|
|
46
45
|
"scopeMismatch": "Die Vorauswahl bei der Installation weicht vom bestätigten Bereich ab. Speichervorgänge im Hintergrund folgen dem bestätigten Bereich.",
|
|
47
46
|
"scopeChangeHelp": "Eine Änderung des Bereichs widerruft vorhandene Ziele und bricht ausstehende Speichervorgänge ab. Benutzer müssen ihre Ziele neu auswählen. Bereits gespeicherte Dateien bleiben erhalten.",
|
|
48
47
|
"confirmScope": "Bereichsänderung bestätigen",
|
|
49
|
-
"waiting_executor": "Warten auf den Start der Systemdienste"
|
|
48
|
+
"waiting_executor": "Warten auf den Start der Systemdienste",
|
|
49
|
+
"status": "Status",
|
|
50
|
+
"statusReady": "Bereit",
|
|
51
|
+
"statusNeeds": "Genehmigung erforderlich",
|
|
52
|
+
"statusScope": "Freigegebener Ordner erforderlich",
|
|
53
|
+
"statusBlocked": "Nicht verfügbar",
|
|
54
|
+
"statusConfirming": "Wird bestätigt",
|
|
55
|
+
"hintPassword": "Geben Sie das DSM-Passwort ein, um zu bestätigen.",
|
|
56
|
+
"hintUnchanged": "Wählen Sie einen anderen Bereich, um ihn zu ändern.",
|
|
57
|
+
"retry": "Neuer Versuch"
|
|
50
58
|
}
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"blocked": "Background file access is unavailable. Ask an administrator to check the app setup.",
|
|
14
14
|
"loading": "Loading…",
|
|
15
15
|
"details": "Details",
|
|
16
|
-
"refresh": "Refresh",
|
|
17
16
|
"revoke": "Revoke",
|
|
18
17
|
"cancel": "Cancel job",
|
|
19
18
|
"noDelegations": "You have no active delegations.",
|
|
@@ -46,5 +45,14 @@
|
|
|
46
45
|
"scopeMismatch": "The installer pre-selection differs from the confirmed scope. Background saves follow the confirmed scope.",
|
|
47
46
|
"scopeChangeHelp": "Changing the scope revokes existing destinations and cancels pending saves. Users must choose destinations again. Saved files remain.",
|
|
48
47
|
"confirmScope": "Confirm scope change",
|
|
49
|
-
"waiting_executor": "Waiting for system services to start"
|
|
48
|
+
"waiting_executor": "Waiting for system services to start",
|
|
49
|
+
"status": "Status",
|
|
50
|
+
"statusReady": "Ready",
|
|
51
|
+
"statusNeeds": "Needs approval",
|
|
52
|
+
"statusScope": "Needs a shared folder",
|
|
53
|
+
"statusBlocked": "Unavailable",
|
|
54
|
+
"statusConfirming": "Confirming",
|
|
55
|
+
"hintPassword": "Enter the DSM password to confirm.",
|
|
56
|
+
"hintUnchanged": "Choose a different scope to change it.",
|
|
57
|
+
"retry": "Retry"
|
|
50
58
|
}
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"blocked": "El acceso a archivos en segundo plano no está disponible. Pida a un administrador que revise la configuración de la aplicación.",
|
|
14
14
|
"loading": "Cargando…",
|
|
15
15
|
"details": "Detalles",
|
|
16
|
-
"refresh": "Actualizar",
|
|
17
16
|
"revoke": "Revocar",
|
|
18
17
|
"cancel": "Cancelar tarea",
|
|
19
18
|
"noDelegations": "No tiene delegaciones activas.",
|
|
@@ -46,5 +45,14 @@
|
|
|
46
45
|
"scopeMismatch": "La preselección de la instalación difiere del ámbito confirmado. Los guardados en segundo plano siguen el ámbito confirmado.",
|
|
47
46
|
"scopeChangeHelp": "Cambiar el ámbito revoca los destinos existentes y cancela los guardados pendientes. Los usuarios deben elegir de nuevo sus destinos. Los archivos ya guardados se conservan.",
|
|
48
47
|
"confirmScope": "Confirmar cambio de ámbito",
|
|
49
|
-
"waiting_executor": "Esperando a que se inicien los servicios del sistema"
|
|
48
|
+
"waiting_executor": "Esperando a que se inicien los servicios del sistema",
|
|
49
|
+
"status": "Estado",
|
|
50
|
+
"statusReady": "Listo",
|
|
51
|
+
"statusNeeds": "Requiere aprobación",
|
|
52
|
+
"statusScope": "Falta confirmar la carpeta compartida",
|
|
53
|
+
"statusBlocked": "No disponible",
|
|
54
|
+
"statusConfirming": "Confirmando",
|
|
55
|
+
"hintPassword": "Introduzca la contraseña de DSM para confirmar.",
|
|
56
|
+
"hintUnchanged": "Elija otro ámbito para cambiarlo.",
|
|
57
|
+
"retry": "Volver a intentar"
|
|
50
58
|
}
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"blocked": "L’accès aux fichiers en arrière-plan n’est pas disponible. Demandez à un administrateur de vérifier la configuration de l’application.",
|
|
14
14
|
"loading": "Chargement…",
|
|
15
15
|
"details": "Détails",
|
|
16
|
-
"refresh": "Actualiser",
|
|
17
16
|
"revoke": "Révoquer",
|
|
18
17
|
"cancel": "Annuler la tâche",
|
|
19
18
|
"noDelegations": "Vous n’avez aucune délégation active.",
|
|
@@ -46,5 +45,14 @@
|
|
|
46
45
|
"scopeMismatch": "La présélection de l’installation diffère de la portée confirmée. Les enregistrements en arrière-plan suivent la portée confirmée.",
|
|
47
46
|
"scopeChangeHelp": "Changer la portée révoque les destinations existantes et annule les enregistrements en attente. Les utilisateurs doivent choisir à nouveau leurs destinations. Les fichiers déjà enregistrés sont conservés.",
|
|
48
47
|
"confirmScope": "Confirmer le changement de portée",
|
|
49
|
-
"waiting_executor": "En attente du démarrage des services système"
|
|
48
|
+
"waiting_executor": "En attente du démarrage des services système",
|
|
49
|
+
"status": "Statut",
|
|
50
|
+
"statusReady": "Prêt",
|
|
51
|
+
"statusNeeds": "Approbation requise",
|
|
52
|
+
"statusScope": "Dossier partagé à confirmer",
|
|
53
|
+
"statusBlocked": "Indisponible",
|
|
54
|
+
"statusConfirming": "Confirmation",
|
|
55
|
+
"hintPassword": "Saisissez le mot de passe DSM pour confirmer.",
|
|
56
|
+
"hintUnchanged": "Choisissez une autre étendue pour la modifier.",
|
|
57
|
+
"retry": "Réessayer"
|
|
50
58
|
}
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"blocked": "L’accesso ai file in background non è disponibile. Chiedere a un amministratore di controllare la configurazione dell’app.",
|
|
14
14
|
"loading": "Caricamento…",
|
|
15
15
|
"details": "Dettagli",
|
|
16
|
-
"refresh": "Aggiorna",
|
|
17
16
|
"revoke": "Revoca",
|
|
18
17
|
"cancel": "Annulla processo",
|
|
19
18
|
"noDelegations": "Nessuna delega attiva.",
|
|
@@ -46,5 +45,14 @@
|
|
|
46
45
|
"scopeMismatch": "La preselezione dell’installazione è diversa dall’ambito confermato. I salvataggi in background seguono l’ambito confermato.",
|
|
47
46
|
"scopeChangeHelp": "La modifica dell’ambito revoca le destinazioni esistenti e annulla i salvataggi in sospeso. Gli utenti devono scegliere di nuovo le destinazioni. I file già salvati restano.",
|
|
48
47
|
"confirmScope": "Conferma modifica dell’ambito",
|
|
49
|
-
"waiting_executor": "In attesa dell’avvio dei servizi di sistema"
|
|
48
|
+
"waiting_executor": "In attesa dell’avvio dei servizi di sistema",
|
|
49
|
+
"status": "Stato",
|
|
50
|
+
"statusReady": "Pronto",
|
|
51
|
+
"statusNeeds": "Approvazione necessaria",
|
|
52
|
+
"statusScope": "Cartella condivisa da confermare",
|
|
53
|
+
"statusBlocked": "Non disponibile",
|
|
54
|
+
"statusConfirming": "Conferma in corso",
|
|
55
|
+
"hintPassword": "Inserire la password DSM per confermare.",
|
|
56
|
+
"hintUnchanged": "Scegliere un ambito diverso per cambiarlo.",
|
|
57
|
+
"retry": "Riprova"
|
|
50
58
|
}
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"blocked": "バックグラウンドのファイルアクセスを利用できません。アプリの設定を確認するよう管理者に依頼してください。",
|
|
14
14
|
"loading": "読み込み中…",
|
|
15
15
|
"details": "詳細",
|
|
16
|
-
"refresh": "最新の情報に更新",
|
|
17
16
|
"revoke": "取り消す",
|
|
18
17
|
"cancel": "ジョブをキャンセル",
|
|
19
18
|
"noDelegations": "有効な委任はありません。",
|
|
@@ -46,5 +45,14 @@
|
|
|
46
45
|
"scopeMismatch": "インストール時の事前選択が確認済みの範囲と異なります。バックグラウンド保存は確認済みの範囲に従います。",
|
|
47
46
|
"scopeChangeHelp": "範囲を変更すると、既存の保存先が取り消され、保留中の保存がキャンセルされます。ユーザーは保存先を選び直す必要があります。保存済みのファイルは残ります。",
|
|
48
47
|
"confirmScope": "範囲の変更を確認",
|
|
49
|
-
"waiting_executor": "システムサービスの起動を待っています"
|
|
48
|
+
"waiting_executor": "システムサービスの起動を待っています",
|
|
49
|
+
"status": "状態",
|
|
50
|
+
"statusReady": "準備完了",
|
|
51
|
+
"statusNeeds": "承認が必要",
|
|
52
|
+
"statusScope": "共有フォルダの確認が必要",
|
|
53
|
+
"statusBlocked": "使用不可",
|
|
54
|
+
"statusConfirming": "確認中",
|
|
55
|
+
"hintPassword": "DSM パスワードを入力すると確認できます。",
|
|
56
|
+
"hintUnchanged": "別の範囲を選ぶと変更できます。",
|
|
57
|
+
"retry": "再試行"
|
|
50
58
|
}
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"blocked": "백그라운드 파일 액세스를 사용할 수 없습니다. 관리자에게 앱 설정을 확인하도록 요청하십시오.",
|
|
14
14
|
"loading": "불러오는 중…",
|
|
15
15
|
"details": "세부 사항",
|
|
16
|
-
"refresh": "새로 고침",
|
|
17
16
|
"revoke": "취소",
|
|
18
17
|
"cancel": "작업 취소",
|
|
19
18
|
"noDelegations": "활성 위임이 없습니다.",
|
|
@@ -46,5 +45,14 @@
|
|
|
46
45
|
"scopeMismatch": "설치 시 사전 선택이 확인된 범위와 다릅니다. 백그라운드 저장은 확인된 범위를 따릅니다.",
|
|
47
46
|
"scopeChangeHelp": "범위를 변경하면 기존 대상이 취소되고 대기 중인 저장이 취소됩니다. 사용자는 대상을 다시 선택해야 합니다. 저장된 파일은 유지됩니다.",
|
|
48
47
|
"confirmScope": "범위 변경 확인",
|
|
49
|
-
"waiting_executor": "시스템 서비스 시작을 기다리는 중"
|
|
48
|
+
"waiting_executor": "시스템 서비스 시작을 기다리는 중",
|
|
49
|
+
"status": "상태",
|
|
50
|
+
"statusReady": "준비됨",
|
|
51
|
+
"statusNeeds": "승인 필요",
|
|
52
|
+
"statusScope": "공유 폴더 확인 필요",
|
|
53
|
+
"statusBlocked": "사용 불가",
|
|
54
|
+
"statusConfirming": "확인 중",
|
|
55
|
+
"hintPassword": "DSM 비밀번호를 입력하면 확인할 수 있습니다.",
|
|
56
|
+
"hintUnchanged": "다른 범위를 선택해야 변경할 수 있습니다.",
|
|
57
|
+
"retry": "재시도"
|
|
50
58
|
}
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"blocked": "后台文件访问不可用,请管理员检查 App 设置。",
|
|
14
14
|
"loading": "正在加载…",
|
|
15
15
|
"details": "详情",
|
|
16
|
-
"refresh": "刷新",
|
|
17
16
|
"revoke": "撤销",
|
|
18
17
|
"cancel": "取消任务",
|
|
19
18
|
"noDelegations": "目前没有有效委托。",
|
|
@@ -46,5 +45,14 @@
|
|
|
46
45
|
"scopeMismatch": "安装时的预选与已确认范围不同。后台保存将按已确认范围执行。",
|
|
47
46
|
"scopeChangeHelp": "更改范围会撤销现有目标,并取消待完成的保存。用户必须重新选择目标。已保存的文件会保留。",
|
|
48
47
|
"confirmScope": "确认更改范围",
|
|
49
|
-
"waiting_executor": "等待系统服务启动"
|
|
48
|
+
"waiting_executor": "等待系统服务启动",
|
|
49
|
+
"status": "状态",
|
|
50
|
+
"statusReady": "就绪",
|
|
51
|
+
"statusNeeds": "需要批准",
|
|
52
|
+
"statusScope": "需要确认共享文件夹",
|
|
53
|
+
"statusBlocked": "无法使用",
|
|
54
|
+
"statusConfirming": "确认中",
|
|
55
|
+
"hintPassword": "输入 DSM 密码后即可确认。",
|
|
56
|
+
"hintUnchanged": "选择不同的范围后才能更换。",
|
|
57
|
+
"retry": "重试"
|
|
50
58
|
}
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"blocked": "背景檔案存取無法使用,請管理員檢查 App 設定。",
|
|
14
14
|
"loading": "載入中…",
|
|
15
15
|
"details": "詳情",
|
|
16
|
-
"refresh": "重新整理",
|
|
17
16
|
"revoke": "撤銷",
|
|
18
17
|
"cancel": "取消工作",
|
|
19
18
|
"noDelegations": "目前沒有有效委託。",
|
|
@@ -46,5 +45,14 @@
|
|
|
46
45
|
"scopeMismatch": "安裝時的預選與已確認範圍不同。背景儲存會依已確認範圍執行。",
|
|
47
46
|
"scopeChangeHelp": "更換範圍會撤銷既有目的地,並取消待完成的儲存。使用者必須重新選擇目的地。已儲存的檔案會保留。",
|
|
48
47
|
"confirmScope": "確認更換範圍",
|
|
49
|
-
"waiting_executor": "等待系統服務啟動"
|
|
48
|
+
"waiting_executor": "等待系統服務啟動",
|
|
49
|
+
"status": "狀態",
|
|
50
|
+
"statusReady": "就緒",
|
|
51
|
+
"statusNeeds": "需要核准",
|
|
52
|
+
"statusScope": "需要確認共用資料夾",
|
|
53
|
+
"statusBlocked": "無法使用",
|
|
54
|
+
"statusConfirming": "確認中",
|
|
55
|
+
"hintPassword": "輸入 DSM 密碼後即可確認。",
|
|
56
|
+
"hintUnchanged": "選擇不同的範圍後才能更換。",
|
|
57
|
+
"retry": "重試"
|
|
50
58
|
}
|
package/dist/i18n/files/de.json
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"errorUnavailable": "File Station ist nicht verfügbar oder der Sitzungsadapter fehlt. Aktualisieren Sie später.",
|
|
25
25
|
"errorCanceled": "Aufruf abgebrochen. Aktualisieren Sie vor dem Fortfahren.",
|
|
26
26
|
"errorTimeout": "Zeitüberschreitung. Aktualisieren Sie die Liste vor dem Fortfahren.",
|
|
27
|
+
"errorOrigin": "Die Anfrage wurde abgelehnt: Der Browser hat nicht angegeben, dass sie von der Seite dieser App stammt. Öffnen Sie die App in einem aktuellen Browser erneut über DSM.",
|
|
27
28
|
"metadata": "Metadaten",
|
|
28
29
|
"fileKind": "Datei",
|
|
29
30
|
"directoryKind": "Ordner",
|
package/dist/i18n/files/en.json
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"errorUnavailable": "File Station is unavailable or this package lacks the session adapter. Refresh later.",
|
|
25
25
|
"errorCanceled": "Request canceled. Refresh before continuing.",
|
|
26
26
|
"errorTimeout": "The request timed out. Refresh the listing before continuing.",
|
|
27
|
+
"errorOrigin": "The request was refused: the browser did not show that it came from this App's page. Open the App again from DSM in a current browser.",
|
|
27
28
|
"metadata": "Metadata",
|
|
28
29
|
"fileKind": "File",
|
|
29
30
|
"directoryKind": "Folder",
|
package/dist/i18n/files/es.json
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"errorUnavailable": "File Station no está disponible o falta el adaptador de sesión. Actualice más tarde.",
|
|
25
25
|
"errorCanceled": "Solicitud cancelada. Actualice antes de continuar.",
|
|
26
26
|
"errorTimeout": "La solicitud agotó el tiempo. Actualice la lista antes de continuar.",
|
|
27
|
+
"errorOrigin": "La solicitud se rechazó: el navegador no indicó que procediera de la página de esta App. Vuelva a abrir la App desde DSM en un navegador actual.",
|
|
27
28
|
"metadata": "Metadatos",
|
|
28
29
|
"fileKind": "Archivo",
|
|
29
30
|
"directoryKind": "Carpeta",
|
package/dist/i18n/files/fr.json
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"errorUnavailable": "File Station est indisponible ou l’adaptateur de session manque. Actualisez plus tard.",
|
|
25
25
|
"errorCanceled": "Requête annulée. Actualisez avant de continuer.",
|
|
26
26
|
"errorTimeout": "Délai dépassé. Actualisez la liste avant de continuer.",
|
|
27
|
+
"errorOrigin": "La requête a été refusée : le navigateur n’a pas indiqué qu’elle provenait de la page de cette App. Rouvrez l’App depuis DSM dans un navigateur récent.",
|
|
27
28
|
"metadata": "Métadonnées",
|
|
28
29
|
"fileKind": "Fichier",
|
|
29
30
|
"directoryKind": "Dossier",
|
package/dist/i18n/files/it.json
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"errorUnavailable": "File Station non disponibile o adattatore di sessione mancante. Aggiornare più tardi.",
|
|
25
25
|
"errorCanceled": "Richiesta annullata. Aggiornare prima di continuare.",
|
|
26
26
|
"errorTimeout": "Tempo scaduto. Aggiornare l’elenco prima di continuare.",
|
|
27
|
+
"errorOrigin": "La richiesta è stata rifiutata: il browser non ha indicato che proviene dalla pagina di questa App. Riaprire l’App da DSM in un browser aggiornato.",
|
|
27
28
|
"metadata": "Metadati",
|
|
28
29
|
"fileKind": "File",
|
|
29
30
|
"directoryKind": "Cartella",
|
package/dist/i18n/files/ja.json
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"errorUnavailable": "File Station が利用できないか、このパッケージにセッション adapter がありません。後で最新の情報に更新してください。",
|
|
25
25
|
"errorCanceled": "リクエストをキャンセルしました。最新の情報に更新してから続けてください。",
|
|
26
26
|
"errorTimeout": "リクエストがタイムアウトしました。一覧を最新の情報に更新してください。",
|
|
27
|
+
"errorOrigin": "リクエストは拒否されました。ブラウザーがこの App のページからのリクエストであることを示しませんでした。最新のブラウザーで DSM から App を開き直してください。",
|
|
27
28
|
"metadata": "情報",
|
|
28
29
|
"fileKind": "ファイル",
|
|
29
30
|
"directoryKind": "フォルダ",
|
package/dist/i18n/files/ko.json
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"errorUnavailable": "File Station을 사용할 수 없거나 패키지에 세션 adapter가 없습니다. 나중에 새로 고치십시오.",
|
|
25
25
|
"errorCanceled": "요청이 취소되었습니다. 새로 고친 후 계속하십시오.",
|
|
26
26
|
"errorTimeout": "요청 시간이 초과되었습니다. 목록을 새로 고치십시오.",
|
|
27
|
+
"errorOrigin": "요청이 거부되었습니다. 브라우저가 이 App 페이지에서 보낸 요청임을 알리지 않았습니다. 최신 브라우저에서 DSM으로 App을 다시 여십시오.",
|
|
27
28
|
"metadata": "정보",
|
|
28
29
|
"fileKind": "파일",
|
|
29
30
|
"directoryKind": "폴더",
|