From e113e271c4a0a3c13569c1e0ad2c009e5189a559 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 30 Aug 2026 19:59:12 +0200 Subject: [PATCH 01/35] chore(release): 0.2.4-unstable.20260830175353 (#605) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- appinfo/info.xml | 2 +- openapi.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index 2bfd99f6..5b3ce9ad 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -46,7 +46,7 @@ Maak een [featureverzoek](https://github.com/ConductionNL/larpinq/issues) **Support:** neem voor support contact op met support@conduction.nl. Voor een Service Level Agreement (SLA), neem contact op met sales@conduction.nl. ]]> - 0.2.3-unstable.20260830082603 + 0.2.4-unstable.20260830175353 EUPL-1.2 Conduction Larpinq diff --git a/openapi.json b/openapi.json index 75f551f5..3a09c85d 100644 --- a/openapi.json +++ b/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "dsonextcloud", - "version": "0.2.3-unstable.20260830082603", + "version": "0.2.4-unstable.20260830175353", "description": "DSO Nextcloud", "license": { "name": "agpl" From 7dcbe85b13affc7689f580f8bf9d7c72a2d1d835 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 03:26:15 +0200 Subject: [PATCH 02/35] chore(deps): take @conduction/nextcloud-vue 2.25.1 for the KPI card (#618) 2.25.x makes the canonical KPI card flat and horizontal, so dashboards stop drawing a grey box inside the white card CnWidgetWrapper already draws, and 2.25.1 fixes the narrow-tile step-down that 2.25.0 shipped inert (a source-order bug left KPI values clipped on a three-column tile). The caret range already allowed both; only the lockfile pinned this app back. Lockfile only. --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c936d087..5fedab11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1829,9 +1829,9 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "2.24.3", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.24.3.tgz", - "integrity": "sha512-Hflys+AxGNNSkDxuMf04RdFzijhWDKtcRJAHtmtYLj6ntwoIT51k0rfRju6S5GuTNF+daJDUv9tHDVVXb9ZIWw==", + "version": "2.25.1", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.25.1.tgz", + "integrity": "sha512-c5sY4XnHrfGUIUEatJEIT5jK78k9REj2UCqXylbHiDPkv1HpUx7Sf3XtfDxAd4xPjn/kbO094rNqShK4tPnY7w==", "license": "EUPL-1.2", "dependencies": { "@ckpack/vue-color": "^1.6.0", @@ -1895,7 +1895,7 @@ "eslint-plugin-vue": "^9.21.0 || ^10.0.0", "gridstack": "^12.0.0 || ^13.0.0", "marked": "^12.0.0", - "pinia": "^2.0.0 || ^3.0.0", + "pinia": "^2.0.0 || ^3.0.0 || ^4.0.0", "vue": "^3.5.0", "vue-eslint-parser": "^9.4.0 || ^10.0.0", "vue-material-design-icons": "^5.0.0" From 323b6a28fd9c62045875cd176adc44c30a42d5d4 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 04:59:21 +0200 Subject: [PATCH 03/35] fix(store): import useObjectStore, which was called but never imported (#620) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit initializeStores() called useObjectStore() on line 39 while the file imported createObjectStore (the factory) and generateUrl, neither of which it used. The call would have thrown ReferenceError the moment initializeStores() ran. src/store/modules/object.js already builds the store from the factory and exports it, and dossiq imports it from exactly there, so this restores the fleet's shape rather than inventing one. Also removed a shadowed binding and two JSDoc errors that eslint reported: - store.js declared a register binding that was immediately shadowed inside the loop and never read. Removing it changes no behaviour — the 'larpingapp' default it carried was already unreachable. - Settings.vue carried @package twice (once empty) and used @link as a BLOCK tag, which is inline-only. Now @see. prettier reported three files, two of which this change never touched (src/main.js, webpack.config.js) — that check was already failing. Verified: lint, format and build all exit 0. --- src/main.js | 5 ++++- src/store/store.js | 4 +--- src/views/settings/Settings.vue | 23 ++++++++++++++++------- webpack.config.js | 5 ++++- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/main.js b/src/main.js index 9878b70d..bf41519b 100644 --- a/src/main.js +++ b/src/main.js @@ -351,7 +351,10 @@ try { } catch (e) { // Non-fatal — lib translations fall back to English source. // eslint-disable-next-line no-console - console.warn('[larpingapp] registerTranslations failed; falling back to English', e) + console.warn( + '[larpingapp] registerTranslations failed; falling back to English', + e, + ) } tryLoadTranslations() diff --git a/src/store/store.js b/src/store/store.js index 67155f95..6a735445 100644 --- a/src/store/store.js +++ b/src/store/store.js @@ -8,8 +8,7 @@ // part of the Tier-4 manifest migration; CnIndexPage / CnDetailPage drive // every list/detail page from src/manifest.json against this store. -import { generateUrl } from '@nextcloud/router' -import { createObjectStore } from '@conduction/nextcloud-vue' +import { useObjectStore } from './modules/object.js' import { useSettingsStore } from './modules/settings.js' /** @@ -39,7 +38,6 @@ export async function initializeStores() { const objectStore = useObjectStore() const config = (await settingsStore.fetchSettings()) || {} - const register = config.register || 'larpingapp' if (config) { for (const slug of SCHEMA_SLUGS) { diff --git a/src/views/settings/Settings.vue b/src/views/settings/Settings.vue index fbb04fb8..3b2f8b08 100644 --- a/src/views/settings/Settings.vue +++ b/src/views/settings/Settings.vue @@ -126,14 +126,13 @@ import logger from '../../logger.js' /** * @class Settings * @module Components - * @package * @category LarpingApp * @package LarpingApp * @version 1.0.0 * @license EUPL-1.2 * @author Claude AI * @copyright 2023 Conduction - * @link https://github.com/LarpingApp/larpingapp + * @see https://github.com/LarpingApp/larpingapp * * Settings component for the Larping App that allows users to configure * data storage options for different object types using Larp Registers. @@ -203,10 +202,14 @@ export default defineComponent({ if (!this.selectedRegister) return false const register = this.settings.availableRegisters.find( - r => r.id.toString() === this.selectedRegister.value, + (r) => r.id.toString() === this.selectedRegister.value, ) - return register && Array.isArray(register.schemas) && register.schemas.length > 0 + return ( + register + && Array.isArray(register.schemas) + && register.schemas.length > 0 + ) }, }, @@ -397,7 +400,9 @@ export default defineComponent({ configToSave[`${type}_register`] = this.selectedRegister.value // Set the schema ID if selected - configToSave[`${type}_schema`] = config.schema ? config.schema.value : '' + configToSave[`${type}_schema`] = config.schema + ? config.schema.value + : '' }) const response = await fetch( @@ -441,7 +446,9 @@ export default defineComponent({ this.configurationResults = null try { - const response = await fetch('/index.php/apps/larpingapp/api/settings/load') + const response = await fetch( + '/index.php/apps/larpingapp/api/settings/load', + ) const data = await response.json() if (data.error) { @@ -452,7 +459,9 @@ export default defineComponent({ await this.loadSettings() } } catch (error) { - this.configurationResults = { error: 'Failed to load configuration: ' + error.message } + this.configurationResults = { + error: 'Failed to load configuration: ' + error.message, + } } finally { this.loadingConfiguration = false } diff --git a/webpack.config.js b/webpack.config.js index 1fb572fc..91e067af 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -210,6 +210,9 @@ webpackConfig.plugins = [ // `^3.x` line), preventing @conduction/nextcloud-vue's nested `@nextcloud/dialogs@^7` // — which drags in a Vue-3 `@nextcloud/vue` + floating-vue and breaks the Vue-2 // build with "export 'createApp' was not found in 'vue'". Mirrors procest/decidesk. -webpackConfig.resolve.alias['@nextcloud/dialogs'] = path.resolve(__dirname, 'node_modules/@nextcloud/dialogs') +webpackConfig.resolve.alias['@nextcloud/dialogs'] = path.resolve( + __dirname, + 'node_modules/@nextcloud/dialogs', +) module.exports = webpackConfig From 95d1000893a3f17175064eee97fffff1a5643a94 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 05:58:32 +0200 Subject: [PATCH 04/35] fix(l10n): cover the schema strings that broke the check (#622) * fix(l10n): cover the schema strings that broke the check check:schema-l10n failed on development: 221 schema string(s); 196 uncovered, baseline 134 62 schema string(s) added with no catalogue key. They will render in English inside an otherwise translated form. Adds Dutch for the field titles and short descriptions a user actually reads in a form: names, dates, currencies, game master notes, the requirement-override fields and the experience-point award fields. en.json takes the identity mapping, which is what the checker requires: the English string IS the key, so changing it there would stop the schema matching at all. The Dutch is the part being authored. The .js catalogues are regenerated with npm run l10n:build rather than edited, because the .json files are the source and hand-editing the generated side is how the two drift apart. Uncovered goes 196 -> 125, which is nine BELOW the previous baseline, so the baseline is lowered to 125 in the same commit. Leaving it at 134 would let the coverage slip back by nine without the check noticing. Verified: check:schema-l10n, check:l10n and check:l10n-js all exit 0. * fix(l10n): translate the 71 schema strings in the other 35 locales The previous commit added the schema field labels to en.json and nl.json and left the other 35 catalogues short by the same 71 keys, so `npm run test:l10n` failed on the parity gate: every required locale must carry a real translation for every English source key. Each locale now has all 71. The wording is taken from the terms the catalogue already uses for the same nouns rather than from a fresh choice per string: character, skill, event, player, item, condition and effect all keep the word that locale already picked, and the five keys that only differ from an existing one by capitalisation ("Start Date" next to "Start date", the three "Required ..." pairs) reuse the same translation. Two schema notes drove specific choices. The `setting` schema is titled "World", and its own note records that all 35 non-Dutch locales had read the old title as a UI preference, so "Setting Name" is translated as the name of the world, not of a setting. "Ability" and "Stat" are separate schemas, so the locales that had already spent their obvious word on one of them use a distinct word for the other. Fifteen locales keep "Status" as-is. It is the actual word in those languages, and the parity gate counts values identical to English rather than rejecting them, so nothing needs recording anywhere. The .js catalogues are regenerated with `npm run l10n:build`. The .json files are the source; hand-editing the generated side is how the two drift apart. Verified: test:l10n, check:l10n-js, check:schema-l10n and format all exit 0. en.json and nl.json are untouched. --------- Co-authored-by: Conduction Release Bot --- l10n/.schema-l10n-baseline.json | 2 +- l10n/be.js | 73 ++++- l10n/be.json | 73 ++++- l10n/bg.js | 73 ++++- l10n/bg.json | 73 ++++- l10n/bs.js | 73 ++++- l10n/bs.json | 73 ++++- l10n/ca.js | 73 ++++- l10n/ca.json | 73 ++++- l10n/cs.js | 73 ++++- l10n/cs.json | 73 ++++- l10n/da.js | 73 ++++- l10n/da.json | 73 ++++- l10n/de.js | 73 ++++- l10n/de.json | 73 ++++- l10n/el.js | 73 ++++- l10n/el.json | 73 ++++- l10n/en.js | 335 ++++++++++++--------- l10n/en.json | 335 ++++++++++++--------- l10n/es.js | 73 ++++- l10n/es.json | 73 ++++- l10n/et.js | 73 ++++- l10n/et.json | 73 ++++- l10n/fi.js | 73 ++++- l10n/fi.json | 73 ++++- l10n/fr.js | 73 ++++- l10n/fr.json | 73 ++++- l10n/ga.js | 73 ++++- l10n/ga.json | 73 ++++- l10n/hr.js | 73 ++++- l10n/hr.json | 73 ++++- l10n/hu.js | 73 ++++- l10n/hu.json | 73 ++++- l10n/is.js | 73 ++++- l10n/is.json | 73 ++++- l10n/it.js | 73 ++++- l10n/it.json | 73 ++++- l10n/lb.js | 73 ++++- l10n/lb.json | 73 ++++- l10n/lt.js | 73 ++++- l10n/lt.json | 73 ++++- l10n/lv.js | 73 ++++- l10n/lv.json | 73 ++++- l10n/mk.js | 73 ++++- l10n/mk.json | 73 ++++- l10n/mt.js | 73 ++++- l10n/mt.json | 73 ++++- l10n/nb.js | 73 ++++- l10n/nb.json | 73 ++++- l10n/nl.js | 510 ++++++++++++++++++-------------- l10n/nl.json | 510 ++++++++++++++++++-------------- l10n/pl.js | 73 ++++- l10n/pl.json | 73 ++++- l10n/pt.js | 73 ++++- l10n/pt.json | 73 ++++- l10n/rm.js | 73 ++++- l10n/rm.json | 73 ++++- l10n/ro.js | 73 ++++- l10n/ro.json | 73 ++++- l10n/ru.js | 73 ++++- l10n/ru.json | 73 ++++- l10n/sk.js | 73 ++++- l10n/sk.json | 73 ++++- l10n/sl.js | 73 ++++- l10n/sl.json | 73 ++++- l10n/sq.js | 73 ++++- l10n/sq.json | 73 ++++- l10n/sr.js | 73 ++++- l10n/sr.json | 73 ++++- l10n/sv.js | 73 ++++- l10n/sv.json | 73 ++++- l10n/tr.js | 73 ++++- l10n/tr.json | 73 ++++- l10n/uk.js | 73 ++++- l10n/uk.json | 73 ++++- 75 files changed, 6027 insertions(+), 775 deletions(-) diff --git a/l10n/.schema-l10n-baseline.json b/l10n/.schema-l10n-baseline.json index d2ee426a..5067a41f 100644 --- a/l10n/.schema-l10n-baseline.json +++ b/l10n/.schema-l10n-baseline.json @@ -1,3 +1,3 @@ { - "uncovered": 134 + "uncovered": 125 } diff --git a/l10n/be.js b/l10n/be.js index b2f2d045..9bfee6d7 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Няма — гэта базавы навык.", "Where the automation lives": "Дзе жыве аўтаматызацыя", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows — гэта тое, што адбываецца без ніводнага кліку: напамін да заканчэння тэрміну, пацвярджэнне пры падачы. Тут вы іх чытаеце і рэдагуеце — зараз нічога будаваць не трэба.", - "Open Flows in the menu": "Адкрыйце Flows у меню" + "Open Flows in the menu": "Адкрыйце Flows у меню", + "Ability Name": "Назва здольнасці", + "Affected Characters": "Закранутыя персанажы", + "Amount of copper pieces": "Колькасць медных манет", + "Amount of gold pieces": "Колькасць залатых манет", + "Amount of silver pieces": "Колькасць срэбных манет", + "Automatic system notices": "Аўтаматычныя сістэмныя паведамленні", + "Award Reason": "Прычына налічэння", + "Awarded At": "Налічана", + "Awarded By": "Налічыў", + "Background Story": "Перадгісторыя персанажа", + "Base Value": "Базавае значэнне", + "Character Card": "Картка персанажа", + "Character Name": "Імя персанажа", + "Checked In At": "Прыбыццё зафіксавана", + "Checked In By": "Прыбыццё зафіксаваў", + "Condition Name": "Назва стану", + "Contact email address": "Кантактны адрас электроннай пошты", + "Copper Pieces": "Медныя манеты", + "Effect Name": "Назва эфекту", + "End Date": "Дата заканчэння", + "Event Name": "Назва падзеі", + "Event description": "Апісанне падзеі", + "Event end date and time": "Дата і час заканчэння падзеі", + "Event location": "Месца правядзення падзеі", + "Event name": "Назва падзеі", + "Event start date and time": "Дата і час пачатку падзеі", + "Faith": "Вера", + "Full name of the player": "Поўнае імя гульца", + "Game Master Notes (Private)": "Нататкі вядучага гульні (прыватныя)", + "Game Master Notes (Public)": "Нататкі вядучага гульні (публічныя)", + "Gold Pieces": "Залатыя манеты", + "Item Name": "Назва прадмета", + "Items and Money": "Прадметы і грошы", + "Mechanical Effect": "Гульнявы эфект", + "Modifier Value": "Значэнне мадыфікатара", + "Name of the condition": "Назва стану", + "Name of the effect": "Назва эфекту", + "Name of the event": "Назва падзеі", + "Name of the item": "Назва прадмета", + "Name of the skill": "Назва навыку", + "Name of the stat": "Назва характарыстыкі", + "Nextcloud user": "Карыстальнік Nextcloud", + "Notes about items and money": "Нататкі пра прадметы і грошы", + "Notes about the player": "Нататкі пра гульца", + "Overridden At": "Выключэнне дадзена", + "Overridden By": "Выключэнне даў", + "Override Reason": "Прычына выключэння", + "Owner": "Уладальнік", + "Owner UID": "UID уладальніка", + "Participating Characters": "Персанажы, якія ўдзельнічаюць", + "Player Name": "Імя гульца", + "Post-Event Effects": "Эфекты пасля падзеі", + "Real name of the player": "Сапраўднае імя гульца", + "Required Conditions": "Патрэбныя станы", + "Required Effects": "Патрэбныя эфекты", + "Required Score": "Патрэбнае значэнне", + "Required Skills": "Патрэбныя навыкі", + "Required Stats": "Патрэбныя характарыстыкі", + "Requirement Overrides": "Выключэнні з патрабаванняў", + "Setting Name": "Назва свету гульні", + "Silver Pieces": "Срэбныя манеты", + "Skill Name": "Назва навыку", + "Start Date": "Дата пачатку", + "Starting value for all characters": "Пачатковае значэнне для ўсіх персанажаў", + "Stat": "Характарыстыка", + "Status": "Статус", + "System Notice": "Сістэмнае паведамленне", + "Unique Artifact": "Унікальны артэфакт", + "Unique Condition": "Унікальны стан", + "XP Amount": "Колькасць пунктаў вопыту", + "XP Award": "Налічэнне пунктаў вопыту" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/be.json b/l10n/be.json index 9f66792b..e994ad25 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Няма — гэта базавы навык.", "Where the automation lives": "Дзе жыве аўтаматызацыя", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows — гэта тое, што адбываецца без ніводнага кліку: напамін да заканчэння тэрміну, пацвярджэнне пры падачы. Тут вы іх чытаеце і рэдагуеце — зараз нічога будаваць не трэба.", - "Open Flows in the menu": "Адкрыйце Flows у меню" + "Open Flows in the menu": "Адкрыйце Flows у меню", + "Ability Name": "Назва здольнасці", + "Affected Characters": "Закранутыя персанажы", + "Amount of copper pieces": "Колькасць медных манет", + "Amount of gold pieces": "Колькасць залатых манет", + "Amount of silver pieces": "Колькасць срэбных манет", + "Automatic system notices": "Аўтаматычныя сістэмныя паведамленні", + "Award Reason": "Прычына налічэння", + "Awarded At": "Налічана", + "Awarded By": "Налічыў", + "Background Story": "Перадгісторыя персанажа", + "Base Value": "Базавае значэнне", + "Character Card": "Картка персанажа", + "Character Name": "Імя персанажа", + "Checked In At": "Прыбыццё зафіксавана", + "Checked In By": "Прыбыццё зафіксаваў", + "Condition Name": "Назва стану", + "Contact email address": "Кантактны адрас электроннай пошты", + "Copper Pieces": "Медныя манеты", + "Effect Name": "Назва эфекту", + "End Date": "Дата заканчэння", + "Event Name": "Назва падзеі", + "Event description": "Апісанне падзеі", + "Event end date and time": "Дата і час заканчэння падзеі", + "Event location": "Месца правядзення падзеі", + "Event name": "Назва падзеі", + "Event start date and time": "Дата і час пачатку падзеі", + "Faith": "Вера", + "Full name of the player": "Поўнае імя гульца", + "Game Master Notes (Private)": "Нататкі вядучага гульні (прыватныя)", + "Game Master Notes (Public)": "Нататкі вядучага гульні (публічныя)", + "Gold Pieces": "Залатыя манеты", + "Item Name": "Назва прадмета", + "Items and Money": "Прадметы і грошы", + "Mechanical Effect": "Гульнявы эфект", + "Modifier Value": "Значэнне мадыфікатара", + "Name of the condition": "Назва стану", + "Name of the effect": "Назва эфекту", + "Name of the event": "Назва падзеі", + "Name of the item": "Назва прадмета", + "Name of the skill": "Назва навыку", + "Name of the stat": "Назва характарыстыкі", + "Nextcloud user": "Карыстальнік Nextcloud", + "Notes about items and money": "Нататкі пра прадметы і грошы", + "Notes about the player": "Нататкі пра гульца", + "Overridden At": "Выключэнне дадзена", + "Overridden By": "Выключэнне даў", + "Override Reason": "Прычына выключэння", + "Owner": "Уладальнік", + "Owner UID": "UID уладальніка", + "Participating Characters": "Персанажы, якія ўдзельнічаюць", + "Player Name": "Імя гульца", + "Post-Event Effects": "Эфекты пасля падзеі", + "Real name of the player": "Сапраўднае імя гульца", + "Required Conditions": "Патрэбныя станы", + "Required Effects": "Патрэбныя эфекты", + "Required Score": "Патрэбнае значэнне", + "Required Skills": "Патрэбныя навыкі", + "Required Stats": "Патрэбныя характарыстыкі", + "Requirement Overrides": "Выключэнні з патрабаванняў", + "Setting Name": "Назва свету гульні", + "Silver Pieces": "Срэбныя манеты", + "Skill Name": "Назва навыку", + "Start Date": "Дата пачатку", + "Starting value for all characters": "Пачатковае значэнне для ўсіх персанажаў", + "Stat": "Характарыстыка", + "Status": "Статус", + "System Notice": "Сістэмнае паведамленне", + "Unique Artifact": "Унікальны артэфакт", + "Unique Condition": "Унікальны стан", + "XP Amount": "Колькасць пунктаў вопыту", + "XP Award": "Налічэнне пунктаў вопыту" }, "plurals": {} } diff --git a/l10n/bg.js b/l10n/bg.js index 4801cc0f..f7c6dc13 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Няма — това е основно умение.", "Where the automation lives": "Къде живее автоматизацията", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows е това, което се случва, без някой да кликне: напомняне преди да изтече срок, потвърждение при подаване. Тук ги четете и редактирате — сега няма какво да се изгражда.", - "Open Flows in the menu": "Отворете Flows в менюто" + "Open Flows in the menu": "Отворете Flows в менюто", + "Ability Name": "Име на способността", + "Affected Characters": "Засегнати герои", + "Amount of copper pieces": "Брой медни монети", + "Amount of gold pieces": "Брой златни монети", + "Amount of silver pieces": "Брой сребърни монети", + "Automatic system notices": "Автоматични системни съобщения", + "Award Reason": "Причина за присъждането", + "Awarded At": "Присъдено на", + "Awarded By": "Присъдено от", + "Background Story": "Предистория на героя", + "Base Value": "Базова стойност", + "Character Card": "Карта на героя", + "Character Name": "Име на героя", + "Checked In At": "Пристигането е отбелязано на", + "Checked In By": "Пристигането е отбелязано от", + "Condition Name": "Име на състоянието", + "Contact email address": "Имейл адрес за контакт", + "Copper Pieces": "Медни монети", + "Effect Name": "Име на ефекта", + "End Date": "Крайна дата", + "Event Name": "Име на събитието", + "Event description": "Описание на събитието", + "Event end date and time": "Крайна дата и час на събитието", + "Event location": "Място на събитието", + "Event name": "Име на събитието", + "Event start date and time": "Начална дата и час на събитието", + "Faith": "Вяра", + "Full name of the player": "Пълно име на играча", + "Game Master Notes (Private)": "Бележки на водещия играта (лични)", + "Game Master Notes (Public)": "Бележки на водещия играта (публични)", + "Gold Pieces": "Златни монети", + "Item Name": "Име на предмета", + "Items and Money": "Предмети и пари", + "Mechanical Effect": "Ефект в играта", + "Modifier Value": "Стойност на модификатора", + "Name of the condition": "Име на състоянието", + "Name of the effect": "Име на ефекта", + "Name of the event": "Име на събитието", + "Name of the item": "Име на предмета", + "Name of the skill": "Име на умението", + "Name of the stat": "Име на характеристиката", + "Nextcloud user": "Потребител на Nextcloud", + "Notes about items and money": "Бележки за предметите и парите", + "Notes about the player": "Бележки за играча", + "Overridden At": "Изключението е дадено на", + "Overridden By": "Изключението е дадено от", + "Override Reason": "Причина за изключението", + "Owner": "Собственик", + "Owner UID": "UID на собственика", + "Participating Characters": "Участващи герои", + "Player Name": "Име на играча", + "Post-Event Effects": "Ефекти след събитието", + "Real name of the player": "Истинско име на играча", + "Required Conditions": "Необходими състояния", + "Required Effects": "Необходими ефекти", + "Required Score": "Необходима стойност", + "Required Skills": "Необходими умения", + "Required Stats": "Необходими характеристики", + "Requirement Overrides": "Изключения от изискванията", + "Setting Name": "Име на света на играта", + "Silver Pieces": "Сребърни монети", + "Skill Name": "Име на умението", + "Start Date": "Начална дата", + "Starting value for all characters": "Начална стойност за всички герои", + "Stat": "Характеристика", + "Status": "Статус", + "System Notice": "Системно съобщение", + "Unique Artifact": "Уникален артефакт", + "Unique Condition": "Уникално състояние", + "XP Amount": "Брой точки опит", + "XP Award": "Присъждане на точки опит" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bg.json b/l10n/bg.json index ecbb13cd..569466c4 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Няма — това е основно умение.", "Where the automation lives": "Къде живее автоматизацията", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows е това, което се случва, без някой да кликне: напомняне преди да изтече срок, потвърждение при подаване. Тук ги четете и редактирате — сега няма какво да се изгражда.", - "Open Flows in the menu": "Отворете Flows в менюто" + "Open Flows in the menu": "Отворете Flows в менюто", + "Ability Name": "Име на способността", + "Affected Characters": "Засегнати герои", + "Amount of copper pieces": "Брой медни монети", + "Amount of gold pieces": "Брой златни монети", + "Amount of silver pieces": "Брой сребърни монети", + "Automatic system notices": "Автоматични системни съобщения", + "Award Reason": "Причина за присъждането", + "Awarded At": "Присъдено на", + "Awarded By": "Присъдено от", + "Background Story": "Предистория на героя", + "Base Value": "Базова стойност", + "Character Card": "Карта на героя", + "Character Name": "Име на героя", + "Checked In At": "Пристигането е отбелязано на", + "Checked In By": "Пристигането е отбелязано от", + "Condition Name": "Име на състоянието", + "Contact email address": "Имейл адрес за контакт", + "Copper Pieces": "Медни монети", + "Effect Name": "Име на ефекта", + "End Date": "Крайна дата", + "Event Name": "Име на събитието", + "Event description": "Описание на събитието", + "Event end date and time": "Крайна дата и час на събитието", + "Event location": "Място на събитието", + "Event name": "Име на събитието", + "Event start date and time": "Начална дата и час на събитието", + "Faith": "Вяра", + "Full name of the player": "Пълно име на играча", + "Game Master Notes (Private)": "Бележки на водещия играта (лични)", + "Game Master Notes (Public)": "Бележки на водещия играта (публични)", + "Gold Pieces": "Златни монети", + "Item Name": "Име на предмета", + "Items and Money": "Предмети и пари", + "Mechanical Effect": "Ефект в играта", + "Modifier Value": "Стойност на модификатора", + "Name of the condition": "Име на състоянието", + "Name of the effect": "Име на ефекта", + "Name of the event": "Име на събитието", + "Name of the item": "Име на предмета", + "Name of the skill": "Име на умението", + "Name of the stat": "Име на характеристиката", + "Nextcloud user": "Потребител на Nextcloud", + "Notes about items and money": "Бележки за предметите и парите", + "Notes about the player": "Бележки за играча", + "Overridden At": "Изключението е дадено на", + "Overridden By": "Изключението е дадено от", + "Override Reason": "Причина за изключението", + "Owner": "Собственик", + "Owner UID": "UID на собственика", + "Participating Characters": "Участващи герои", + "Player Name": "Име на играча", + "Post-Event Effects": "Ефекти след събитието", + "Real name of the player": "Истинско име на играча", + "Required Conditions": "Необходими състояния", + "Required Effects": "Необходими ефекти", + "Required Score": "Необходима стойност", + "Required Skills": "Необходими умения", + "Required Stats": "Необходими характеристики", + "Requirement Overrides": "Изключения от изискванията", + "Setting Name": "Име на света на играта", + "Silver Pieces": "Сребърни монети", + "Skill Name": "Име на умението", + "Start Date": "Начална дата", + "Starting value for all characters": "Начална стойност за всички герои", + "Stat": "Характеристика", + "Status": "Статус", + "System Notice": "Системно съобщение", + "Unique Artifact": "Уникален артефакт", + "Unique Condition": "Уникално състояние", + "XP Amount": "Брой точки опит", + "XP Award": "Присъждане на точки опит" }, "plurals": {} } diff --git a/l10n/bs.js b/l10n/bs.js index 9afa20d2..1f1e42b4 100644 --- a/l10n/bs.js +++ b/l10n/bs.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Nema — ovo je osnovna vještina.", "Where the automation lives": "Gdje živi automatizacija", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je ono što se dešava bez ičijeg klika: podsjetnik prije isteka roka, potvrda pri predaji. Ovdje ih čitaš i uređuješ — sada nema šta da se gradi.", - "Open Flows in the menu": "Otvori Flows u meniju" + "Open Flows in the menu": "Otvori Flows u meniju", + "Ability Name": "Naziv sposobnosti", + "Affected Characters": "Zahvaćeni likovi", + "Amount of copper pieces": "Broj bakrenih novčića", + "Amount of gold pieces": "Broj zlatnih novčića", + "Amount of silver pieces": "Broj srebrnih novčića", + "Automatic system notices": "Automatska sistemska obavještenja", + "Award Reason": "Razlog dodjele", + "Awarded At": "Dodijeljeno", + "Awarded By": "Dodijelio", + "Background Story": "Pozadinska priča", + "Base Value": "Osnovna vrijednost", + "Character Card": "Kartica lika", + "Character Name": "Ime lika", + "Checked In At": "Dolazak zabilježen", + "Checked In By": "Dolazak zabilježio", + "Condition Name": "Naziv stanja", + "Contact email address": "Kontakt e-mail adresa", + "Copper Pieces": "Bakreni novčići", + "Effect Name": "Naziv efekta", + "End Date": "Datum završetka", + "Event Name": "Naziv događaja", + "Event description": "Opis događaja", + "Event end date and time": "Datum i vrijeme završetka događaja", + "Event location": "Mjesto događaja", + "Event name": "Naziv događaja", + "Event start date and time": "Datum i vrijeme početka događaja", + "Faith": "Vjera", + "Full name of the player": "Puno ime igrača", + "Game Master Notes (Private)": "Bilješke voditelja igre (privatne)", + "Game Master Notes (Public)": "Bilješke voditelja igre (javne)", + "Gold Pieces": "Zlatni novčići", + "Item Name": "Naziv predmeta", + "Items and Money": "Predmeti i novac", + "Mechanical Effect": "Efekat u igri", + "Modifier Value": "Vrijednost modifikatora", + "Name of the condition": "Naziv stanja", + "Name of the effect": "Naziv efekta", + "Name of the event": "Naziv događaja", + "Name of the item": "Naziv predmeta", + "Name of the skill": "Naziv vještine", + "Name of the stat": "Naziv svojstva", + "Nextcloud user": "Nextcloud korisnik", + "Notes about items and money": "Bilješke o predmetima i novcu", + "Notes about the player": "Bilješke o igraču", + "Overridden At": "Izuzetak odobren", + "Overridden By": "Izuzetak odobrio", + "Override Reason": "Razlog izuzetka", + "Owner": "Vlasnik", + "Owner UID": "UID vlasnika", + "Participating Characters": "Učestvujući likovi", + "Player Name": "Ime igrača", + "Post-Event Effects": "Efekti nakon događaja", + "Real name of the player": "Pravo ime igrača", + "Required Conditions": "Potrebna stanja", + "Required Effects": "Potrebni efekti", + "Required Score": "Potrebna vrijednost", + "Required Skills": "Potrebne vještine", + "Required Stats": "Potrebna svojstva", + "Requirement Overrides": "Izuzeci od preduslova", + "Setting Name": "Naziv svijeta igre", + "Silver Pieces": "Srebrni novčići", + "Skill Name": "Naziv vještine", + "Start Date": "Datum početka", + "Starting value for all characters": "Početna vrijednost za sve likove", + "Stat": "Svojstvo", + "Status": "Status", + "System Notice": "Sistemsko obavještenje", + "Unique Artifact": "Jedinstveni artefakt", + "Unique Condition": "Jedinstveno stanje", + "XP Amount": "Broj bodova iskustva", + "XP Award": "Dodjela bodova iskustva" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bs.json b/l10n/bs.json index 4b3d4b2e..56787d60 100644 --- a/l10n/bs.json +++ b/l10n/bs.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Nema — ovo je osnovna vještina.", "Where the automation lives": "Gdje živi automatizacija", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je ono što se dešava bez ičijeg klika: podsjetnik prije isteka roka, potvrda pri predaji. Ovdje ih čitaš i uređuješ — sada nema šta da se gradi.", - "Open Flows in the menu": "Otvori Flows u meniju" + "Open Flows in the menu": "Otvori Flows u meniju", + "Ability Name": "Naziv sposobnosti", + "Affected Characters": "Zahvaćeni likovi", + "Amount of copper pieces": "Broj bakrenih novčića", + "Amount of gold pieces": "Broj zlatnih novčića", + "Amount of silver pieces": "Broj srebrnih novčića", + "Automatic system notices": "Automatska sistemska obavještenja", + "Award Reason": "Razlog dodjele", + "Awarded At": "Dodijeljeno", + "Awarded By": "Dodijelio", + "Background Story": "Pozadinska priča", + "Base Value": "Osnovna vrijednost", + "Character Card": "Kartica lika", + "Character Name": "Ime lika", + "Checked In At": "Dolazak zabilježen", + "Checked In By": "Dolazak zabilježio", + "Condition Name": "Naziv stanja", + "Contact email address": "Kontakt e-mail adresa", + "Copper Pieces": "Bakreni novčići", + "Effect Name": "Naziv efekta", + "End Date": "Datum završetka", + "Event Name": "Naziv događaja", + "Event description": "Opis događaja", + "Event end date and time": "Datum i vrijeme završetka događaja", + "Event location": "Mjesto događaja", + "Event name": "Naziv događaja", + "Event start date and time": "Datum i vrijeme početka događaja", + "Faith": "Vjera", + "Full name of the player": "Puno ime igrača", + "Game Master Notes (Private)": "Bilješke voditelja igre (privatne)", + "Game Master Notes (Public)": "Bilješke voditelja igre (javne)", + "Gold Pieces": "Zlatni novčići", + "Item Name": "Naziv predmeta", + "Items and Money": "Predmeti i novac", + "Mechanical Effect": "Efekat u igri", + "Modifier Value": "Vrijednost modifikatora", + "Name of the condition": "Naziv stanja", + "Name of the effect": "Naziv efekta", + "Name of the event": "Naziv događaja", + "Name of the item": "Naziv predmeta", + "Name of the skill": "Naziv vještine", + "Name of the stat": "Naziv svojstva", + "Nextcloud user": "Nextcloud korisnik", + "Notes about items and money": "Bilješke o predmetima i novcu", + "Notes about the player": "Bilješke o igraču", + "Overridden At": "Izuzetak odobren", + "Overridden By": "Izuzetak odobrio", + "Override Reason": "Razlog izuzetka", + "Owner": "Vlasnik", + "Owner UID": "UID vlasnika", + "Participating Characters": "Učestvujući likovi", + "Player Name": "Ime igrača", + "Post-Event Effects": "Efekti nakon događaja", + "Real name of the player": "Pravo ime igrača", + "Required Conditions": "Potrebna stanja", + "Required Effects": "Potrebni efekti", + "Required Score": "Potrebna vrijednost", + "Required Skills": "Potrebne vještine", + "Required Stats": "Potrebna svojstva", + "Requirement Overrides": "Izuzeci od preduslova", + "Setting Name": "Naziv svijeta igre", + "Silver Pieces": "Srebrni novčići", + "Skill Name": "Naziv vještine", + "Start Date": "Datum početka", + "Starting value for all characters": "Početna vrijednost za sve likove", + "Stat": "Svojstvo", + "Status": "Status", + "System Notice": "Sistemsko obavještenje", + "Unique Artifact": "Jedinstveni artefakt", + "Unique Condition": "Jedinstveno stanje", + "XP Amount": "Broj bodova iskustva", + "XP Award": "Dodjela bodova iskustva" }, "plurals": {} } diff --git a/l10n/ca.js b/l10n/ca.js index ea325fac..4c64d895 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Cap — aquesta és una aptitud arrel.", "Where the automation lives": "On viu l'automatització", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Els Flows són el que passa sense que ningú faci clic: un recordatori abans que venci un termini, una confirmació en enviar. Aquí els llegeixes i els edites — ara no cal construir res.", - "Open Flows in the menu": "Obre Flows al menú" + "Open Flows in the menu": "Obre Flows al menú", + "Ability Name": "Nom de l'habilitat", + "Affected Characters": "Personatges afectats", + "Amount of copper pieces": "Quantitat de monedes de coure", + "Amount of gold pieces": "Quantitat de monedes d'or", + "Amount of silver pieces": "Quantitat de monedes de plata", + "Automatic system notices": "Avisos automàtics del sistema", + "Award Reason": "Motiu de la concessió", + "Awarded At": "Concedit el", + "Awarded By": "Concedit per", + "Background Story": "Història de rerefons", + "Base Value": "Valor base", + "Character Card": "Fitxa de personatge", + "Character Name": "Nom del personatge", + "Checked In At": "Entrada registrada el", + "Checked In By": "Entrada registrada per", + "Condition Name": "Nom de la condició", + "Contact email address": "Adreça electrònica de contacte", + "Copper Pieces": "Monedes de coure", + "Effect Name": "Nom de l'efecte", + "End Date": "Data de finalització", + "Event Name": "Nom de l'esdeveniment", + "Event description": "Descripció de l'esdeveniment", + "Event end date and time": "Data i hora de finalització de l'esdeveniment", + "Event location": "Ubicació de l'esdeveniment", + "Event name": "Nom de l'esdeveniment", + "Event start date and time": "Data i hora d'inici de l'esdeveniment", + "Faith": "Fe", + "Full name of the player": "Nom complet del jugador", + "Game Master Notes (Private)": "Notes del narrador (privades)", + "Game Master Notes (Public)": "Notes del narrador (públiques)", + "Gold Pieces": "Monedes d'or", + "Item Name": "Nom de l'objecte", + "Items and Money": "Objectes i diners", + "Mechanical Effect": "Efecte de joc", + "Modifier Value": "Valor del modificador", + "Name of the condition": "Nom de la condició", + "Name of the effect": "Nom de l'efecte", + "Name of the event": "Nom de l'esdeveniment", + "Name of the item": "Nom de l'objecte", + "Name of the skill": "Nom de l'aptitud", + "Name of the stat": "Nom de la característica", + "Nextcloud user": "Usuari de Nextcloud", + "Notes about items and money": "Notes sobre els objectes i els diners", + "Notes about the player": "Notes sobre el jugador", + "Overridden At": "Excepció concedida el", + "Overridden By": "Excepció concedida per", + "Override Reason": "Motiu de l'excepció", + "Owner": "Propietari", + "Owner UID": "UID del propietari", + "Participating Characters": "Personatges participants", + "Player Name": "Nom del jugador", + "Post-Event Effects": "Efectes posteriors a l'esdeveniment", + "Real name of the player": "Nom real del jugador", + "Required Conditions": "Condicions requerides", + "Required Effects": "Efectes requerits", + "Required Score": "Valor requerit", + "Required Skills": "Aptituds requerides", + "Required Stats": "Característiques requerides", + "Requirement Overrides": "Excepcions als prerequisits", + "Setting Name": "Nom de l'ambientació", + "Silver Pieces": "Monedes de plata", + "Skill Name": "Nom de l'aptitud", + "Start Date": "Data d'inici", + "Starting value for all characters": "Valor inicial per a tots els personatges", + "Stat": "Característica", + "Status": "Estat", + "System Notice": "Avís del sistema", + "Unique Artifact": "Artefacte únic", + "Unique Condition": "Condició única", + "XP Amount": "Quantitat de punts d'experiència", + "XP Award": "Concessió de punts d'experiència" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ca.json b/l10n/ca.json index 0ccf9393..12afcf5d 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Cap — aquesta és una aptitud arrel.", "Where the automation lives": "On viu l'automatització", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Els Flows són el que passa sense que ningú faci clic: un recordatori abans que venci un termini, una confirmació en enviar. Aquí els llegeixes i els edites — ara no cal construir res.", - "Open Flows in the menu": "Obre Flows al menú" + "Open Flows in the menu": "Obre Flows al menú", + "Ability Name": "Nom de l'habilitat", + "Affected Characters": "Personatges afectats", + "Amount of copper pieces": "Quantitat de monedes de coure", + "Amount of gold pieces": "Quantitat de monedes d'or", + "Amount of silver pieces": "Quantitat de monedes de plata", + "Automatic system notices": "Avisos automàtics del sistema", + "Award Reason": "Motiu de la concessió", + "Awarded At": "Concedit el", + "Awarded By": "Concedit per", + "Background Story": "Història de rerefons", + "Base Value": "Valor base", + "Character Card": "Fitxa de personatge", + "Character Name": "Nom del personatge", + "Checked In At": "Entrada registrada el", + "Checked In By": "Entrada registrada per", + "Condition Name": "Nom de la condició", + "Contact email address": "Adreça electrònica de contacte", + "Copper Pieces": "Monedes de coure", + "Effect Name": "Nom de l'efecte", + "End Date": "Data de finalització", + "Event Name": "Nom de l'esdeveniment", + "Event description": "Descripció de l'esdeveniment", + "Event end date and time": "Data i hora de finalització de l'esdeveniment", + "Event location": "Ubicació de l'esdeveniment", + "Event name": "Nom de l'esdeveniment", + "Event start date and time": "Data i hora d'inici de l'esdeveniment", + "Faith": "Fe", + "Full name of the player": "Nom complet del jugador", + "Game Master Notes (Private)": "Notes del narrador (privades)", + "Game Master Notes (Public)": "Notes del narrador (públiques)", + "Gold Pieces": "Monedes d'or", + "Item Name": "Nom de l'objecte", + "Items and Money": "Objectes i diners", + "Mechanical Effect": "Efecte de joc", + "Modifier Value": "Valor del modificador", + "Name of the condition": "Nom de la condició", + "Name of the effect": "Nom de l'efecte", + "Name of the event": "Nom de l'esdeveniment", + "Name of the item": "Nom de l'objecte", + "Name of the skill": "Nom de l'aptitud", + "Name of the stat": "Nom de la característica", + "Nextcloud user": "Usuari de Nextcloud", + "Notes about items and money": "Notes sobre els objectes i els diners", + "Notes about the player": "Notes sobre el jugador", + "Overridden At": "Excepció concedida el", + "Overridden By": "Excepció concedida per", + "Override Reason": "Motiu de l'excepció", + "Owner": "Propietari", + "Owner UID": "UID del propietari", + "Participating Characters": "Personatges participants", + "Player Name": "Nom del jugador", + "Post-Event Effects": "Efectes posteriors a l'esdeveniment", + "Real name of the player": "Nom real del jugador", + "Required Conditions": "Condicions requerides", + "Required Effects": "Efectes requerits", + "Required Score": "Valor requerit", + "Required Skills": "Aptituds requerides", + "Required Stats": "Característiques requerides", + "Requirement Overrides": "Excepcions als prerequisits", + "Setting Name": "Nom de l'ambientació", + "Silver Pieces": "Monedes de plata", + "Skill Name": "Nom de l'aptitud", + "Start Date": "Data d'inici", + "Starting value for all characters": "Valor inicial per a tots els personatges", + "Stat": "Característica", + "Status": "Estat", + "System Notice": "Avís del sistema", + "Unique Artifact": "Artefacte únic", + "Unique Condition": "Condició única", + "XP Amount": "Quantitat de punts d'experiència", + "XP Award": "Concessió de punts d'experiència" }, "plurals": {} } diff --git a/l10n/cs.js b/l10n/cs.js index 08c0f281..75ba4a52 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Žádné — toto je kořenová dovednost.", "Where the automation lives": "Kde bydlí automatizace", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je to, co se děje, aniž by někdo klikl: připomínka před vypršením lhůty, potvrzení při odeslání. Tady je čteš a upravuješ — teď není co stavět.", - "Open Flows in the menu": "Otevři Flows v nabídce" + "Open Flows in the menu": "Otevři Flows v nabídce", + "Ability Name": "Název schopnosti", + "Affected Characters": "Dotčené postavy", + "Amount of copper pieces": "Počet měděných mincí", + "Amount of gold pieces": "Počet zlatých mincí", + "Amount of silver pieces": "Počet stříbrných mincí", + "Automatic system notices": "Automatická systémová oznámení", + "Award Reason": "Důvod udělení", + "Awarded At": "Uděleno dne", + "Awarded By": "Udělil", + "Background Story": "Příběh postavy", + "Base Value": "Základní hodnota", + "Character Card": "Karta postavy", + "Character Name": "Jméno postavy", + "Checked In At": "Příchod zaregistrován dne", + "Checked In By": "Příchod zaregistroval", + "Condition Name": "Název stavu", + "Contact email address": "Kontaktní e-mailová adresa", + "Copper Pieces": "Měděné mince", + "Effect Name": "Název efektu", + "End Date": "Datum konce", + "Event Name": "Název události", + "Event description": "Popis události", + "Event end date and time": "Datum a čas konce události", + "Event location": "Místo konání události", + "Event name": "Název události", + "Event start date and time": "Datum a čas začátku události", + "Faith": "Víra", + "Full name of the player": "Celé jméno hráče", + "Game Master Notes (Private)": "Poznámky vypravěče (soukromé)", + "Game Master Notes (Public)": "Poznámky vypravěče (veřejné)", + "Gold Pieces": "Zlaté mince", + "Item Name": "Název předmětu", + "Items and Money": "Předměty a peníze", + "Mechanical Effect": "Herní efekt", + "Modifier Value": "Hodnota modifikátoru", + "Name of the condition": "Název stavu", + "Name of the effect": "Název efektu", + "Name of the event": "Název události", + "Name of the item": "Název předmětu", + "Name of the skill": "Název dovednosti", + "Name of the stat": "Název vlastnosti", + "Nextcloud user": "Uživatel Nextcloudu", + "Notes about items and money": "Poznámky k předmětům a penězům", + "Notes about the player": "Poznámky k hráči", + "Overridden At": "Výjimka udělena dne", + "Overridden By": "Výjimku udělil", + "Override Reason": "Důvod výjimky", + "Owner": "Vlastník", + "Owner UID": "UID vlastníka", + "Participating Characters": "Zúčastněné postavy", + "Player Name": "Jméno hráče", + "Post-Event Effects": "Efekty po události", + "Real name of the player": "Skutečné jméno hráče", + "Required Conditions": "Požadované stavy", + "Required Effects": "Požadované efekty", + "Required Score": "Požadovaná hodnota", + "Required Skills": "Požadované dovednosti", + "Required Stats": "Požadované vlastnosti", + "Requirement Overrides": "Výjimky z předpokladů", + "Setting Name": "Název herního světa", + "Silver Pieces": "Stříbrné mince", + "Skill Name": "Název dovednosti", + "Start Date": "Datum začátku", + "Starting value for all characters": "Počáteční hodnota pro všechny postavy", + "Stat": "Vlastnost", + "Status": "Status", + "System Notice": "Systémové oznámení", + "Unique Artifact": "Jedinečný artefakt", + "Unique Condition": "Jedinečný stav", + "XP Amount": "Počet zkušenostních bodů", + "XP Award": "Udělení zkušenostních bodů" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/cs.json b/l10n/cs.json index 2b4a929e..52f281fb 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Žádné — toto je kořenová dovednost.", "Where the automation lives": "Kde bydlí automatizace", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je to, co se děje, aniž by někdo klikl: připomínka před vypršením lhůty, potvrzení při odeslání. Tady je čteš a upravuješ — teď není co stavět.", - "Open Flows in the menu": "Otevři Flows v nabídce" + "Open Flows in the menu": "Otevři Flows v nabídce", + "Ability Name": "Název schopnosti", + "Affected Characters": "Dotčené postavy", + "Amount of copper pieces": "Počet měděných mincí", + "Amount of gold pieces": "Počet zlatých mincí", + "Amount of silver pieces": "Počet stříbrných mincí", + "Automatic system notices": "Automatická systémová oznámení", + "Award Reason": "Důvod udělení", + "Awarded At": "Uděleno dne", + "Awarded By": "Udělil", + "Background Story": "Příběh postavy", + "Base Value": "Základní hodnota", + "Character Card": "Karta postavy", + "Character Name": "Jméno postavy", + "Checked In At": "Příchod zaregistrován dne", + "Checked In By": "Příchod zaregistroval", + "Condition Name": "Název stavu", + "Contact email address": "Kontaktní e-mailová adresa", + "Copper Pieces": "Měděné mince", + "Effect Name": "Název efektu", + "End Date": "Datum konce", + "Event Name": "Název události", + "Event description": "Popis události", + "Event end date and time": "Datum a čas konce události", + "Event location": "Místo konání události", + "Event name": "Název události", + "Event start date and time": "Datum a čas začátku události", + "Faith": "Víra", + "Full name of the player": "Celé jméno hráče", + "Game Master Notes (Private)": "Poznámky vypravěče (soukromé)", + "Game Master Notes (Public)": "Poznámky vypravěče (veřejné)", + "Gold Pieces": "Zlaté mince", + "Item Name": "Název předmětu", + "Items and Money": "Předměty a peníze", + "Mechanical Effect": "Herní efekt", + "Modifier Value": "Hodnota modifikátoru", + "Name of the condition": "Název stavu", + "Name of the effect": "Název efektu", + "Name of the event": "Název události", + "Name of the item": "Název předmětu", + "Name of the skill": "Název dovednosti", + "Name of the stat": "Název vlastnosti", + "Nextcloud user": "Uživatel Nextcloudu", + "Notes about items and money": "Poznámky k předmětům a penězům", + "Notes about the player": "Poznámky k hráči", + "Overridden At": "Výjimka udělena dne", + "Overridden By": "Výjimku udělil", + "Override Reason": "Důvod výjimky", + "Owner": "Vlastník", + "Owner UID": "UID vlastníka", + "Participating Characters": "Zúčastněné postavy", + "Player Name": "Jméno hráče", + "Post-Event Effects": "Efekty po události", + "Real name of the player": "Skutečné jméno hráče", + "Required Conditions": "Požadované stavy", + "Required Effects": "Požadované efekty", + "Required Score": "Požadovaná hodnota", + "Required Skills": "Požadované dovednosti", + "Required Stats": "Požadované vlastnosti", + "Requirement Overrides": "Výjimky z předpokladů", + "Setting Name": "Název herního světa", + "Silver Pieces": "Stříbrné mince", + "Skill Name": "Název dovednosti", + "Start Date": "Datum začátku", + "Starting value for all characters": "Počáteční hodnota pro všechny postavy", + "Stat": "Vlastnost", + "Status": "Status", + "System Notice": "Systémové oznámení", + "Unique Artifact": "Jedinečný artefakt", + "Unique Condition": "Jedinečný stav", + "XP Amount": "Počet zkušenostních bodů", + "XP Award": "Udělení zkušenostních bodů" }, "plurals": {} } diff --git a/l10n/da.js b/l10n/da.js index 959db1eb..b174a399 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Ingen — dette er en grundfærdighed.", "Where the automation lives": "Hvor automatiseringen bor", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows er det, der sker, uden at nogen klikker: en påmindelse, før en frist udløber, en bekræftelse ved indsendelse. Her læser og redigerer du dem — der er ikke noget at bygge nu.", - "Open Flows in the menu": "Åbn Flows i menuen" + "Open Flows in the menu": "Åbn Flows i menuen", + "Ability Name": "Navn på evnen", + "Affected Characters": "Berørte karakterer", + "Amount of copper pieces": "Antal kobberstykker", + "Amount of gold pieces": "Antal guldstykker", + "Amount of silver pieces": "Antal sølvstykker", + "Automatic system notices": "Automatiske systemmeddelelser", + "Award Reason": "Årsag til tildelingen", + "Awarded At": "Tildelt den", + "Awarded By": "Tildelt af", + "Background Story": "Baggrundshistorie", + "Base Value": "Basisværdi", + "Character Card": "Karakterkort", + "Character Name": "Navn på karakteren", + "Checked In At": "Tjekket ind den", + "Checked In By": "Tjekket ind af", + "Condition Name": "Navn på tilstanden", + "Contact email address": "E-mailadresse til kontakt", + "Copper Pieces": "Kobberstykker", + "Effect Name": "Navn på effekten", + "End Date": "Slutdato", + "Event Name": "Navn på begivenheden", + "Event description": "Beskrivelse af begivenheden", + "Event end date and time": "Slutdato og -tidspunkt for begivenheden", + "Event location": "Sted for begivenheden", + "Event name": "Navn på begivenheden", + "Event start date and time": "Startdato og -tidspunkt for begivenheden", + "Faith": "Tro", + "Full name of the player": "Spillerens fulde navn", + "Game Master Notes (Private)": "Spillederens noter (private)", + "Game Master Notes (Public)": "Spillederens noter (offentlige)", + "Gold Pieces": "Guldstykker", + "Item Name": "Navn på genstanden", + "Items and Money": "Genstande og penge", + "Mechanical Effect": "Spilteknisk effekt", + "Modifier Value": "Modifikatorens værdi", + "Name of the condition": "Navn på tilstanden", + "Name of the effect": "Navn på effekten", + "Name of the event": "Navn på begivenheden", + "Name of the item": "Navn på genstanden", + "Name of the skill": "Navn på færdigheden", + "Name of the stat": "Navn på egenskaben", + "Nextcloud user": "Nextcloud-bruger", + "Notes about items and money": "Noter om genstande og penge", + "Notes about the player": "Noter om spilleren", + "Overridden At": "Tilsidesat den", + "Overridden By": "Tilsidesat af", + "Override Reason": "Årsag til tilsidesættelsen", + "Owner": "Ejer", + "Owner UID": "Ejerens UID", + "Participating Characters": "Deltagende karakterer", + "Player Name": "Navn på spilleren", + "Post-Event Effects": "Effekter efter begivenheden", + "Real name of the player": "Spillerens rigtige navn", + "Required Conditions": "Krævede tilstande", + "Required Effects": "Krævede effekter", + "Required Score": "Krævet værdi", + "Required Skills": "Krævede færdigheder", + "Required Stats": "Krævede egenskaber", + "Requirement Overrides": "Tilsidesatte forudsætninger", + "Setting Name": "Navn på spilverdenen", + "Silver Pieces": "Sølvstykker", + "Skill Name": "Navn på færdigheden", + "Start Date": "Startdato", + "Starting value for all characters": "Startværdi for alle karakterer", + "Stat": "Egenskab", + "Status": "Status", + "System Notice": "Systemmeddelelse", + "Unique Artifact": "Unik artefakt", + "Unique Condition": "Unik tilstand", + "XP Amount": "Antal erfaringspoint", + "XP Award": "XP-tildeling" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/da.json b/l10n/da.json index bbe90a29..752a061c 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Ingen — dette er en grundfærdighed.", "Where the automation lives": "Hvor automatiseringen bor", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows er det, der sker, uden at nogen klikker: en påmindelse, før en frist udløber, en bekræftelse ved indsendelse. Her læser og redigerer du dem — der er ikke noget at bygge nu.", - "Open Flows in the menu": "Åbn Flows i menuen" + "Open Flows in the menu": "Åbn Flows i menuen", + "Ability Name": "Navn på evnen", + "Affected Characters": "Berørte karakterer", + "Amount of copper pieces": "Antal kobberstykker", + "Amount of gold pieces": "Antal guldstykker", + "Amount of silver pieces": "Antal sølvstykker", + "Automatic system notices": "Automatiske systemmeddelelser", + "Award Reason": "Årsag til tildelingen", + "Awarded At": "Tildelt den", + "Awarded By": "Tildelt af", + "Background Story": "Baggrundshistorie", + "Base Value": "Basisværdi", + "Character Card": "Karakterkort", + "Character Name": "Navn på karakteren", + "Checked In At": "Tjekket ind den", + "Checked In By": "Tjekket ind af", + "Condition Name": "Navn på tilstanden", + "Contact email address": "E-mailadresse til kontakt", + "Copper Pieces": "Kobberstykker", + "Effect Name": "Navn på effekten", + "End Date": "Slutdato", + "Event Name": "Navn på begivenheden", + "Event description": "Beskrivelse af begivenheden", + "Event end date and time": "Slutdato og -tidspunkt for begivenheden", + "Event location": "Sted for begivenheden", + "Event name": "Navn på begivenheden", + "Event start date and time": "Startdato og -tidspunkt for begivenheden", + "Faith": "Tro", + "Full name of the player": "Spillerens fulde navn", + "Game Master Notes (Private)": "Spillederens noter (private)", + "Game Master Notes (Public)": "Spillederens noter (offentlige)", + "Gold Pieces": "Guldstykker", + "Item Name": "Navn på genstanden", + "Items and Money": "Genstande og penge", + "Mechanical Effect": "Spilteknisk effekt", + "Modifier Value": "Modifikatorens værdi", + "Name of the condition": "Navn på tilstanden", + "Name of the effect": "Navn på effekten", + "Name of the event": "Navn på begivenheden", + "Name of the item": "Navn på genstanden", + "Name of the skill": "Navn på færdigheden", + "Name of the stat": "Navn på egenskaben", + "Nextcloud user": "Nextcloud-bruger", + "Notes about items and money": "Noter om genstande og penge", + "Notes about the player": "Noter om spilleren", + "Overridden At": "Tilsidesat den", + "Overridden By": "Tilsidesat af", + "Override Reason": "Årsag til tilsidesættelsen", + "Owner": "Ejer", + "Owner UID": "Ejerens UID", + "Participating Characters": "Deltagende karakterer", + "Player Name": "Navn på spilleren", + "Post-Event Effects": "Effekter efter begivenheden", + "Real name of the player": "Spillerens rigtige navn", + "Required Conditions": "Krævede tilstande", + "Required Effects": "Krævede effekter", + "Required Score": "Krævet værdi", + "Required Skills": "Krævede færdigheder", + "Required Stats": "Krævede egenskaber", + "Requirement Overrides": "Tilsidesatte forudsætninger", + "Setting Name": "Navn på spilverdenen", + "Silver Pieces": "Sølvstykker", + "Skill Name": "Navn på færdigheden", + "Start Date": "Startdato", + "Starting value for all characters": "Startværdi for alle karakterer", + "Stat": "Egenskab", + "Status": "Status", + "System Notice": "Systemmeddelelse", + "Unique Artifact": "Unik artefakt", + "Unique Condition": "Unik tilstand", + "XP Amount": "Antal erfaringspoint", + "XP Award": "XP-tildeling" }, "plurals": {} } diff --git a/l10n/de.js b/l10n/de.js index 3b59a7a4..b4f22fe5 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Keine — dies ist eine Grundfähigkeit.", "Where the automation lives": "Wo die Automatisierung wohnt", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows sind das, was ohne Klick geschieht: eine Erinnerung, bevor eine Frist abläuft, eine Bestätigung beim Einreichen. Hier liest und bearbeitest du sie — jetzt ist nichts zu bauen.", - "Open Flows in the menu": "Öffne Flows im Menü" + "Open Flows in the menu": "Öffne Flows im Menü", + "Ability Name": "Name der Fertigkeit", + "Affected Characters": "Betroffene Charaktere", + "Amount of copper pieces": "Anzahl der Kupferstücke", + "Amount of gold pieces": "Anzahl der Goldstücke", + "Amount of silver pieces": "Anzahl der Silberstücke", + "Automatic system notices": "Automatische Systemhinweise", + "Award Reason": "Grund der Vergabe", + "Awarded At": "Vergeben am", + "Awarded By": "Vergeben von", + "Background Story": "Hintergrundgeschichte", + "Base Value": "Basiswert", + "Character Card": "Charakterkarte", + "Character Name": "Name des Charakters", + "Checked In At": "Eingecheckt am", + "Checked In By": "Eingecheckt von", + "Condition Name": "Name des Zustands", + "Contact email address": "E-Mail-Adresse für Kontakt", + "Copper Pieces": "Kupferstücke", + "Effect Name": "Name des Effekts", + "End Date": "Enddatum", + "Event Name": "Name der Veranstaltung", + "Event description": "Beschreibung der Veranstaltung", + "Event end date and time": "Enddatum und -zeit der Veranstaltung", + "Event location": "Ort der Veranstaltung", + "Event name": "Name der Veranstaltung", + "Event start date and time": "Startdatum und -zeit der Veranstaltung", + "Faith": "Glaube", + "Full name of the player": "Vollständiger Name des Spielers", + "Game Master Notes (Private)": "Notizen der Spielleitung (privat)", + "Game Master Notes (Public)": "Notizen der Spielleitung (öffentlich)", + "Gold Pieces": "Goldstücke", + "Item Name": "Name des Gegenstands", + "Items and Money": "Gegenstände und Geld", + "Mechanical Effect": "Spielmechanischer Effekt", + "Modifier Value": "Wert des Modifikators", + "Name of the condition": "Name des Zustands", + "Name of the effect": "Name des Effekts", + "Name of the event": "Name der Veranstaltung", + "Name of the item": "Name des Gegenstands", + "Name of the skill": "Name der Fähigkeit", + "Name of the stat": "Name des Attributs", + "Nextcloud user": "Nextcloud-Benutzer", + "Notes about items and money": "Notizen zu Gegenständen und Geld", + "Notes about the player": "Notizen zum Spieler", + "Overridden At": "Überschrieben am", + "Overridden By": "Überschrieben von", + "Override Reason": "Grund der Überschreibung", + "Owner": "Eigentümer", + "Owner UID": "UID des Eigentümers", + "Participating Characters": "Teilnehmende Charaktere", + "Player Name": "Name des Spielers", + "Post-Event Effects": "Effekte nach der Veranstaltung", + "Real name of the player": "Echter Name des Spielers", + "Required Conditions": "Erforderliche Zustände", + "Required Effects": "Erforderliche Effekte", + "Required Score": "Erforderlicher Wert", + "Required Skills": "Erforderliche Fähigkeiten", + "Required Stats": "Erforderliche Attribute", + "Requirement Overrides": "Überschriebene Voraussetzungen", + "Setting Name": "Name der Spielwelt", + "Silver Pieces": "Silberstücke", + "Skill Name": "Name der Fähigkeit", + "Start Date": "Startdatum", + "Starting value for all characters": "Startwert für alle Charaktere", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Systemhinweis", + "Unique Artifact": "Einzigartiges Artefakt", + "Unique Condition": "Einzigartiger Zustand", + "XP Amount": "Anzahl der Erfahrungspunkte", + "XP Award": "XP-Vergabe" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/de.json b/l10n/de.json index 081373fa..2dc2f52f 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Keine — dies ist eine Grundfähigkeit.", "Where the automation lives": "Wo die Automatisierung wohnt", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows sind das, was ohne Klick geschieht: eine Erinnerung, bevor eine Frist abläuft, eine Bestätigung beim Einreichen. Hier liest und bearbeitest du sie — jetzt ist nichts zu bauen.", - "Open Flows in the menu": "Öffne Flows im Menü" + "Open Flows in the menu": "Öffne Flows im Menü", + "Ability Name": "Name der Fertigkeit", + "Affected Characters": "Betroffene Charaktere", + "Amount of copper pieces": "Anzahl der Kupferstücke", + "Amount of gold pieces": "Anzahl der Goldstücke", + "Amount of silver pieces": "Anzahl der Silberstücke", + "Automatic system notices": "Automatische Systemhinweise", + "Award Reason": "Grund der Vergabe", + "Awarded At": "Vergeben am", + "Awarded By": "Vergeben von", + "Background Story": "Hintergrundgeschichte", + "Base Value": "Basiswert", + "Character Card": "Charakterkarte", + "Character Name": "Name des Charakters", + "Checked In At": "Eingecheckt am", + "Checked In By": "Eingecheckt von", + "Condition Name": "Name des Zustands", + "Contact email address": "E-Mail-Adresse für Kontakt", + "Copper Pieces": "Kupferstücke", + "Effect Name": "Name des Effekts", + "End Date": "Enddatum", + "Event Name": "Name der Veranstaltung", + "Event description": "Beschreibung der Veranstaltung", + "Event end date and time": "Enddatum und -zeit der Veranstaltung", + "Event location": "Ort der Veranstaltung", + "Event name": "Name der Veranstaltung", + "Event start date and time": "Startdatum und -zeit der Veranstaltung", + "Faith": "Glaube", + "Full name of the player": "Vollständiger Name des Spielers", + "Game Master Notes (Private)": "Notizen der Spielleitung (privat)", + "Game Master Notes (Public)": "Notizen der Spielleitung (öffentlich)", + "Gold Pieces": "Goldstücke", + "Item Name": "Name des Gegenstands", + "Items and Money": "Gegenstände und Geld", + "Mechanical Effect": "Spielmechanischer Effekt", + "Modifier Value": "Wert des Modifikators", + "Name of the condition": "Name des Zustands", + "Name of the effect": "Name des Effekts", + "Name of the event": "Name der Veranstaltung", + "Name of the item": "Name des Gegenstands", + "Name of the skill": "Name der Fähigkeit", + "Name of the stat": "Name des Attributs", + "Nextcloud user": "Nextcloud-Benutzer", + "Notes about items and money": "Notizen zu Gegenständen und Geld", + "Notes about the player": "Notizen zum Spieler", + "Overridden At": "Überschrieben am", + "Overridden By": "Überschrieben von", + "Override Reason": "Grund der Überschreibung", + "Owner": "Eigentümer", + "Owner UID": "UID des Eigentümers", + "Participating Characters": "Teilnehmende Charaktere", + "Player Name": "Name des Spielers", + "Post-Event Effects": "Effekte nach der Veranstaltung", + "Real name of the player": "Echter Name des Spielers", + "Required Conditions": "Erforderliche Zustände", + "Required Effects": "Erforderliche Effekte", + "Required Score": "Erforderlicher Wert", + "Required Skills": "Erforderliche Fähigkeiten", + "Required Stats": "Erforderliche Attribute", + "Requirement Overrides": "Überschriebene Voraussetzungen", + "Setting Name": "Name der Spielwelt", + "Silver Pieces": "Silberstücke", + "Skill Name": "Name der Fähigkeit", + "Start Date": "Startdatum", + "Starting value for all characters": "Startwert für alle Charaktere", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Systemhinweis", + "Unique Artifact": "Einzigartiges Artefakt", + "Unique Condition": "Einzigartiger Zustand", + "XP Amount": "Anzahl der Erfahrungspunkte", + "XP Award": "XP-Vergabe" }, "plurals": {} } diff --git a/l10n/el.js b/l10n/el.js index f0cc831c..92729475 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Καμία — αυτή είναι ριζική δεξιότητα.", "Where the automation lives": "Πού ζει η αυτοματοποίηση", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Τα Flows είναι αυτό που συμβαίνει χωρίς να κάνει κανείς κλικ: μια υπενθύμιση πριν λήξει μια προθεσμία, μια επιβεβαίωση κατά την υποβολή. Εδώ τα διαβάζετε και τα επεξεργάζεστε — δεν χρειάζεται να φτιάξετε τίποτα τώρα.", - "Open Flows in the menu": "Ανοίξτε τα Flows στο μενού" + "Open Flows in the menu": "Ανοίξτε τα Flows στο μενού", + "Ability Name": "Όνομα της ικανότητας", + "Affected Characters": "Επηρεαζόμενοι χαρακτήρες", + "Amount of copper pieces": "Αριθμός χάλκινων νομισμάτων", + "Amount of gold pieces": "Αριθμός χρυσών νομισμάτων", + "Amount of silver pieces": "Αριθμός ασημένιων νομισμάτων", + "Automatic system notices": "Αυτόματες ειδοποιήσεις συστήματος", + "Award Reason": "Αιτιολογία της απονομής", + "Awarded At": "Απονεμήθηκε στις", + "Awarded By": "Απονεμήθηκε από", + "Background Story": "Ιστορία υποβάθρου", + "Base Value": "Βασική τιμή", + "Character Card": "Κάρτα χαρακτήρα", + "Character Name": "Όνομα του χαρακτήρα", + "Checked In At": "Η προσέλευση καταγράφηκε στις", + "Checked In By": "Η προσέλευση καταγράφηκε από", + "Condition Name": "Όνομα της κατάστασης", + "Contact email address": "Διεύθυνση email επικοινωνίας", + "Copper Pieces": "Χάλκινα νομίσματα", + "Effect Name": "Όνομα της επίδρασης", + "End Date": "Ημερομηνία λήξης", + "Event Name": "Όνομα της εκδήλωσης", + "Event description": "Περιγραφή της εκδήλωσης", + "Event end date and time": "Ημερομηνία και ώρα λήξης της εκδήλωσης", + "Event location": "Τοποθεσία της εκδήλωσης", + "Event name": "Όνομα της εκδήλωσης", + "Event start date and time": "Ημερομηνία και ώρα έναρξης της εκδήλωσης", + "Faith": "Πίστη", + "Full name of the player": "Πλήρες όνομα του παίκτη", + "Game Master Notes (Private)": "Σημειώσεις του αρχηγού παιχνιδιού (ιδιωτικές)", + "Game Master Notes (Public)": "Σημειώσεις του αρχηγού παιχνιδιού (δημόσιες)", + "Gold Pieces": "Χρυσά νομίσματα", + "Item Name": "Όνομα του αντικειμένου", + "Items and Money": "Αντικείμενα και χρήματα", + "Mechanical Effect": "Επίδραση στο παιχνίδι", + "Modifier Value": "Τιμή του τροποποιητή", + "Name of the condition": "Όνομα της κατάστασης", + "Name of the effect": "Όνομα της επίδρασης", + "Name of the event": "Όνομα της εκδήλωσης", + "Name of the item": "Όνομα του αντικειμένου", + "Name of the skill": "Όνομα της δεξιότητας", + "Name of the stat": "Όνομα του χαρακτηριστικού", + "Nextcloud user": "Χρήστης Nextcloud", + "Notes about items and money": "Σημειώσεις για τα αντικείμενα και τα χρήματα", + "Notes about the player": "Σημειώσεις για τον παίκτη", + "Overridden At": "Η εξαίρεση δόθηκε στις", + "Overridden By": "Η εξαίρεση δόθηκε από", + "Override Reason": "Αιτιολογία της εξαίρεσης", + "Owner": "Κάτοχος", + "Owner UID": "UID του κατόχου", + "Participating Characters": "Συμμετέχοντες χαρακτήρες", + "Player Name": "Όνομα του παίκτη", + "Post-Event Effects": "Επιδράσεις μετά την εκδήλωση", + "Real name of the player": "Πραγματικό όνομα του παίκτη", + "Required Conditions": "Απαιτούμενες καταστάσεις", + "Required Effects": "Απαιτούμενες επιδράσεις", + "Required Score": "Απαιτούμενη τιμή", + "Required Skills": "Απαιτούμενες δεξιότητες", + "Required Stats": "Απαιτούμενα χαρακτηριστικά", + "Requirement Overrides": "Εξαιρέσεις από τις προϋποθέσεις", + "Setting Name": "Όνομα του κόσμου παιχνιδιού", + "Silver Pieces": "Ασημένια νομίσματα", + "Skill Name": "Όνομα της δεξιότητας", + "Start Date": "Ημερομηνία έναρξης", + "Starting value for all characters": "Αρχική τιμή για όλους τους χαρακτήρες", + "Stat": "Χαρακτηριστικό", + "Status": "Κατάσταση", + "System Notice": "Ειδοποίηση συστήματος", + "Unique Artifact": "Μοναδικό τεχνούργημα", + "Unique Condition": "Μοναδική κατάσταση", + "XP Amount": "Αριθμός πόντων εμπειρίας", + "XP Award": "Απονομή πόντων εμπειρίας" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/el.json b/l10n/el.json index 7cbfe410..9ecfe59e 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Καμία — αυτή είναι ριζική δεξιότητα.", "Where the automation lives": "Πού ζει η αυτοματοποίηση", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Τα Flows είναι αυτό που συμβαίνει χωρίς να κάνει κανείς κλικ: μια υπενθύμιση πριν λήξει μια προθεσμία, μια επιβεβαίωση κατά την υποβολή. Εδώ τα διαβάζετε και τα επεξεργάζεστε — δεν χρειάζεται να φτιάξετε τίποτα τώρα.", - "Open Flows in the menu": "Ανοίξτε τα Flows στο μενού" + "Open Flows in the menu": "Ανοίξτε τα Flows στο μενού", + "Ability Name": "Όνομα της ικανότητας", + "Affected Characters": "Επηρεαζόμενοι χαρακτήρες", + "Amount of copper pieces": "Αριθμός χάλκινων νομισμάτων", + "Amount of gold pieces": "Αριθμός χρυσών νομισμάτων", + "Amount of silver pieces": "Αριθμός ασημένιων νομισμάτων", + "Automatic system notices": "Αυτόματες ειδοποιήσεις συστήματος", + "Award Reason": "Αιτιολογία της απονομής", + "Awarded At": "Απονεμήθηκε στις", + "Awarded By": "Απονεμήθηκε από", + "Background Story": "Ιστορία υποβάθρου", + "Base Value": "Βασική τιμή", + "Character Card": "Κάρτα χαρακτήρα", + "Character Name": "Όνομα του χαρακτήρα", + "Checked In At": "Η προσέλευση καταγράφηκε στις", + "Checked In By": "Η προσέλευση καταγράφηκε από", + "Condition Name": "Όνομα της κατάστασης", + "Contact email address": "Διεύθυνση email επικοινωνίας", + "Copper Pieces": "Χάλκινα νομίσματα", + "Effect Name": "Όνομα της επίδρασης", + "End Date": "Ημερομηνία λήξης", + "Event Name": "Όνομα της εκδήλωσης", + "Event description": "Περιγραφή της εκδήλωσης", + "Event end date and time": "Ημερομηνία και ώρα λήξης της εκδήλωσης", + "Event location": "Τοποθεσία της εκδήλωσης", + "Event name": "Όνομα της εκδήλωσης", + "Event start date and time": "Ημερομηνία και ώρα έναρξης της εκδήλωσης", + "Faith": "Πίστη", + "Full name of the player": "Πλήρες όνομα του παίκτη", + "Game Master Notes (Private)": "Σημειώσεις του αρχηγού παιχνιδιού (ιδιωτικές)", + "Game Master Notes (Public)": "Σημειώσεις του αρχηγού παιχνιδιού (δημόσιες)", + "Gold Pieces": "Χρυσά νομίσματα", + "Item Name": "Όνομα του αντικειμένου", + "Items and Money": "Αντικείμενα και χρήματα", + "Mechanical Effect": "Επίδραση στο παιχνίδι", + "Modifier Value": "Τιμή του τροποποιητή", + "Name of the condition": "Όνομα της κατάστασης", + "Name of the effect": "Όνομα της επίδρασης", + "Name of the event": "Όνομα της εκδήλωσης", + "Name of the item": "Όνομα του αντικειμένου", + "Name of the skill": "Όνομα της δεξιότητας", + "Name of the stat": "Όνομα του χαρακτηριστικού", + "Nextcloud user": "Χρήστης Nextcloud", + "Notes about items and money": "Σημειώσεις για τα αντικείμενα και τα χρήματα", + "Notes about the player": "Σημειώσεις για τον παίκτη", + "Overridden At": "Η εξαίρεση δόθηκε στις", + "Overridden By": "Η εξαίρεση δόθηκε από", + "Override Reason": "Αιτιολογία της εξαίρεσης", + "Owner": "Κάτοχος", + "Owner UID": "UID του κατόχου", + "Participating Characters": "Συμμετέχοντες χαρακτήρες", + "Player Name": "Όνομα του παίκτη", + "Post-Event Effects": "Επιδράσεις μετά την εκδήλωση", + "Real name of the player": "Πραγματικό όνομα του παίκτη", + "Required Conditions": "Απαιτούμενες καταστάσεις", + "Required Effects": "Απαιτούμενες επιδράσεις", + "Required Score": "Απαιτούμενη τιμή", + "Required Skills": "Απαιτούμενες δεξιότητες", + "Required Stats": "Απαιτούμενα χαρακτηριστικά", + "Requirement Overrides": "Εξαιρέσεις από τις προϋποθέσεις", + "Setting Name": "Όνομα του κόσμου παιχνιδιού", + "Silver Pieces": "Ασημένια νομίσματα", + "Skill Name": "Όνομα της δεξιότητας", + "Start Date": "Ημερομηνία έναρξης", + "Starting value for all characters": "Αρχική τιμή για όλους τους χαρακτήρες", + "Stat": "Χαρακτηριστικό", + "Status": "Κατάσταση", + "System Notice": "Ειδοποίηση συστήματος", + "Unique Artifact": "Μοναδικό τεχνούργημα", + "Unique Condition": "Μοναδική κατάσταση", + "XP Amount": "Αριθμός πόντων εμπειρίας", + "XP Award": "Απονομή πόντων εμπειρίας" }, "plurals": {} } diff --git a/l10n/en.js b/l10n/en.js index 4c39b72c..01fbacd5 100644 --- a/l10n/en.js +++ b/l10n/en.js @@ -1,158 +1,229 @@ OC.L10N.register( "larpinq", { - "Larpinq": "Larpinq", - "Dashboard": "Dashboard", - "Characters": "Characters", - "Character": "Character", - "Players": "Players", - "Player": "Player", + "(score ≥ {n})": "(score ≥ {n})", "Abilities": "Abilities", "Ability": "Ability", - "Skills": "Skills", - "Skill": "Skill", - "Items": "Items", - "Item": "Item", - "Conditions": "Conditions", - "Condition": "Condition", - "Effects": "Effects", - "Effect": "Effect", - "Events": "Events", - "Event": "Event", - "Settings": "Settings", - "Worlds": "Worlds", - "Setting": "Setting", - "World": "World", - "Documentation": "Documentation", - "New character": "New character", - "New player": "New player", - "New ability": "New ability", - "New skill": "New skill", - "New item": "New item", - "New condition": "New condition", - "New effect": "New effect", - "New event": "New event", - "Name": "Name", - "Description": "Description", - "Type": "Type", + "Ability Name": "Ability Name", + "Advanced settings": "Advanced settings", + "Affected Characters": "Affected Characters", + "All worlds": "All settings", + "Amount of copper pieces": "Amount of copper pieces", + "Amount of gold pieces": "Amount of gold pieces", + "Amount of silver pieces": "Amount of silver pieces", "Approved": "Approved", - "Gold": "Gold", - "Silver": "Silver", - "Copper": "Copper", + "Are you sure you want to delete this?": "Are you sure you want to delete this?", + "Attendance": "Attendance", + "Attendance tracking is unavailable — showing the participant list read-only.": "Attendance tracking is unavailable — showing the participant list read-only.", + "Automatic system notices": "Automatic system notices", + "Available": "Available", + "Award Reason": "Award Reason", + "Awarded At": "Awarded At", + "Awarded By": "Awarded By", + "Back to list": "Back to list", + "Background": "Background", + "Background Story": "Background Story", "Base": "Base", - "Modifier": "Modifier", - "Modification": "Modification", - "Cumulative": "Cumulative", - "Location": "Location", - "Start date": "Start date", - "End date": "End date", - "Unique": "Unique", - "Value": "Value", - "player": "player", - "npc": "npc", - "other": "other", - "no": "no", - "approved": "approved", - "positive": "positive", - "negative": "negative", - "cumulative": "cumulative", - "non-cumulative": "non-cumulative", - "Save": "Save", + "Base Value": "Base Value", "Cancel": "Cancel", - "Delete": "Delete", - "Edit": "Edit", - "Search": "Search", - "Loading...": "Loading...", - "Back to list": "Back to list", - "Are you sure you want to delete this?": "Are you sure you want to delete this?", - "Download PDF": "Download PDF", - "Select a template to generate a PDF from this character": "Select a template to generate a PDF from this character", - "PDF generation requires the DocuDesk app to be installed and enabled": "PDF generation requires the DocuDesk app to be installed and enabled", - "Configuration saved": "Configuration saved", + "Character": "Character", + "Character Card": "Character Card", + "Character Name": "Character Name", + "Characters": "Characters", + "Check in": "Check in", + "Check-in": "Check-in", + "Checked In At": "Checked In At", + "Checked In By": "Checked In By", + "Checked in": "Checked in", + "Condition": "Condition", + "Condition Name": "Condition Name", + "Conditions": "Conditions", + "Configuration": "Configuration", "Configuration re-imported successfully": "Configuration re-imported successfully", - "Re-import configuration": "Re-import configuration", - "Game setup": "Game setup", - "Advanced settings": "Advanced settings", + "Configuration saved": "Configuration saved", + "Configure": "Configure", "Configure OpenRegister data source to enable this widget": "Configure OpenRegister data source to enable this widget", - "Loading skill data...": "Loading skill data...", - "Retry": "Retry", - "No skill data available": "No skill data available", - "characters": "characters", - "Other": "Other", - "Failed to load skill data": "Failed to load skill data", - "Data storage": "Data storage", "Configure where to store your LARP data": "Configure where to store your LARP data", - "Open Register is not installed. Some features might be unavailable.": "Open Register is not installed. Some features might be unavailable.", - "Source": "Source", - "Register": "Register", - "Schema": "Schema", + "Configure your Larpinq installation": "Configure your Larpinq installation", + "Configure your Larpinq settings here.": "Configure your Larpinq settings here.", + "Contact email address": "Contact email address", + "Copper": "Copper", + "Copper Pieces": "Copper Pieces", + "Create": "Create", + "Cumulative": "Cumulative", + "Dashboard": "Dashboard", + "Data storage": "Data storage", + "Delete": "Delete", + "Description": "Description", + "Documentation": "Documentation", + "Download PDF": "Download PDF", + "Edit": "Edit", + "Effect": "Effect", + "Effect Name": "Effect Name", + "Effects": "Effects", + "End Date": "End Date", + "End date": "End date", + "Event": "Event", + "Event Name": "Event Name", + "Event description": "Event description", + "Event end date and time": "Event end date and time", + "Event location": "Event location", + "Event name": "Event name", + "Event start date and time": "Event start date and time", + "Events": "Events", + "Failed to delete.": "Failed to delete.", + "Failed to load skill data": "Failed to load skill data", + "Failed to save settings": "Failed to save settings", + "Failed to save. Please try again.": "Failed to save. Please try again.", + "Faith": "Faith", + "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.", + "For a Service Level Agreement (SLA), contact": "For a Service Level Agreement (SLA), contact", + "For support, contact us at": "For support, contact us at", + "Full name of the player": "Full name of the player", + "Game Master Notes (Private)": "Game Master Notes (Private)", + "Game Master Notes (Public)": "Game Master Notes (Public)", + "Game setup": "Game setup", + "General": "General", + "Gold": "Gold", + "Gold Pieces": "Gold Pieces", + "Importing...": "Importing...", + "Information about the current Larpinq installation": "Information about the current Larpinq installation", "Internal": "Internal", - "Open Register": "Open Register", - "Yes": "Yes", + "Item": "Item", + "Item Name": "Item Name", + "Items": "Items", + "Items and Money": "Items and Money", + "Larpinq": "Larpinq", + "Larpinq Settings": "Larpinq Settings", + "Larpinq settings": "Larpinq settings", + "Loading skill data...": "Loading skill data...", + "Loading...": "Loading...", + "Location": "Location", + "Locked": "Locked", + "Mechanical Effect": "Mechanical Effect", + "Modification": "Modification", + "Modifier": "Modifier", + "Modifier Value": "Modifier Value", + "Name": "Name", + "Name of the condition": "Name of the condition", + "Name of the effect": "Name of the effect", + "Name of the event": "Name of the event", + "Name of the item": "Name of the item", + "Name of the skill": "Name of the skill", + "Name of the stat": "Name of the stat", + "New ability": "New ability", + "New character": "New character", + "New condition": "New condition", + "New effect": "New effect", + "New event": "New event", + "New item": "New item", + "New player": "New player", + "New skill": "New skill", + "Nextcloud user": "Nextcloud user", "No": "No", - "Create": "Create", + "No character (uncoloured)": "No character (uncoloured)", "No characters yet": "No characters yet", + "No confirmed participants for this event yet.": "No confirmed participants for this event yet.", "No events yet": "No events yet", - "View all ({count})": "View all ({count})", + "No prerequisites": "No prerequisites", + "No skill data available": "No skill data available", + "No skills exist yet for the selected world.": "No skills exist yet for the selected setting.", + "No skills to show": "No skills to show", + "No-show": "No-show", + "None — this is a root skill.": "None — this is a root skill.", + "Notes about items and money": "Notes about items and money", + "Notes about the player": "Notes about the player", + "Open Flows in the menu": "Open Flows in the menu", + "Open Register": "Open Register", + "Open Register is not installed. Some features might be unavailable.": "Open Register is not installed. Some features might be unavailable.", + "OpenRegister is not configured. Some features may be limited.": "OpenRegister is not configured. Some features may be limited.", + "Other": "Other", + "Overridden At": "Overridden At", + "Overridden By": "Overridden By", + "Override Reason": "Override Reason", + "Owned": "Owned", + "Owner": "Owner", + "Owner UID": "Owner UID", + "PDF generation requires the DocuDesk app to be installed and enabled": "PDF generation requires the DocuDesk app to be installed and enabled", + "Participating Characters": "Participating Characters", + "Player": "Player", + "Player Name": "Player Name", + "Players": "Players", + "Post-Event Effects": "Post-Event Effects", + "Prerequisites": "Prerequisites", + "Re-import configuration": "Re-import configuration", + "Re-import failed": "Re-import failed", + "Real name of the player": "Real name of the player", "Recent characters": "Recent characters", "Recent events": "Recent events", - "Skill usage by characters": "Skill usage by characters", "Refresh dashboard": "Refresh dashboard", - "Larpinq settings": "Larpinq settings", - "Configure your Larpinq installation": "Configure your Larpinq installation", - "Version information": "Version information", - "Information about the current Larpinq installation": "Information about the current Larpinq installation", - "Support": "Support", - "For support, contact us at": "For support, contact us at", - "For a Service Level Agreement (SLA), contact": "For a Service Level Agreement (SLA), contact", - "Importing...": "Importing...", - "Re-import failed": "Re-import failed", - "Configuration": "Configuration", - "OpenRegister is not configured. Some features may be limited.": "OpenRegister is not configured. Some features may be limited.", - "Configure": "Configure", - "Failed to save. Please try again.": "Failed to save. Please try again.", - "Failed to delete.": "Failed to delete.", - "Background": "Background", - "Save all": "Save All", - "Unnamed character": "Unnamed Character", - "Unnamed event": "Unnamed Event", - "Welcome to Larpinq!": "Welcome to Larpinq!", - "Configure your Larpinq settings here.": "Configure your Larpinq settings here.", - "Failed to save settings": "Failed to save settings", - "General": "General", - "Larpinq Settings": "Larpinq Settings", - "Save All": "Save All", - "Settings saved successfully": "Settings saved successfully", - "Version Information": "Version Information", - "Check-in": "Check-in", - "Attendance": "Attendance", - "Check in": "Check in", - "No-show": "No-show", + "Register": "Register", "Registered": "Registered", - "Checked in": "Checked in", - "No confirmed participants for this event yet.": "No confirmed participants for this event yet.", - "Attendance tracking is unavailable — showing the participant list read-only.": "Attendance tracking is unavailable — showing the participant list read-only.", - "Skill tree": "Skill tree", - "No character (uncoloured)": "No character (uncoloured)", - "All worlds": "All settings", - "Owned": "Owned", - "Available": "Available", - "Locked": "Locked", - "Unknown": "Unknown", - "No skills to show": "No skills to show", - "No skills exist yet for the selected world.": "No skills exist yet for the selected setting.", - "Requires: {list}": "Requires: {list}", - "No prerequisites": "No prerequisites", - "Required skills": "Required skills", + "Required Conditions": "Required Conditions", + "Required Effects": "Required Effects", + "Required Score": "Required Score", + "Required Skills": "Required Skills", + "Required Stats": "Required Stats", "Required abilities": "Required abilities", - "(score ≥ {n})": "(score ≥ {n})", "Required conditions": "Required conditions", "Required effects": "Required effects", - "Prerequisites": "Prerequisites", - "None — this is a root skill.": "None — this is a root skill.", + "Required skills": "Required skills", + "Requirement Overrides": "Requirement Overrides", + "Requires: {list}": "Requires: {list}", + "Retry": "Retry", + "Save": "Save", + "Save All": "Save All", + "Save all": "Save All", + "Schema": "Schema", + "Search": "Search", + "Select a template to generate a PDF from this character": "Select a template to generate a PDF from this character", + "Setting": "Setting", + "Setting Name": "Setting Name", + "Settings": "Settings", + "Settings saved successfully": "Settings saved successfully", + "Silver": "Silver", + "Silver Pieces": "Silver Pieces", + "Skill": "Skill", + "Skill Name": "Skill Name", + "Skill tree": "Skill tree", + "Skill usage by characters": "Skill usage by characters", + "Skills": "Skills", + "Source": "Source", + "Start Date": "Start Date", + "Start date": "Start date", + "Starting value for all characters": "Starting value for all characters", + "Stat": "Stat", + "Status": "Status", + "Support": "Support", + "System Notice": "System Notice", + "Type": "Type", + "Unique": "Unique", + "Unique Artifact": "Unique Artifact", + "Unique Condition": "Unique Condition", + "Unknown": "Unknown", + "Unnamed character": "Unnamed Character", + "Unnamed event": "Unnamed Event", + "Value": "Value", + "Version Information": "Version Information", + "Version information": "Version information", + "View all ({count})": "View all ({count})", + "Welcome to Larpinq!": "Welcome to Larpinq!", "Where the automation lives": "Where the automation lives", - "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.", - "Open Flows in the menu": "Open Flows in the menu" + "World": "World", + "Worlds": "Worlds", + "XP Amount": "XP Amount", + "XP Award": "XP Award", + "Yes": "Yes", + "approved": "approved", + "characters": "characters", + "cumulative": "cumulative", + "negative": "negative", + "no": "no", + "non-cumulative": "non-cumulative", + "npc": "npc", + "other": "other", + "player": "player", + "positive": "positive" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/en.json b/l10n/en.json index a331fcfa..64726122 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -1,157 +1,228 @@ { "translations": { - "Larpinq": "Larpinq", - "Dashboard": "Dashboard", - "Characters": "Characters", - "Character": "Character", - "Players": "Players", - "Player": "Player", + "(score ≥ {n})": "(score ≥ {n})", "Abilities": "Abilities", "Ability": "Ability", - "Skills": "Skills", - "Skill": "Skill", - "Items": "Items", - "Item": "Item", - "Conditions": "Conditions", - "Condition": "Condition", - "Effects": "Effects", - "Effect": "Effect", - "Events": "Events", - "Event": "Event", - "Settings": "Settings", - "Worlds": "Worlds", - "Setting": "Setting", - "World": "World", - "Documentation": "Documentation", - "New character": "New character", - "New player": "New player", - "New ability": "New ability", - "New skill": "New skill", - "New item": "New item", - "New condition": "New condition", - "New effect": "New effect", - "New event": "New event", - "Name": "Name", - "Description": "Description", - "Type": "Type", + "Ability Name": "Ability Name", + "Advanced settings": "Advanced settings", + "Affected Characters": "Affected Characters", + "All worlds": "All settings", + "Amount of copper pieces": "Amount of copper pieces", + "Amount of gold pieces": "Amount of gold pieces", + "Amount of silver pieces": "Amount of silver pieces", "Approved": "Approved", - "Gold": "Gold", - "Silver": "Silver", - "Copper": "Copper", + "Are you sure you want to delete this?": "Are you sure you want to delete this?", + "Attendance": "Attendance", + "Attendance tracking is unavailable — showing the participant list read-only.": "Attendance tracking is unavailable — showing the participant list read-only.", + "Automatic system notices": "Automatic system notices", + "Available": "Available", + "Award Reason": "Award Reason", + "Awarded At": "Awarded At", + "Awarded By": "Awarded By", + "Back to list": "Back to list", + "Background": "Background", + "Background Story": "Background Story", "Base": "Base", - "Modifier": "Modifier", - "Modification": "Modification", - "Cumulative": "Cumulative", - "Location": "Location", - "Start date": "Start date", - "End date": "End date", - "Unique": "Unique", - "Value": "Value", - "player": "player", - "npc": "npc", - "other": "other", - "no": "no", - "approved": "approved", - "positive": "positive", - "negative": "negative", - "cumulative": "cumulative", - "non-cumulative": "non-cumulative", - "Save": "Save", + "Base Value": "Base Value", "Cancel": "Cancel", - "Delete": "Delete", - "Edit": "Edit", - "Search": "Search", - "Loading...": "Loading...", - "Back to list": "Back to list", - "Are you sure you want to delete this?": "Are you sure you want to delete this?", - "Download PDF": "Download PDF", - "Select a template to generate a PDF from this character": "Select a template to generate a PDF from this character", - "PDF generation requires the DocuDesk app to be installed and enabled": "PDF generation requires the DocuDesk app to be installed and enabled", - "Configuration saved": "Configuration saved", + "Character": "Character", + "Character Card": "Character Card", + "Character Name": "Character Name", + "Characters": "Characters", + "Check in": "Check in", + "Check-in": "Check-in", + "Checked In At": "Checked In At", + "Checked In By": "Checked In By", + "Checked in": "Checked in", + "Condition": "Condition", + "Condition Name": "Condition Name", + "Conditions": "Conditions", + "Configuration": "Configuration", "Configuration re-imported successfully": "Configuration re-imported successfully", - "Re-import configuration": "Re-import configuration", - "Game setup": "Game setup", - "Advanced settings": "Advanced settings", + "Configuration saved": "Configuration saved", + "Configure": "Configure", "Configure OpenRegister data source to enable this widget": "Configure OpenRegister data source to enable this widget", - "Loading skill data...": "Loading skill data...", - "Retry": "Retry", - "No skill data available": "No skill data available", - "characters": "characters", - "Other": "Other", - "Failed to load skill data": "Failed to load skill data", - "Data storage": "Data storage", "Configure where to store your LARP data": "Configure where to store your LARP data", - "Open Register is not installed. Some features might be unavailable.": "Open Register is not installed. Some features might be unavailable.", - "Source": "Source", - "Register": "Register", - "Schema": "Schema", + "Configure your Larpinq installation": "Configure your Larpinq installation", + "Configure your Larpinq settings here.": "Configure your Larpinq settings here.", + "Contact email address": "Contact email address", + "Copper": "Copper", + "Copper Pieces": "Copper Pieces", + "Create": "Create", + "Cumulative": "Cumulative", + "Dashboard": "Dashboard", + "Data storage": "Data storage", + "Delete": "Delete", + "Description": "Description", + "Documentation": "Documentation", + "Download PDF": "Download PDF", + "Edit": "Edit", + "Effect": "Effect", + "Effect Name": "Effect Name", + "Effects": "Effects", + "End Date": "End Date", + "End date": "End date", + "Event": "Event", + "Event Name": "Event Name", + "Event description": "Event description", + "Event end date and time": "Event end date and time", + "Event location": "Event location", + "Event name": "Event name", + "Event start date and time": "Event start date and time", + "Events": "Events", + "Failed to delete.": "Failed to delete.", + "Failed to load skill data": "Failed to load skill data", + "Failed to save settings": "Failed to save settings", + "Failed to save. Please try again.": "Failed to save. Please try again.", + "Faith": "Faith", + "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.", + "For a Service Level Agreement (SLA), contact": "For a Service Level Agreement (SLA), contact", + "For support, contact us at": "For support, contact us at", + "Full name of the player": "Full name of the player", + "Game Master Notes (Private)": "Game Master Notes (Private)", + "Game Master Notes (Public)": "Game Master Notes (Public)", + "Game setup": "Game setup", + "General": "General", + "Gold": "Gold", + "Gold Pieces": "Gold Pieces", + "Importing...": "Importing...", + "Information about the current Larpinq installation": "Information about the current Larpinq installation", "Internal": "Internal", - "Open Register": "Open Register", - "Yes": "Yes", + "Item": "Item", + "Item Name": "Item Name", + "Items": "Items", + "Items and Money": "Items and Money", + "Larpinq": "Larpinq", + "Larpinq Settings": "Larpinq Settings", + "Larpinq settings": "Larpinq settings", + "Loading skill data...": "Loading skill data...", + "Loading...": "Loading...", + "Location": "Location", + "Locked": "Locked", + "Mechanical Effect": "Mechanical Effect", + "Modification": "Modification", + "Modifier": "Modifier", + "Modifier Value": "Modifier Value", + "Name": "Name", + "Name of the condition": "Name of the condition", + "Name of the effect": "Name of the effect", + "Name of the event": "Name of the event", + "Name of the item": "Name of the item", + "Name of the skill": "Name of the skill", + "Name of the stat": "Name of the stat", + "New ability": "New ability", + "New character": "New character", + "New condition": "New condition", + "New effect": "New effect", + "New event": "New event", + "New item": "New item", + "New player": "New player", + "New skill": "New skill", + "Nextcloud user": "Nextcloud user", "No": "No", - "Create": "Create", + "No character (uncoloured)": "No character (uncoloured)", "No characters yet": "No characters yet", + "No confirmed participants for this event yet.": "No confirmed participants for this event yet.", "No events yet": "No events yet", - "View all ({count})": "View all ({count})", + "No prerequisites": "No prerequisites", + "No skill data available": "No skill data available", + "No skills exist yet for the selected world.": "No skills exist yet for the selected setting.", + "No skills to show": "No skills to show", + "No-show": "No-show", + "None — this is a root skill.": "None — this is a root skill.", + "Notes about items and money": "Notes about items and money", + "Notes about the player": "Notes about the player", + "Open Flows in the menu": "Open Flows in the menu", + "Open Register": "Open Register", + "Open Register is not installed. Some features might be unavailable.": "Open Register is not installed. Some features might be unavailable.", + "OpenRegister is not configured. Some features may be limited.": "OpenRegister is not configured. Some features may be limited.", + "Other": "Other", + "Overridden At": "Overridden At", + "Overridden By": "Overridden By", + "Override Reason": "Override Reason", + "Owned": "Owned", + "Owner": "Owner", + "Owner UID": "Owner UID", + "PDF generation requires the DocuDesk app to be installed and enabled": "PDF generation requires the DocuDesk app to be installed and enabled", + "Participating Characters": "Participating Characters", + "Player": "Player", + "Player Name": "Player Name", + "Players": "Players", + "Post-Event Effects": "Post-Event Effects", + "Prerequisites": "Prerequisites", + "Re-import configuration": "Re-import configuration", + "Re-import failed": "Re-import failed", + "Real name of the player": "Real name of the player", "Recent characters": "Recent characters", "Recent events": "Recent events", - "Skill usage by characters": "Skill usage by characters", "Refresh dashboard": "Refresh dashboard", - "Larpinq settings": "Larpinq settings", - "Configure your Larpinq installation": "Configure your Larpinq installation", - "Version information": "Version information", - "Information about the current Larpinq installation": "Information about the current Larpinq installation", - "Support": "Support", - "For support, contact us at": "For support, contact us at", - "For a Service Level Agreement (SLA), contact": "For a Service Level Agreement (SLA), contact", - "Importing...": "Importing...", - "Re-import failed": "Re-import failed", - "Configuration": "Configuration", - "OpenRegister is not configured. Some features may be limited.": "OpenRegister is not configured. Some features may be limited.", - "Configure": "Configure", - "Failed to save. Please try again.": "Failed to save. Please try again.", - "Failed to delete.": "Failed to delete.", - "Background": "Background", - "Save all": "Save All", - "Unnamed character": "Unnamed Character", - "Unnamed event": "Unnamed Event", - "Welcome to Larpinq!": "Welcome to Larpinq!", - "Configure your Larpinq settings here.": "Configure your Larpinq settings here.", - "Failed to save settings": "Failed to save settings", - "General": "General", - "Larpinq Settings": "Larpinq Settings", - "Save All": "Save All", - "Settings saved successfully": "Settings saved successfully", - "Version Information": "Version Information", - "Check-in": "Check-in", - "Attendance": "Attendance", - "Check in": "Check in", - "No-show": "No-show", + "Register": "Register", "Registered": "Registered", - "Checked in": "Checked in", - "No confirmed participants for this event yet.": "No confirmed participants for this event yet.", - "Attendance tracking is unavailable — showing the participant list read-only.": "Attendance tracking is unavailable — showing the participant list read-only.", - "Skill tree": "Skill tree", - "No character (uncoloured)": "No character (uncoloured)", - "All worlds": "All settings", - "Owned": "Owned", - "Available": "Available", - "Locked": "Locked", - "Unknown": "Unknown", - "No skills to show": "No skills to show", - "No skills exist yet for the selected world.": "No skills exist yet for the selected setting.", - "Requires: {list}": "Requires: {list}", - "No prerequisites": "No prerequisites", - "Required skills": "Required skills", + "Required Conditions": "Required Conditions", + "Required Effects": "Required Effects", + "Required Score": "Required Score", + "Required Skills": "Required Skills", + "Required Stats": "Required Stats", "Required abilities": "Required abilities", - "(score ≥ {n})": "(score ≥ {n})", "Required conditions": "Required conditions", "Required effects": "Required effects", - "Prerequisites": "Prerequisites", - "None — this is a root skill.": "None — this is a root skill.", + "Required skills": "Required skills", + "Requirement Overrides": "Requirement Overrides", + "Requires: {list}": "Requires: {list}", + "Retry": "Retry", + "Save": "Save", + "Save All": "Save All", + "Save all": "Save All", + "Schema": "Schema", + "Search": "Search", + "Select a template to generate a PDF from this character": "Select a template to generate a PDF from this character", + "Setting": "Setting", + "Setting Name": "Setting Name", + "Settings": "Settings", + "Settings saved successfully": "Settings saved successfully", + "Silver": "Silver", + "Silver Pieces": "Silver Pieces", + "Skill": "Skill", + "Skill Name": "Skill Name", + "Skill tree": "Skill tree", + "Skill usage by characters": "Skill usage by characters", + "Skills": "Skills", + "Source": "Source", + "Start Date": "Start Date", + "Start date": "Start date", + "Starting value for all characters": "Starting value for all characters", + "Stat": "Stat", + "Status": "Status", + "Support": "Support", + "System Notice": "System Notice", + "Type": "Type", + "Unique": "Unique", + "Unique Artifact": "Unique Artifact", + "Unique Condition": "Unique Condition", + "Unknown": "Unknown", + "Unnamed character": "Unnamed Character", + "Unnamed event": "Unnamed Event", + "Value": "Value", + "Version Information": "Version Information", + "Version information": "Version information", + "View all ({count})": "View all ({count})", + "Welcome to Larpinq!": "Welcome to Larpinq!", "Where the automation lives": "Where the automation lives", - "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.", - "Open Flows in the menu": "Open Flows in the menu" + "World": "World", + "Worlds": "Worlds", + "XP Amount": "XP Amount", + "XP Award": "XP Award", + "Yes": "Yes", + "approved": "approved", + "characters": "characters", + "cumulative": "cumulative", + "negative": "negative", + "no": "no", + "non-cumulative": "non-cumulative", + "npc": "npc", + "other": "other", + "player": "player", + "positive": "positive" }, "plurals": {}, "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/es.js b/l10n/es.js index 12d2c9be..78745a41 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Ninguno — esta es una habilidad raíz.", "Where the automation lives": "Dónde vive la automatización", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Los Flows son lo que ocurre sin que nadie haga clic: un recordatorio antes de que venza un plazo, una confirmación al enviar. Aquí los lees y los editas — no hay nada que construir ahora.", - "Open Flows in the menu": "Abre Flows en el menú" + "Open Flows in the menu": "Abre Flows en el menú", + "Ability Name": "Nombre de la aptitud", + "Affected Characters": "Personajes afectados", + "Amount of copper pieces": "Cantidad de monedas de cobre", + "Amount of gold pieces": "Cantidad de monedas de oro", + "Amount of silver pieces": "Cantidad de monedas de plata", + "Automatic system notices": "Avisos automáticos del sistema", + "Award Reason": "Motivo de la concesión", + "Awarded At": "Concedido el", + "Awarded By": "Concedido por", + "Background Story": "Historia de trasfondo", + "Base Value": "Valor base", + "Character Card": "Ficha de personaje", + "Character Name": "Nombre del personaje", + "Checked In At": "Entrada registrada el", + "Checked In By": "Entrada registrada por", + "Condition Name": "Nombre de la condición", + "Contact email address": "Dirección de correo de contacto", + "Copper Pieces": "Monedas de cobre", + "Effect Name": "Nombre del efecto", + "End Date": "Fecha de fin", + "Event Name": "Nombre del evento", + "Event description": "Descripción del evento", + "Event end date and time": "Fecha y hora de fin del evento", + "Event location": "Ubicación del evento", + "Event name": "Nombre del evento", + "Event start date and time": "Fecha y hora de inicio del evento", + "Faith": "Fe", + "Full name of the player": "Nombre completo del jugador", + "Game Master Notes (Private)": "Notas del máster (privadas)", + "Game Master Notes (Public)": "Notas del máster (públicas)", + "Gold Pieces": "Monedas de oro", + "Item Name": "Nombre del objeto", + "Items and Money": "Objetos y dinero", + "Mechanical Effect": "Efecto de juego", + "Modifier Value": "Valor del modificador", + "Name of the condition": "Nombre de la condición", + "Name of the effect": "Nombre del efecto", + "Name of the event": "Nombre del evento", + "Name of the item": "Nombre del objeto", + "Name of the skill": "Nombre de la habilidad", + "Name of the stat": "Nombre de la característica", + "Nextcloud user": "Usuario de Nextcloud", + "Notes about items and money": "Notas sobre objetos y dinero", + "Notes about the player": "Notas sobre el jugador", + "Overridden At": "Excepción concedida el", + "Overridden By": "Excepción concedida por", + "Override Reason": "Motivo de la excepción", + "Owner": "Propietario", + "Owner UID": "UID del propietario", + "Participating Characters": "Personajes participantes", + "Player Name": "Nombre del jugador", + "Post-Event Effects": "Efectos posteriores al evento", + "Real name of the player": "Nombre real del jugador", + "Required Conditions": "Condiciones requeridas", + "Required Effects": "Efectos requeridos", + "Required Score": "Valor requerido", + "Required Skills": "Habilidades requeridas", + "Required Stats": "Características requeridas", + "Requirement Overrides": "Excepciones a los requisitos", + "Setting Name": "Nombre de la ambientación", + "Silver Pieces": "Monedas de plata", + "Skill Name": "Nombre de la habilidad", + "Start Date": "Fecha de inicio", + "Starting value for all characters": "Valor inicial para todos los personajes", + "Stat": "Característica", + "Status": "Estado", + "System Notice": "Aviso del sistema", + "Unique Artifact": "Artefacto único", + "Unique Condition": "Condición única", + "XP Amount": "Cantidad de puntos de experiencia", + "XP Award": "Concesión de puntos de experiencia" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/es.json b/l10n/es.json index 68e83fb5..e89279ae 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Ninguno — esta es una habilidad raíz.", "Where the automation lives": "Dónde vive la automatización", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Los Flows son lo que ocurre sin que nadie haga clic: un recordatorio antes de que venza un plazo, una confirmación al enviar. Aquí los lees y los editas — no hay nada que construir ahora.", - "Open Flows in the menu": "Abre Flows en el menú" + "Open Flows in the menu": "Abre Flows en el menú", + "Ability Name": "Nombre de la aptitud", + "Affected Characters": "Personajes afectados", + "Amount of copper pieces": "Cantidad de monedas de cobre", + "Amount of gold pieces": "Cantidad de monedas de oro", + "Amount of silver pieces": "Cantidad de monedas de plata", + "Automatic system notices": "Avisos automáticos del sistema", + "Award Reason": "Motivo de la concesión", + "Awarded At": "Concedido el", + "Awarded By": "Concedido por", + "Background Story": "Historia de trasfondo", + "Base Value": "Valor base", + "Character Card": "Ficha de personaje", + "Character Name": "Nombre del personaje", + "Checked In At": "Entrada registrada el", + "Checked In By": "Entrada registrada por", + "Condition Name": "Nombre de la condición", + "Contact email address": "Dirección de correo de contacto", + "Copper Pieces": "Monedas de cobre", + "Effect Name": "Nombre del efecto", + "End Date": "Fecha de fin", + "Event Name": "Nombre del evento", + "Event description": "Descripción del evento", + "Event end date and time": "Fecha y hora de fin del evento", + "Event location": "Ubicación del evento", + "Event name": "Nombre del evento", + "Event start date and time": "Fecha y hora de inicio del evento", + "Faith": "Fe", + "Full name of the player": "Nombre completo del jugador", + "Game Master Notes (Private)": "Notas del máster (privadas)", + "Game Master Notes (Public)": "Notas del máster (públicas)", + "Gold Pieces": "Monedas de oro", + "Item Name": "Nombre del objeto", + "Items and Money": "Objetos y dinero", + "Mechanical Effect": "Efecto de juego", + "Modifier Value": "Valor del modificador", + "Name of the condition": "Nombre de la condición", + "Name of the effect": "Nombre del efecto", + "Name of the event": "Nombre del evento", + "Name of the item": "Nombre del objeto", + "Name of the skill": "Nombre de la habilidad", + "Name of the stat": "Nombre de la característica", + "Nextcloud user": "Usuario de Nextcloud", + "Notes about items and money": "Notas sobre objetos y dinero", + "Notes about the player": "Notas sobre el jugador", + "Overridden At": "Excepción concedida el", + "Overridden By": "Excepción concedida por", + "Override Reason": "Motivo de la excepción", + "Owner": "Propietario", + "Owner UID": "UID del propietario", + "Participating Characters": "Personajes participantes", + "Player Name": "Nombre del jugador", + "Post-Event Effects": "Efectos posteriores al evento", + "Real name of the player": "Nombre real del jugador", + "Required Conditions": "Condiciones requeridas", + "Required Effects": "Efectos requeridos", + "Required Score": "Valor requerido", + "Required Skills": "Habilidades requeridas", + "Required Stats": "Características requeridas", + "Requirement Overrides": "Excepciones a los requisitos", + "Setting Name": "Nombre de la ambientación", + "Silver Pieces": "Monedas de plata", + "Skill Name": "Nombre de la habilidad", + "Start Date": "Fecha de inicio", + "Starting value for all characters": "Valor inicial para todos los personajes", + "Stat": "Característica", + "Status": "Estado", + "System Notice": "Aviso del sistema", + "Unique Artifact": "Artefacto único", + "Unique Condition": "Condición única", + "XP Amount": "Cantidad de puntos de experiencia", + "XP Award": "Concesión de puntos de experiencia" }, "plurals": {} } diff --git a/l10n/et.js b/l10n/et.js index db1cecde..dba747d4 100644 --- a/l10n/et.js +++ b/l10n/et.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Puuduvad — see on juuroskus.", "Where the automation lives": "Kus automaatika elab", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows on see, mis juhtub ilma et keegi klõpsaks: meeldetuletus enne tähtaja möödumist, kinnitus esitamisel. Siin loed ja muudad neid — praegu pole midagi ehitada.", - "Open Flows in the menu": "Ava menüüst Flows" + "Open Flows in the menu": "Ava menüüst Flows", + "Ability Name": "Võime nimi", + "Affected Characters": "Mõjutatud tegelased", + "Amount of copper pieces": "Vaskmüntide arv", + "Amount of gold pieces": "Kuldmüntide arv", + "Amount of silver pieces": "Hõbemüntide arv", + "Automatic system notices": "Automaatsed süsteemiteated", + "Award Reason": "Andmise põhjus", + "Awarded At": "Antud", + "Awarded By": "Andja", + "Background Story": "Taustalugu", + "Base Value": "Algväärtus", + "Character Card": "Tegelase kaart", + "Character Name": "Tegelase nimi", + "Checked In At": "Kohalolek registreeritud", + "Checked In By": "Kohaloleku registreerija", + "Condition Name": "Seisundi nimi", + "Contact email address": "Kontakti e-posti aadress", + "Copper Pieces": "Vaskmündid", + "Effect Name": "Mõju nimi", + "End Date": "Lõppkuupäev", + "Event Name": "Sündmuse nimi", + "Event description": "Sündmuse kirjeldus", + "Event end date and time": "Sündmuse lõppkuupäev ja -kellaaeg", + "Event location": "Sündmuse toimumiskoht", + "Event name": "Sündmuse nimi", + "Event start date and time": "Sündmuse alguskuupäev ja -kellaaeg", + "Faith": "Usk", + "Full name of the player": "Mängija täisnimi", + "Game Master Notes (Private)": "Mängujuhi märkmed (privaatsed)", + "Game Master Notes (Public)": "Mängujuhi märkmed (avalikud)", + "Gold Pieces": "Kuldmündid", + "Item Name": "Eseme nimi", + "Items and Money": "Esemed ja raha", + "Mechanical Effect": "Mängumehaaniline mõju", + "Modifier Value": "Modifikaatori väärtus", + "Name of the condition": "Seisundi nimi", + "Name of the effect": "Mõju nimi", + "Name of the event": "Sündmuse nimi", + "Name of the item": "Eseme nimi", + "Name of the skill": "Oskuse nimi", + "Name of the stat": "Omaduse nimi", + "Nextcloud user": "Nextcloudi kasutaja", + "Notes about items and money": "Märkmed esemete ja raha kohta", + "Notes about the player": "Märkmed mängija kohta", + "Overridden At": "Erand tehtud", + "Overridden By": "Erandi tegija", + "Override Reason": "Erandi põhjus", + "Owner": "Omanik", + "Owner UID": "Omaniku UID", + "Participating Characters": "Osalevad tegelased", + "Player Name": "Mängija nimi", + "Post-Event Effects": "Sündmusejärgsed mõjud", + "Real name of the player": "Mängija pärisnimi", + "Required Conditions": "Nõutavad seisundid", + "Required Effects": "Nõutavad mõjud", + "Required Score": "Nõutav väärtus", + "Required Skills": "Nõutavad oskused", + "Required Stats": "Nõutavad omadused", + "Requirement Overrides": "Erandid eeldustest", + "Setting Name": "Mängumaailma nimi", + "Silver Pieces": "Hõbemündid", + "Skill Name": "Oskuse nimi", + "Start Date": "Alguskuupäev", + "Starting value for all characters": "Algväärtus kõigile tegelastele", + "Stat": "Omadus", + "Status": "Olek", + "System Notice": "Süsteemiteade", + "Unique Artifact": "Unikaalne artefakt", + "Unique Condition": "Unikaalne seisund", + "XP Amount": "Kogemuspunktide arv", + "XP Award": "Kogemuspunktide andmine" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/et.json b/l10n/et.json index 027ec9d9..85ca0c4f 100644 --- a/l10n/et.json +++ b/l10n/et.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Puuduvad — see on juuroskus.", "Where the automation lives": "Kus automaatika elab", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows on see, mis juhtub ilma et keegi klõpsaks: meeldetuletus enne tähtaja möödumist, kinnitus esitamisel. Siin loed ja muudad neid — praegu pole midagi ehitada.", - "Open Flows in the menu": "Ava menüüst Flows" + "Open Flows in the menu": "Ava menüüst Flows", + "Ability Name": "Võime nimi", + "Affected Characters": "Mõjutatud tegelased", + "Amount of copper pieces": "Vaskmüntide arv", + "Amount of gold pieces": "Kuldmüntide arv", + "Amount of silver pieces": "Hõbemüntide arv", + "Automatic system notices": "Automaatsed süsteemiteated", + "Award Reason": "Andmise põhjus", + "Awarded At": "Antud", + "Awarded By": "Andja", + "Background Story": "Taustalugu", + "Base Value": "Algväärtus", + "Character Card": "Tegelase kaart", + "Character Name": "Tegelase nimi", + "Checked In At": "Kohalolek registreeritud", + "Checked In By": "Kohaloleku registreerija", + "Condition Name": "Seisundi nimi", + "Contact email address": "Kontakti e-posti aadress", + "Copper Pieces": "Vaskmündid", + "Effect Name": "Mõju nimi", + "End Date": "Lõppkuupäev", + "Event Name": "Sündmuse nimi", + "Event description": "Sündmuse kirjeldus", + "Event end date and time": "Sündmuse lõppkuupäev ja -kellaaeg", + "Event location": "Sündmuse toimumiskoht", + "Event name": "Sündmuse nimi", + "Event start date and time": "Sündmuse alguskuupäev ja -kellaaeg", + "Faith": "Usk", + "Full name of the player": "Mängija täisnimi", + "Game Master Notes (Private)": "Mängujuhi märkmed (privaatsed)", + "Game Master Notes (Public)": "Mängujuhi märkmed (avalikud)", + "Gold Pieces": "Kuldmündid", + "Item Name": "Eseme nimi", + "Items and Money": "Esemed ja raha", + "Mechanical Effect": "Mängumehaaniline mõju", + "Modifier Value": "Modifikaatori väärtus", + "Name of the condition": "Seisundi nimi", + "Name of the effect": "Mõju nimi", + "Name of the event": "Sündmuse nimi", + "Name of the item": "Eseme nimi", + "Name of the skill": "Oskuse nimi", + "Name of the stat": "Omaduse nimi", + "Nextcloud user": "Nextcloudi kasutaja", + "Notes about items and money": "Märkmed esemete ja raha kohta", + "Notes about the player": "Märkmed mängija kohta", + "Overridden At": "Erand tehtud", + "Overridden By": "Erandi tegija", + "Override Reason": "Erandi põhjus", + "Owner": "Omanik", + "Owner UID": "Omaniku UID", + "Participating Characters": "Osalevad tegelased", + "Player Name": "Mängija nimi", + "Post-Event Effects": "Sündmusejärgsed mõjud", + "Real name of the player": "Mängija pärisnimi", + "Required Conditions": "Nõutavad seisundid", + "Required Effects": "Nõutavad mõjud", + "Required Score": "Nõutav väärtus", + "Required Skills": "Nõutavad oskused", + "Required Stats": "Nõutavad omadused", + "Requirement Overrides": "Erandid eeldustest", + "Setting Name": "Mängumaailma nimi", + "Silver Pieces": "Hõbemündid", + "Skill Name": "Oskuse nimi", + "Start Date": "Alguskuupäev", + "Starting value for all characters": "Algväärtus kõigile tegelastele", + "Stat": "Omadus", + "Status": "Olek", + "System Notice": "Süsteemiteade", + "Unique Artifact": "Unikaalne artefakt", + "Unique Condition": "Unikaalne seisund", + "XP Amount": "Kogemuspunktide arv", + "XP Award": "Kogemuspunktide andmine" }, "plurals": {} } diff --git a/l10n/fi.js b/l10n/fi.js index 4cc0d638..ebc84f5b 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Ei mitään — tämä on juuritaito.", "Where the automation lives": "Missä automaatio asuu", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows on se, mikä tapahtuu ilman että kukaan klikkaa: muistutus ennen määräajan umpeutumista, vahvistus lähetettäessä. Täällä luet ja muokkaat niitä — nyt ei tarvitse rakentaa mitään.", - "Open Flows in the menu": "Avaa Flows valikosta" + "Open Flows in the menu": "Avaa Flows valikosta", + "Ability Name": "Kyvyn nimi", + "Affected Characters": "Vaikutuksen kohteena olevat hahmot", + "Amount of copper pieces": "Kuparikolikoiden määrä", + "Amount of gold pieces": "Kultakolikoiden määrä", + "Amount of silver pieces": "Hopeakolikoiden määrä", + "Automatic system notices": "Automaattiset järjestelmäilmoitukset", + "Award Reason": "Myöntämisen syy", + "Awarded At": "Myönnetty", + "Awarded By": "Myöntäjä", + "Background Story": "Taustatarina", + "Base Value": "Perusarvo", + "Character Card": "Hahmokortti", + "Character Name": "Hahmon nimi", + "Checked In At": "Saapuminen kirjattu", + "Checked In By": "Saapumisen kirjaaja", + "Condition Name": "Tilan nimi", + "Contact email address": "Yhteydenoton sähköpostiosoite", + "Copper Pieces": "Kuparikolikot", + "Effect Name": "Vaikutuksen nimi", + "End Date": "Päättymispäivä", + "Event Name": "Tapahtuman nimi", + "Event description": "Tapahtuman kuvaus", + "Event end date and time": "Tapahtuman päättymispäivä ja -aika", + "Event location": "Tapahtuman paikka", + "Event name": "Tapahtuman nimi", + "Event start date and time": "Tapahtuman alkamispäivä ja -aika", + "Faith": "Usko", + "Full name of the player": "Pelaajan koko nimi", + "Game Master Notes (Private)": "Pelinjohtajan muistiinpanot (yksityiset)", + "Game Master Notes (Public)": "Pelinjohtajan muistiinpanot (julkiset)", + "Gold Pieces": "Kultakolikot", + "Item Name": "Esineen nimi", + "Items and Money": "Esineet ja raha", + "Mechanical Effect": "Pelimekaaninen vaikutus", + "Modifier Value": "Muokkaajan arvo", + "Name of the condition": "Tilan nimi", + "Name of the effect": "Vaikutuksen nimi", + "Name of the event": "Tapahtuman nimi", + "Name of the item": "Esineen nimi", + "Name of the skill": "Taidon nimi", + "Name of the stat": "Ominaisuuden nimi", + "Nextcloud user": "Nextcloud-käyttäjä", + "Notes about items and money": "Muistiinpanot esineistä ja rahasta", + "Notes about the player": "Muistiinpanot pelaajasta", + "Overridden At": "Poikkeus myönnetty", + "Overridden By": "Poikkeuksen myöntäjä", + "Override Reason": "Poikkeuksen syy", + "Owner": "Omistaja", + "Owner UID": "Omistajan UID", + "Participating Characters": "Osallistuvat hahmot", + "Player Name": "Pelaajan nimi", + "Post-Event Effects": "Tapahtuman jälkeiset vaikutukset", + "Real name of the player": "Pelaajan oikea nimi", + "Required Conditions": "Vaaditut tilat", + "Required Effects": "Vaaditut vaikutukset", + "Required Score": "Vaadittu arvo", + "Required Skills": "Vaaditut taidot", + "Required Stats": "Vaaditut ominaisuudet", + "Requirement Overrides": "Poikkeukset esivaatimuksista", + "Setting Name": "Pelimaailman nimi", + "Silver Pieces": "Hopeakolikot", + "Skill Name": "Taidon nimi", + "Start Date": "Alkamispäivä", + "Starting value for all characters": "Aloitusarvo kaikille hahmoille", + "Stat": "Ominaisuus", + "Status": "Status", + "System Notice": "Järjestelmäilmoitus", + "Unique Artifact": "Ainutlaatuinen artefakti", + "Unique Condition": "Ainutlaatuinen tila", + "XP Amount": "Kokemuspisteiden määrä", + "XP Award": "Kokemuspisteiden myöntäminen" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fi.json b/l10n/fi.json index 2b92beef..6fbf04e6 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Ei mitään — tämä on juuritaito.", "Where the automation lives": "Missä automaatio asuu", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows on se, mikä tapahtuu ilman että kukaan klikkaa: muistutus ennen määräajan umpeutumista, vahvistus lähetettäessä. Täällä luet ja muokkaat niitä — nyt ei tarvitse rakentaa mitään.", - "Open Flows in the menu": "Avaa Flows valikosta" + "Open Flows in the menu": "Avaa Flows valikosta", + "Ability Name": "Kyvyn nimi", + "Affected Characters": "Vaikutuksen kohteena olevat hahmot", + "Amount of copper pieces": "Kuparikolikoiden määrä", + "Amount of gold pieces": "Kultakolikoiden määrä", + "Amount of silver pieces": "Hopeakolikoiden määrä", + "Automatic system notices": "Automaattiset järjestelmäilmoitukset", + "Award Reason": "Myöntämisen syy", + "Awarded At": "Myönnetty", + "Awarded By": "Myöntäjä", + "Background Story": "Taustatarina", + "Base Value": "Perusarvo", + "Character Card": "Hahmokortti", + "Character Name": "Hahmon nimi", + "Checked In At": "Saapuminen kirjattu", + "Checked In By": "Saapumisen kirjaaja", + "Condition Name": "Tilan nimi", + "Contact email address": "Yhteydenoton sähköpostiosoite", + "Copper Pieces": "Kuparikolikot", + "Effect Name": "Vaikutuksen nimi", + "End Date": "Päättymispäivä", + "Event Name": "Tapahtuman nimi", + "Event description": "Tapahtuman kuvaus", + "Event end date and time": "Tapahtuman päättymispäivä ja -aika", + "Event location": "Tapahtuman paikka", + "Event name": "Tapahtuman nimi", + "Event start date and time": "Tapahtuman alkamispäivä ja -aika", + "Faith": "Usko", + "Full name of the player": "Pelaajan koko nimi", + "Game Master Notes (Private)": "Pelinjohtajan muistiinpanot (yksityiset)", + "Game Master Notes (Public)": "Pelinjohtajan muistiinpanot (julkiset)", + "Gold Pieces": "Kultakolikot", + "Item Name": "Esineen nimi", + "Items and Money": "Esineet ja raha", + "Mechanical Effect": "Pelimekaaninen vaikutus", + "Modifier Value": "Muokkaajan arvo", + "Name of the condition": "Tilan nimi", + "Name of the effect": "Vaikutuksen nimi", + "Name of the event": "Tapahtuman nimi", + "Name of the item": "Esineen nimi", + "Name of the skill": "Taidon nimi", + "Name of the stat": "Ominaisuuden nimi", + "Nextcloud user": "Nextcloud-käyttäjä", + "Notes about items and money": "Muistiinpanot esineistä ja rahasta", + "Notes about the player": "Muistiinpanot pelaajasta", + "Overridden At": "Poikkeus myönnetty", + "Overridden By": "Poikkeuksen myöntäjä", + "Override Reason": "Poikkeuksen syy", + "Owner": "Omistaja", + "Owner UID": "Omistajan UID", + "Participating Characters": "Osallistuvat hahmot", + "Player Name": "Pelaajan nimi", + "Post-Event Effects": "Tapahtuman jälkeiset vaikutukset", + "Real name of the player": "Pelaajan oikea nimi", + "Required Conditions": "Vaaditut tilat", + "Required Effects": "Vaaditut vaikutukset", + "Required Score": "Vaadittu arvo", + "Required Skills": "Vaaditut taidot", + "Required Stats": "Vaaditut ominaisuudet", + "Requirement Overrides": "Poikkeukset esivaatimuksista", + "Setting Name": "Pelimaailman nimi", + "Silver Pieces": "Hopeakolikot", + "Skill Name": "Taidon nimi", + "Start Date": "Alkamispäivä", + "Starting value for all characters": "Aloitusarvo kaikille hahmoille", + "Stat": "Ominaisuus", + "Status": "Status", + "System Notice": "Järjestelmäilmoitus", + "Unique Artifact": "Ainutlaatuinen artefakti", + "Unique Condition": "Ainutlaatuinen tila", + "XP Amount": "Kokemuspisteiden määrä", + "XP Award": "Kokemuspisteiden myöntäminen" }, "plurals": {} } diff --git a/l10n/fr.js b/l10n/fr.js index d06f9d76..14f8ac12 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Aucun — il s'agit d'une compétence racine.", "Where the automation lives": "Où vit l'automatisation", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Les Flows sont ce qui se passe sans que personne ne clique : un rappel avant l'échéance d'un délai, une confirmation envoyée à la soumission. C'est ici que vous les lisez et les modifiez — rien à construire maintenant.", - "Open Flows in the menu": "Ouvrez Flows dans le menu" + "Open Flows in the menu": "Ouvrez Flows dans le menu", + "Ability Name": "Nom de l'aptitude", + "Affected Characters": "Personnages concernés", + "Amount of copper pieces": "Nombre de pièces de cuivre", + "Amount of gold pieces": "Nombre de pièces d'or", + "Amount of silver pieces": "Nombre de pièces d'argent", + "Automatic system notices": "Avis système automatiques", + "Award Reason": "Motif de l'attribution", + "Awarded At": "Attribué le", + "Awarded By": "Attribué par", + "Background Story": "Historique du personnage", + "Base Value": "Valeur de base", + "Character Card": "Fiche de personnage", + "Character Name": "Nom du personnage", + "Checked In At": "Arrivée enregistrée le", + "Checked In By": "Arrivée enregistrée par", + "Condition Name": "Nom de la condition", + "Contact email address": "Adresse e-mail de contact", + "Copper Pieces": "Pièces de cuivre", + "Effect Name": "Nom de l'effet", + "End Date": "Date de fin", + "Event Name": "Nom de l'événement", + "Event description": "Description de l'événement", + "Event end date and time": "Date et heure de fin de l'événement", + "Event location": "Lieu de l'événement", + "Event name": "Nom de l'événement", + "Event start date and time": "Date et heure de début de l'événement", + "Faith": "Foi", + "Full name of the player": "Nom complet du joueur", + "Game Master Notes (Private)": "Notes du maître de jeu (privées)", + "Game Master Notes (Public)": "Notes du maître de jeu (publiques)", + "Gold Pieces": "Pièces d'or", + "Item Name": "Nom de l'objet", + "Items and Money": "Objets et argent", + "Mechanical Effect": "Effet de jeu", + "Modifier Value": "Valeur du modificateur", + "Name of the condition": "Nom de la condition", + "Name of the effect": "Nom de l'effet", + "Name of the event": "Nom de l'événement", + "Name of the item": "Nom de l'objet", + "Name of the skill": "Nom de la compétence", + "Name of the stat": "Nom de la caractéristique", + "Nextcloud user": "Utilisateur Nextcloud", + "Notes about items and money": "Notes sur les objets et l'argent", + "Notes about the player": "Notes sur le joueur", + "Overridden At": "Dérogation accordée le", + "Overridden By": "Dérogation accordée par", + "Override Reason": "Motif de la dérogation", + "Owner": "Propriétaire", + "Owner UID": "UID du propriétaire", + "Participating Characters": "Personnages participants", + "Player Name": "Nom du joueur", + "Post-Event Effects": "Effets après l'événement", + "Real name of the player": "Nom réel du joueur", + "Required Conditions": "Conditions requises", + "Required Effects": "Effets requis", + "Required Score": "Valeur requise", + "Required Skills": "Compétences requises", + "Required Stats": "Caractéristiques requises", + "Requirement Overrides": "Dérogations aux prérequis", + "Setting Name": "Nom de l'univers", + "Silver Pieces": "Pièces d'argent", + "Skill Name": "Nom de la compétence", + "Start Date": "Date de début", + "Starting value for all characters": "Valeur de départ pour tous les personnages", + "Stat": "Caractéristique", + "Status": "Statut", + "System Notice": "Avis système", + "Unique Artifact": "Artefact unique", + "Unique Condition": "Condition unique", + "XP Amount": "Nombre de points d'expérience", + "XP Award": "Attribution de points d'expérience" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fr.json b/l10n/fr.json index e00d1117..03e8bddc 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Aucun — il s'agit d'une compétence racine.", "Where the automation lives": "Où vit l'automatisation", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Les Flows sont ce qui se passe sans que personne ne clique : un rappel avant l'échéance d'un délai, une confirmation envoyée à la soumission. C'est ici que vous les lisez et les modifiez — rien à construire maintenant.", - "Open Flows in the menu": "Ouvrez Flows dans le menu" + "Open Flows in the menu": "Ouvrez Flows dans le menu", + "Ability Name": "Nom de l'aptitude", + "Affected Characters": "Personnages concernés", + "Amount of copper pieces": "Nombre de pièces de cuivre", + "Amount of gold pieces": "Nombre de pièces d'or", + "Amount of silver pieces": "Nombre de pièces d'argent", + "Automatic system notices": "Avis système automatiques", + "Award Reason": "Motif de l'attribution", + "Awarded At": "Attribué le", + "Awarded By": "Attribué par", + "Background Story": "Historique du personnage", + "Base Value": "Valeur de base", + "Character Card": "Fiche de personnage", + "Character Name": "Nom du personnage", + "Checked In At": "Arrivée enregistrée le", + "Checked In By": "Arrivée enregistrée par", + "Condition Name": "Nom de la condition", + "Contact email address": "Adresse e-mail de contact", + "Copper Pieces": "Pièces de cuivre", + "Effect Name": "Nom de l'effet", + "End Date": "Date de fin", + "Event Name": "Nom de l'événement", + "Event description": "Description de l'événement", + "Event end date and time": "Date et heure de fin de l'événement", + "Event location": "Lieu de l'événement", + "Event name": "Nom de l'événement", + "Event start date and time": "Date et heure de début de l'événement", + "Faith": "Foi", + "Full name of the player": "Nom complet du joueur", + "Game Master Notes (Private)": "Notes du maître de jeu (privées)", + "Game Master Notes (Public)": "Notes du maître de jeu (publiques)", + "Gold Pieces": "Pièces d'or", + "Item Name": "Nom de l'objet", + "Items and Money": "Objets et argent", + "Mechanical Effect": "Effet de jeu", + "Modifier Value": "Valeur du modificateur", + "Name of the condition": "Nom de la condition", + "Name of the effect": "Nom de l'effet", + "Name of the event": "Nom de l'événement", + "Name of the item": "Nom de l'objet", + "Name of the skill": "Nom de la compétence", + "Name of the stat": "Nom de la caractéristique", + "Nextcloud user": "Utilisateur Nextcloud", + "Notes about items and money": "Notes sur les objets et l'argent", + "Notes about the player": "Notes sur le joueur", + "Overridden At": "Dérogation accordée le", + "Overridden By": "Dérogation accordée par", + "Override Reason": "Motif de la dérogation", + "Owner": "Propriétaire", + "Owner UID": "UID du propriétaire", + "Participating Characters": "Personnages participants", + "Player Name": "Nom du joueur", + "Post-Event Effects": "Effets après l'événement", + "Real name of the player": "Nom réel du joueur", + "Required Conditions": "Conditions requises", + "Required Effects": "Effets requis", + "Required Score": "Valeur requise", + "Required Skills": "Compétences requises", + "Required Stats": "Caractéristiques requises", + "Requirement Overrides": "Dérogations aux prérequis", + "Setting Name": "Nom de l'univers", + "Silver Pieces": "Pièces d'argent", + "Skill Name": "Nom de la compétence", + "Start Date": "Date de début", + "Starting value for all characters": "Valeur de départ pour tous les personnages", + "Stat": "Caractéristique", + "Status": "Statut", + "System Notice": "Avis système", + "Unique Artifact": "Artefact unique", + "Unique Condition": "Condition unique", + "XP Amount": "Nombre de points d'expérience", + "XP Award": "Attribution de points d'expérience" }, "plurals": {} } diff --git a/l10n/ga.js b/l10n/ga.js index 744ebbf6..dee2a767 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Ceann ar bith — is bunscil í seo.", "Where the automation lives": "An áit a maireann an uathoibriú", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Is éard is Flows ann ná an rud a tharlaíonn gan aon duine a chliceáil: meabhrúchán sula rachaidh spriocdháta in éag, deimhniú ar aighneacht. Is anseo a léann tú agus a chuireann tú in eagar iad — níl aon rud le tógáil anois.", - "Open Flows in the menu": "Oscail Flows sa roghchlár" + "Open Flows in the menu": "Oscail Flows sa roghchlár", + "Ability Name": "Ainm an chumais", + "Affected Characters": "Carachtair a bhfuil tionchar orthu", + "Amount of copper pieces": "Líon na mbonn copair", + "Amount of gold pieces": "Líon na mbonn óir", + "Amount of silver pieces": "Líon na mbonn airgid", + "Automatic system notices": "Fógraí uathoibríocha córais", + "Award Reason": "Cúis leis an mbronnadh", + "Awarded At": "Bronnta ar", + "Awarded By": "Bronnta ag", + "Background Story": "Scéal cúlra", + "Base Value": "Bunluach", + "Character Card": "Cárta an charachtair", + "Character Name": "Ainm an charachtair", + "Checked In At": "Clárú isteach ar", + "Checked In By": "Cláraithe isteach ag", + "Condition Name": "Ainm an choinníll", + "Contact email address": "Seoladh ríomhphoist teagmhála", + "Copper Pieces": "Boinn chopair", + "Effect Name": "Ainm na héifeachta", + "End Date": "Dáta deiridh", + "Event Name": "Ainm an imeachta", + "Event description": "Cur síos ar an imeacht", + "Event end date and time": "Dáta agus am deiridh an imeachta", + "Event location": "Suíomh an imeachta", + "Event name": "Ainm an imeachta", + "Event start date and time": "Dáta agus am tosaigh an imeachta", + "Faith": "Creideamh", + "Full name of the player": "Ainm iomlán an imreora", + "Game Master Notes (Private)": "Nótaí an mháistir cluiche (príobháideach)", + "Game Master Notes (Public)": "Nótaí an mháistir cluiche (poiblí)", + "Gold Pieces": "Boinn óir", + "Item Name": "Ainm na míre", + "Items and Money": "Míreanna agus airgead", + "Mechanical Effect": "Éifeacht sa chluiche", + "Modifier Value": "Luach an mhionathraitheora", + "Name of the condition": "Ainm an choinníll", + "Name of the effect": "Ainm na héifeachta", + "Name of the event": "Ainm an imeachta", + "Name of the item": "Ainm na míre", + "Name of the skill": "Ainm na scile", + "Name of the stat": "Ainm na tréithe", + "Nextcloud user": "Úsáideoir Nextcloud", + "Notes about items and money": "Nótaí faoi mhíreanna agus airgead", + "Notes about the player": "Nótaí faoin imreoir", + "Overridden At": "Sáraíodh ar", + "Overridden By": "Sáraithe ag", + "Override Reason": "Cúis leis an sárú", + "Owner": "Úinéir", + "Owner UID": "UID an úinéara", + "Participating Characters": "Carachtair rannpháirteacha", + "Player Name": "Ainm an imreora", + "Post-Event Effects": "Éifeachtaí i ndiaidh an imeachta", + "Real name of the player": "Fíorainm an imreora", + "Required Conditions": "Coinníollacha riachtanacha", + "Required Effects": "Éifeachtaí riachtanacha", + "Required Score": "Luach riachtanach", + "Required Skills": "Scileanna riachtanacha", + "Required Stats": "Tréithe riachtanacha", + "Requirement Overrides": "Sáruithe ar na réamhriachtanais", + "Setting Name": "Ainm shaol an chluiche", + "Silver Pieces": "Boinn airgid", + "Skill Name": "Ainm na scile", + "Start Date": "Dáta tosaigh", + "Starting value for all characters": "Luach tosaigh do gach carachtar", + "Stat": "Tréith", + "Status": "Stádas", + "System Notice": "Fógra córais", + "Unique Artifact": "Déantán uathúil", + "Unique Condition": "Coinníoll uathúil", + "XP Amount": "Líon na bpointí taithí", + "XP Award": "Bronnadh pointí taithí" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ga.json b/l10n/ga.json index a139d111..41890fd4 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Ceann ar bith — is bunscil í seo.", "Where the automation lives": "An áit a maireann an uathoibriú", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Is éard is Flows ann ná an rud a tharlaíonn gan aon duine a chliceáil: meabhrúchán sula rachaidh spriocdháta in éag, deimhniú ar aighneacht. Is anseo a léann tú agus a chuireann tú in eagar iad — níl aon rud le tógáil anois.", - "Open Flows in the menu": "Oscail Flows sa roghchlár" + "Open Flows in the menu": "Oscail Flows sa roghchlár", + "Ability Name": "Ainm an chumais", + "Affected Characters": "Carachtair a bhfuil tionchar orthu", + "Amount of copper pieces": "Líon na mbonn copair", + "Amount of gold pieces": "Líon na mbonn óir", + "Amount of silver pieces": "Líon na mbonn airgid", + "Automatic system notices": "Fógraí uathoibríocha córais", + "Award Reason": "Cúis leis an mbronnadh", + "Awarded At": "Bronnta ar", + "Awarded By": "Bronnta ag", + "Background Story": "Scéal cúlra", + "Base Value": "Bunluach", + "Character Card": "Cárta an charachtair", + "Character Name": "Ainm an charachtair", + "Checked In At": "Clárú isteach ar", + "Checked In By": "Cláraithe isteach ag", + "Condition Name": "Ainm an choinníll", + "Contact email address": "Seoladh ríomhphoist teagmhála", + "Copper Pieces": "Boinn chopair", + "Effect Name": "Ainm na héifeachta", + "End Date": "Dáta deiridh", + "Event Name": "Ainm an imeachta", + "Event description": "Cur síos ar an imeacht", + "Event end date and time": "Dáta agus am deiridh an imeachta", + "Event location": "Suíomh an imeachta", + "Event name": "Ainm an imeachta", + "Event start date and time": "Dáta agus am tosaigh an imeachta", + "Faith": "Creideamh", + "Full name of the player": "Ainm iomlán an imreora", + "Game Master Notes (Private)": "Nótaí an mháistir cluiche (príobháideach)", + "Game Master Notes (Public)": "Nótaí an mháistir cluiche (poiblí)", + "Gold Pieces": "Boinn óir", + "Item Name": "Ainm na míre", + "Items and Money": "Míreanna agus airgead", + "Mechanical Effect": "Éifeacht sa chluiche", + "Modifier Value": "Luach an mhionathraitheora", + "Name of the condition": "Ainm an choinníll", + "Name of the effect": "Ainm na héifeachta", + "Name of the event": "Ainm an imeachta", + "Name of the item": "Ainm na míre", + "Name of the skill": "Ainm na scile", + "Name of the stat": "Ainm na tréithe", + "Nextcloud user": "Úsáideoir Nextcloud", + "Notes about items and money": "Nótaí faoi mhíreanna agus airgead", + "Notes about the player": "Nótaí faoin imreoir", + "Overridden At": "Sáraíodh ar", + "Overridden By": "Sáraithe ag", + "Override Reason": "Cúis leis an sárú", + "Owner": "Úinéir", + "Owner UID": "UID an úinéara", + "Participating Characters": "Carachtair rannpháirteacha", + "Player Name": "Ainm an imreora", + "Post-Event Effects": "Éifeachtaí i ndiaidh an imeachta", + "Real name of the player": "Fíorainm an imreora", + "Required Conditions": "Coinníollacha riachtanacha", + "Required Effects": "Éifeachtaí riachtanacha", + "Required Score": "Luach riachtanach", + "Required Skills": "Scileanna riachtanacha", + "Required Stats": "Tréithe riachtanacha", + "Requirement Overrides": "Sáruithe ar na réamhriachtanais", + "Setting Name": "Ainm shaol an chluiche", + "Silver Pieces": "Boinn airgid", + "Skill Name": "Ainm na scile", + "Start Date": "Dáta tosaigh", + "Starting value for all characters": "Luach tosaigh do gach carachtar", + "Stat": "Tréith", + "Status": "Stádas", + "System Notice": "Fógra córais", + "Unique Artifact": "Déantán uathúil", + "Unique Condition": "Coinníoll uathúil", + "XP Amount": "Líon na bpointí taithí", + "XP Award": "Bronnadh pointí taithí" }, "plurals": {} } diff --git a/l10n/hr.js b/l10n/hr.js index 239c0a0a..02b48763 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Nema — ovo je korijenska vještina.", "Where the automation lives": "Gdje živi automatizacija", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je ono što se događa bez ičijeg klika: podsjetnik prije isteka roka, potvrda pri predaji. Ovdje ih čitaš i uređuješ — sada nema što graditi.", - "Open Flows in the menu": "Otvori Flows u izborniku" + "Open Flows in the menu": "Otvori Flows u izborniku", + "Ability Name": "Naziv sposobnosti", + "Affected Characters": "Zahvaćeni likovi", + "Amount of copper pieces": "Broj bakrenih novčića", + "Amount of gold pieces": "Broj zlatnih novčića", + "Amount of silver pieces": "Broj srebrnih novčića", + "Automatic system notices": "Automatske obavijesti sustava", + "Award Reason": "Razlog dodjele", + "Awarded At": "Dodijeljeno", + "Awarded By": "Dodijelio", + "Background Story": "Pozadinska priča", + "Base Value": "Osnovna vrijednost", + "Character Card": "Kartica lika", + "Character Name": "Ime lika", + "Checked In At": "Dolazak zabilježen", + "Checked In By": "Dolazak zabilježio", + "Condition Name": "Naziv stanja", + "Contact email address": "Kontaktna adresa e-pošte", + "Copper Pieces": "Bakreni novčići", + "Effect Name": "Naziv učinka", + "End Date": "Datum završetka", + "Event Name": "Naziv događaja", + "Event description": "Opis događaja", + "Event end date and time": "Datum i vrijeme završetka događaja", + "Event location": "Mjesto događaja", + "Event name": "Naziv događaja", + "Event start date and time": "Datum i vrijeme početka događaja", + "Faith": "Vjera", + "Full name of the player": "Puno ime igrača", + "Game Master Notes (Private)": "Bilješke voditelja igre (privatne)", + "Game Master Notes (Public)": "Bilješke voditelja igre (javne)", + "Gold Pieces": "Zlatni novčići", + "Item Name": "Naziv predmeta", + "Items and Money": "Predmeti i novac", + "Mechanical Effect": "Učinak u igri", + "Modifier Value": "Vrijednost modifikatora", + "Name of the condition": "Naziv stanja", + "Name of the effect": "Naziv učinka", + "Name of the event": "Naziv događaja", + "Name of the item": "Naziv predmeta", + "Name of the skill": "Naziv vještine", + "Name of the stat": "Naziv svojstva", + "Nextcloud user": "Nextcloud korisnik", + "Notes about items and money": "Bilješke o predmetima i novcu", + "Notes about the player": "Bilješke o igraču", + "Overridden At": "Iznimka odobrena", + "Overridden By": "Iznimku odobrio", + "Override Reason": "Razlog iznimke", + "Owner": "Vlasnik", + "Owner UID": "UID vlasnika", + "Participating Characters": "Sudjelujući likovi", + "Player Name": "Ime igrača", + "Post-Event Effects": "Učinci nakon događaja", + "Real name of the player": "Pravo ime igrača", + "Required Conditions": "Potrebna stanja", + "Required Effects": "Potrebni učinci", + "Required Score": "Potrebna vrijednost", + "Required Skills": "Potrebne vještine", + "Required Stats": "Potrebna svojstva", + "Requirement Overrides": "Iznimke od preduvjeta", + "Setting Name": "Naziv svijeta igre", + "Silver Pieces": "Srebrni novčići", + "Skill Name": "Naziv vještine", + "Start Date": "Datum početka", + "Starting value for all characters": "Početna vrijednost za sve likove", + "Stat": "Svojstvo", + "Status": "Status", + "System Notice": "Obavijest sustava", + "Unique Artifact": "Jedinstveni artefakt", + "Unique Condition": "Jedinstveno stanje", + "XP Amount": "Broj bodova iskustva", + "XP Award": "Dodjela bodova iskustva" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hr.json b/l10n/hr.json index 07106649..9bd9ba3a 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Nema — ovo je korijenska vještina.", "Where the automation lives": "Gdje živi automatizacija", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je ono što se događa bez ičijeg klika: podsjetnik prije isteka roka, potvrda pri predaji. Ovdje ih čitaš i uređuješ — sada nema što graditi.", - "Open Flows in the menu": "Otvori Flows u izborniku" + "Open Flows in the menu": "Otvori Flows u izborniku", + "Ability Name": "Naziv sposobnosti", + "Affected Characters": "Zahvaćeni likovi", + "Amount of copper pieces": "Broj bakrenih novčića", + "Amount of gold pieces": "Broj zlatnih novčića", + "Amount of silver pieces": "Broj srebrnih novčića", + "Automatic system notices": "Automatske obavijesti sustava", + "Award Reason": "Razlog dodjele", + "Awarded At": "Dodijeljeno", + "Awarded By": "Dodijelio", + "Background Story": "Pozadinska priča", + "Base Value": "Osnovna vrijednost", + "Character Card": "Kartica lika", + "Character Name": "Ime lika", + "Checked In At": "Dolazak zabilježen", + "Checked In By": "Dolazak zabilježio", + "Condition Name": "Naziv stanja", + "Contact email address": "Kontaktna adresa e-pošte", + "Copper Pieces": "Bakreni novčići", + "Effect Name": "Naziv učinka", + "End Date": "Datum završetka", + "Event Name": "Naziv događaja", + "Event description": "Opis događaja", + "Event end date and time": "Datum i vrijeme završetka događaja", + "Event location": "Mjesto događaja", + "Event name": "Naziv događaja", + "Event start date and time": "Datum i vrijeme početka događaja", + "Faith": "Vjera", + "Full name of the player": "Puno ime igrača", + "Game Master Notes (Private)": "Bilješke voditelja igre (privatne)", + "Game Master Notes (Public)": "Bilješke voditelja igre (javne)", + "Gold Pieces": "Zlatni novčići", + "Item Name": "Naziv predmeta", + "Items and Money": "Predmeti i novac", + "Mechanical Effect": "Učinak u igri", + "Modifier Value": "Vrijednost modifikatora", + "Name of the condition": "Naziv stanja", + "Name of the effect": "Naziv učinka", + "Name of the event": "Naziv događaja", + "Name of the item": "Naziv predmeta", + "Name of the skill": "Naziv vještine", + "Name of the stat": "Naziv svojstva", + "Nextcloud user": "Nextcloud korisnik", + "Notes about items and money": "Bilješke o predmetima i novcu", + "Notes about the player": "Bilješke o igraču", + "Overridden At": "Iznimka odobrena", + "Overridden By": "Iznimku odobrio", + "Override Reason": "Razlog iznimke", + "Owner": "Vlasnik", + "Owner UID": "UID vlasnika", + "Participating Characters": "Sudjelujući likovi", + "Player Name": "Ime igrača", + "Post-Event Effects": "Učinci nakon događaja", + "Real name of the player": "Pravo ime igrača", + "Required Conditions": "Potrebna stanja", + "Required Effects": "Potrebni učinci", + "Required Score": "Potrebna vrijednost", + "Required Skills": "Potrebne vještine", + "Required Stats": "Potrebna svojstva", + "Requirement Overrides": "Iznimke od preduvjeta", + "Setting Name": "Naziv svijeta igre", + "Silver Pieces": "Srebrni novčići", + "Skill Name": "Naziv vještine", + "Start Date": "Datum početka", + "Starting value for all characters": "Početna vrijednost za sve likove", + "Stat": "Svojstvo", + "Status": "Status", + "System Notice": "Obavijest sustava", + "Unique Artifact": "Jedinstveni artefakt", + "Unique Condition": "Jedinstveno stanje", + "XP Amount": "Broj bodova iskustva", + "XP Award": "Dodjela bodova iskustva" }, "plurals": {} } diff --git a/l10n/hu.js b/l10n/hu.js index 28c6577c..6e12e128 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Nincs — ez egy gyökérkészség.", "Where the automation lives": "Ahol az automatizálás lakik", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "A Flows az, ami kattintás nélkül történik: emlékeztető a határidő lejárta előtt, visszaigazolás beküldéskor. Itt olvasod és szerkeszted őket — most nincs mit építeni.", - "Open Flows in the menu": "Nyisd meg a Flows menüpontot" + "Open Flows in the menu": "Nyisd meg a Flows menüpontot", + "Ability Name": "A képesség neve", + "Affected Characters": "Érintett karakterek", + "Amount of copper pieces": "Rézérmék száma", + "Amount of gold pieces": "Aranyérmék száma", + "Amount of silver pieces": "Ezüstérmék száma", + "Automatic system notices": "Automatikus rendszerüzenetek", + "Award Reason": "Az odaítélés indoka", + "Awarded At": "Odaítélve ekkor", + "Awarded By": "Odaítélte", + "Background Story": "Háttértörténet", + "Base Value": "Alapérték", + "Character Card": "Karakterlap", + "Character Name": "A karakter neve", + "Checked In At": "Érkezés rögzítve ekkor", + "Checked In By": "Az érkezést rögzítette", + "Condition Name": "Az állapot neve", + "Contact email address": "Kapcsolattartási e-mail-cím", + "Copper Pieces": "Rézérmék", + "Effect Name": "A hatás neve", + "End Date": "Záró dátum", + "Event Name": "Az esemény neve", + "Event description": "Az esemény leírása", + "Event end date and time": "Az esemény záró dátuma és időpontja", + "Event location": "Az esemény helyszíne", + "Event name": "Az esemény neve", + "Event start date and time": "Az esemény kezdő dátuma és időpontja", + "Faith": "Hit", + "Full name of the player": "A játékos teljes neve", + "Game Master Notes (Private)": "A játékmester jegyzetei (magán)", + "Game Master Notes (Public)": "A játékmester jegyzetei (nyilvános)", + "Gold Pieces": "Aranyérmék", + "Item Name": "A tárgy neve", + "Items and Money": "Tárgyak és pénz", + "Mechanical Effect": "Játékbeli hatás", + "Modifier Value": "A módosító értéke", + "Name of the condition": "Az állapot neve", + "Name of the effect": "A hatás neve", + "Name of the event": "Az esemény neve", + "Name of the item": "A tárgy neve", + "Name of the skill": "A készség neve", + "Name of the stat": "A tulajdonság neve", + "Nextcloud user": "Nextcloud-felhasználó", + "Notes about items and money": "Jegyzetek a tárgyakról és a pénzről", + "Notes about the player": "Jegyzetek a játékosról", + "Overridden At": "Felülbírálva ekkor", + "Overridden By": "Felülbírálta", + "Override Reason": "A felülbírálás indoka", + "Owner": "Tulajdonos", + "Owner UID": "A tulajdonos UID-ja", + "Participating Characters": "Résztvevő karakterek", + "Player Name": "A játékos neve", + "Post-Event Effects": "Esemény utáni hatások", + "Real name of the player": "A játékos valódi neve", + "Required Conditions": "Szükséges állapotok", + "Required Effects": "Szükséges hatások", + "Required Score": "Szükséges érték", + "Required Skills": "Szükséges készségek", + "Required Stats": "Szükséges tulajdonságok", + "Requirement Overrides": "Felülbírált előfeltételek", + "Setting Name": "A játékvilág neve", + "Silver Pieces": "Ezüstérmék", + "Skill Name": "A készség neve", + "Start Date": "Kezdő dátum", + "Starting value for all characters": "Kezdőérték minden karakter számára", + "Stat": "Tulajdonság", + "Status": "Státusz", + "System Notice": "Rendszerüzenet", + "Unique Artifact": "Egyedi artefaktum", + "Unique Condition": "Egyedi állapot", + "XP Amount": "Tapasztalati pontok száma", + "XP Award": "Tapasztalati pontok odaítélése" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hu.json b/l10n/hu.json index e46754b2..747329fd 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Nincs — ez egy gyökérkészség.", "Where the automation lives": "Ahol az automatizálás lakik", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "A Flows az, ami kattintás nélkül történik: emlékeztető a határidő lejárta előtt, visszaigazolás beküldéskor. Itt olvasod és szerkeszted őket — most nincs mit építeni.", - "Open Flows in the menu": "Nyisd meg a Flows menüpontot" + "Open Flows in the menu": "Nyisd meg a Flows menüpontot", + "Ability Name": "A képesség neve", + "Affected Characters": "Érintett karakterek", + "Amount of copper pieces": "Rézérmék száma", + "Amount of gold pieces": "Aranyérmék száma", + "Amount of silver pieces": "Ezüstérmék száma", + "Automatic system notices": "Automatikus rendszerüzenetek", + "Award Reason": "Az odaítélés indoka", + "Awarded At": "Odaítélve ekkor", + "Awarded By": "Odaítélte", + "Background Story": "Háttértörténet", + "Base Value": "Alapérték", + "Character Card": "Karakterlap", + "Character Name": "A karakter neve", + "Checked In At": "Érkezés rögzítve ekkor", + "Checked In By": "Az érkezést rögzítette", + "Condition Name": "Az állapot neve", + "Contact email address": "Kapcsolattartási e-mail-cím", + "Copper Pieces": "Rézérmék", + "Effect Name": "A hatás neve", + "End Date": "Záró dátum", + "Event Name": "Az esemény neve", + "Event description": "Az esemény leírása", + "Event end date and time": "Az esemény záró dátuma és időpontja", + "Event location": "Az esemény helyszíne", + "Event name": "Az esemény neve", + "Event start date and time": "Az esemény kezdő dátuma és időpontja", + "Faith": "Hit", + "Full name of the player": "A játékos teljes neve", + "Game Master Notes (Private)": "A játékmester jegyzetei (magán)", + "Game Master Notes (Public)": "A játékmester jegyzetei (nyilvános)", + "Gold Pieces": "Aranyérmék", + "Item Name": "A tárgy neve", + "Items and Money": "Tárgyak és pénz", + "Mechanical Effect": "Játékbeli hatás", + "Modifier Value": "A módosító értéke", + "Name of the condition": "Az állapot neve", + "Name of the effect": "A hatás neve", + "Name of the event": "Az esemény neve", + "Name of the item": "A tárgy neve", + "Name of the skill": "A készség neve", + "Name of the stat": "A tulajdonság neve", + "Nextcloud user": "Nextcloud-felhasználó", + "Notes about items and money": "Jegyzetek a tárgyakról és a pénzről", + "Notes about the player": "Jegyzetek a játékosról", + "Overridden At": "Felülbírálva ekkor", + "Overridden By": "Felülbírálta", + "Override Reason": "A felülbírálás indoka", + "Owner": "Tulajdonos", + "Owner UID": "A tulajdonos UID-ja", + "Participating Characters": "Résztvevő karakterek", + "Player Name": "A játékos neve", + "Post-Event Effects": "Esemény utáni hatások", + "Real name of the player": "A játékos valódi neve", + "Required Conditions": "Szükséges állapotok", + "Required Effects": "Szükséges hatások", + "Required Score": "Szükséges érték", + "Required Skills": "Szükséges készségek", + "Required Stats": "Szükséges tulajdonságok", + "Requirement Overrides": "Felülbírált előfeltételek", + "Setting Name": "A játékvilág neve", + "Silver Pieces": "Ezüstérmék", + "Skill Name": "A készség neve", + "Start Date": "Kezdő dátum", + "Starting value for all characters": "Kezdőérték minden karakter számára", + "Stat": "Tulajdonság", + "Status": "Státusz", + "System Notice": "Rendszerüzenet", + "Unique Artifact": "Egyedi artefaktum", + "Unique Condition": "Egyedi állapot", + "XP Amount": "Tapasztalati pontok száma", + "XP Award": "Tapasztalati pontok odaítélése" }, "plurals": {} } diff --git a/l10n/is.js b/l10n/is.js index e6eb3a7f..82ad1f3f 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Engar — þetta er grunnfærni.", "Where the automation lives": "Þar sem sjálfvirknin býr", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows er það sem gerist án þess að nokkur smelli: áminning áður en frestur rennur út, staðfesting við innsendingu. Hér lestu þau og breytir þeim — það er ekkert að byggja núna.", - "Open Flows in the menu": "Opnaðu Flows í valmyndinni" + "Open Flows in the menu": "Opnaðu Flows í valmyndinni", + "Ability Name": "Nafn hæfileikans", + "Affected Characters": "Persónur sem verða fyrir áhrifum", + "Amount of copper pieces": "Fjöldi koparpeninga", + "Amount of gold pieces": "Fjöldi gullpeninga", + "Amount of silver pieces": "Fjöldi silfurpeninga", + "Automatic system notices": "Sjálfvirkar kerfistilkynningar", + "Award Reason": "Ástæða veitingar", + "Awarded At": "Veitt þann", + "Awarded By": "Veitt af", + "Background Story": "Bakgrunnssaga", + "Base Value": "Grunngildi", + "Character Card": "Persónuspjald", + "Character Name": "Nafn persónunnar", + "Checked In At": "Mæting skráð þann", + "Checked In By": "Mæting skráð af", + "Condition Name": "Nafn ástandsins", + "Contact email address": "Netfang fyrir samskipti", + "Copper Pieces": "Koparpeningar", + "Effect Name": "Nafn áhrifanna", + "End Date": "Lokadagsetning", + "Event Name": "Nafn viðburðarins", + "Event description": "Lýsing viðburðarins", + "Event end date and time": "Lokadagsetning og tími viðburðarins", + "Event location": "Staðsetning viðburðarins", + "Event name": "Nafn viðburðarins", + "Event start date and time": "Upphafsdagsetning og tími viðburðarins", + "Faith": "Trú", + "Full name of the player": "Fullt nafn leikmannsins", + "Game Master Notes (Private)": "Einkaathugasemdir leikstjóra", + "Game Master Notes (Public)": "Opinberar athugasemdir leikstjóra", + "Gold Pieces": "Gullpeningar", + "Item Name": "Nafn hlutarins", + "Items and Money": "Hlutir og peningar", + "Mechanical Effect": "Áhrif samkvæmt reglum", + "Modifier Value": "Gildi breytisins", + "Name of the condition": "Nafn ástandsins", + "Name of the effect": "Nafn áhrifanna", + "Name of the event": "Nafn viðburðarins", + "Name of the item": "Nafn hlutarins", + "Name of the skill": "Nafn færninnar", + "Name of the stat": "Nafn eiginleikans", + "Nextcloud user": "Nextcloud-notandi", + "Notes about items and money": "Athugasemdir um hluti og peninga", + "Notes about the player": "Athugasemdir um leikmanninn", + "Overridden At": "Hnekkt þann", + "Overridden By": "Hnekkt af", + "Override Reason": "Ástæða hnekkingar", + "Owner": "Eigandi", + "Owner UID": "UID eiganda", + "Participating Characters": "Þátttakandi persónur", + "Player Name": "Nafn leikmannsins", + "Post-Event Effects": "Áhrif eftir viðburðinn", + "Real name of the player": "Rétt nafn leikmannsins", + "Required Conditions": "Nauðsynlegt ástand", + "Required Effects": "Nauðsynleg áhrif", + "Required Score": "Nauðsynlegt gildi", + "Required Skills": "Nauðsynleg færni", + "Required Stats": "Nauðsynlegir eiginleikar", + "Requirement Overrides": "Hnekktar forkröfur", + "Setting Name": "Nafn söguheimsins", + "Silver Pieces": "Silfurpeningar", + "Skill Name": "Nafn færninnar", + "Start Date": "Upphafsdagsetning", + "Starting value for all characters": "Upphafsgildi fyrir allar persónur", + "Stat": "Eiginleiki", + "Status": "Staða", + "System Notice": "Kerfistilkynning", + "Unique Artifact": "Einstakur gripur", + "Unique Condition": "Einstakt ástand", + "XP Amount": "Fjöldi reynslustiga", + "XP Award": "Veiting reynslustiga" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/is.json b/l10n/is.json index ad6cfd79..6f2bfb9d 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Engar — þetta er grunnfærni.", "Where the automation lives": "Þar sem sjálfvirknin býr", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows er það sem gerist án þess að nokkur smelli: áminning áður en frestur rennur út, staðfesting við innsendingu. Hér lestu þau og breytir þeim — það er ekkert að byggja núna.", - "Open Flows in the menu": "Opnaðu Flows í valmyndinni" + "Open Flows in the menu": "Opnaðu Flows í valmyndinni", + "Ability Name": "Nafn hæfileikans", + "Affected Characters": "Persónur sem verða fyrir áhrifum", + "Amount of copper pieces": "Fjöldi koparpeninga", + "Amount of gold pieces": "Fjöldi gullpeninga", + "Amount of silver pieces": "Fjöldi silfurpeninga", + "Automatic system notices": "Sjálfvirkar kerfistilkynningar", + "Award Reason": "Ástæða veitingar", + "Awarded At": "Veitt þann", + "Awarded By": "Veitt af", + "Background Story": "Bakgrunnssaga", + "Base Value": "Grunngildi", + "Character Card": "Persónuspjald", + "Character Name": "Nafn persónunnar", + "Checked In At": "Mæting skráð þann", + "Checked In By": "Mæting skráð af", + "Condition Name": "Nafn ástandsins", + "Contact email address": "Netfang fyrir samskipti", + "Copper Pieces": "Koparpeningar", + "Effect Name": "Nafn áhrifanna", + "End Date": "Lokadagsetning", + "Event Name": "Nafn viðburðarins", + "Event description": "Lýsing viðburðarins", + "Event end date and time": "Lokadagsetning og tími viðburðarins", + "Event location": "Staðsetning viðburðarins", + "Event name": "Nafn viðburðarins", + "Event start date and time": "Upphafsdagsetning og tími viðburðarins", + "Faith": "Trú", + "Full name of the player": "Fullt nafn leikmannsins", + "Game Master Notes (Private)": "Einkaathugasemdir leikstjóra", + "Game Master Notes (Public)": "Opinberar athugasemdir leikstjóra", + "Gold Pieces": "Gullpeningar", + "Item Name": "Nafn hlutarins", + "Items and Money": "Hlutir og peningar", + "Mechanical Effect": "Áhrif samkvæmt reglum", + "Modifier Value": "Gildi breytisins", + "Name of the condition": "Nafn ástandsins", + "Name of the effect": "Nafn áhrifanna", + "Name of the event": "Nafn viðburðarins", + "Name of the item": "Nafn hlutarins", + "Name of the skill": "Nafn færninnar", + "Name of the stat": "Nafn eiginleikans", + "Nextcloud user": "Nextcloud-notandi", + "Notes about items and money": "Athugasemdir um hluti og peninga", + "Notes about the player": "Athugasemdir um leikmanninn", + "Overridden At": "Hnekkt þann", + "Overridden By": "Hnekkt af", + "Override Reason": "Ástæða hnekkingar", + "Owner": "Eigandi", + "Owner UID": "UID eiganda", + "Participating Characters": "Þátttakandi persónur", + "Player Name": "Nafn leikmannsins", + "Post-Event Effects": "Áhrif eftir viðburðinn", + "Real name of the player": "Rétt nafn leikmannsins", + "Required Conditions": "Nauðsynlegt ástand", + "Required Effects": "Nauðsynleg áhrif", + "Required Score": "Nauðsynlegt gildi", + "Required Skills": "Nauðsynleg færni", + "Required Stats": "Nauðsynlegir eiginleikar", + "Requirement Overrides": "Hnekktar forkröfur", + "Setting Name": "Nafn söguheimsins", + "Silver Pieces": "Silfurpeningar", + "Skill Name": "Nafn færninnar", + "Start Date": "Upphafsdagsetning", + "Starting value for all characters": "Upphafsgildi fyrir allar persónur", + "Stat": "Eiginleiki", + "Status": "Staða", + "System Notice": "Kerfistilkynning", + "Unique Artifact": "Einstakur gripur", + "Unique Condition": "Einstakt ástand", + "XP Amount": "Fjöldi reynslustiga", + "XP Award": "Veiting reynslustiga" }, "plurals": {} } diff --git a/l10n/it.js b/l10n/it.js index fedd929d..9defde85 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Nessuno — questa è un'abilità radice.", "Where the automation lives": "Dove vive l'automazione", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "I Flows sono ciò che accade senza che nessuno clicchi: un promemoria prima che scada un termine, una conferma all'invio. Qui li leggi e li modifichi — non c'è nulla da costruire ora.", - "Open Flows in the menu": "Apri Flows nel menu" + "Open Flows in the menu": "Apri Flows nel menu", + "Ability Name": "Nome dell'attitudine", + "Affected Characters": "Personaggi coinvolti", + "Amount of copper pieces": "Quantità di monete di rame", + "Amount of gold pieces": "Quantità di monete d'oro", + "Amount of silver pieces": "Quantità di monete d'argento", + "Automatic system notices": "Avvisi automatici di sistema", + "Award Reason": "Motivo dell'assegnazione", + "Awarded At": "Assegnato il", + "Awarded By": "Assegnato da", + "Background Story": "Storia personale", + "Base Value": "Valore base", + "Character Card": "Scheda del personaggio", + "Character Name": "Nome del personaggio", + "Checked In At": "Presenza registrata il", + "Checked In By": "Presenza registrata da", + "Condition Name": "Nome della condizione", + "Contact email address": "Indirizzo e-mail di contatto", + "Copper Pieces": "Monete di rame", + "Effect Name": "Nome dell'effetto", + "End Date": "Data di fine", + "Event Name": "Nome dell'evento", + "Event description": "Descrizione dell'evento", + "Event end date and time": "Data e ora di fine dell'evento", + "Event location": "Luogo dell'evento", + "Event name": "Nome dell'evento", + "Event start date and time": "Data e ora di inizio dell'evento", + "Faith": "Fede", + "Full name of the player": "Nome completo del giocatore", + "Game Master Notes (Private)": "Note del master (private)", + "Game Master Notes (Public)": "Note del master (pubbliche)", + "Gold Pieces": "Monete d'oro", + "Item Name": "Nome dell'oggetto", + "Items and Money": "Oggetti e denaro", + "Mechanical Effect": "Effetto di gioco", + "Modifier Value": "Valore del modificatore", + "Name of the condition": "Nome della condizione", + "Name of the effect": "Nome dell'effetto", + "Name of the event": "Nome dell'evento", + "Name of the item": "Nome dell'oggetto", + "Name of the skill": "Nome dell'abilità", + "Name of the stat": "Nome della caratteristica", + "Nextcloud user": "Utente Nextcloud", + "Notes about items and money": "Note su oggetti e denaro", + "Notes about the player": "Note sul giocatore", + "Overridden At": "Deroga concessa il", + "Overridden By": "Deroga concessa da", + "Override Reason": "Motivo della deroga", + "Owner": "Proprietario", + "Owner UID": "UID del proprietario", + "Participating Characters": "Personaggi partecipanti", + "Player Name": "Nome del giocatore", + "Post-Event Effects": "Effetti dopo l'evento", + "Real name of the player": "Nome reale del giocatore", + "Required Conditions": "Condizioni richieste", + "Required Effects": "Effetti richiesti", + "Required Score": "Valore richiesto", + "Required Skills": "Abilità richieste", + "Required Stats": "Caratteristiche richieste", + "Requirement Overrides": "Deroghe ai prerequisiti", + "Setting Name": "Nome dell'ambientazione", + "Silver Pieces": "Monete d'argento", + "Skill Name": "Nome dell'abilità", + "Start Date": "Data di inizio", + "Starting value for all characters": "Valore iniziale per tutti i personaggi", + "Stat": "Caratteristica", + "Status": "Stato", + "System Notice": "Avviso di sistema", + "Unique Artifact": "Artefatto unico", + "Unique Condition": "Condizione unica", + "XP Amount": "Quantità di punti esperienza", + "XP Award": "Assegnazione di punti esperienza" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/it.json b/l10n/it.json index 4503d1d9..21dc0f82 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Nessuno — questa è un'abilità radice.", "Where the automation lives": "Dove vive l'automazione", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "I Flows sono ciò che accade senza che nessuno clicchi: un promemoria prima che scada un termine, una conferma all'invio. Qui li leggi e li modifichi — non c'è nulla da costruire ora.", - "Open Flows in the menu": "Apri Flows nel menu" + "Open Flows in the menu": "Apri Flows nel menu", + "Ability Name": "Nome dell'attitudine", + "Affected Characters": "Personaggi coinvolti", + "Amount of copper pieces": "Quantità di monete di rame", + "Amount of gold pieces": "Quantità di monete d'oro", + "Amount of silver pieces": "Quantità di monete d'argento", + "Automatic system notices": "Avvisi automatici di sistema", + "Award Reason": "Motivo dell'assegnazione", + "Awarded At": "Assegnato il", + "Awarded By": "Assegnato da", + "Background Story": "Storia personale", + "Base Value": "Valore base", + "Character Card": "Scheda del personaggio", + "Character Name": "Nome del personaggio", + "Checked In At": "Presenza registrata il", + "Checked In By": "Presenza registrata da", + "Condition Name": "Nome della condizione", + "Contact email address": "Indirizzo e-mail di contatto", + "Copper Pieces": "Monete di rame", + "Effect Name": "Nome dell'effetto", + "End Date": "Data di fine", + "Event Name": "Nome dell'evento", + "Event description": "Descrizione dell'evento", + "Event end date and time": "Data e ora di fine dell'evento", + "Event location": "Luogo dell'evento", + "Event name": "Nome dell'evento", + "Event start date and time": "Data e ora di inizio dell'evento", + "Faith": "Fede", + "Full name of the player": "Nome completo del giocatore", + "Game Master Notes (Private)": "Note del master (private)", + "Game Master Notes (Public)": "Note del master (pubbliche)", + "Gold Pieces": "Monete d'oro", + "Item Name": "Nome dell'oggetto", + "Items and Money": "Oggetti e denaro", + "Mechanical Effect": "Effetto di gioco", + "Modifier Value": "Valore del modificatore", + "Name of the condition": "Nome della condizione", + "Name of the effect": "Nome dell'effetto", + "Name of the event": "Nome dell'evento", + "Name of the item": "Nome dell'oggetto", + "Name of the skill": "Nome dell'abilità", + "Name of the stat": "Nome della caratteristica", + "Nextcloud user": "Utente Nextcloud", + "Notes about items and money": "Note su oggetti e denaro", + "Notes about the player": "Note sul giocatore", + "Overridden At": "Deroga concessa il", + "Overridden By": "Deroga concessa da", + "Override Reason": "Motivo della deroga", + "Owner": "Proprietario", + "Owner UID": "UID del proprietario", + "Participating Characters": "Personaggi partecipanti", + "Player Name": "Nome del giocatore", + "Post-Event Effects": "Effetti dopo l'evento", + "Real name of the player": "Nome reale del giocatore", + "Required Conditions": "Condizioni richieste", + "Required Effects": "Effetti richiesti", + "Required Score": "Valore richiesto", + "Required Skills": "Abilità richieste", + "Required Stats": "Caratteristiche richieste", + "Requirement Overrides": "Deroghe ai prerequisiti", + "Setting Name": "Nome dell'ambientazione", + "Silver Pieces": "Monete d'argento", + "Skill Name": "Nome dell'abilità", + "Start Date": "Data di inizio", + "Starting value for all characters": "Valore iniziale per tutti i personaggi", + "Stat": "Caratteristica", + "Status": "Stato", + "System Notice": "Avviso di sistema", + "Unique Artifact": "Artefatto unico", + "Unique Condition": "Condizione unica", + "XP Amount": "Quantità di punti esperienza", + "XP Award": "Assegnazione di punti esperienza" }, "plurals": {} } diff --git a/l10n/lb.js b/l10n/lb.js index 66a37d7b..fdd7d2f2 100644 --- a/l10n/lb.js +++ b/l10n/lb.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Keng — dëst ass eng Basiskompetenz.", "Where the automation lives": "Wou d'Automatisatioun wunnt", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows sinn dat, wat geschitt ouni datt een klickt: eng Erënnerung ier eng Frist ausleeft, eng Bestätegung beim Ofginn. Hei liest an änners du se — et gëtt elo näischt ze bauen.", - "Open Flows in the menu": "Maach Flows am Menü op" + "Open Flows in the menu": "Maach Flows am Menü op", + "Ability Name": "Numm vun der Fäegkeet", + "Affected Characters": "Betraff Personnagen", + "Amount of copper pieces": "Unzuel u Kofferstécker", + "Amount of gold pieces": "Unzuel u Goldstécker", + "Amount of silver pieces": "Unzuel u Sëlwerstécker", + "Automatic system notices": "Automatesch Systemmeldungen", + "Award Reason": "Grond fir d'Verginn", + "Awarded At": "Vergi den", + "Awarded By": "Vergi vun", + "Background Story": "Hannergrondgeschicht", + "Base Value": "Basiswäert", + "Character Card": "Personnagekaart", + "Character Name": "Numm vum Personnage", + "Checked In At": "Ugemellt den", + "Checked In By": "Ugemellt vun", + "Condition Name": "Numm vum Zoustand", + "Contact email address": "E-Mail-Adress fir de Kontakt", + "Copper Pieces": "Kofferstécker", + "Effect Name": "Numm vum Effekt", + "End Date": "Schlussdatum", + "Event Name": "Numm vum Evenement", + "Event description": "Beschreiwung vum Evenement", + "Event end date and time": "Schlussdatum an -zäit vum Evenement", + "Event location": "Standuert vum Evenement", + "Event name": "Numm vum Evenement", + "Event start date and time": "Ufanksdatum an -zäit vum Evenement", + "Faith": "Glawen", + "Full name of the player": "Vollstännegen Numm vum Spiller", + "Game Master Notes (Private)": "Notize vum Spillleeder (privat)", + "Game Master Notes (Public)": "Notize vum Spillleeder (ëffentlech)", + "Gold Pieces": "Goldstécker", + "Item Name": "Numm vum Géigestand", + "Items and Money": "Géigestänn a Suen", + "Mechanical Effect": "Spilltechneschen Effekt", + "Modifier Value": "Wäert vum Modifizéierer", + "Name of the condition": "Numm vum Zoustand", + "Name of the effect": "Numm vum Effekt", + "Name of the event": "Numm vum Evenement", + "Name of the item": "Numm vum Géigestand", + "Name of the skill": "Numm vun der Kompetenz", + "Name of the stat": "Numm vum Attribut", + "Nextcloud user": "Nextcloud-Benotzer", + "Notes about items and money": "Notizen iwwer Géigestänn a Suen", + "Notes about the player": "Notizen iwwer de Spiller", + "Overridden At": "Iwwerschriwwen den", + "Overridden By": "Iwwerschriwwe vun", + "Override Reason": "Grond fir d'Iwwerschreiwen", + "Owner": "Besëtzer", + "Owner UID": "UID vum Besëtzer", + "Participating Characters": "Deelhuel Personnagen", + "Player Name": "Numm vum Spiller", + "Post-Event Effects": "Effekter nom Evenement", + "Real name of the player": "Richtegen Numm vum Spiller", + "Required Conditions": "Erfuerderlech Zoustänn", + "Required Effects": "Erfuerderlech Effekter", + "Required Score": "Erfuerderleche Wäert", + "Required Skills": "Erfuerderlech Kompetenzen", + "Required Stats": "Erfuerderlech Attributer", + "Requirement Overrides": "Iwwerschriwwe Viraussetzungen", + "Setting Name": "Numm vun der Spillwelt", + "Silver Pieces": "Sëlwerstécker", + "Skill Name": "Numm vun der Kompetenz", + "Start Date": "Ufanksdatum", + "Starting value for all characters": "Startwäert fir all Personnagen", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Systemmeldung", + "Unique Artifact": "Eenzegaartegt Artefakt", + "Unique Condition": "Eenzegaartegen Zoustand", + "XP Amount": "Unzuel un Erfarungspunkten", + "XP Award": "XP-Verginn" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lb.json b/l10n/lb.json index a346c594..c5b8dbdf 100644 --- a/l10n/lb.json +++ b/l10n/lb.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Keng — dëst ass eng Basiskompetenz.", "Where the automation lives": "Wou d'Automatisatioun wunnt", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows sinn dat, wat geschitt ouni datt een klickt: eng Erënnerung ier eng Frist ausleeft, eng Bestätegung beim Ofginn. Hei liest an änners du se — et gëtt elo näischt ze bauen.", - "Open Flows in the menu": "Maach Flows am Menü op" + "Open Flows in the menu": "Maach Flows am Menü op", + "Ability Name": "Numm vun der Fäegkeet", + "Affected Characters": "Betraff Personnagen", + "Amount of copper pieces": "Unzuel u Kofferstécker", + "Amount of gold pieces": "Unzuel u Goldstécker", + "Amount of silver pieces": "Unzuel u Sëlwerstécker", + "Automatic system notices": "Automatesch Systemmeldungen", + "Award Reason": "Grond fir d'Verginn", + "Awarded At": "Vergi den", + "Awarded By": "Vergi vun", + "Background Story": "Hannergrondgeschicht", + "Base Value": "Basiswäert", + "Character Card": "Personnagekaart", + "Character Name": "Numm vum Personnage", + "Checked In At": "Ugemellt den", + "Checked In By": "Ugemellt vun", + "Condition Name": "Numm vum Zoustand", + "Contact email address": "E-Mail-Adress fir de Kontakt", + "Copper Pieces": "Kofferstécker", + "Effect Name": "Numm vum Effekt", + "End Date": "Schlussdatum", + "Event Name": "Numm vum Evenement", + "Event description": "Beschreiwung vum Evenement", + "Event end date and time": "Schlussdatum an -zäit vum Evenement", + "Event location": "Standuert vum Evenement", + "Event name": "Numm vum Evenement", + "Event start date and time": "Ufanksdatum an -zäit vum Evenement", + "Faith": "Glawen", + "Full name of the player": "Vollstännegen Numm vum Spiller", + "Game Master Notes (Private)": "Notize vum Spillleeder (privat)", + "Game Master Notes (Public)": "Notize vum Spillleeder (ëffentlech)", + "Gold Pieces": "Goldstécker", + "Item Name": "Numm vum Géigestand", + "Items and Money": "Géigestänn a Suen", + "Mechanical Effect": "Spilltechneschen Effekt", + "Modifier Value": "Wäert vum Modifizéierer", + "Name of the condition": "Numm vum Zoustand", + "Name of the effect": "Numm vum Effekt", + "Name of the event": "Numm vum Evenement", + "Name of the item": "Numm vum Géigestand", + "Name of the skill": "Numm vun der Kompetenz", + "Name of the stat": "Numm vum Attribut", + "Nextcloud user": "Nextcloud-Benotzer", + "Notes about items and money": "Notizen iwwer Géigestänn a Suen", + "Notes about the player": "Notizen iwwer de Spiller", + "Overridden At": "Iwwerschriwwen den", + "Overridden By": "Iwwerschriwwe vun", + "Override Reason": "Grond fir d'Iwwerschreiwen", + "Owner": "Besëtzer", + "Owner UID": "UID vum Besëtzer", + "Participating Characters": "Deelhuel Personnagen", + "Player Name": "Numm vum Spiller", + "Post-Event Effects": "Effekter nom Evenement", + "Real name of the player": "Richtegen Numm vum Spiller", + "Required Conditions": "Erfuerderlech Zoustänn", + "Required Effects": "Erfuerderlech Effekter", + "Required Score": "Erfuerderleche Wäert", + "Required Skills": "Erfuerderlech Kompetenzen", + "Required Stats": "Erfuerderlech Attributer", + "Requirement Overrides": "Iwwerschriwwe Viraussetzungen", + "Setting Name": "Numm vun der Spillwelt", + "Silver Pieces": "Sëlwerstécker", + "Skill Name": "Numm vun der Kompetenz", + "Start Date": "Ufanksdatum", + "Starting value for all characters": "Startwäert fir all Personnagen", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Systemmeldung", + "Unique Artifact": "Eenzegaartegt Artefakt", + "Unique Condition": "Eenzegaartegen Zoustand", + "XP Amount": "Unzuel un Erfarungspunkten", + "XP Award": "XP-Verginn" }, "plurals": {} } diff --git a/l10n/lt.js b/l10n/lt.js index 31b9e2fd..37fa7db5 100644 --- a/l10n/lt.js +++ b/l10n/lt.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Nėra — tai pagrindinis įgūdis.", "Where the automation lives": "Kur gyvena automatizavimas", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows yra tai, kas vyksta niekam nespaudžiant: priminimas prieš pasibaigiant terminui, patvirtinimas pateikus. Čia juos skaitai ir redaguoji — dabar nieko kurti nereikia.", - "Open Flows in the menu": "Atverkite Flows meniu" + "Open Flows in the menu": "Atverkite Flows meniu", + "Ability Name": "Gebėjimo pavadinimas", + "Affected Characters": "Paveikti personažai", + "Amount of copper pieces": "Varinių monetų skaičius", + "Amount of gold pieces": "Auksinių monetų skaičius", + "Amount of silver pieces": "Sidabrinių monetų skaičius", + "Automatic system notices": "Automatiniai sistemos pranešimai", + "Award Reason": "Skyrimo priežastis", + "Awarded At": "Skirta", + "Awarded By": "Skyrė", + "Background Story": "Kilmės istorija", + "Base Value": "Bazinė reikšmė", + "Character Card": "Personažo kortelė", + "Character Name": "Personažo vardas", + "Checked In At": "Atvykimas užregistruotas", + "Checked In By": "Atvykimą užregistravo", + "Condition Name": "Būsenos pavadinimas", + "Contact email address": "Kontaktinis el. pašto adresas", + "Copper Pieces": "Varinės monetos", + "Effect Name": "Efekto pavadinimas", + "End Date": "Pabaigos data", + "Event Name": "Renginio pavadinimas", + "Event description": "Renginio aprašymas", + "Event end date and time": "Renginio pabaigos data ir laikas", + "Event location": "Renginio vieta", + "Event name": "Renginio pavadinimas", + "Event start date and time": "Renginio pradžios data ir laikas", + "Faith": "Tikėjimas", + "Full name of the player": "Visas žaidėjo vardas", + "Game Master Notes (Private)": "Žaidimo vedėjo pastabos (privačios)", + "Game Master Notes (Public)": "Žaidimo vedėjo pastabos (viešos)", + "Gold Pieces": "Auksinės monetos", + "Item Name": "Daikto pavadinimas", + "Items and Money": "Daiktai ir pinigai", + "Mechanical Effect": "Žaidimo efektas", + "Modifier Value": "Modifikatoriaus reikšmė", + "Name of the condition": "Būsenos pavadinimas", + "Name of the effect": "Efekto pavadinimas", + "Name of the event": "Renginio pavadinimas", + "Name of the item": "Daikto pavadinimas", + "Name of the skill": "Įgūdžio pavadinimas", + "Name of the stat": "Savybės pavadinimas", + "Nextcloud user": "Nextcloud naudotojas", + "Notes about items and money": "Pastabos apie daiktus ir pinigus", + "Notes about the player": "Pastabos apie žaidėją", + "Overridden At": "Išimtis suteikta", + "Overridden By": "Išimtį suteikė", + "Override Reason": "Išimties priežastis", + "Owner": "Savininkas", + "Owner UID": "Savininko UID", + "Participating Characters": "Dalyvaujantys personažai", + "Player Name": "Žaidėjo vardas", + "Post-Event Effects": "Efektai po renginio", + "Real name of the player": "Tikrasis žaidėjo vardas", + "Required Conditions": "Reikalingos būsenos", + "Required Effects": "Reikalingi efektai", + "Required Score": "Reikalinga reikšmė", + "Required Skills": "Reikalingi įgūdžiai", + "Required Stats": "Reikalingos savybės", + "Requirement Overrides": "Būtinų sąlygų išimtys", + "Setting Name": "Žaidimo pasaulio pavadinimas", + "Silver Pieces": "Sidabrinės monetos", + "Skill Name": "Įgūdžio pavadinimas", + "Start Date": "Pradžios data", + "Starting value for all characters": "Pradinė reikšmė visiems personažams", + "Stat": "Savybė", + "Status": "Statusas", + "System Notice": "Sistemos pranešimas", + "Unique Artifact": "Unikalus artefaktas", + "Unique Condition": "Unikali būsena", + "XP Amount": "Patirties taškų skaičius", + "XP Award": "Patirties taškų skyrimas" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lt.json b/l10n/lt.json index 45bd5f39..c980e6f2 100644 --- a/l10n/lt.json +++ b/l10n/lt.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Nėra — tai pagrindinis įgūdis.", "Where the automation lives": "Kur gyvena automatizavimas", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows yra tai, kas vyksta niekam nespaudžiant: priminimas prieš pasibaigiant terminui, patvirtinimas pateikus. Čia juos skaitai ir redaguoji — dabar nieko kurti nereikia.", - "Open Flows in the menu": "Atverkite Flows meniu" + "Open Flows in the menu": "Atverkite Flows meniu", + "Ability Name": "Gebėjimo pavadinimas", + "Affected Characters": "Paveikti personažai", + "Amount of copper pieces": "Varinių monetų skaičius", + "Amount of gold pieces": "Auksinių monetų skaičius", + "Amount of silver pieces": "Sidabrinių monetų skaičius", + "Automatic system notices": "Automatiniai sistemos pranešimai", + "Award Reason": "Skyrimo priežastis", + "Awarded At": "Skirta", + "Awarded By": "Skyrė", + "Background Story": "Kilmės istorija", + "Base Value": "Bazinė reikšmė", + "Character Card": "Personažo kortelė", + "Character Name": "Personažo vardas", + "Checked In At": "Atvykimas užregistruotas", + "Checked In By": "Atvykimą užregistravo", + "Condition Name": "Būsenos pavadinimas", + "Contact email address": "Kontaktinis el. pašto adresas", + "Copper Pieces": "Varinės monetos", + "Effect Name": "Efekto pavadinimas", + "End Date": "Pabaigos data", + "Event Name": "Renginio pavadinimas", + "Event description": "Renginio aprašymas", + "Event end date and time": "Renginio pabaigos data ir laikas", + "Event location": "Renginio vieta", + "Event name": "Renginio pavadinimas", + "Event start date and time": "Renginio pradžios data ir laikas", + "Faith": "Tikėjimas", + "Full name of the player": "Visas žaidėjo vardas", + "Game Master Notes (Private)": "Žaidimo vedėjo pastabos (privačios)", + "Game Master Notes (Public)": "Žaidimo vedėjo pastabos (viešos)", + "Gold Pieces": "Auksinės monetos", + "Item Name": "Daikto pavadinimas", + "Items and Money": "Daiktai ir pinigai", + "Mechanical Effect": "Žaidimo efektas", + "Modifier Value": "Modifikatoriaus reikšmė", + "Name of the condition": "Būsenos pavadinimas", + "Name of the effect": "Efekto pavadinimas", + "Name of the event": "Renginio pavadinimas", + "Name of the item": "Daikto pavadinimas", + "Name of the skill": "Įgūdžio pavadinimas", + "Name of the stat": "Savybės pavadinimas", + "Nextcloud user": "Nextcloud naudotojas", + "Notes about items and money": "Pastabos apie daiktus ir pinigus", + "Notes about the player": "Pastabos apie žaidėją", + "Overridden At": "Išimtis suteikta", + "Overridden By": "Išimtį suteikė", + "Override Reason": "Išimties priežastis", + "Owner": "Savininkas", + "Owner UID": "Savininko UID", + "Participating Characters": "Dalyvaujantys personažai", + "Player Name": "Žaidėjo vardas", + "Post-Event Effects": "Efektai po renginio", + "Real name of the player": "Tikrasis žaidėjo vardas", + "Required Conditions": "Reikalingos būsenos", + "Required Effects": "Reikalingi efektai", + "Required Score": "Reikalinga reikšmė", + "Required Skills": "Reikalingi įgūdžiai", + "Required Stats": "Reikalingos savybės", + "Requirement Overrides": "Būtinų sąlygų išimtys", + "Setting Name": "Žaidimo pasaulio pavadinimas", + "Silver Pieces": "Sidabrinės monetos", + "Skill Name": "Įgūdžio pavadinimas", + "Start Date": "Pradžios data", + "Starting value for all characters": "Pradinė reikšmė visiems personažams", + "Stat": "Savybė", + "Status": "Statusas", + "System Notice": "Sistemos pranešimas", + "Unique Artifact": "Unikalus artefaktas", + "Unique Condition": "Unikali būsena", + "XP Amount": "Patirties taškų skaičius", + "XP Award": "Patirties taškų skyrimas" }, "plurals": {} } diff --git a/l10n/lv.js b/l10n/lv.js index 11d9d873..f592a8e6 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Nav — šī ir pamatprasme.", "Where the automation lives": "Kur mīt automatizācija", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows ir tas, kas notiek, nevienam neklikšķinot: atgādinājums pirms termiņa beigām, apstiprinājums pēc iesniegšanas. Šeit tos lasi un rediģē — tagad nekas nav jābūvē.", - "Open Flows in the menu": "Atver Flows izvēlnē" + "Open Flows in the menu": "Atver Flows izvēlnē", + "Ability Name": "Spējas nosaukums", + "Affected Characters": "Ietekmētie tēli", + "Amount of copper pieces": "Vara monētu skaits", + "Amount of gold pieces": "Zelta monētu skaits", + "Amount of silver pieces": "Sudraba monētu skaits", + "Automatic system notices": "Automātiski sistēmas paziņojumi", + "Award Reason": "Piešķiršanas iemesls", + "Awarded At": "Piešķirts", + "Awarded By": "Piešķīra", + "Background Story": "Priekšvēstures stāsts", + "Base Value": "Bāzes vērtība", + "Character Card": "Tēla kartīte", + "Character Name": "Tēla vārds", + "Checked In At": "Ierašanās reģistrēta", + "Checked In By": "Ierašanos reģistrēja", + "Condition Name": "Stāvokļa nosaukums", + "Contact email address": "Kontaktu e-pasta adrese", + "Copper Pieces": "Vara monētas", + "Effect Name": "Efekta nosaukums", + "End Date": "Beigu datums", + "Event Name": "Notikuma nosaukums", + "Event description": "Notikuma apraksts", + "Event end date and time": "Notikuma beigu datums un laiks", + "Event location": "Notikuma norises vieta", + "Event name": "Notikuma nosaukums", + "Event start date and time": "Notikuma sākuma datums un laiks", + "Faith": "Ticība", + "Full name of the player": "Spēlētāja pilns vārds", + "Game Master Notes (Private)": "Spēles vadītāja piezīmes (privātas)", + "Game Master Notes (Public)": "Spēles vadītāja piezīmes (publiskas)", + "Gold Pieces": "Zelta monētas", + "Item Name": "Priekšmeta nosaukums", + "Items and Money": "Priekšmeti un nauda", + "Mechanical Effect": "Spēles efekts", + "Modifier Value": "Modifikatora vērtība", + "Name of the condition": "Stāvokļa nosaukums", + "Name of the effect": "Efekta nosaukums", + "Name of the event": "Notikuma nosaukums", + "Name of the item": "Priekšmeta nosaukums", + "Name of the skill": "Prasmes nosaukums", + "Name of the stat": "Īpašības nosaukums", + "Nextcloud user": "Nextcloud lietotājs", + "Notes about items and money": "Piezīmes par priekšmetiem un naudu", + "Notes about the player": "Piezīmes par spēlētāju", + "Overridden At": "Izņēmums piešķirts", + "Overridden By": "Izņēmumu piešķīra", + "Override Reason": "Izņēmuma iemesls", + "Owner": "Īpašnieks", + "Owner UID": "Īpašnieka UID", + "Participating Characters": "Iesaistītie tēli", + "Player Name": "Spēlētāja vārds", + "Post-Event Effects": "Efekti pēc notikuma", + "Real name of the player": "Spēlētāja īstais vārds", + "Required Conditions": "Nepieciešamie stāvokļi", + "Required Effects": "Nepieciešamie efekti", + "Required Score": "Nepieciešamā vērtība", + "Required Skills": "Nepieciešamās prasmes", + "Required Stats": "Nepieciešamās īpašības", + "Requirement Overrides": "Izņēmumi no priekšnosacījumiem", + "Setting Name": "Spēles pasaules nosaukums", + "Silver Pieces": "Sudraba monētas", + "Skill Name": "Prasmes nosaukums", + "Start Date": "Sākuma datums", + "Starting value for all characters": "Sākuma vērtība visiem tēliem", + "Stat": "Īpašība", + "Status": "Statuss", + "System Notice": "Sistēmas paziņojums", + "Unique Artifact": "Unikāls artefakts", + "Unique Condition": "Unikāls stāvoklis", + "XP Amount": "Pieredzes punktu skaits", + "XP Award": "Pieredzes punktu piešķiršana" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lv.json b/l10n/lv.json index f170bec5..48ff2b60 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Nav — šī ir pamatprasme.", "Where the automation lives": "Kur mīt automatizācija", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows ir tas, kas notiek, nevienam neklikšķinot: atgādinājums pirms termiņa beigām, apstiprinājums pēc iesniegšanas. Šeit tos lasi un rediģē — tagad nekas nav jābūvē.", - "Open Flows in the menu": "Atver Flows izvēlnē" + "Open Flows in the menu": "Atver Flows izvēlnē", + "Ability Name": "Spējas nosaukums", + "Affected Characters": "Ietekmētie tēli", + "Amount of copper pieces": "Vara monētu skaits", + "Amount of gold pieces": "Zelta monētu skaits", + "Amount of silver pieces": "Sudraba monētu skaits", + "Automatic system notices": "Automātiski sistēmas paziņojumi", + "Award Reason": "Piešķiršanas iemesls", + "Awarded At": "Piešķirts", + "Awarded By": "Piešķīra", + "Background Story": "Priekšvēstures stāsts", + "Base Value": "Bāzes vērtība", + "Character Card": "Tēla kartīte", + "Character Name": "Tēla vārds", + "Checked In At": "Ierašanās reģistrēta", + "Checked In By": "Ierašanos reģistrēja", + "Condition Name": "Stāvokļa nosaukums", + "Contact email address": "Kontaktu e-pasta adrese", + "Copper Pieces": "Vara monētas", + "Effect Name": "Efekta nosaukums", + "End Date": "Beigu datums", + "Event Name": "Notikuma nosaukums", + "Event description": "Notikuma apraksts", + "Event end date and time": "Notikuma beigu datums un laiks", + "Event location": "Notikuma norises vieta", + "Event name": "Notikuma nosaukums", + "Event start date and time": "Notikuma sākuma datums un laiks", + "Faith": "Ticība", + "Full name of the player": "Spēlētāja pilns vārds", + "Game Master Notes (Private)": "Spēles vadītāja piezīmes (privātas)", + "Game Master Notes (Public)": "Spēles vadītāja piezīmes (publiskas)", + "Gold Pieces": "Zelta monētas", + "Item Name": "Priekšmeta nosaukums", + "Items and Money": "Priekšmeti un nauda", + "Mechanical Effect": "Spēles efekts", + "Modifier Value": "Modifikatora vērtība", + "Name of the condition": "Stāvokļa nosaukums", + "Name of the effect": "Efekta nosaukums", + "Name of the event": "Notikuma nosaukums", + "Name of the item": "Priekšmeta nosaukums", + "Name of the skill": "Prasmes nosaukums", + "Name of the stat": "Īpašības nosaukums", + "Nextcloud user": "Nextcloud lietotājs", + "Notes about items and money": "Piezīmes par priekšmetiem un naudu", + "Notes about the player": "Piezīmes par spēlētāju", + "Overridden At": "Izņēmums piešķirts", + "Overridden By": "Izņēmumu piešķīra", + "Override Reason": "Izņēmuma iemesls", + "Owner": "Īpašnieks", + "Owner UID": "Īpašnieka UID", + "Participating Characters": "Iesaistītie tēli", + "Player Name": "Spēlētāja vārds", + "Post-Event Effects": "Efekti pēc notikuma", + "Real name of the player": "Spēlētāja īstais vārds", + "Required Conditions": "Nepieciešamie stāvokļi", + "Required Effects": "Nepieciešamie efekti", + "Required Score": "Nepieciešamā vērtība", + "Required Skills": "Nepieciešamās prasmes", + "Required Stats": "Nepieciešamās īpašības", + "Requirement Overrides": "Izņēmumi no priekšnosacījumiem", + "Setting Name": "Spēles pasaules nosaukums", + "Silver Pieces": "Sudraba monētas", + "Skill Name": "Prasmes nosaukums", + "Start Date": "Sākuma datums", + "Starting value for all characters": "Sākuma vērtība visiem tēliem", + "Stat": "Īpašība", + "Status": "Statuss", + "System Notice": "Sistēmas paziņojums", + "Unique Artifact": "Unikāls artefakts", + "Unique Condition": "Unikāls stāvoklis", + "XP Amount": "Pieredzes punktu skaits", + "XP Award": "Pieredzes punktu piešķiršana" }, "plurals": {} } diff --git a/l10n/mk.js b/l10n/mk.js index 135fe690..e66ee76a 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Нема — ова е основна вештина.", "Where the automation lives": "Каде живее автоматизацијата", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows е тоа што се случува без некој да кликне: потсетник пред да истече рокот, потврда при поднесување. Тука ги читаш и ги уредуваш — сега нема што да се гради.", - "Open Flows in the menu": "Отвори Flows во менито" + "Open Flows in the menu": "Отвори Flows во менито", + "Ability Name": "Име на способноста", + "Affected Characters": "Засегнати ликови", + "Amount of copper pieces": "Број на бакарни монети", + "Amount of gold pieces": "Број на златни монети", + "Amount of silver pieces": "Број на сребрени монети", + "Automatic system notices": "Автоматски системски известувања", + "Award Reason": "Причина за доделувањето", + "Awarded At": "Доделено на", + "Awarded By": "Доделено од", + "Background Story": "Приказна за потеклото", + "Base Value": "Основна вредност", + "Character Card": "Картичка на ликот", + "Character Name": "Име на ликот", + "Checked In At": "Пристигнувањето е забележано на", + "Checked In By": "Пристигнувањето го забележа", + "Condition Name": "Име на состојбата", + "Contact email address": "Контакт адреса за е-пошта", + "Copper Pieces": "Бакарни монети", + "Effect Name": "Име на ефектот", + "End Date": "Датум на завршеток", + "Event Name": "Име на настанот", + "Event description": "Опис на настанот", + "Event end date and time": "Датум и време на завршеток на настанот", + "Event location": "Место на настанот", + "Event name": "Име на настанот", + "Event start date and time": "Датум и време на почеток на настанот", + "Faith": "Вера", + "Full name of the player": "Целосно име на играчот", + "Game Master Notes (Private)": "Белешки на водачот на играта (приватни)", + "Game Master Notes (Public)": "Белешки на водачот на играта (јавни)", + "Gold Pieces": "Златни монети", + "Item Name": "Име на предметот", + "Items and Money": "Предмети и пари", + "Mechanical Effect": "Ефект во играта", + "Modifier Value": "Вредност на модификаторот", + "Name of the condition": "Име на состојбата", + "Name of the effect": "Име на ефектот", + "Name of the event": "Име на настанот", + "Name of the item": "Име на предметот", + "Name of the skill": "Име на вештината", + "Name of the stat": "Име на својството", + "Nextcloud user": "Nextcloud корисник", + "Notes about items and money": "Белешки за предметите и парите", + "Notes about the player": "Белешки за играчот", + "Overridden At": "Исклучокот е одобрен на", + "Overridden By": "Исклучокот го одобри", + "Override Reason": "Причина за исклучокот", + "Owner": "Сопственик", + "Owner UID": "UID на сопственикот", + "Participating Characters": "Ликови што учествуваат", + "Player Name": "Име на играчот", + "Post-Event Effects": "Ефекти по настанот", + "Real name of the player": "Вистинско име на играчот", + "Required Conditions": "Потребни состојби", + "Required Effects": "Потребни ефекти", + "Required Score": "Потребна вредност", + "Required Skills": "Потребни вештини", + "Required Stats": "Потребни својства", + "Requirement Overrides": "Исклучоци од предусловите", + "Setting Name": "Име на светот на играта", + "Silver Pieces": "Сребрени монети", + "Skill Name": "Име на вештината", + "Start Date": "Датум на почеток", + "Starting value for all characters": "Почетна вредност за сите ликови", + "Stat": "Својство", + "Status": "Статус", + "System Notice": "Системско известување", + "Unique Artifact": "Уникатен артефакт", + "Unique Condition": "Уникатна состојба", + "XP Amount": "Број на поени искуство", + "XP Award": "Доделување поени искуство" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mk.json b/l10n/mk.json index 7e5af06e..98e34663 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Нема — ова е основна вештина.", "Where the automation lives": "Каде живее автоматизацијата", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows е тоа што се случува без некој да кликне: потсетник пред да истече рокот, потврда при поднесување. Тука ги читаш и ги уредуваш — сега нема што да се гради.", - "Open Flows in the menu": "Отвори Flows во менито" + "Open Flows in the menu": "Отвори Flows во менито", + "Ability Name": "Име на способноста", + "Affected Characters": "Засегнати ликови", + "Amount of copper pieces": "Број на бакарни монети", + "Amount of gold pieces": "Број на златни монети", + "Amount of silver pieces": "Број на сребрени монети", + "Automatic system notices": "Автоматски системски известувања", + "Award Reason": "Причина за доделувањето", + "Awarded At": "Доделено на", + "Awarded By": "Доделено од", + "Background Story": "Приказна за потеклото", + "Base Value": "Основна вредност", + "Character Card": "Картичка на ликот", + "Character Name": "Име на ликот", + "Checked In At": "Пристигнувањето е забележано на", + "Checked In By": "Пристигнувањето го забележа", + "Condition Name": "Име на состојбата", + "Contact email address": "Контакт адреса за е-пошта", + "Copper Pieces": "Бакарни монети", + "Effect Name": "Име на ефектот", + "End Date": "Датум на завршеток", + "Event Name": "Име на настанот", + "Event description": "Опис на настанот", + "Event end date and time": "Датум и време на завршеток на настанот", + "Event location": "Место на настанот", + "Event name": "Име на настанот", + "Event start date and time": "Датум и време на почеток на настанот", + "Faith": "Вера", + "Full name of the player": "Целосно име на играчот", + "Game Master Notes (Private)": "Белешки на водачот на играта (приватни)", + "Game Master Notes (Public)": "Белешки на водачот на играта (јавни)", + "Gold Pieces": "Златни монети", + "Item Name": "Име на предметот", + "Items and Money": "Предмети и пари", + "Mechanical Effect": "Ефект во играта", + "Modifier Value": "Вредност на модификаторот", + "Name of the condition": "Име на состојбата", + "Name of the effect": "Име на ефектот", + "Name of the event": "Име на настанот", + "Name of the item": "Име на предметот", + "Name of the skill": "Име на вештината", + "Name of the stat": "Име на својството", + "Nextcloud user": "Nextcloud корисник", + "Notes about items and money": "Белешки за предметите и парите", + "Notes about the player": "Белешки за играчот", + "Overridden At": "Исклучокот е одобрен на", + "Overridden By": "Исклучокот го одобри", + "Override Reason": "Причина за исклучокот", + "Owner": "Сопственик", + "Owner UID": "UID на сопственикот", + "Participating Characters": "Ликови што учествуваат", + "Player Name": "Име на играчот", + "Post-Event Effects": "Ефекти по настанот", + "Real name of the player": "Вистинско име на играчот", + "Required Conditions": "Потребни состојби", + "Required Effects": "Потребни ефекти", + "Required Score": "Потребна вредност", + "Required Skills": "Потребни вештини", + "Required Stats": "Потребни својства", + "Requirement Overrides": "Исклучоци од предусловите", + "Setting Name": "Име на светот на играта", + "Silver Pieces": "Сребрени монети", + "Skill Name": "Име на вештината", + "Start Date": "Датум на почеток", + "Starting value for all characters": "Почетна вредност за сите ликови", + "Stat": "Својство", + "Status": "Статус", + "System Notice": "Системско известување", + "Unique Artifact": "Уникатен артефакт", + "Unique Condition": "Уникатна состојба", + "XP Amount": "Број на поени искуство", + "XP Award": "Доделување поени искуство" }, "plurals": {} } diff --git a/l10n/mt.js b/l10n/mt.js index 2edd4365..840d2b1e 100644 --- a/l10n/mt.js +++ b/l10n/mt.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "L-ebda waħda — din hija ħila bażika.", "Where the automation lives": "Fejn tgħix l-awtomazzjoni", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Il-Flows huma dak li jiġri mingħajr ma jikklikkja ħadd: tfakkira qabel ma jiskadi terminu, konferma mal-preżentazzjoni. Hawn taqrahom u teditjahom — m'hemm xejn x'tibni issa.", - "Open Flows in the menu": "Iftaħ Flows fil-menu" + "Open Flows in the menu": "Iftaħ Flows fil-menu", + "Ability Name": "Isem tal-abbiltà", + "Affected Characters": "Karattri affettwati", + "Amount of copper pieces": "Ammont ta' muniti tar-ram", + "Amount of gold pieces": "Ammont ta' muniti tad-deheb", + "Amount of silver pieces": "Ammont ta' muniti tal-fidda", + "Automatic system notices": "Avviżi awtomatiċi tas-sistema", + "Award Reason": "Raġuni għall-għoti", + "Awarded At": "Mogħti fi", + "Awarded By": "Mogħti minn", + "Background Story": "Storja tal-isfond", + "Base Value": "Valur bażi", + "Character Card": "Karta tal-karattru", + "Character Name": "Isem tal-karattru", + "Checked In At": "Wasla rreġistrata fi", + "Checked In By": "Wasla rreġistrata minn", + "Condition Name": "Isem tal-kundizzjoni", + "Contact email address": "Indirizz tal-email għall-kuntatt", + "Copper Pieces": "Muniti tar-ram", + "Effect Name": "Isem tal-effett", + "End Date": "Data tat-tmiem", + "Event Name": "Isem tal-avveniment", + "Event description": "Deskrizzjoni tal-avveniment", + "Event end date and time": "Data u ħin tat-tmiem tal-avveniment", + "Event location": "Post tal-avveniment", + "Event name": "Isem tal-avveniment", + "Event start date and time": "Data u ħin tal-bidu tal-avveniment", + "Faith": "Fidi", + "Full name of the player": "Isem sħiħ tal-plejer", + "Game Master Notes (Private)": "Noti tal-mexxej tal-logħba (privati)", + "Game Master Notes (Public)": "Noti tal-mexxej tal-logħba (pubbliċi)", + "Gold Pieces": "Muniti tad-deheb", + "Item Name": "Isem tal-oġġett", + "Items and Money": "Oġġetti u flus", + "Mechanical Effect": "Effett fil-logħba", + "Modifier Value": "Valur tal-modifikatur", + "Name of the condition": "Isem tal-kundizzjoni", + "Name of the effect": "Isem tal-effett", + "Name of the event": "Isem tal-avveniment", + "Name of the item": "Isem tal-oġġett", + "Name of the skill": "Isem tal-ħila", + "Name of the stat": "Isem tal-attribut", + "Nextcloud user": "Utent ta' Nextcloud", + "Notes about items and money": "Noti dwar l-oġġetti u l-flus", + "Notes about the player": "Noti dwar il-plejer", + "Overridden At": "Eċċezzjoni mogħtija fi", + "Overridden By": "Eċċezzjoni mogħtija minn", + "Override Reason": "Raġuni għall-eċċezzjoni", + "Owner": "Sid", + "Owner UID": "UID tas-sid", + "Participating Characters": "Karattri parteċipanti", + "Player Name": "Isem tal-plejer", + "Post-Event Effects": "Effetti wara l-avveniment", + "Real name of the player": "Isem reali tal-plejer", + "Required Conditions": "Kundizzjonijiet meħtieġa", + "Required Effects": "Effetti meħtieġa", + "Required Score": "Valur meħtieġ", + "Required Skills": "Ħiliet meħtieġa", + "Required Stats": "Attributi meħtieġa", + "Requirement Overrides": "Eċċezzjonijiet mill-prerekwiżiti", + "Setting Name": "Isem tad-dinja tal-logħba", + "Silver Pieces": "Muniti tal-fidda", + "Skill Name": "Isem tal-ħila", + "Start Date": "Data tal-bidu", + "Starting value for all characters": "Valur inizjali għall-karattri kollha", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Avviż tas-sistema", + "Unique Artifact": "Artefatt uniku", + "Unique Condition": "Kundizzjoni unika", + "XP Amount": "Ammont ta' punti ta' esperjenza", + "XP Award": "Għoti ta' punti ta' esperjenza" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mt.json b/l10n/mt.json index 67100322..b44fa30b 100644 --- a/l10n/mt.json +++ b/l10n/mt.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "L-ebda waħda — din hija ħila bażika.", "Where the automation lives": "Fejn tgħix l-awtomazzjoni", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Il-Flows huma dak li jiġri mingħajr ma jikklikkja ħadd: tfakkira qabel ma jiskadi terminu, konferma mal-preżentazzjoni. Hawn taqrahom u teditjahom — m'hemm xejn x'tibni issa.", - "Open Flows in the menu": "Iftaħ Flows fil-menu" + "Open Flows in the menu": "Iftaħ Flows fil-menu", + "Ability Name": "Isem tal-abbiltà", + "Affected Characters": "Karattri affettwati", + "Amount of copper pieces": "Ammont ta' muniti tar-ram", + "Amount of gold pieces": "Ammont ta' muniti tad-deheb", + "Amount of silver pieces": "Ammont ta' muniti tal-fidda", + "Automatic system notices": "Avviżi awtomatiċi tas-sistema", + "Award Reason": "Raġuni għall-għoti", + "Awarded At": "Mogħti fi", + "Awarded By": "Mogħti minn", + "Background Story": "Storja tal-isfond", + "Base Value": "Valur bażi", + "Character Card": "Karta tal-karattru", + "Character Name": "Isem tal-karattru", + "Checked In At": "Wasla rreġistrata fi", + "Checked In By": "Wasla rreġistrata minn", + "Condition Name": "Isem tal-kundizzjoni", + "Contact email address": "Indirizz tal-email għall-kuntatt", + "Copper Pieces": "Muniti tar-ram", + "Effect Name": "Isem tal-effett", + "End Date": "Data tat-tmiem", + "Event Name": "Isem tal-avveniment", + "Event description": "Deskrizzjoni tal-avveniment", + "Event end date and time": "Data u ħin tat-tmiem tal-avveniment", + "Event location": "Post tal-avveniment", + "Event name": "Isem tal-avveniment", + "Event start date and time": "Data u ħin tal-bidu tal-avveniment", + "Faith": "Fidi", + "Full name of the player": "Isem sħiħ tal-plejer", + "Game Master Notes (Private)": "Noti tal-mexxej tal-logħba (privati)", + "Game Master Notes (Public)": "Noti tal-mexxej tal-logħba (pubbliċi)", + "Gold Pieces": "Muniti tad-deheb", + "Item Name": "Isem tal-oġġett", + "Items and Money": "Oġġetti u flus", + "Mechanical Effect": "Effett fil-logħba", + "Modifier Value": "Valur tal-modifikatur", + "Name of the condition": "Isem tal-kundizzjoni", + "Name of the effect": "Isem tal-effett", + "Name of the event": "Isem tal-avveniment", + "Name of the item": "Isem tal-oġġett", + "Name of the skill": "Isem tal-ħila", + "Name of the stat": "Isem tal-attribut", + "Nextcloud user": "Utent ta' Nextcloud", + "Notes about items and money": "Noti dwar l-oġġetti u l-flus", + "Notes about the player": "Noti dwar il-plejer", + "Overridden At": "Eċċezzjoni mogħtija fi", + "Overridden By": "Eċċezzjoni mogħtija minn", + "Override Reason": "Raġuni għall-eċċezzjoni", + "Owner": "Sid", + "Owner UID": "UID tas-sid", + "Participating Characters": "Karattri parteċipanti", + "Player Name": "Isem tal-plejer", + "Post-Event Effects": "Effetti wara l-avveniment", + "Real name of the player": "Isem reali tal-plejer", + "Required Conditions": "Kundizzjonijiet meħtieġa", + "Required Effects": "Effetti meħtieġa", + "Required Score": "Valur meħtieġ", + "Required Skills": "Ħiliet meħtieġa", + "Required Stats": "Attributi meħtieġa", + "Requirement Overrides": "Eċċezzjonijiet mill-prerekwiżiti", + "Setting Name": "Isem tad-dinja tal-logħba", + "Silver Pieces": "Muniti tal-fidda", + "Skill Name": "Isem tal-ħila", + "Start Date": "Data tal-bidu", + "Starting value for all characters": "Valur inizjali għall-karattri kollha", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Avviż tas-sistema", + "Unique Artifact": "Artefatt uniku", + "Unique Condition": "Kundizzjoni unika", + "XP Amount": "Ammont ta' punti ta' esperjenza", + "XP Award": "Għoti ta' punti ta' esperjenza" }, "plurals": {} } diff --git a/l10n/nb.js b/l10n/nb.js index 26e8c719..03fd0532 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Ingen — dette er en grunnferdighet.", "Where the automation lives": "Der automatiseringen bor", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows er det som skjer uten at noen klikker: en påminnelse før en frist går ut, en bekreftelse ved innsending. Her leser og redigerer du dem — det er ingenting å bygge nå.", - "Open Flows in the menu": "Åpne Flows i menyen" + "Open Flows in the menu": "Åpne Flows i menyen", + "Ability Name": "Navn på egenskapen", + "Affected Characters": "Berørte karakterer", + "Amount of copper pieces": "Antall kobberstykker", + "Amount of gold pieces": "Antall gullstykker", + "Amount of silver pieces": "Antall sølvstykker", + "Automatic system notices": "Automatiske systemmeldinger", + "Award Reason": "Årsak til tildelingen", + "Awarded At": "Tildelt den", + "Awarded By": "Tildelt av", + "Background Story": "Bakgrunnshistorie", + "Base Value": "Grunnverdi", + "Character Card": "Karakterkort", + "Character Name": "Navn på karakteren", + "Checked In At": "Sjekket inn den", + "Checked In By": "Sjekket inn av", + "Condition Name": "Navn på tilstanden", + "Contact email address": "E-postadresse for kontakt", + "Copper Pieces": "Kobberstykker", + "Effect Name": "Navn på effekten", + "End Date": "Sluttdato", + "Event Name": "Navn på arrangementet", + "Event description": "Beskrivelse av arrangementet", + "Event end date and time": "Sluttdato og -tid for arrangementet", + "Event location": "Sted for arrangementet", + "Event name": "Navn på arrangementet", + "Event start date and time": "Startdato og -tid for arrangementet", + "Faith": "Tro", + "Full name of the player": "Spillerens fulle navn", + "Game Master Notes (Private)": "Spillederens notater (private)", + "Game Master Notes (Public)": "Spillederens notater (offentlige)", + "Gold Pieces": "Gullstykker", + "Item Name": "Navn på gjenstanden", + "Items and Money": "Gjenstander og penger", + "Mechanical Effect": "Spillteknisk effekt", + "Modifier Value": "Modifikatorens verdi", + "Name of the condition": "Navn på tilstanden", + "Name of the effect": "Navn på effekten", + "Name of the event": "Navn på arrangementet", + "Name of the item": "Navn på gjenstanden", + "Name of the skill": "Navn på ferdigheten", + "Name of the stat": "Navn på attributtet", + "Nextcloud user": "Nextcloud-bruker", + "Notes about items and money": "Notater om gjenstander og penger", + "Notes about the player": "Notater om spilleren", + "Overridden At": "Overstyrt den", + "Overridden By": "Overstyrt av", + "Override Reason": "Årsak til overstyringen", + "Owner": "Eier", + "Owner UID": "Eierens UID", + "Participating Characters": "Deltakende karakterer", + "Player Name": "Navn på spilleren", + "Post-Event Effects": "Effekter etter arrangementet", + "Real name of the player": "Spillerens virkelige navn", + "Required Conditions": "Nødvendige tilstander", + "Required Effects": "Nødvendige effekter", + "Required Score": "Nødvendig verdi", + "Required Skills": "Nødvendige ferdigheter", + "Required Stats": "Nødvendige attributter", + "Requirement Overrides": "Overstyrte forutsetninger", + "Setting Name": "Navn på spillverdenen", + "Silver Pieces": "Sølvstykker", + "Skill Name": "Navn på ferdigheten", + "Start Date": "Startdato", + "Starting value for all characters": "Startverdi for alle karakterer", + "Stat": "Attributt", + "Status": "Status", + "System Notice": "Systemmelding", + "Unique Artifact": "Unik artefakt", + "Unique Condition": "Unik tilstand", + "XP Amount": "Antall erfaringspoeng", + "XP Award": "XP-tildeling" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nb.json b/l10n/nb.json index be13fb2c..777c319e 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Ingen — dette er en grunnferdighet.", "Where the automation lives": "Der automatiseringen bor", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows er det som skjer uten at noen klikker: en påminnelse før en frist går ut, en bekreftelse ved innsending. Her leser og redigerer du dem — det er ingenting å bygge nå.", - "Open Flows in the menu": "Åpne Flows i menyen" + "Open Flows in the menu": "Åpne Flows i menyen", + "Ability Name": "Navn på egenskapen", + "Affected Characters": "Berørte karakterer", + "Amount of copper pieces": "Antall kobberstykker", + "Amount of gold pieces": "Antall gullstykker", + "Amount of silver pieces": "Antall sølvstykker", + "Automatic system notices": "Automatiske systemmeldinger", + "Award Reason": "Årsak til tildelingen", + "Awarded At": "Tildelt den", + "Awarded By": "Tildelt av", + "Background Story": "Bakgrunnshistorie", + "Base Value": "Grunnverdi", + "Character Card": "Karakterkort", + "Character Name": "Navn på karakteren", + "Checked In At": "Sjekket inn den", + "Checked In By": "Sjekket inn av", + "Condition Name": "Navn på tilstanden", + "Contact email address": "E-postadresse for kontakt", + "Copper Pieces": "Kobberstykker", + "Effect Name": "Navn på effekten", + "End Date": "Sluttdato", + "Event Name": "Navn på arrangementet", + "Event description": "Beskrivelse av arrangementet", + "Event end date and time": "Sluttdato og -tid for arrangementet", + "Event location": "Sted for arrangementet", + "Event name": "Navn på arrangementet", + "Event start date and time": "Startdato og -tid for arrangementet", + "Faith": "Tro", + "Full name of the player": "Spillerens fulle navn", + "Game Master Notes (Private)": "Spillederens notater (private)", + "Game Master Notes (Public)": "Spillederens notater (offentlige)", + "Gold Pieces": "Gullstykker", + "Item Name": "Navn på gjenstanden", + "Items and Money": "Gjenstander og penger", + "Mechanical Effect": "Spillteknisk effekt", + "Modifier Value": "Modifikatorens verdi", + "Name of the condition": "Navn på tilstanden", + "Name of the effect": "Navn på effekten", + "Name of the event": "Navn på arrangementet", + "Name of the item": "Navn på gjenstanden", + "Name of the skill": "Navn på ferdigheten", + "Name of the stat": "Navn på attributtet", + "Nextcloud user": "Nextcloud-bruker", + "Notes about items and money": "Notater om gjenstander og penger", + "Notes about the player": "Notater om spilleren", + "Overridden At": "Overstyrt den", + "Overridden By": "Overstyrt av", + "Override Reason": "Årsak til overstyringen", + "Owner": "Eier", + "Owner UID": "Eierens UID", + "Participating Characters": "Deltakende karakterer", + "Player Name": "Navn på spilleren", + "Post-Event Effects": "Effekter etter arrangementet", + "Real name of the player": "Spillerens virkelige navn", + "Required Conditions": "Nødvendige tilstander", + "Required Effects": "Nødvendige effekter", + "Required Score": "Nødvendig verdi", + "Required Skills": "Nødvendige ferdigheter", + "Required Stats": "Nødvendige attributter", + "Requirement Overrides": "Overstyrte forutsetninger", + "Setting Name": "Navn på spillverdenen", + "Silver Pieces": "Sølvstykker", + "Skill Name": "Navn på ferdigheten", + "Start Date": "Startdato", + "Starting value for all characters": "Startverdi for alle karakterer", + "Stat": "Attributt", + "Status": "Status", + "System Notice": "Systemmelding", + "Unique Artifact": "Unik artefakt", + "Unique Condition": "Unik tilstand", + "XP Amount": "Antall erfaringspoeng", + "XP Award": "XP-tildeling" }, "plurals": {} } diff --git a/l10n/nl.js b/l10n/nl.js index 4cf3c0f1..aadf76b4 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -1,251 +1,321 @@ OC.L10N.register( "larpinq", { - "Larpinq": "Larpinq", - "Dashboard": "Dashboard", - "Characters": "Karakters", - "Character": "Karakter", - "Players": "Spelers", - "Player": "Speler", + "(score ≥ {n})": "(score ≥ {n})", "Abilities": "Vaardigheden", "Ability": "Vaardigheid", - "Skills": "Skills", - "Skill": "Skill", - "Items": "Items", - "Item": "Item", - "Conditions": "Condities", - "Condition": "Conditie", - "Effects": "Effecten", - "Effect": "Effect", - "Events": "Evenementen", - "Event": "Evenement", - "Settings": "Instellingen", - "Worlds": "Werelden", - "Setting": "Instelling", - "World": "Wereld", - "Documentation": "Documentatie", - "New character": "Nieuw karakter", - "New player": "Nieuwe speler", - "New ability": "Nieuwe vaardigheid", - "New skill": "Nieuwe skill", - "New item": "Nieuw item", - "New condition": "Nieuwe conditie", - "New effect": "Nieuw effect", - "New event": "Nieuw evenement", - "Name": "Naam", - "Description": "Omschrijving", - "Type": "Type", + "Ability Name": "Naam van de eigenschap", + "Add more characters and events from the menu, and the Dashboard tracks them as your world grows. The documentation covers the rest.": "Voeg via het menu meer personages en evenementen toe; het Dashboard houdt ze bij terwijl je wereld groeit. De documentatie behandelt de rest.", + "Add your first character. Give them a name and a type, and save. You can flesh out abilities, skills and items later.": "Voeg je eerste personage toe. Geef het een naam en een type en sla op. Eigenschappen, vaardigheden en voorwerpen werk je later uit.", + "Advanced settings": "Geavanceerde instellingen", + "Affected Characters": "Betrokken personages", + "All worlds": "Alle werelden", + "Amount of copper pieces": "Aantal koperstukken", + "Amount of gold pieces": "Aantal goudstukken", + "Amount of silver pieces": "Aantal zilverstukken", + "Applied effects": "Toegepaste effecten", + "Applies effects": "Past effecten toe", "Approved": "Goedgekeurd", - "Gold": "Goud", - "Silver": "Zilver", - "Copper": "Koper", + "Are you sure you want to delete this?": "Weet u zeker dat u dit wilt verwijderen?", + "Attendance": "Aanwezigheid", + "Attendance tracking is unavailable — showing the participant list read-only.": "Aanwezigheidsregistratie is niet beschikbaar — de deelnemerslijst wordt alleen-lezen getoond.", + "Attendees": "Deelnemers", + "Automatic system notices": "Automatische systeemmeldingen", + "Available": "Beschikbaar", + "Award Reason": "Reden voor de toekenning", + "Award record": "Toekenningsrecord", + "Awarded": "Toegekend", + "Awarded At": "Toegekend op", + "Awarded By": "Toegekend door", + "Back to list": "Terug naar lijst", + "Background": "Achtergrond", + "Background Story": "Achtergrondverhaal", "Base": "Basis", - "Modifier": "Modifier", - "Modification": "Wijziging", - "Cumulative": "Cumulatief", - "Location": "Locatie", - "Start date": "Startdatum", - "End date": "Einddatum", - "Unique": "Uniek", - "Value": "Waarde", - "player": "speler", - "npc": "npc", - "other": "overig", - "no": "nee", - "approved": "goedgekeurd", - "positive": "positief", - "negative": "negatief", - "cumulative": "cumulatief", - "non-cumulative": "niet-cumulatief", - "Save": "Opslaan", + "Base Value": "Basiswaarde", + "Base value": "Basiswaarde", + "Build & world": "Build en wereld", "Cancel": "Annuleren", - "Delete": "Verwijderen", - "Edit": "Bewerken", - "Search": "Zoeken", - "Loading...": "Laden...", - "Back to list": "Terug naar lijst", - "Are you sure you want to delete this?": "Weet u zeker dat u dit wilt verwijderen?", - "Download PDF": "PDF downloaden", - "Select a template to generate a PDF from this character": "Selecteer een template om een PDF te genereren van dit karakter", - "PDF generation requires the DocuDesk app to be installed and enabled": "PDF-generatie vereist dat de DocuDesk-app is geïnstalleerd en ingeschakeld", - "Configuration saved": "Configuratie opgeslagen", + "Character": "Karakter", + "Character Card": "Personagekaart", + "Character Name": "Naam van het personage", + "Characters": "Karakters", + "Characters are the heart of your world. Open Characters from the menu to get started.": "Personages vormen de kern van je wereld. Open Personages in het menu om te beginnen.", + "Characters in this world": "Personages in deze wereld", + "Characters played": "Gespeelde personages", + "Characters with this skill": "Personages met deze vaardigheid", + "Check in": "Inchecken", + "Check-in": "Inchecken", + "Checked In At": "Ingecheckt op", + "Checked In By": "Ingecheckt door", + "Checked in": "Ingecheckt", + "Click Characters in the menu": "Klik op Personages in het menu", + "Click Events in the menu": "Klik op Evenementen in het menu", + "Click New and save a character": "Klik op Nieuw en sla een personage op", + "Click New and save an event": "Klik op Nieuw en sla een evenement op", + "Condition": "Conditie", + "Condition Name": "Naam van de conditie", + "Conditions": "Condities", + "Conditions granting this effect": "Condities die dit effect verlenen", + "Configuration": "Configuratie", "Configuration re-imported successfully": "Configuratie succesvol opnieuw geïmporteerd", - "Re-import configuration": "Configuratie opnieuw importeren", - "Game setup": "Spelinstelling", - "Advanced settings": "Geavanceerde instellingen", + "Configuration saved": "Configuratie opgeslagen", + "Configure": "Configureren", "Configure OpenRegister data source to enable this widget": "Configureer OpenRegister-gegevensbron om deze widget in te schakelen", - "Loading skill data...": "Skillgegevens laden...", - "Retry": "Opnieuw proberen", - "No skill data available": "Geen skillgegevens beschikbaar", - "characters": "karakters", - "Other": "Overig", - "Failed to load skill data": "Laden van skillgegevens mislukt", - "Data storage": "Gegevensopslag", "Configure where to store your LARP data": "Configureer waar uw LARP-gegevens worden opgeslagen", - "Open Register is not installed. Some features might be unavailable.": "Open Register is niet geïnstalleerd. Sommige functies zijn mogelijk niet beschikbaar.", - "Source": "Bron", - "Register": "Register", - "Schema": "Schema", - "Internal": "Intern", - "Open Register": "Open Register", - "Yes": "Ja", - "No": "Nee", - "Create": "Aanmaken", - "No characters yet": "Nog geen karakters", - "No events yet": "Nog geen evenementen", - "View all ({count})": "Alles bekijken ({count})", - "Recent characters": "Recente karakters", - "Recent events": "Recente evenementen", - "Skill usage by characters": "Skillgebruik per karakter", - "Refresh dashboard": "Dashboard vernieuwen", - "Larpinq settings": "Larpinq-instellingen", "Configure your Larpinq installation": "Configureer uw Larpinq-installatie", - "Version information": "Versie-informatie", - "Information about the current Larpinq installation": "Informatie over de huidige Larpinq-installatie", - "Support": "Ondersteuning", - "For support, contact us at": "Voor ondersteuning, neem contact met ons op via", - "For a Service Level Agreement (SLA), contact": "Voor een Service Level Agreement (SLA), neem contact op met", - "Importing...": "Importeren...", - "Re-import failed": "Opnieuw importeren mislukt", - "Configuration": "Configuratie", - "OpenRegister is not configured. Some features may be limited.": "OpenRegister is niet geconfigureerd. Sommige functies zijn mogelijk beperkt.", - "Configure": "Configureren", - "Failed to save. Please try again.": "Opslaan mislukt. Probeer het opnieuw.", - "Failed to delete.": "Verwijderen mislukt.", - "Background": "Achtergrond", - "Save all": "Alles opslaan", - "Unnamed character": "Naamloos karakter", - "Unnamed event": "Naamloos evenement", - "Welcome to Larpinq!": "Welkom bij Larpinq!", "Configure your Larpinq settings here.": "Configureer hier uw Larpinq-instellingen.", + "Contact card": "Contactkaart", + "Contact email address": "E-mailadres voor contact", + "Copper": "Koper", + "Copper Pieces": "Koperstukken", + "Create": "Aanmaken", + "Create the Larpinq register and schemas in OpenRegister: the data store for characters, players, abilities, skills, items, conditions, effects, events and settings. This normally runs automatically on install; run it here if OpenRegister was enabled after Larpinq, or to repair a partial install. It is safe to run more than once.": "Maak het Larpinq-register en de schema's aan in OpenRegister: de gegevensopslag voor personages, spelers, eigenschappen, vaardigheden, voorwerpen, condities, effecten, evenementen en instellingen. Dit gebeurt normaal automatisch bij installatie; voer het hier uit als OpenRegister na Larpinq is ingeschakeld, of om een halve installatie te herstellen. Je kunt dit veilig meerdere keren uitvoeren.", + "Create your first event. Name it and set a start date, then save. Your characters can join it from here.": "Maak je eerste evenement aan. Geef het een naam en een startdatum en sla op. Je personages kunnen zich hier aanmelden.", + "Cumulative": "Cumulatief", + "Currently affecting": "Momenteel van invloed op", + "Dashboard": "Dashboard", + "Data storage": "Gegevensopslag", + "Delete": "Verwijderen", + "Demo data (optional)": "Demodata (optioneel)", + "Description": "Omschrijving", + "Direction": "Richting", + "Documentation": "Documentatie", + "Download PDF": "PDF downloaden", + "Edit": "Bewerken", + "Effect": "Effect", + "Effect Name": "Naam van het effect", + "Effects": "Effecten", + "Effects & prerequisites": "Effecten en vereisten", + "Effects applied after event": "Effecten toegepast na het evenement", + "Effects modifying this ability": "Effecten die deze eigenschap wijzigen", + "End Date": "Einddatum", + "End date": "Einddatum", + "Event": "Evenement", + "Event & character": "Evenement en personage", + "Event Name": "Naam van het evenement", + "Event description": "Beschrijving van het evenement", + "Event end date and time": "Einddatum en -tijd van het evenement", + "Event location": "Locatie van het evenement", + "Event name": "Naam van het evenement", + "Event pack": "Evenementpakket", + "Event start date and time": "Startdatum en -tijd van het evenement", + "Events": "Evenementen", + "Events are the game sessions where your world comes alive. Open Events from the menu.": "Evenementen zijn de speelsessies waarin je wereld tot leven komt. Open Evenementen in het menu.", + "Events in this world": "Evenementen in deze wereld", + "Failed to delete.": "Verwijderen mislukt.", + "Failed to load skill data": "Laden van skillgegevens mislukt", "Failed to save settings": "Opslaan van instellingen mislukt", + "Failed to save. Please try again.": "Opslaan mislukt. Probeer het opnieuw.", + "Faith": "Geloof", + "Features & roadmap": "Functies en roadmap", + "Flow": "Flow", + "Flows": "Flows", + "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows zijn wat er gebeurt zonder dat iemand klikt: een herinnering voordat een termijn verstrijkt, een bevestiging die bij indiening wordt verstuurd. Hier leest en bewerkt u ze. U hoeft nu niets te bouwen.", + "For a Service Level Agreement (SLA), contact": "Voor een Service Level Agreement (SLA), neem contact op met", + "For support, contact us at": "Voor ondersteuning, neem contact met ons op via", + "Full name of the player": "Volledige naam van de speler", + "Game Master Notes (Private)": "Notities van de spelleider (privé)", + "Game Master Notes (Public)": "Notities van de spelleider (openbaar)", + "Game Settings": "Spelinstellingen", + "Game setup": "Spelinstelling", + "Game state & notes": "Spelstatus en notities", "General": "Algemeen", + "Getting started": "Aan de slag", + "Gold": "Goud", + "Gold Pieces": "Goudstukken", + "Gold pieces": "Goudstukken", + "Grants effects": "Verleent effecten", + "Held by": "In bezit van", + "History": "Geschiedenis", + "Identity": "Identiteit", + "Importing...": "Importeren...", + "Information about the current Larpinq installation": "Informatie over de huidige Larpinq-installatie", + "Internal": "Intern", + "Item": "Item", + "Item Name": "Naam van het voorwerp", + "Items": "Items", + "Items and Money": "Voorwerpen en geld", + "Items granting this effect": "Voorwerpen die dit effect verlenen", + "Larpinq": "Larpinq", "Larpinq Settings": "Larpinq-instellingen", - "Save All": "Alles opslaan", - "Settings saved successfully": "Instellingen succesvol opgeslagen", - "Version Information": "Versie-informatie", - "Check-in": "Inchecken", - "Attendance": "Aanwezigheid", - "Check in": "Inchecken", - "No-show": "Niet verschenen", - "Registered": "Ingeschreven", - "Checked in": "Ingecheckt", - "No confirmed participants for this event yet.": "Nog geen bevestigde deelnemers voor dit evenement.", - "Attendance tracking is unavailable — showing the participant list read-only.": "Aanwezigheidsregistratie is niet beschikbaar — de deelnemerslijst wordt alleen-lezen getoond.", - "Skill tree": "Vaardigheidsboom", - "No character (uncoloured)": "Geen personage (ongekleurd)", - "All worlds": "Alle werelden", - "Owned": "In bezit", - "Available": "Beschikbaar", + "Larpinq settings": "Larpinq-instellingen", + "Let's take a quick spin through your world. We'll create a character and an event together so you can see how the pieces fit, and you'll add each record yourself.": "Laten we snel door je wereld lopen. We maken samen een personage en een evenement aan zodat je ziet hoe alles in elkaar grijpt, en jij legt elk record zelf vast.", + "Load an example LARP with characters, skills, items and events, so lists, character sheets and the event calendar show a working product right away. Optional, and safe to run more than once. Skip this on a production install.": "Laad een voorbeeld-LARP met personages, vaardigheden, items en evenementen, zodat lijsten, personagebladen en de evenementenkalender meteen een werkend product tonen. Optioneel en veilig om vaker uit te voeren. Sla dit over bij een productie-installatie.", + "Loading skill data...": "Skillgegevens laden...", + "Loading...": "Laden...", + "Location": "Locatie", "Locked": "Vergrendeld", - "Unknown": "Onbekend", - "No skills to show": "Geen skills om te tonen", - "No skills exist yet for the selected world.": "Er bestaan nog geen skills voor de geselecteerde wereld.", - "Requires: {list}": "Vereist: {list}", - "No prerequisites": "Geen vereisten", - "Required skills": "Vereiste skills", - "Required abilities": "Vereiste vaardigheden", - "(score ≥ {n})": "(score ≥ {n})", - "Required conditions": "Vereiste condities", - "Required effects": "Vereiste effecten", - "Prerequisites": "Vereisten", - "None — this is a root skill.": "Geen — dit is een basisskill.", - "Welcome to LARPing": "Welkom bij LARPing", "Manage your live-action roleplay world, with characters, players, items and events all in one place. One quick step provisions your data store, then you're ready to play.": "Beheer je live-action roleplay-wereld, met personages, spelers, voorwerpen en evenementen op één plek. Eén snelle stap richt je gegevensopslag in, daarna kun je spelen.", - "Provision your world": "Je wereld inrichten", - "Create the Larpinq register and schemas in OpenRegister: the data store for characters, players, abilities, skills, items, conditions, effects, events and settings. This normally runs automatically on install; run it here if OpenRegister was enabled after Larpinq, or to repair a partial install. It is safe to run more than once.": "Maak het Larpinq-register en de schema's aan in OpenRegister: de gegevensopslag voor personages, spelers, eigenschappen, vaardigheden, voorwerpen, condities, effecten, evenementen en instellingen. Dit gebeurt normaal automatisch bij installatie; voer het hier uit als OpenRegister na Larpinq is ingeschakeld, of om een halve installatie te herstellen. Je kunt dit veilig meerdere keren uitvoeren.", - "You're ready": "Je bent klaar", - "That's it. Your world's data store is provisioned. Jump into the Dashboard to see it at a glance, and reopen this setup or the guided tour anytime from the app's … menu.": "Dat was het. De gegevensopslag van je wereld staat klaar. Ga naar het Dashboard voor een overzicht, en open deze installatie of de rondleiding wanneer je wilt opnieuw via het …-menu van de app.", - "Getting started": "Aan de slag", - "Let's take a quick spin through your world. We'll create a character and an event together so you can see how the pieces fit, and you'll add each record yourself.": "Laten we snel door je wereld lopen. We maken samen een personage en een evenement aan zodat je ziet hoe alles in elkaar grijpt, en jij legt elk record zelf vast.", - "Characters are the heart of your world. Open Characters from the menu to get started.": "Personages vormen de kern van je wereld. Open Personages in het menu om te beginnen.", - "Click Characters in the menu": "Klik op Personages in het menu", - "Add your first character. Give them a name and a type, and save. You can flesh out abilities, skills and items later.": "Voeg je eerste personage toe. Geef het een naam en een type en sla op. Eigenschappen, vaardigheden en voorwerpen werk je later uit.", - "Click New and save a character": "Klik op Nieuw en sla een personage op", - "Events are the game sessions where your world comes alive. Open Events from the menu.": "Evenementen zijn de speelsessies waarin je wereld tot leven komt. Open Evenementen in het menu.", - "Click Events in the menu": "Klik op Evenementen in het menu", - "Create your first event. Name it and set a start date, then save. Your characters can join it from here.": "Maak je eerste evenement aan. Geef het een naam en een startdatum en sla op. Je personages kunnen zich hier aanmelden.", - "Click New and save an event": "Klik op Nieuw en sla een evenement op", - "Your world has its first character": "Je wereld heeft zijn eerste personage", - "Add more characters and events from the menu, and the Dashboard tracks them as your world grows. The documentation covers the rest.": "Voeg via het menu meer personages en evenementen toe; het Dashboard houdt ze bij terwijl je wereld groeit. De documentatie behandelt de rest.", - "Open the documentation to keep going": "Open de documentatie om verder te gaan", + "Mechanical Effect": "Speleffect", "Mechanics": "Spelmechanieken", - "XP Awards": "XP-toekenningen", - "Game Settings": "Spelinstellingen", - "Features & roadmap": "Functies en roadmap", - "Flows": "Flows", - "Starts": "Begint", - "Identity": "Identiteit", - "XP awarded": "Toegekende XP", - "Gold pieces": "Goudstukken", - "Game state & notes": "Spelstatus en notities", - "Build & world": "Build en wereld", - "XP award history": "Geschiedenis XP-toekenningen", - "XP": "XP", - "Reason": "Reden", - "Awarded": "Toegekend", + "Min score": "Minimumscore", + "Modification": "Wijziging", + "Modifier": "Modifier", + "Modifier Value": "Waarde van de aanpassing", + "Modifier value": "Modificatiewaarde", + "Modifies abilities": "Wijzigt eigenschappen", + "Name": "Naam", + "Name of the condition": "Naam van de conditie", + "Name of the effect": "Naam van het effect", + "Name of the event": "Naam van het evenement", + "Name of the item": "Naam van het voorwerp", + "Name of the skill": "Naam van de vaardigheid", + "Name of the stat": "Naam van de statistiek", + "New ability": "Nieuwe vaardigheid", + "New character": "Nieuw karakter", + "New condition": "Nieuwe conditie", + "New effect": "Nieuw effect", + "New event": "Nieuw evenement", + "New item": "Nieuw item", + "New player": "Nieuwe speler", + "New skill": "Nieuwe skill", + "Nextcloud user": "Nextcloud-gebruiker", + "No": "Nee", "No XP awarded yet.": "Nog geen XP toegekend.", - "Portrait & sheet": "Portret en spelersblad", - "History": "Geschiedenis", - "Contact card": "Contactkaart", - "Related": "Gerelateerd", - "Characters played": "Gespeelde personages", + "No XP granted yet.": "Nog geen XP verleend.", + "No character (uncoloured)": "Geen personage (ongekleurd)", + "No characters are currently affected.": "Momenteel zijn er geen personages beïnvloed.", + "No characters have learned this skill yet.": "Nog geen personages hebben deze vaardigheid geleerd.", + "No characters in this world yet.": "Nog geen personages in deze wereld.", "No characters played yet.": "Nog geen personages gespeeld.", - "Base value": "Basiswaarde", - "Effects modifying this ability": "Effecten die deze eigenschap wijzigen", - "Direction": "Richting", - "Stacks": "Stapelt", + "No characters registered yet.": "Nog geen personages aangemeld.", + "No characters yet": "Nog geen karakters", + "No conditions grant this effect yet.": "Nog geen condities verlenen dit effect.", + "No confirmed participants for this event yet.": "Nog geen bevestigde deelnemers voor dit evenement.", "No effects modify this stat yet.": "Nog geen effecten wijzigen deze waarde.", - "Skills requiring this stat": "Vaardigheden die deze waarde vereisen", - "Min score": "Minimumscore", + "No events in this world yet.": "Nog geen evenementen in deze wereld.", + "No events yet": "Nog geen evenementen", + "No items grant this effect yet.": "Nog geen voorwerpen verlenen dit effect.", + "No prerequisites": "Geen vereisten", + "No skill data available": "Geen skillgegevens beschikbaar", + "No skills exist yet for the selected world.": "Er bestaan nog geen skills voor de geselecteerde wereld.", + "No skills grant this effect yet.": "Nog geen vaardigheden verlenen dit effect.", "No skills require this stat yet.": "Nog geen vaardigheden vereisen deze waarde.", - "Effects & prerequisites": "Effecten en vereisten", - "Grants effects": "Verleent effecten", - "Requires skills": "Vereist vaardigheden", - "Requires stats": "Vereist waarden", - "Requires conditions": "Vereist condities", - "Requires effects": "Vereist effecten", - "Characters with this skill": "Personages met deze vaardigheid", - "No characters have learned this skill yet.": "Nog geen personages hebben deze vaardigheid geleerd.", - "Held by": "In bezit van", + "No skills to show": "Geen skills om te tonen", + "No-show": "Niet verschenen", "Nobody is holding this item yet.": "Niemand heeft dit voorwerp nog in bezit.", + "None — this is a root skill.": "Geen — dit is een basisskill.", + "Notes about items and money": "Notities over voorwerpen en geld", + "Notes about the player": "Notities over de speler", + "Open Flows in the menu": "Open Flows in het menu", + "Open Register": "Open Register", + "Open Register is not installed. Some features might be unavailable.": "Open Register is niet geïnstalleerd. Sommige functies zijn mogelijk niet beschikbaar.", + "Open the documentation to keep going": "Open de documentatie om verder te gaan", + "OpenRegister is not configured. Some features may be limited.": "OpenRegister is niet geconfigureerd. Sommige functies zijn mogelijk beperkt.", + "Other": "Overig", + "Overridden At": "Overschreven op", + "Overridden By": "Overschreven door", + "Override Reason": "Reden voor de overschrijving", + "Owned": "In bezit", + "Owner": "Eigenaar", + "Owner UID": "UID van de eigenaar", + "PDF generation requires the DocuDesk app to be installed and enabled": "PDF-generatie vereist dat de DocuDesk-app is geïnstalleerd en ingeschakeld", + "Participating Characters": "Deelnemende personages", + "Participating characters": "Deelnemende personages", + "Player": "Speler", + "Player Name": "Naam van de speler", + "Players": "Spelers", + "Portrait & sheet": "Portret en spelersblad", + "Post-Event Effects": "Effecten na het evenement", + "Post-event effects": "Effecten na afloop", + "Prerequisites": "Vereisten", "Props & handouts": "Attributen en handouts", - "Applied effects": "Toegepaste effecten", - "Applies effects": "Past effecten toe", - "Currently affecting": "Momenteel van invloed op", - "No characters are currently affected.": "Momenteel zijn er geen personages beïnvloed.", - "Modifier value": "Modificatiewaarde", - "Modifies abilities": "Wijzigt eigenschappen", - "Skills granting this effect": "Vaardigheden die dit effect verlenen", - "No skills grant this effect yet.": "Nog geen vaardigheden verlenen dit effect.", - "Items granting this effect": "Voorwerpen die dit effect verlenen", - "No items grant this effect yet.": "Nog geen voorwerpen verlenen dit effect.", - "Conditions granting this effect": "Condities die dit effect verlenen", - "No conditions grant this effect yet.": "Nog geen condities verlenen dit effect.", - "Attendees": "Deelnemers", - "XP granted": "Verleende XP", + "Provision your world": "Je wereld inrichten", + "Re-import configuration": "Configuratie opnieuw importeren", + "Re-import failed": "Opnieuw importeren mislukt", + "Real name of the player": "Echte naam van de speler", + "Reason": "Reden", + "Recent characters": "Recente karakters", + "Recent events": "Recente evenementen", + "Refresh dashboard": "Dashboard vernieuwen", + "Register": "Register", + "Registered": "Ingeschreven", + "Related": "Gerelateerd", + "Required Conditions": "Vereiste condities", + "Required Effects": "Vereiste effecten", + "Required Score": "Vereiste score", + "Required Skills": "Vereiste vaardigheden", + "Required Stats": "Vereiste statistieken", + "Required abilities": "Vereiste vaardigheden", + "Required conditions": "Vereiste condities", + "Required effects": "Vereiste effecten", + "Required skills": "Vereiste skills", + "Requirement Overrides": "Overschreven vereisten", + "Requires conditions": "Vereist condities", + "Requires effects": "Vereist effecten", + "Requires skills": "Vereist vaardigheden", + "Requires stats": "Vereist waarden", + "Requires: {list}": "Vereist: {list}", + "Retry": "Opnieuw proberen", + "Save": "Opslaan", + "Save All": "Alles opslaan", + "Save all": "Alles opslaan", "Schedule": "Programma", - "Post-event effects": "Effecten na afloop", - "Effects applied after event": "Effecten toegepast na het evenement", + "Schema": "Schema", + "Search": "Zoeken", + "Select a template to generate a PDF from this character": "Selecteer een template om een PDF te genereren van dit karakter", + "Setting": "Instelling", + "Setting Name": "Naam van de setting", + "Settings": "Instellingen", + "Settings saved successfully": "Instellingen succesvol opgeslagen", "Sign-up": "Aanmelding", - "Participating characters": "Deelnemende personages", - "No characters registered yet.": "Nog geen personages aangemeld.", - "XP awards": "XP-toekenningen", - "No XP granted yet.": "Nog geen XP verleend.", - "Event pack": "Evenementpakket", - "Characters in this world": "Personages in deze wereld", - "No characters in this world yet.": "Nog geen personages in deze wereld.", - "Events in this world": "Evenementen in deze wereld", - "No events in this world yet.": "Nog geen evenementen in deze wereld.", - "XP Award": "XP-toekenning", - "Award record": "Toekenningsrecord", - "Event & character": "Evenement en personage", - "Flow": "Flow", - "Demo data (optional)": "Demodata (optioneel)", - "Load an example LARP with characters, skills, items and events, so lists, character sheets and the event calendar show a working product right away. Optional, and safe to run more than once. Skip this on a production install.": "Laad een voorbeeld-LARP met personages, vaardigheden, items en evenementen, zodat lijsten, personagebladen en de evenementenkalender meteen een werkend product tonen. Optioneel en veilig om vaker uit te voeren. Sla dit over bij een productie-installatie.", + "Silver": "Zilver", + "Silver Pieces": "Zilverstukken", + "Skill": "Skill", + "Skill Name": "Naam van de vaardigheid", + "Skill tree": "Vaardigheidsboom", + "Skill usage by characters": "Skillgebruik per karakter", + "Skills": "Skills", + "Skills granting this effect": "Vaardigheden die dit effect verlenen", + "Skills requiring this stat": "Vaardigheden die deze waarde vereisen", + "Source": "Bron", + "Stacks": "Stapelt", + "Start Date": "Startdatum", + "Start date": "Startdatum", + "Starting value for all characters": "Startwaarde voor alle personages", + "Starts": "Begint", + "Stat": "Statistiek", + "Status": "Status", + "Support": "Ondersteuning", + "System Notice": "Systeemmelding", + "That's it. Your world's data store is provisioned. Jump into the Dashboard to see it at a glance, and reopen this setup or the guided tour anytime from the app's … menu.": "Dat was het. De gegevensopslag van je wereld staat klaar. Ga naar het Dashboard voor een overzicht, en open deze installatie of de rondleiding wanneer je wilt opnieuw via het …-menu van de app.", + "Type": "Type", + "Unique": "Uniek", + "Unique Artifact": "Uniek artefact", + "Unique Condition": "Unieke conditie", + "Unknown": "Onbekend", + "Unnamed character": "Naamloos karakter", + "Unnamed event": "Naamloos evenement", + "Value": "Waarde", + "Version Information": "Versie-informatie", + "Version information": "Versie-informatie", + "View all ({count})": "Alles bekijken ({count})", + "Welcome to LARPing": "Welkom bij LARPing", + "Welcome to Larpinq!": "Welkom bij Larpinq!", "Where the automation lives": "Waar de automatisering zit", - "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows zijn wat er gebeurt zonder dat iemand klikt: een herinnering voordat een termijn verstrijkt, een bevestiging die bij indiening wordt verstuurd. Hier leest en bewerkt u ze. U hoeft nu niets te bouwen.", - "Open Flows in the menu": "Open Flows in het menu" + "World": "Wereld", + "Worlds": "Werelden", + "XP": "XP", + "XP Amount": "Aantal ervaringspunten", + "XP Award": "XP-toekenning", + "XP Awards": "XP-toekenningen", + "XP award history": "Geschiedenis XP-toekenningen", + "XP awarded": "Toegekende XP", + "XP awards": "XP-toekenningen", + "XP granted": "Verleende XP", + "Yes": "Ja", + "You're ready": "Je bent klaar", + "Your world has its first character": "Je wereld heeft zijn eerste personage", + "approved": "goedgekeurd", + "characters": "karakters", + "cumulative": "cumulatief", + "negative": "negatief", + "no": "nee", + "non-cumulative": "niet-cumulatief", + "npc": "npc", + "other": "overig", + "player": "speler", + "positive": "positief" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nl.json b/l10n/nl.json index a0b41162..33c100a8 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1,250 +1,320 @@ { "translations": { - "Larpinq": "Larpinq", - "Dashboard": "Dashboard", - "Characters": "Karakters", - "Character": "Karakter", - "Players": "Spelers", - "Player": "Speler", + "(score ≥ {n})": "(score ≥ {n})", "Abilities": "Vaardigheden", "Ability": "Vaardigheid", - "Skills": "Skills", - "Skill": "Skill", - "Items": "Items", - "Item": "Item", - "Conditions": "Condities", - "Condition": "Conditie", - "Effects": "Effecten", - "Effect": "Effect", - "Events": "Evenementen", - "Event": "Evenement", - "Settings": "Instellingen", - "Worlds": "Werelden", - "Setting": "Instelling", - "World": "Wereld", - "Documentation": "Documentatie", - "New character": "Nieuw karakter", - "New player": "Nieuwe speler", - "New ability": "Nieuwe vaardigheid", - "New skill": "Nieuwe skill", - "New item": "Nieuw item", - "New condition": "Nieuwe conditie", - "New effect": "Nieuw effect", - "New event": "Nieuw evenement", - "Name": "Naam", - "Description": "Omschrijving", - "Type": "Type", + "Ability Name": "Naam van de eigenschap", + "Add more characters and events from the menu, and the Dashboard tracks them as your world grows. The documentation covers the rest.": "Voeg via het menu meer personages en evenementen toe; het Dashboard houdt ze bij terwijl je wereld groeit. De documentatie behandelt de rest.", + "Add your first character. Give them a name and a type, and save. You can flesh out abilities, skills and items later.": "Voeg je eerste personage toe. Geef het een naam en een type en sla op. Eigenschappen, vaardigheden en voorwerpen werk je later uit.", + "Advanced settings": "Geavanceerde instellingen", + "Affected Characters": "Betrokken personages", + "All worlds": "Alle werelden", + "Amount of copper pieces": "Aantal koperstukken", + "Amount of gold pieces": "Aantal goudstukken", + "Amount of silver pieces": "Aantal zilverstukken", + "Applied effects": "Toegepaste effecten", + "Applies effects": "Past effecten toe", "Approved": "Goedgekeurd", - "Gold": "Goud", - "Silver": "Zilver", - "Copper": "Koper", + "Are you sure you want to delete this?": "Weet u zeker dat u dit wilt verwijderen?", + "Attendance": "Aanwezigheid", + "Attendance tracking is unavailable — showing the participant list read-only.": "Aanwezigheidsregistratie is niet beschikbaar — de deelnemerslijst wordt alleen-lezen getoond.", + "Attendees": "Deelnemers", + "Automatic system notices": "Automatische systeemmeldingen", + "Available": "Beschikbaar", + "Award Reason": "Reden voor de toekenning", + "Award record": "Toekenningsrecord", + "Awarded": "Toegekend", + "Awarded At": "Toegekend op", + "Awarded By": "Toegekend door", + "Back to list": "Terug naar lijst", + "Background": "Achtergrond", + "Background Story": "Achtergrondverhaal", "Base": "Basis", - "Modifier": "Modifier", - "Modification": "Wijziging", - "Cumulative": "Cumulatief", - "Location": "Locatie", - "Start date": "Startdatum", - "End date": "Einddatum", - "Unique": "Uniek", - "Value": "Waarde", - "player": "speler", - "npc": "npc", - "other": "overig", - "no": "nee", - "approved": "goedgekeurd", - "positive": "positief", - "negative": "negatief", - "cumulative": "cumulatief", - "non-cumulative": "niet-cumulatief", - "Save": "Opslaan", + "Base Value": "Basiswaarde", + "Base value": "Basiswaarde", + "Build & world": "Build en wereld", "Cancel": "Annuleren", - "Delete": "Verwijderen", - "Edit": "Bewerken", - "Search": "Zoeken", - "Loading...": "Laden...", - "Back to list": "Terug naar lijst", - "Are you sure you want to delete this?": "Weet u zeker dat u dit wilt verwijderen?", - "Download PDF": "PDF downloaden", - "Select a template to generate a PDF from this character": "Selecteer een template om een PDF te genereren van dit karakter", - "PDF generation requires the DocuDesk app to be installed and enabled": "PDF-generatie vereist dat de DocuDesk-app is geïnstalleerd en ingeschakeld", - "Configuration saved": "Configuratie opgeslagen", + "Character": "Karakter", + "Character Card": "Personagekaart", + "Character Name": "Naam van het personage", + "Characters": "Karakters", + "Characters are the heart of your world. Open Characters from the menu to get started.": "Personages vormen de kern van je wereld. Open Personages in het menu om te beginnen.", + "Characters in this world": "Personages in deze wereld", + "Characters played": "Gespeelde personages", + "Characters with this skill": "Personages met deze vaardigheid", + "Check in": "Inchecken", + "Check-in": "Inchecken", + "Checked In At": "Ingecheckt op", + "Checked In By": "Ingecheckt door", + "Checked in": "Ingecheckt", + "Click Characters in the menu": "Klik op Personages in het menu", + "Click Events in the menu": "Klik op Evenementen in het menu", + "Click New and save a character": "Klik op Nieuw en sla een personage op", + "Click New and save an event": "Klik op Nieuw en sla een evenement op", + "Condition": "Conditie", + "Condition Name": "Naam van de conditie", + "Conditions": "Condities", + "Conditions granting this effect": "Condities die dit effect verlenen", + "Configuration": "Configuratie", "Configuration re-imported successfully": "Configuratie succesvol opnieuw geïmporteerd", - "Re-import configuration": "Configuratie opnieuw importeren", - "Game setup": "Spelinstelling", - "Advanced settings": "Geavanceerde instellingen", + "Configuration saved": "Configuratie opgeslagen", + "Configure": "Configureren", "Configure OpenRegister data source to enable this widget": "Configureer OpenRegister-gegevensbron om deze widget in te schakelen", - "Loading skill data...": "Skillgegevens laden...", - "Retry": "Opnieuw proberen", - "No skill data available": "Geen skillgegevens beschikbaar", - "characters": "karakters", - "Other": "Overig", - "Failed to load skill data": "Laden van skillgegevens mislukt", - "Data storage": "Gegevensopslag", "Configure where to store your LARP data": "Configureer waar uw LARP-gegevens worden opgeslagen", - "Open Register is not installed. Some features might be unavailable.": "Open Register is niet geïnstalleerd. Sommige functies zijn mogelijk niet beschikbaar.", - "Source": "Bron", - "Register": "Register", - "Schema": "Schema", - "Internal": "Intern", - "Open Register": "Open Register", - "Yes": "Ja", - "No": "Nee", - "Create": "Aanmaken", - "No characters yet": "Nog geen karakters", - "No events yet": "Nog geen evenementen", - "View all ({count})": "Alles bekijken ({count})", - "Recent characters": "Recente karakters", - "Recent events": "Recente evenementen", - "Skill usage by characters": "Skillgebruik per karakter", - "Refresh dashboard": "Dashboard vernieuwen", - "Larpinq settings": "Larpinq-instellingen", "Configure your Larpinq installation": "Configureer uw Larpinq-installatie", - "Version information": "Versie-informatie", - "Information about the current Larpinq installation": "Informatie over de huidige Larpinq-installatie", - "Support": "Ondersteuning", - "For support, contact us at": "Voor ondersteuning, neem contact met ons op via", - "For a Service Level Agreement (SLA), contact": "Voor een Service Level Agreement (SLA), neem contact op met", - "Importing...": "Importeren...", - "Re-import failed": "Opnieuw importeren mislukt", - "Configuration": "Configuratie", - "OpenRegister is not configured. Some features may be limited.": "OpenRegister is niet geconfigureerd. Sommige functies zijn mogelijk beperkt.", - "Configure": "Configureren", - "Failed to save. Please try again.": "Opslaan mislukt. Probeer het opnieuw.", - "Failed to delete.": "Verwijderen mislukt.", - "Background": "Achtergrond", - "Save all": "Alles opslaan", - "Unnamed character": "Naamloos karakter", - "Unnamed event": "Naamloos evenement", - "Welcome to Larpinq!": "Welkom bij Larpinq!", "Configure your Larpinq settings here.": "Configureer hier uw Larpinq-instellingen.", + "Contact card": "Contactkaart", + "Contact email address": "E-mailadres voor contact", + "Copper": "Koper", + "Copper Pieces": "Koperstukken", + "Create": "Aanmaken", + "Create the Larpinq register and schemas in OpenRegister: the data store for characters, players, abilities, skills, items, conditions, effects, events and settings. This normally runs automatically on install; run it here if OpenRegister was enabled after Larpinq, or to repair a partial install. It is safe to run more than once.": "Maak het Larpinq-register en de schema's aan in OpenRegister: de gegevensopslag voor personages, spelers, eigenschappen, vaardigheden, voorwerpen, condities, effecten, evenementen en instellingen. Dit gebeurt normaal automatisch bij installatie; voer het hier uit als OpenRegister na Larpinq is ingeschakeld, of om een halve installatie te herstellen. Je kunt dit veilig meerdere keren uitvoeren.", + "Create your first event. Name it and set a start date, then save. Your characters can join it from here.": "Maak je eerste evenement aan. Geef het een naam en een startdatum en sla op. Je personages kunnen zich hier aanmelden.", + "Cumulative": "Cumulatief", + "Currently affecting": "Momenteel van invloed op", + "Dashboard": "Dashboard", + "Data storage": "Gegevensopslag", + "Delete": "Verwijderen", + "Demo data (optional)": "Demodata (optioneel)", + "Description": "Omschrijving", + "Direction": "Richting", + "Documentation": "Documentatie", + "Download PDF": "PDF downloaden", + "Edit": "Bewerken", + "Effect": "Effect", + "Effect Name": "Naam van het effect", + "Effects": "Effecten", + "Effects & prerequisites": "Effecten en vereisten", + "Effects applied after event": "Effecten toegepast na het evenement", + "Effects modifying this ability": "Effecten die deze eigenschap wijzigen", + "End Date": "Einddatum", + "End date": "Einddatum", + "Event": "Evenement", + "Event & character": "Evenement en personage", + "Event Name": "Naam van het evenement", + "Event description": "Beschrijving van het evenement", + "Event end date and time": "Einddatum en -tijd van het evenement", + "Event location": "Locatie van het evenement", + "Event name": "Naam van het evenement", + "Event pack": "Evenementpakket", + "Event start date and time": "Startdatum en -tijd van het evenement", + "Events": "Evenementen", + "Events are the game sessions where your world comes alive. Open Events from the menu.": "Evenementen zijn de speelsessies waarin je wereld tot leven komt. Open Evenementen in het menu.", + "Events in this world": "Evenementen in deze wereld", + "Failed to delete.": "Verwijderen mislukt.", + "Failed to load skill data": "Laden van skillgegevens mislukt", "Failed to save settings": "Opslaan van instellingen mislukt", + "Failed to save. Please try again.": "Opslaan mislukt. Probeer het opnieuw.", + "Faith": "Geloof", + "Features & roadmap": "Functies en roadmap", + "Flow": "Flow", + "Flows": "Flows", + "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows zijn wat er gebeurt zonder dat iemand klikt: een herinnering voordat een termijn verstrijkt, een bevestiging die bij indiening wordt verstuurd. Hier leest en bewerkt u ze. U hoeft nu niets te bouwen.", + "For a Service Level Agreement (SLA), contact": "Voor een Service Level Agreement (SLA), neem contact op met", + "For support, contact us at": "Voor ondersteuning, neem contact met ons op via", + "Full name of the player": "Volledige naam van de speler", + "Game Master Notes (Private)": "Notities van de spelleider (privé)", + "Game Master Notes (Public)": "Notities van de spelleider (openbaar)", + "Game Settings": "Spelinstellingen", + "Game setup": "Spelinstelling", + "Game state & notes": "Spelstatus en notities", "General": "Algemeen", + "Getting started": "Aan de slag", + "Gold": "Goud", + "Gold Pieces": "Goudstukken", + "Gold pieces": "Goudstukken", + "Grants effects": "Verleent effecten", + "Held by": "In bezit van", + "History": "Geschiedenis", + "Identity": "Identiteit", + "Importing...": "Importeren...", + "Information about the current Larpinq installation": "Informatie over de huidige Larpinq-installatie", + "Internal": "Intern", + "Item": "Item", + "Item Name": "Naam van het voorwerp", + "Items": "Items", + "Items and Money": "Voorwerpen en geld", + "Items granting this effect": "Voorwerpen die dit effect verlenen", + "Larpinq": "Larpinq", "Larpinq Settings": "Larpinq-instellingen", - "Save All": "Alles opslaan", - "Settings saved successfully": "Instellingen succesvol opgeslagen", - "Version Information": "Versie-informatie", - "Check-in": "Inchecken", - "Attendance": "Aanwezigheid", - "Check in": "Inchecken", - "No-show": "Niet verschenen", - "Registered": "Ingeschreven", - "Checked in": "Ingecheckt", - "No confirmed participants for this event yet.": "Nog geen bevestigde deelnemers voor dit evenement.", - "Attendance tracking is unavailable — showing the participant list read-only.": "Aanwezigheidsregistratie is niet beschikbaar — de deelnemerslijst wordt alleen-lezen getoond.", - "Skill tree": "Vaardigheidsboom", - "No character (uncoloured)": "Geen personage (ongekleurd)", - "All worlds": "Alle werelden", - "Owned": "In bezit", - "Available": "Beschikbaar", + "Larpinq settings": "Larpinq-instellingen", + "Let's take a quick spin through your world. We'll create a character and an event together so you can see how the pieces fit, and you'll add each record yourself.": "Laten we snel door je wereld lopen. We maken samen een personage en een evenement aan zodat je ziet hoe alles in elkaar grijpt, en jij legt elk record zelf vast.", + "Load an example LARP with characters, skills, items and events, so lists, character sheets and the event calendar show a working product right away. Optional, and safe to run more than once. Skip this on a production install.": "Laad een voorbeeld-LARP met personages, vaardigheden, items en evenementen, zodat lijsten, personagebladen en de evenementenkalender meteen een werkend product tonen. Optioneel en veilig om vaker uit te voeren. Sla dit over bij een productie-installatie.", + "Loading skill data...": "Skillgegevens laden...", + "Loading...": "Laden...", + "Location": "Locatie", "Locked": "Vergrendeld", - "Unknown": "Onbekend", - "No skills to show": "Geen skills om te tonen", - "No skills exist yet for the selected world.": "Er bestaan nog geen skills voor de geselecteerde wereld.", - "Requires: {list}": "Vereist: {list}", - "No prerequisites": "Geen vereisten", - "Required skills": "Vereiste skills", - "Required abilities": "Vereiste vaardigheden", - "(score ≥ {n})": "(score ≥ {n})", - "Required conditions": "Vereiste condities", - "Required effects": "Vereiste effecten", - "Prerequisites": "Vereisten", - "None — this is a root skill.": "Geen — dit is een basisskill.", - "Welcome to LARPing": "Welkom bij LARPing", "Manage your live-action roleplay world, with characters, players, items and events all in one place. One quick step provisions your data store, then you're ready to play.": "Beheer je live-action roleplay-wereld, met personages, spelers, voorwerpen en evenementen op één plek. Eén snelle stap richt je gegevensopslag in, daarna kun je spelen.", - "Provision your world": "Je wereld inrichten", - "Create the Larpinq register and schemas in OpenRegister: the data store for characters, players, abilities, skills, items, conditions, effects, events and settings. This normally runs automatically on install; run it here if OpenRegister was enabled after Larpinq, or to repair a partial install. It is safe to run more than once.": "Maak het Larpinq-register en de schema's aan in OpenRegister: de gegevensopslag voor personages, spelers, eigenschappen, vaardigheden, voorwerpen, condities, effecten, evenementen en instellingen. Dit gebeurt normaal automatisch bij installatie; voer het hier uit als OpenRegister na Larpinq is ingeschakeld, of om een halve installatie te herstellen. Je kunt dit veilig meerdere keren uitvoeren.", - "You're ready": "Je bent klaar", - "That's it. Your world's data store is provisioned. Jump into the Dashboard to see it at a glance, and reopen this setup or the guided tour anytime from the app's … menu.": "Dat was het. De gegevensopslag van je wereld staat klaar. Ga naar het Dashboard voor een overzicht, en open deze installatie of de rondleiding wanneer je wilt opnieuw via het …-menu van de app.", - "Getting started": "Aan de slag", - "Let's take a quick spin through your world. We'll create a character and an event together so you can see how the pieces fit, and you'll add each record yourself.": "Laten we snel door je wereld lopen. We maken samen een personage en een evenement aan zodat je ziet hoe alles in elkaar grijpt, en jij legt elk record zelf vast.", - "Characters are the heart of your world. Open Characters from the menu to get started.": "Personages vormen de kern van je wereld. Open Personages in het menu om te beginnen.", - "Click Characters in the menu": "Klik op Personages in het menu", - "Add your first character. Give them a name and a type, and save. You can flesh out abilities, skills and items later.": "Voeg je eerste personage toe. Geef het een naam en een type en sla op. Eigenschappen, vaardigheden en voorwerpen werk je later uit.", - "Click New and save a character": "Klik op Nieuw en sla een personage op", - "Events are the game sessions where your world comes alive. Open Events from the menu.": "Evenementen zijn de speelsessies waarin je wereld tot leven komt. Open Evenementen in het menu.", - "Click Events in the menu": "Klik op Evenementen in het menu", - "Create your first event. Name it and set a start date, then save. Your characters can join it from here.": "Maak je eerste evenement aan. Geef het een naam en een startdatum en sla op. Je personages kunnen zich hier aanmelden.", - "Click New and save an event": "Klik op Nieuw en sla een evenement op", - "Your world has its first character": "Je wereld heeft zijn eerste personage", - "Add more characters and events from the menu, and the Dashboard tracks them as your world grows. The documentation covers the rest.": "Voeg via het menu meer personages en evenementen toe; het Dashboard houdt ze bij terwijl je wereld groeit. De documentatie behandelt de rest.", - "Open the documentation to keep going": "Open de documentatie om verder te gaan", + "Mechanical Effect": "Speleffect", "Mechanics": "Spelmechanieken", - "XP Awards": "XP-toekenningen", - "Game Settings": "Spelinstellingen", - "Features & roadmap": "Functies en roadmap", - "Flows": "Flows", - "Starts": "Begint", - "Identity": "Identiteit", - "XP awarded": "Toegekende XP", - "Gold pieces": "Goudstukken", - "Game state & notes": "Spelstatus en notities", - "Build & world": "Build en wereld", - "XP award history": "Geschiedenis XP-toekenningen", - "XP": "XP", - "Reason": "Reden", - "Awarded": "Toegekend", + "Min score": "Minimumscore", + "Modification": "Wijziging", + "Modifier": "Modifier", + "Modifier Value": "Waarde van de aanpassing", + "Modifier value": "Modificatiewaarde", + "Modifies abilities": "Wijzigt eigenschappen", + "Name": "Naam", + "Name of the condition": "Naam van de conditie", + "Name of the effect": "Naam van het effect", + "Name of the event": "Naam van het evenement", + "Name of the item": "Naam van het voorwerp", + "Name of the skill": "Naam van de vaardigheid", + "Name of the stat": "Naam van de statistiek", + "New ability": "Nieuwe vaardigheid", + "New character": "Nieuw karakter", + "New condition": "Nieuwe conditie", + "New effect": "Nieuw effect", + "New event": "Nieuw evenement", + "New item": "Nieuw item", + "New player": "Nieuwe speler", + "New skill": "Nieuwe skill", + "Nextcloud user": "Nextcloud-gebruiker", + "No": "Nee", "No XP awarded yet.": "Nog geen XP toegekend.", - "Portrait & sheet": "Portret en spelersblad", - "History": "Geschiedenis", - "Contact card": "Contactkaart", - "Related": "Gerelateerd", - "Characters played": "Gespeelde personages", + "No XP granted yet.": "Nog geen XP verleend.", + "No character (uncoloured)": "Geen personage (ongekleurd)", + "No characters are currently affected.": "Momenteel zijn er geen personages beïnvloed.", + "No characters have learned this skill yet.": "Nog geen personages hebben deze vaardigheid geleerd.", + "No characters in this world yet.": "Nog geen personages in deze wereld.", "No characters played yet.": "Nog geen personages gespeeld.", - "Base value": "Basiswaarde", - "Effects modifying this ability": "Effecten die deze eigenschap wijzigen", - "Direction": "Richting", - "Stacks": "Stapelt", + "No characters registered yet.": "Nog geen personages aangemeld.", + "No characters yet": "Nog geen karakters", + "No conditions grant this effect yet.": "Nog geen condities verlenen dit effect.", + "No confirmed participants for this event yet.": "Nog geen bevestigde deelnemers voor dit evenement.", "No effects modify this stat yet.": "Nog geen effecten wijzigen deze waarde.", - "Skills requiring this stat": "Vaardigheden die deze waarde vereisen", - "Min score": "Minimumscore", + "No events in this world yet.": "Nog geen evenementen in deze wereld.", + "No events yet": "Nog geen evenementen", + "No items grant this effect yet.": "Nog geen voorwerpen verlenen dit effect.", + "No prerequisites": "Geen vereisten", + "No skill data available": "Geen skillgegevens beschikbaar", + "No skills exist yet for the selected world.": "Er bestaan nog geen skills voor de geselecteerde wereld.", + "No skills grant this effect yet.": "Nog geen vaardigheden verlenen dit effect.", "No skills require this stat yet.": "Nog geen vaardigheden vereisen deze waarde.", - "Effects & prerequisites": "Effecten en vereisten", - "Grants effects": "Verleent effecten", - "Requires skills": "Vereist vaardigheden", - "Requires stats": "Vereist waarden", - "Requires conditions": "Vereist condities", - "Requires effects": "Vereist effecten", - "Characters with this skill": "Personages met deze vaardigheid", - "No characters have learned this skill yet.": "Nog geen personages hebben deze vaardigheid geleerd.", - "Held by": "In bezit van", + "No skills to show": "Geen skills om te tonen", + "No-show": "Niet verschenen", "Nobody is holding this item yet.": "Niemand heeft dit voorwerp nog in bezit.", + "None — this is a root skill.": "Geen — dit is een basisskill.", + "Notes about items and money": "Notities over voorwerpen en geld", + "Notes about the player": "Notities over de speler", + "Open Flows in the menu": "Open Flows in het menu", + "Open Register": "Open Register", + "Open Register is not installed. Some features might be unavailable.": "Open Register is niet geïnstalleerd. Sommige functies zijn mogelijk niet beschikbaar.", + "Open the documentation to keep going": "Open de documentatie om verder te gaan", + "OpenRegister is not configured. Some features may be limited.": "OpenRegister is niet geconfigureerd. Sommige functies zijn mogelijk beperkt.", + "Other": "Overig", + "Overridden At": "Overschreven op", + "Overridden By": "Overschreven door", + "Override Reason": "Reden voor de overschrijving", + "Owned": "In bezit", + "Owner": "Eigenaar", + "Owner UID": "UID van de eigenaar", + "PDF generation requires the DocuDesk app to be installed and enabled": "PDF-generatie vereist dat de DocuDesk-app is geïnstalleerd en ingeschakeld", + "Participating Characters": "Deelnemende personages", + "Participating characters": "Deelnemende personages", + "Player": "Speler", + "Player Name": "Naam van de speler", + "Players": "Spelers", + "Portrait & sheet": "Portret en spelersblad", + "Post-Event Effects": "Effecten na het evenement", + "Post-event effects": "Effecten na afloop", + "Prerequisites": "Vereisten", "Props & handouts": "Attributen en handouts", - "Applied effects": "Toegepaste effecten", - "Applies effects": "Past effecten toe", - "Currently affecting": "Momenteel van invloed op", - "No characters are currently affected.": "Momenteel zijn er geen personages beïnvloed.", - "Modifier value": "Modificatiewaarde", - "Modifies abilities": "Wijzigt eigenschappen", - "Skills granting this effect": "Vaardigheden die dit effect verlenen", - "No skills grant this effect yet.": "Nog geen vaardigheden verlenen dit effect.", - "Items granting this effect": "Voorwerpen die dit effect verlenen", - "No items grant this effect yet.": "Nog geen voorwerpen verlenen dit effect.", - "Conditions granting this effect": "Condities die dit effect verlenen", - "No conditions grant this effect yet.": "Nog geen condities verlenen dit effect.", - "Attendees": "Deelnemers", - "XP granted": "Verleende XP", + "Provision your world": "Je wereld inrichten", + "Re-import configuration": "Configuratie opnieuw importeren", + "Re-import failed": "Opnieuw importeren mislukt", + "Real name of the player": "Echte naam van de speler", + "Reason": "Reden", + "Recent characters": "Recente karakters", + "Recent events": "Recente evenementen", + "Refresh dashboard": "Dashboard vernieuwen", + "Register": "Register", + "Registered": "Ingeschreven", + "Related": "Gerelateerd", + "Required Conditions": "Vereiste condities", + "Required Effects": "Vereiste effecten", + "Required Score": "Vereiste score", + "Required Skills": "Vereiste vaardigheden", + "Required Stats": "Vereiste statistieken", + "Required abilities": "Vereiste vaardigheden", + "Required conditions": "Vereiste condities", + "Required effects": "Vereiste effecten", + "Required skills": "Vereiste skills", + "Requirement Overrides": "Overschreven vereisten", + "Requires conditions": "Vereist condities", + "Requires effects": "Vereist effecten", + "Requires skills": "Vereist vaardigheden", + "Requires stats": "Vereist waarden", + "Requires: {list}": "Vereist: {list}", + "Retry": "Opnieuw proberen", + "Save": "Opslaan", + "Save All": "Alles opslaan", + "Save all": "Alles opslaan", "Schedule": "Programma", - "Post-event effects": "Effecten na afloop", - "Effects applied after event": "Effecten toegepast na het evenement", + "Schema": "Schema", + "Search": "Zoeken", + "Select a template to generate a PDF from this character": "Selecteer een template om een PDF te genereren van dit karakter", + "Setting": "Instelling", + "Setting Name": "Naam van de setting", + "Settings": "Instellingen", + "Settings saved successfully": "Instellingen succesvol opgeslagen", "Sign-up": "Aanmelding", - "Participating characters": "Deelnemende personages", - "No characters registered yet.": "Nog geen personages aangemeld.", - "XP awards": "XP-toekenningen", - "No XP granted yet.": "Nog geen XP verleend.", - "Event pack": "Evenementpakket", - "Characters in this world": "Personages in deze wereld", - "No characters in this world yet.": "Nog geen personages in deze wereld.", - "Events in this world": "Evenementen in deze wereld", - "No events in this world yet.": "Nog geen evenementen in deze wereld.", - "XP Award": "XP-toekenning", - "Award record": "Toekenningsrecord", - "Event & character": "Evenement en personage", - "Flow": "Flow", - "Demo data (optional)": "Demodata (optioneel)", - "Load an example LARP with characters, skills, items and events, so lists, character sheets and the event calendar show a working product right away. Optional, and safe to run more than once. Skip this on a production install.": "Laad een voorbeeld-LARP met personages, vaardigheden, items en evenementen, zodat lijsten, personagebladen en de evenementenkalender meteen een werkend product tonen. Optioneel en veilig om vaker uit te voeren. Sla dit over bij een productie-installatie.", + "Silver": "Zilver", + "Silver Pieces": "Zilverstukken", + "Skill": "Skill", + "Skill Name": "Naam van de vaardigheid", + "Skill tree": "Vaardigheidsboom", + "Skill usage by characters": "Skillgebruik per karakter", + "Skills": "Skills", + "Skills granting this effect": "Vaardigheden die dit effect verlenen", + "Skills requiring this stat": "Vaardigheden die deze waarde vereisen", + "Source": "Bron", + "Stacks": "Stapelt", + "Start Date": "Startdatum", + "Start date": "Startdatum", + "Starting value for all characters": "Startwaarde voor alle personages", + "Starts": "Begint", + "Stat": "Statistiek", + "Status": "Status", + "Support": "Ondersteuning", + "System Notice": "Systeemmelding", + "That's it. Your world's data store is provisioned. Jump into the Dashboard to see it at a glance, and reopen this setup or the guided tour anytime from the app's … menu.": "Dat was het. De gegevensopslag van je wereld staat klaar. Ga naar het Dashboard voor een overzicht, en open deze installatie of de rondleiding wanneer je wilt opnieuw via het …-menu van de app.", + "Type": "Type", + "Unique": "Uniek", + "Unique Artifact": "Uniek artefact", + "Unique Condition": "Unieke conditie", + "Unknown": "Onbekend", + "Unnamed character": "Naamloos karakter", + "Unnamed event": "Naamloos evenement", + "Value": "Waarde", + "Version Information": "Versie-informatie", + "Version information": "Versie-informatie", + "View all ({count})": "Alles bekijken ({count})", + "Welcome to LARPing": "Welkom bij LARPing", + "Welcome to Larpinq!": "Welkom bij Larpinq!", "Where the automation lives": "Waar de automatisering zit", - "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows zijn wat er gebeurt zonder dat iemand klikt: een herinnering voordat een termijn verstrijkt, een bevestiging die bij indiening wordt verstuurd. Hier leest en bewerkt u ze. U hoeft nu niets te bouwen.", - "Open Flows in the menu": "Open Flows in het menu" + "World": "Wereld", + "Worlds": "Werelden", + "XP": "XP", + "XP Amount": "Aantal ervaringspunten", + "XP Award": "XP-toekenning", + "XP Awards": "XP-toekenningen", + "XP award history": "Geschiedenis XP-toekenningen", + "XP awarded": "Toegekende XP", + "XP awards": "XP-toekenningen", + "XP granted": "Verleende XP", + "Yes": "Ja", + "You're ready": "Je bent klaar", + "Your world has its first character": "Je wereld heeft zijn eerste personage", + "approved": "goedgekeurd", + "characters": "karakters", + "cumulative": "cumulatief", + "negative": "negatief", + "no": "nee", + "non-cumulative": "niet-cumulatief", + "npc": "npc", + "other": "overig", + "player": "speler", + "positive": "positief" }, "plurals": {}, "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/pl.js b/l10n/pl.js index cd49ebb5..abb8bab1 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Brak — to jest umiejętność podstawowa.", "Where the automation lives": "Gdzie mieszka automatyzacja", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows to to, co dzieje się bez niczyjego kliknięcia: przypomnienie przed upływem terminu, potwierdzenie po złożeniu. Tutaj je czytasz i edytujesz — teraz nie trzeba niczego budować.", - "Open Flows in the menu": "Otwórz Flows w menu" + "Open Flows in the menu": "Otwórz Flows w menu", + "Ability Name": "Nazwa zdolności", + "Affected Characters": "Postacie, których to dotyczy", + "Amount of copper pieces": "Liczba sztuk miedzi", + "Amount of gold pieces": "Liczba sztuk złota", + "Amount of silver pieces": "Liczba sztuk srebra", + "Automatic system notices": "Automatyczne powiadomienia systemowe", + "Award Reason": "Powód przyznania", + "Awarded At": "Przyznano dnia", + "Awarded By": "Przyznał", + "Background Story": "Historia postaci", + "Base Value": "Wartość bazowa", + "Character Card": "Karta postaci", + "Character Name": "Imię postaci", + "Checked In At": "Przybycie zarejestrowano dnia", + "Checked In By": "Przybycie zarejestrował", + "Condition Name": "Nazwa stanu", + "Contact email address": "Kontaktowy adres e-mail", + "Copper Pieces": "Sztuki miedzi", + "Effect Name": "Nazwa efektu", + "End Date": "Data zakończenia", + "Event Name": "Nazwa wydarzenia", + "Event description": "Opis wydarzenia", + "Event end date and time": "Data i godzina zakończenia wydarzenia", + "Event location": "Miejsce wydarzenia", + "Event name": "Nazwa wydarzenia", + "Event start date and time": "Data i godzina rozpoczęcia wydarzenia", + "Faith": "Wiara", + "Full name of the player": "Pełne imię i nazwisko gracza", + "Game Master Notes (Private)": "Notatki mistrza gry (prywatne)", + "Game Master Notes (Public)": "Notatki mistrza gry (publiczne)", + "Gold Pieces": "Sztuki złota", + "Item Name": "Nazwa przedmiotu", + "Items and Money": "Przedmioty i pieniądze", + "Mechanical Effect": "Efekt mechaniczny", + "Modifier Value": "Wartość modyfikatora", + "Name of the condition": "Nazwa stanu", + "Name of the effect": "Nazwa efektu", + "Name of the event": "Nazwa wydarzenia", + "Name of the item": "Nazwa przedmiotu", + "Name of the skill": "Nazwa umiejętności", + "Name of the stat": "Nazwa cechy", + "Nextcloud user": "Użytkownik Nextcloud", + "Notes about items and money": "Notatki o przedmiotach i pieniądzach", + "Notes about the player": "Notatki o graczu", + "Overridden At": "Odstępstwo przyznano dnia", + "Overridden By": "Odstępstwo przyznał", + "Override Reason": "Powód odstępstwa", + "Owner": "Właściciel", + "Owner UID": "UID właściciela", + "Participating Characters": "Uczestniczące postacie", + "Player Name": "Imię gracza", + "Post-Event Effects": "Efekty po wydarzeniu", + "Real name of the player": "Prawdziwe imię i nazwisko gracza", + "Required Conditions": "Wymagane stany", + "Required Effects": "Wymagane efekty", + "Required Score": "Wymagana wartość", + "Required Skills": "Wymagane umiejętności", + "Required Stats": "Wymagane cechy", + "Requirement Overrides": "Odstępstwa od wymagań", + "Setting Name": "Nazwa świata gry", + "Silver Pieces": "Sztuki srebra", + "Skill Name": "Nazwa umiejętności", + "Start Date": "Data rozpoczęcia", + "Starting value for all characters": "Wartość początkowa dla wszystkich postaci", + "Stat": "Cecha", + "Status": "Status", + "System Notice": "Powiadomienie systemowe", + "Unique Artifact": "Unikalny artefakt", + "Unique Condition": "Unikalny stan", + "XP Amount": "Liczba punktów doświadczenia", + "XP Award": "Przyznanie punktów doświadczenia" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pl.json b/l10n/pl.json index 90d02a3c..04dfe872 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Brak — to jest umiejętność podstawowa.", "Where the automation lives": "Gdzie mieszka automatyzacja", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows to to, co dzieje się bez niczyjego kliknięcia: przypomnienie przed upływem terminu, potwierdzenie po złożeniu. Tutaj je czytasz i edytujesz — teraz nie trzeba niczego budować.", - "Open Flows in the menu": "Otwórz Flows w menu" + "Open Flows in the menu": "Otwórz Flows w menu", + "Ability Name": "Nazwa zdolności", + "Affected Characters": "Postacie, których to dotyczy", + "Amount of copper pieces": "Liczba sztuk miedzi", + "Amount of gold pieces": "Liczba sztuk złota", + "Amount of silver pieces": "Liczba sztuk srebra", + "Automatic system notices": "Automatyczne powiadomienia systemowe", + "Award Reason": "Powód przyznania", + "Awarded At": "Przyznano dnia", + "Awarded By": "Przyznał", + "Background Story": "Historia postaci", + "Base Value": "Wartość bazowa", + "Character Card": "Karta postaci", + "Character Name": "Imię postaci", + "Checked In At": "Przybycie zarejestrowano dnia", + "Checked In By": "Przybycie zarejestrował", + "Condition Name": "Nazwa stanu", + "Contact email address": "Kontaktowy adres e-mail", + "Copper Pieces": "Sztuki miedzi", + "Effect Name": "Nazwa efektu", + "End Date": "Data zakończenia", + "Event Name": "Nazwa wydarzenia", + "Event description": "Opis wydarzenia", + "Event end date and time": "Data i godzina zakończenia wydarzenia", + "Event location": "Miejsce wydarzenia", + "Event name": "Nazwa wydarzenia", + "Event start date and time": "Data i godzina rozpoczęcia wydarzenia", + "Faith": "Wiara", + "Full name of the player": "Pełne imię i nazwisko gracza", + "Game Master Notes (Private)": "Notatki mistrza gry (prywatne)", + "Game Master Notes (Public)": "Notatki mistrza gry (publiczne)", + "Gold Pieces": "Sztuki złota", + "Item Name": "Nazwa przedmiotu", + "Items and Money": "Przedmioty i pieniądze", + "Mechanical Effect": "Efekt mechaniczny", + "Modifier Value": "Wartość modyfikatora", + "Name of the condition": "Nazwa stanu", + "Name of the effect": "Nazwa efektu", + "Name of the event": "Nazwa wydarzenia", + "Name of the item": "Nazwa przedmiotu", + "Name of the skill": "Nazwa umiejętności", + "Name of the stat": "Nazwa cechy", + "Nextcloud user": "Użytkownik Nextcloud", + "Notes about items and money": "Notatki o przedmiotach i pieniądzach", + "Notes about the player": "Notatki o graczu", + "Overridden At": "Odstępstwo przyznano dnia", + "Overridden By": "Odstępstwo przyznał", + "Override Reason": "Powód odstępstwa", + "Owner": "Właściciel", + "Owner UID": "UID właściciela", + "Participating Characters": "Uczestniczące postacie", + "Player Name": "Imię gracza", + "Post-Event Effects": "Efekty po wydarzeniu", + "Real name of the player": "Prawdziwe imię i nazwisko gracza", + "Required Conditions": "Wymagane stany", + "Required Effects": "Wymagane efekty", + "Required Score": "Wymagana wartość", + "Required Skills": "Wymagane umiejętności", + "Required Stats": "Wymagane cechy", + "Requirement Overrides": "Odstępstwa od wymagań", + "Setting Name": "Nazwa świata gry", + "Silver Pieces": "Sztuki srebra", + "Skill Name": "Nazwa umiejętności", + "Start Date": "Data rozpoczęcia", + "Starting value for all characters": "Wartość początkowa dla wszystkich postaci", + "Stat": "Cecha", + "Status": "Status", + "System Notice": "Powiadomienie systemowe", + "Unique Artifact": "Unikalny artefakt", + "Unique Condition": "Unikalny stan", + "XP Amount": "Liczba punktów doświadczenia", + "XP Award": "Przyznanie punktów doświadczenia" }, "plurals": {} } diff --git a/l10n/pt.js b/l10n/pt.js index 6fd3737b..88923f06 100644 --- a/l10n/pt.js +++ b/l10n/pt.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Nenhum — esta é uma habilidade de base.", "Where the automation lives": "Onde vive a automação", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Os Flows são o que acontece sem ninguém clicar: um lembrete antes de um prazo terminar, uma confirmação enviada na submissão. É aqui que os lê e edita — não há nada para construir agora.", - "Open Flows in the menu": "Abra Flows no menu" + "Open Flows in the menu": "Abra Flows no menu", + "Ability Name": "Nome da aptidão", + "Affected Characters": "Personagens afetadas", + "Amount of copper pieces": "Quantidade de moedas de cobre", + "Amount of gold pieces": "Quantidade de moedas de ouro", + "Amount of silver pieces": "Quantidade de moedas de prata", + "Automatic system notices": "Avisos automáticos do sistema", + "Award Reason": "Motivo da atribuição", + "Awarded At": "Atribuído em", + "Awarded By": "Atribuído por", + "Background Story": "História pessoal", + "Base Value": "Valor base", + "Character Card": "Ficha da personagem", + "Character Name": "Nome da personagem", + "Checked In At": "Entrada registada em", + "Checked In By": "Entrada registada por", + "Condition Name": "Nome da condição", + "Contact email address": "Endereço de e-mail de contacto", + "Copper Pieces": "Moedas de cobre", + "Effect Name": "Nome do efeito", + "End Date": "Data de fim", + "Event Name": "Nome do evento", + "Event description": "Descrição do evento", + "Event end date and time": "Data e hora de fim do evento", + "Event location": "Localização do evento", + "Event name": "Nome do evento", + "Event start date and time": "Data e hora de início do evento", + "Faith": "Fé", + "Full name of the player": "Nome completo do jogador", + "Game Master Notes (Private)": "Notas do mestre de jogo (privadas)", + "Game Master Notes (Public)": "Notas do mestre de jogo (públicas)", + "Gold Pieces": "Moedas de ouro", + "Item Name": "Nome do item", + "Items and Money": "Itens e dinheiro", + "Mechanical Effect": "Efeito de jogo", + "Modifier Value": "Valor do modificador", + "Name of the condition": "Nome da condição", + "Name of the effect": "Nome do efeito", + "Name of the event": "Nome do evento", + "Name of the item": "Nome do item", + "Name of the skill": "Nome da habilidade", + "Name of the stat": "Nome do atributo", + "Nextcloud user": "Utilizador do Nextcloud", + "Notes about items and money": "Notas sobre itens e dinheiro", + "Notes about the player": "Notas sobre o jogador", + "Overridden At": "Exceção concedida em", + "Overridden By": "Exceção concedida por", + "Override Reason": "Motivo da exceção", + "Owner": "Proprietário", + "Owner UID": "UID do proprietário", + "Participating Characters": "Personagens participantes", + "Player Name": "Nome do jogador", + "Post-Event Effects": "Efeitos posteriores ao evento", + "Real name of the player": "Nome real do jogador", + "Required Conditions": "Condições necessárias", + "Required Effects": "Efeitos necessários", + "Required Score": "Valor necessário", + "Required Skills": "Habilidades necessárias", + "Required Stats": "Atributos necessários", + "Requirement Overrides": "Exceções aos pré-requisitos", + "Setting Name": "Nome do cenário", + "Silver Pieces": "Moedas de prata", + "Skill Name": "Nome da habilidade", + "Start Date": "Data de início", + "Starting value for all characters": "Valor inicial para todas as personagens", + "Stat": "Atributo", + "Status": "Estado", + "System Notice": "Aviso do sistema", + "Unique Artifact": "Artefacto único", + "Unique Condition": "Condição única", + "XP Amount": "Quantidade de pontos de experiência", + "XP Award": "Atribuição de pontos de experiência" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pt.json b/l10n/pt.json index 7139ddf5..71e9d0c0 100644 --- a/l10n/pt.json +++ b/l10n/pt.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Nenhum — esta é uma habilidade de base.", "Where the automation lives": "Onde vive a automação", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Os Flows são o que acontece sem ninguém clicar: um lembrete antes de um prazo terminar, uma confirmação enviada na submissão. É aqui que os lê e edita — não há nada para construir agora.", - "Open Flows in the menu": "Abra Flows no menu" + "Open Flows in the menu": "Abra Flows no menu", + "Ability Name": "Nome da aptidão", + "Affected Characters": "Personagens afetadas", + "Amount of copper pieces": "Quantidade de moedas de cobre", + "Amount of gold pieces": "Quantidade de moedas de ouro", + "Amount of silver pieces": "Quantidade de moedas de prata", + "Automatic system notices": "Avisos automáticos do sistema", + "Award Reason": "Motivo da atribuição", + "Awarded At": "Atribuído em", + "Awarded By": "Atribuído por", + "Background Story": "História pessoal", + "Base Value": "Valor base", + "Character Card": "Ficha da personagem", + "Character Name": "Nome da personagem", + "Checked In At": "Entrada registada em", + "Checked In By": "Entrada registada por", + "Condition Name": "Nome da condição", + "Contact email address": "Endereço de e-mail de contacto", + "Copper Pieces": "Moedas de cobre", + "Effect Name": "Nome do efeito", + "End Date": "Data de fim", + "Event Name": "Nome do evento", + "Event description": "Descrição do evento", + "Event end date and time": "Data e hora de fim do evento", + "Event location": "Localização do evento", + "Event name": "Nome do evento", + "Event start date and time": "Data e hora de início do evento", + "Faith": "Fé", + "Full name of the player": "Nome completo do jogador", + "Game Master Notes (Private)": "Notas do mestre de jogo (privadas)", + "Game Master Notes (Public)": "Notas do mestre de jogo (públicas)", + "Gold Pieces": "Moedas de ouro", + "Item Name": "Nome do item", + "Items and Money": "Itens e dinheiro", + "Mechanical Effect": "Efeito de jogo", + "Modifier Value": "Valor do modificador", + "Name of the condition": "Nome da condição", + "Name of the effect": "Nome do efeito", + "Name of the event": "Nome do evento", + "Name of the item": "Nome do item", + "Name of the skill": "Nome da habilidade", + "Name of the stat": "Nome do atributo", + "Nextcloud user": "Utilizador do Nextcloud", + "Notes about items and money": "Notas sobre itens e dinheiro", + "Notes about the player": "Notas sobre o jogador", + "Overridden At": "Exceção concedida em", + "Overridden By": "Exceção concedida por", + "Override Reason": "Motivo da exceção", + "Owner": "Proprietário", + "Owner UID": "UID do proprietário", + "Participating Characters": "Personagens participantes", + "Player Name": "Nome do jogador", + "Post-Event Effects": "Efeitos posteriores ao evento", + "Real name of the player": "Nome real do jogador", + "Required Conditions": "Condições necessárias", + "Required Effects": "Efeitos necessários", + "Required Score": "Valor necessário", + "Required Skills": "Habilidades necessárias", + "Required Stats": "Atributos necessários", + "Requirement Overrides": "Exceções aos pré-requisitos", + "Setting Name": "Nome do cenário", + "Silver Pieces": "Moedas de prata", + "Skill Name": "Nome da habilidade", + "Start Date": "Data de início", + "Starting value for all characters": "Valor inicial para todas as personagens", + "Stat": "Atributo", + "Status": "Estado", + "System Notice": "Aviso do sistema", + "Unique Artifact": "Artefacto único", + "Unique Condition": "Condição única", + "XP Amount": "Quantidade de pontos de experiência", + "XP Award": "Atribuição de pontos de experiência" }, "plurals": {} } diff --git a/l10n/rm.js b/l10n/rm.js index d8cdf142..71148699 100644 --- a/l10n/rm.js +++ b/l10n/rm.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Nagina — quai è ina cumpetenza da basa.", "Where the automation lives": "Nua che l'automatisaziun viva", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows èn quai che capita senza ch'insatgi cliccia: ina memoria avant ch'in termin scada, ina conferma cun l'inoltraziun. Qua las legias e las modifitgeschas — i n'è nagut da construir ussa.", - "Open Flows in the menu": "Avra Flows en il menu" + "Open Flows in the menu": "Avra Flows en il menu", + "Ability Name": "Num da l'abilitad", + "Affected Characters": "Persunajs pertutgads", + "Amount of copper pieces": "Dumber da munaidas da cuper", + "Amount of gold pieces": "Dumber da munaidas d'aur", + "Amount of silver pieces": "Dumber da munaidas d'argient", + "Automatic system notices": "Avis automatics dal sistem", + "Award Reason": "Motiv da l'attribuziun", + "Awarded At": "Attribuì ils", + "Awarded By": "Attribuì da", + "Background Story": "Istorgia da fundament", + "Base Value": "Valur da basa", + "Character Card": "Carta dal persunaj", + "Character Name": "Num dal persunaj", + "Checked In At": "Arrivada annunziada ils", + "Checked In By": "Arrivada annunziada da", + "Condition Name": "Num da la conditiun", + "Contact email address": "Adressa dad e-mail da contact", + "Copper Pieces": "Munaidas da cuper", + "Effect Name": "Num da l'effect", + "End Date": "Data da finiziun", + "Event Name": "Num da l'eveniment", + "Event description": "Descripziun da l'eveniment", + "Event end date and time": "Data e temp da finiziun da l'eveniment", + "Event location": "Lieu da l'eveniment", + "Event name": "Num da l'eveniment", + "Event start date and time": "Data e temp da cumenzament da l'eveniment", + "Faith": "Cardientscha", + "Full name of the player": "Num cumplet dal giugader", + "Game Master Notes (Private)": "Notizias dal manader dal gieu (privatas)", + "Game Master Notes (Public)": "Notizias dal manader dal gieu (publicas)", + "Gold Pieces": "Munaidas d'aur", + "Item Name": "Num da l'object", + "Items and Money": "Objects e daners", + "Mechanical Effect": "Effect dal gieu", + "Modifier Value": "Valur dal modifitgader", + "Name of the condition": "Num da la conditiun", + "Name of the effect": "Num da l'effect", + "Name of the event": "Num da l'eveniment", + "Name of the item": "Num da l'object", + "Name of the skill": "Num da la cumpetenza", + "Name of the stat": "Num da l'attribut", + "Nextcloud user": "Utilisader da Nextcloud", + "Notes about items and money": "Notizias davart objects e daners", + "Notes about the player": "Notizias davart il giugader", + "Overridden At": "Surpassà ils", + "Overridden By": "Surpassà da", + "Override Reason": "Motiv da la surpassada", + "Owner": "Possessur", + "Owner UID": "UID dal possessur", + "Participating Characters": "Persunajs participants", + "Player Name": "Num dal giugader", + "Post-Event Effects": "Effects suenter l'eveniment", + "Real name of the player": "Num real dal giugader", + "Required Conditions": "Conditiuns necessarias", + "Required Effects": "Effects necessaris", + "Required Score": "Valur necessaria", + "Required Skills": "Cumpetenzas necessarias", + "Required Stats": "Attributs necessaris", + "Requirement Overrides": "Surpassadas da las premissas", + "Setting Name": "Num dal mund da gieu", + "Silver Pieces": "Munaidas d'argient", + "Skill Name": "Num da la cumpetenza", + "Start Date": "Data da cumenzament", + "Starting value for all characters": "Valur da partenza per tut ils persunajs", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Avis dal sistem", + "Unique Artifact": "Artefact unic", + "Unique Condition": "Conditiun unica", + "XP Amount": "Dumber da puncts d'experientscha", + "XP Award": "Attribuziun da puncts d'experientscha" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/rm.json b/l10n/rm.json index 4dfb8c93..a686f445 100644 --- a/l10n/rm.json +++ b/l10n/rm.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Nagina — quai è ina cumpetenza da basa.", "Where the automation lives": "Nua che l'automatisaziun viva", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows èn quai che capita senza ch'insatgi cliccia: ina memoria avant ch'in termin scada, ina conferma cun l'inoltraziun. Qua las legias e las modifitgeschas — i n'è nagut da construir ussa.", - "Open Flows in the menu": "Avra Flows en il menu" + "Open Flows in the menu": "Avra Flows en il menu", + "Ability Name": "Num da l'abilitad", + "Affected Characters": "Persunajs pertutgads", + "Amount of copper pieces": "Dumber da munaidas da cuper", + "Amount of gold pieces": "Dumber da munaidas d'aur", + "Amount of silver pieces": "Dumber da munaidas d'argient", + "Automatic system notices": "Avis automatics dal sistem", + "Award Reason": "Motiv da l'attribuziun", + "Awarded At": "Attribuì ils", + "Awarded By": "Attribuì da", + "Background Story": "Istorgia da fundament", + "Base Value": "Valur da basa", + "Character Card": "Carta dal persunaj", + "Character Name": "Num dal persunaj", + "Checked In At": "Arrivada annunziada ils", + "Checked In By": "Arrivada annunziada da", + "Condition Name": "Num da la conditiun", + "Contact email address": "Adressa dad e-mail da contact", + "Copper Pieces": "Munaidas da cuper", + "Effect Name": "Num da l'effect", + "End Date": "Data da finiziun", + "Event Name": "Num da l'eveniment", + "Event description": "Descripziun da l'eveniment", + "Event end date and time": "Data e temp da finiziun da l'eveniment", + "Event location": "Lieu da l'eveniment", + "Event name": "Num da l'eveniment", + "Event start date and time": "Data e temp da cumenzament da l'eveniment", + "Faith": "Cardientscha", + "Full name of the player": "Num cumplet dal giugader", + "Game Master Notes (Private)": "Notizias dal manader dal gieu (privatas)", + "Game Master Notes (Public)": "Notizias dal manader dal gieu (publicas)", + "Gold Pieces": "Munaidas d'aur", + "Item Name": "Num da l'object", + "Items and Money": "Objects e daners", + "Mechanical Effect": "Effect dal gieu", + "Modifier Value": "Valur dal modifitgader", + "Name of the condition": "Num da la conditiun", + "Name of the effect": "Num da l'effect", + "Name of the event": "Num da l'eveniment", + "Name of the item": "Num da l'object", + "Name of the skill": "Num da la cumpetenza", + "Name of the stat": "Num da l'attribut", + "Nextcloud user": "Utilisader da Nextcloud", + "Notes about items and money": "Notizias davart objects e daners", + "Notes about the player": "Notizias davart il giugader", + "Overridden At": "Surpassà ils", + "Overridden By": "Surpassà da", + "Override Reason": "Motiv da la surpassada", + "Owner": "Possessur", + "Owner UID": "UID dal possessur", + "Participating Characters": "Persunajs participants", + "Player Name": "Num dal giugader", + "Post-Event Effects": "Effects suenter l'eveniment", + "Real name of the player": "Num real dal giugader", + "Required Conditions": "Conditiuns necessarias", + "Required Effects": "Effects necessaris", + "Required Score": "Valur necessaria", + "Required Skills": "Cumpetenzas necessarias", + "Required Stats": "Attributs necessaris", + "Requirement Overrides": "Surpassadas da las premissas", + "Setting Name": "Num dal mund da gieu", + "Silver Pieces": "Munaidas d'argient", + "Skill Name": "Num da la cumpetenza", + "Start Date": "Data da cumenzament", + "Starting value for all characters": "Valur da partenza per tut ils persunajs", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Avis dal sistem", + "Unique Artifact": "Artefact unic", + "Unique Condition": "Conditiun unica", + "XP Amount": "Dumber da puncts d'experientscha", + "XP Award": "Attribuziun da puncts d'experientscha" }, "plurals": {} } diff --git a/l10n/ro.js b/l10n/ro.js index 3f1d1a73..6142cbf3 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Niciuna — aceasta este o abilitate de bază.", "Where the automation lives": "Unde locuiește automatizarea", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows este ceea ce se întâmplă fără ca nimeni să dea clic: un memento înainte de expirarea unui termen, o confirmare la trimitere. Aici le citești și le editezi — nu e nimic de construit acum.", - "Open Flows in the menu": "Deschide Flows din meniu" + "Open Flows in the menu": "Deschide Flows din meniu", + "Ability Name": "Numele aptitudinii", + "Affected Characters": "Personaje afectate", + "Amount of copper pieces": "Cantitatea de monede de aramă", + "Amount of gold pieces": "Cantitatea de monede de aur", + "Amount of silver pieces": "Cantitatea de monede de argint", + "Automatic system notices": "Notificări automate de sistem", + "Award Reason": "Motivul acordării", + "Awarded At": "Acordat la", + "Awarded By": "Acordat de", + "Background Story": "Poveste de fundal", + "Base Value": "Valoare de bază", + "Character Card": "Fișa personajului", + "Character Name": "Numele personajului", + "Checked In At": "Prezență înregistrată la", + "Checked In By": "Prezență înregistrată de", + "Condition Name": "Numele stării", + "Contact email address": "Adresă de e-mail de contact", + "Copper Pieces": "Monede de aramă", + "Effect Name": "Numele efectului", + "End Date": "Data de sfârșit", + "Event Name": "Numele evenimentului", + "Event description": "Descrierea evenimentului", + "Event end date and time": "Data și ora de sfârșit ale evenimentului", + "Event location": "Locația evenimentului", + "Event name": "Numele evenimentului", + "Event start date and time": "Data și ora de început ale evenimentului", + "Faith": "Credință", + "Full name of the player": "Numele complet al jucătorului", + "Game Master Notes (Private)": "Notele maestrului de joc (private)", + "Game Master Notes (Public)": "Notele maestrului de joc (publice)", + "Gold Pieces": "Monede de aur", + "Item Name": "Numele obiectului", + "Items and Money": "Obiecte și bani", + "Mechanical Effect": "Efect de joc", + "Modifier Value": "Valoarea modificatorului", + "Name of the condition": "Numele stării", + "Name of the effect": "Numele efectului", + "Name of the event": "Numele evenimentului", + "Name of the item": "Numele obiectului", + "Name of the skill": "Numele abilității", + "Name of the stat": "Numele atributului", + "Nextcloud user": "Utilizator Nextcloud", + "Notes about items and money": "Note despre obiecte și bani", + "Notes about the player": "Note despre jucător", + "Overridden At": "Derogare acordată la", + "Overridden By": "Derogare acordată de", + "Override Reason": "Motivul derogării", + "Owner": "Proprietar", + "Owner UID": "UID-ul proprietarului", + "Participating Characters": "Personaje participante", + "Player Name": "Numele jucătorului", + "Post-Event Effects": "Efecte după eveniment", + "Real name of the player": "Numele real al jucătorului", + "Required Conditions": "Stări necesare", + "Required Effects": "Efecte necesare", + "Required Score": "Valoare necesară", + "Required Skills": "Abilități necesare", + "Required Stats": "Atribute necesare", + "Requirement Overrides": "Derogări de la cerințe", + "Setting Name": "Numele universului", + "Silver Pieces": "Monede de argint", + "Skill Name": "Numele abilității", + "Start Date": "Data de început", + "Starting value for all characters": "Valoare inițială pentru toate personajele", + "Stat": "Atribut", + "Status": "Status", + "System Notice": "Notificare de sistem", + "Unique Artifact": "Artefact unic", + "Unique Condition": "Stare unică", + "XP Amount": "Cantitatea de puncte de experiență", + "XP Award": "Acordare de puncte de experiență" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ro.json b/l10n/ro.json index a7233939..252d1b4a 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Niciuna — aceasta este o abilitate de bază.", "Where the automation lives": "Unde locuiește automatizarea", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows este ceea ce se întâmplă fără ca nimeni să dea clic: un memento înainte de expirarea unui termen, o confirmare la trimitere. Aici le citești și le editezi — nu e nimic de construit acum.", - "Open Flows in the menu": "Deschide Flows din meniu" + "Open Flows in the menu": "Deschide Flows din meniu", + "Ability Name": "Numele aptitudinii", + "Affected Characters": "Personaje afectate", + "Amount of copper pieces": "Cantitatea de monede de aramă", + "Amount of gold pieces": "Cantitatea de monede de aur", + "Amount of silver pieces": "Cantitatea de monede de argint", + "Automatic system notices": "Notificări automate de sistem", + "Award Reason": "Motivul acordării", + "Awarded At": "Acordat la", + "Awarded By": "Acordat de", + "Background Story": "Poveste de fundal", + "Base Value": "Valoare de bază", + "Character Card": "Fișa personajului", + "Character Name": "Numele personajului", + "Checked In At": "Prezență înregistrată la", + "Checked In By": "Prezență înregistrată de", + "Condition Name": "Numele stării", + "Contact email address": "Adresă de e-mail de contact", + "Copper Pieces": "Monede de aramă", + "Effect Name": "Numele efectului", + "End Date": "Data de sfârșit", + "Event Name": "Numele evenimentului", + "Event description": "Descrierea evenimentului", + "Event end date and time": "Data și ora de sfârșit ale evenimentului", + "Event location": "Locația evenimentului", + "Event name": "Numele evenimentului", + "Event start date and time": "Data și ora de început ale evenimentului", + "Faith": "Credință", + "Full name of the player": "Numele complet al jucătorului", + "Game Master Notes (Private)": "Notele maestrului de joc (private)", + "Game Master Notes (Public)": "Notele maestrului de joc (publice)", + "Gold Pieces": "Monede de aur", + "Item Name": "Numele obiectului", + "Items and Money": "Obiecte și bani", + "Mechanical Effect": "Efect de joc", + "Modifier Value": "Valoarea modificatorului", + "Name of the condition": "Numele stării", + "Name of the effect": "Numele efectului", + "Name of the event": "Numele evenimentului", + "Name of the item": "Numele obiectului", + "Name of the skill": "Numele abilității", + "Name of the stat": "Numele atributului", + "Nextcloud user": "Utilizator Nextcloud", + "Notes about items and money": "Note despre obiecte și bani", + "Notes about the player": "Note despre jucător", + "Overridden At": "Derogare acordată la", + "Overridden By": "Derogare acordată de", + "Override Reason": "Motivul derogării", + "Owner": "Proprietar", + "Owner UID": "UID-ul proprietarului", + "Participating Characters": "Personaje participante", + "Player Name": "Numele jucătorului", + "Post-Event Effects": "Efecte după eveniment", + "Real name of the player": "Numele real al jucătorului", + "Required Conditions": "Stări necesare", + "Required Effects": "Efecte necesare", + "Required Score": "Valoare necesară", + "Required Skills": "Abilități necesare", + "Required Stats": "Atribute necesare", + "Requirement Overrides": "Derogări de la cerințe", + "Setting Name": "Numele universului", + "Silver Pieces": "Monede de argint", + "Skill Name": "Numele abilității", + "Start Date": "Data de început", + "Starting value for all characters": "Valoare inițială pentru toate personajele", + "Stat": "Atribut", + "Status": "Status", + "System Notice": "Notificare de sistem", + "Unique Artifact": "Artefact unic", + "Unique Condition": "Stare unică", + "XP Amount": "Cantitatea de puncte de experiență", + "XP Award": "Acordare de puncte de experiență" }, "plurals": {} } diff --git a/l10n/ru.js b/l10n/ru.js index 4588e3dc..3d78b445 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Нет — это базовый навык.", "Where the automation lives": "Где живёт автоматизация", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows — это то, что происходит без единого клика: напоминание до истечения срока, подтверждение при отправке. Здесь вы их читаете и редактируете — сейчас ничего строить не нужно.", - "Open Flows in the menu": "Откройте Flows в меню" + "Open Flows in the menu": "Откройте Flows в меню", + "Ability Name": "Название способности", + "Affected Characters": "Затронутые персонажи", + "Amount of copper pieces": "Количество медных монет", + "Amount of gold pieces": "Количество золотых монет", + "Amount of silver pieces": "Количество серебряных монет", + "Automatic system notices": "Автоматические системные уведомления", + "Award Reason": "Причина начисления", + "Awarded At": "Начислено", + "Awarded By": "Начислил", + "Background Story": "Предыстория персонажа", + "Base Value": "Базовое значение", + "Character Card": "Карточка персонажа", + "Character Name": "Имя персонажа", + "Checked In At": "Прибытие отмечено", + "Checked In By": "Прибытие отметил", + "Condition Name": "Название состояния", + "Contact email address": "Контактный адрес электронной почты", + "Copper Pieces": "Медные монеты", + "Effect Name": "Название эффекта", + "End Date": "Дата окончания", + "Event Name": "Название события", + "Event description": "Описание события", + "Event end date and time": "Дата и время окончания события", + "Event location": "Место проведения события", + "Event name": "Название события", + "Event start date and time": "Дата и время начала события", + "Faith": "Вера", + "Full name of the player": "Полное имя игрока", + "Game Master Notes (Private)": "Заметки мастера игры (личные)", + "Game Master Notes (Public)": "Заметки мастера игры (общедоступные)", + "Gold Pieces": "Золотые монеты", + "Item Name": "Название предмета", + "Items and Money": "Предметы и деньги", + "Mechanical Effect": "Игровой эффект", + "Modifier Value": "Значение модификатора", + "Name of the condition": "Название состояния", + "Name of the effect": "Название эффекта", + "Name of the event": "Название события", + "Name of the item": "Название предмета", + "Name of the skill": "Название навыка", + "Name of the stat": "Название характеристики", + "Nextcloud user": "Пользователь Nextcloud", + "Notes about items and money": "Заметки о предметах и деньгах", + "Notes about the player": "Заметки об игроке", + "Overridden At": "Исключение предоставлено", + "Overridden By": "Исключение предоставил", + "Override Reason": "Причина исключения", + "Owner": "Владелец", + "Owner UID": "UID владельца", + "Participating Characters": "Участвующие персонажи", + "Player Name": "Имя игрока", + "Post-Event Effects": "Эффекты после события", + "Real name of the player": "Настоящее имя игрока", + "Required Conditions": "Требуемые состояния", + "Required Effects": "Требуемые эффекты", + "Required Score": "Требуемое значение", + "Required Skills": "Требуемые навыки", + "Required Stats": "Требуемые характеристики", + "Requirement Overrides": "Исключения из требований", + "Setting Name": "Название игрового мира", + "Silver Pieces": "Серебряные монеты", + "Skill Name": "Название навыка", + "Start Date": "Дата начала", + "Starting value for all characters": "Начальное значение для всех персонажей", + "Stat": "Характеристика", + "Status": "Статус", + "System Notice": "Системное уведомление", + "Unique Artifact": "Уникальный артефакт", + "Unique Condition": "Уникальное состояние", + "XP Amount": "Количество очков опыта", + "XP Award": "Начисление очков опыта" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ru.json b/l10n/ru.json index 7e6536c1..5570e3c3 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Нет — это базовый навык.", "Where the automation lives": "Где живёт автоматизация", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows — это то, что происходит без единого клика: напоминание до истечения срока, подтверждение при отправке. Здесь вы их читаете и редактируете — сейчас ничего строить не нужно.", - "Open Flows in the menu": "Откройте Flows в меню" + "Open Flows in the menu": "Откройте Flows в меню", + "Ability Name": "Название способности", + "Affected Characters": "Затронутые персонажи", + "Amount of copper pieces": "Количество медных монет", + "Amount of gold pieces": "Количество золотых монет", + "Amount of silver pieces": "Количество серебряных монет", + "Automatic system notices": "Автоматические системные уведомления", + "Award Reason": "Причина начисления", + "Awarded At": "Начислено", + "Awarded By": "Начислил", + "Background Story": "Предыстория персонажа", + "Base Value": "Базовое значение", + "Character Card": "Карточка персонажа", + "Character Name": "Имя персонажа", + "Checked In At": "Прибытие отмечено", + "Checked In By": "Прибытие отметил", + "Condition Name": "Название состояния", + "Contact email address": "Контактный адрес электронной почты", + "Copper Pieces": "Медные монеты", + "Effect Name": "Название эффекта", + "End Date": "Дата окончания", + "Event Name": "Название события", + "Event description": "Описание события", + "Event end date and time": "Дата и время окончания события", + "Event location": "Место проведения события", + "Event name": "Название события", + "Event start date and time": "Дата и время начала события", + "Faith": "Вера", + "Full name of the player": "Полное имя игрока", + "Game Master Notes (Private)": "Заметки мастера игры (личные)", + "Game Master Notes (Public)": "Заметки мастера игры (общедоступные)", + "Gold Pieces": "Золотые монеты", + "Item Name": "Название предмета", + "Items and Money": "Предметы и деньги", + "Mechanical Effect": "Игровой эффект", + "Modifier Value": "Значение модификатора", + "Name of the condition": "Название состояния", + "Name of the effect": "Название эффекта", + "Name of the event": "Название события", + "Name of the item": "Название предмета", + "Name of the skill": "Название навыка", + "Name of the stat": "Название характеристики", + "Nextcloud user": "Пользователь Nextcloud", + "Notes about items and money": "Заметки о предметах и деньгах", + "Notes about the player": "Заметки об игроке", + "Overridden At": "Исключение предоставлено", + "Overridden By": "Исключение предоставил", + "Override Reason": "Причина исключения", + "Owner": "Владелец", + "Owner UID": "UID владельца", + "Participating Characters": "Участвующие персонажи", + "Player Name": "Имя игрока", + "Post-Event Effects": "Эффекты после события", + "Real name of the player": "Настоящее имя игрока", + "Required Conditions": "Требуемые состояния", + "Required Effects": "Требуемые эффекты", + "Required Score": "Требуемое значение", + "Required Skills": "Требуемые навыки", + "Required Stats": "Требуемые характеристики", + "Requirement Overrides": "Исключения из требований", + "Setting Name": "Название игрового мира", + "Silver Pieces": "Серебряные монеты", + "Skill Name": "Название навыка", + "Start Date": "Дата начала", + "Starting value for all characters": "Начальное значение для всех персонажей", + "Stat": "Характеристика", + "Status": "Статус", + "System Notice": "Системное уведомление", + "Unique Artifact": "Уникальный артефакт", + "Unique Condition": "Уникальное состояние", + "XP Amount": "Количество очков опыта", + "XP Award": "Начисление очков опыта" }, "plurals": {} } diff --git a/l10n/sk.js b/l10n/sk.js index 912ca2f3..7b5b998e 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Žiadne — toto je koreňová zručnosť.", "Where the automation lives": "Kde býva automatizácia", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je to, čo sa deje bez toho, aby niekto klikol: pripomienka pred uplynutím lehoty, potvrdenie pri odoslaní. Tu ich čítaš a upravuješ — teraz netreba nič stavať.", - "Open Flows in the menu": "Otvor Flows v ponuke" + "Open Flows in the menu": "Otvor Flows v ponuke", + "Ability Name": "Názov schopnosti", + "Affected Characters": "Dotknuté postavy", + "Amount of copper pieces": "Počet medených mincí", + "Amount of gold pieces": "Počet zlatých mincí", + "Amount of silver pieces": "Počet strieborných mincí", + "Automatic system notices": "Automatické systémové oznámenia", + "Award Reason": "Dôvod udelenia", + "Awarded At": "Udelené dňa", + "Awarded By": "Udelil", + "Background Story": "Príbeh postavy", + "Base Value": "Základná hodnota", + "Character Card": "Karta postavy", + "Character Name": "Meno postavy", + "Checked In At": "Príchod zaregistrovaný dňa", + "Checked In By": "Príchod zaregistroval", + "Condition Name": "Názov stavu", + "Contact email address": "Kontaktná e-mailová adresa", + "Copper Pieces": "Medené mince", + "Effect Name": "Názov účinku", + "End Date": "Dátum ukončenia", + "Event Name": "Názov podujatia", + "Event description": "Popis podujatia", + "Event end date and time": "Dátum a čas ukončenia podujatia", + "Event location": "Miesto konania podujatia", + "Event name": "Názov podujatia", + "Event start date and time": "Dátum a čas začiatku podujatia", + "Faith": "Viera", + "Full name of the player": "Celé meno hráča", + "Game Master Notes (Private)": "Poznámky rozprávača (súkromné)", + "Game Master Notes (Public)": "Poznámky rozprávača (verejné)", + "Gold Pieces": "Zlaté mince", + "Item Name": "Názov predmetu", + "Items and Money": "Predmety a peniaze", + "Mechanical Effect": "Herný účinok", + "Modifier Value": "Hodnota modifikátora", + "Name of the condition": "Názov stavu", + "Name of the effect": "Názov účinku", + "Name of the event": "Názov podujatia", + "Name of the item": "Názov predmetu", + "Name of the skill": "Názov zručnosti", + "Name of the stat": "Názov vlastnosti", + "Nextcloud user": "Používateľ Nextcloudu", + "Notes about items and money": "Poznámky k predmetom a peniazom", + "Notes about the player": "Poznámky k hráčovi", + "Overridden At": "Výnimka udelená dňa", + "Overridden By": "Výnimku udelil", + "Override Reason": "Dôvod výnimky", + "Owner": "Vlastník", + "Owner UID": "UID vlastníka", + "Participating Characters": "Zúčastnené postavy", + "Player Name": "Meno hráča", + "Post-Event Effects": "Účinky po podujatí", + "Real name of the player": "Skutočné meno hráča", + "Required Conditions": "Požadované stavy", + "Required Effects": "Požadované účinky", + "Required Score": "Požadovaná hodnota", + "Required Skills": "Požadované zručnosti", + "Required Stats": "Požadované vlastnosti", + "Requirement Overrides": "Výnimky z predpokladov", + "Setting Name": "Názov herného sveta", + "Silver Pieces": "Strieborné mince", + "Skill Name": "Názov zručnosti", + "Start Date": "Dátum začiatku", + "Starting value for all characters": "Počiatočná hodnota pre všetky postavy", + "Stat": "Vlastnosť", + "Status": "Status", + "System Notice": "Systémové oznámenie", + "Unique Artifact": "Jedinečný artefakt", + "Unique Condition": "Jedinečný stav", + "XP Amount": "Počet skúsenostných bodov", + "XP Award": "Udelenie skúsenostných bodov" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sk.json b/l10n/sk.json index e3b31328..5427bd0e 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Žiadne — toto je koreňová zručnosť.", "Where the automation lives": "Kde býva automatizácia", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je to, čo sa deje bez toho, aby niekto klikol: pripomienka pred uplynutím lehoty, potvrdenie pri odoslaní. Tu ich čítaš a upravuješ — teraz netreba nič stavať.", - "Open Flows in the menu": "Otvor Flows v ponuke" + "Open Flows in the menu": "Otvor Flows v ponuke", + "Ability Name": "Názov schopnosti", + "Affected Characters": "Dotknuté postavy", + "Amount of copper pieces": "Počet medených mincí", + "Amount of gold pieces": "Počet zlatých mincí", + "Amount of silver pieces": "Počet strieborných mincí", + "Automatic system notices": "Automatické systémové oznámenia", + "Award Reason": "Dôvod udelenia", + "Awarded At": "Udelené dňa", + "Awarded By": "Udelil", + "Background Story": "Príbeh postavy", + "Base Value": "Základná hodnota", + "Character Card": "Karta postavy", + "Character Name": "Meno postavy", + "Checked In At": "Príchod zaregistrovaný dňa", + "Checked In By": "Príchod zaregistroval", + "Condition Name": "Názov stavu", + "Contact email address": "Kontaktná e-mailová adresa", + "Copper Pieces": "Medené mince", + "Effect Name": "Názov účinku", + "End Date": "Dátum ukončenia", + "Event Name": "Názov podujatia", + "Event description": "Popis podujatia", + "Event end date and time": "Dátum a čas ukončenia podujatia", + "Event location": "Miesto konania podujatia", + "Event name": "Názov podujatia", + "Event start date and time": "Dátum a čas začiatku podujatia", + "Faith": "Viera", + "Full name of the player": "Celé meno hráča", + "Game Master Notes (Private)": "Poznámky rozprávača (súkromné)", + "Game Master Notes (Public)": "Poznámky rozprávača (verejné)", + "Gold Pieces": "Zlaté mince", + "Item Name": "Názov predmetu", + "Items and Money": "Predmety a peniaze", + "Mechanical Effect": "Herný účinok", + "Modifier Value": "Hodnota modifikátora", + "Name of the condition": "Názov stavu", + "Name of the effect": "Názov účinku", + "Name of the event": "Názov podujatia", + "Name of the item": "Názov predmetu", + "Name of the skill": "Názov zručnosti", + "Name of the stat": "Názov vlastnosti", + "Nextcloud user": "Používateľ Nextcloudu", + "Notes about items and money": "Poznámky k predmetom a peniazom", + "Notes about the player": "Poznámky k hráčovi", + "Overridden At": "Výnimka udelená dňa", + "Overridden By": "Výnimku udelil", + "Override Reason": "Dôvod výnimky", + "Owner": "Vlastník", + "Owner UID": "UID vlastníka", + "Participating Characters": "Zúčastnené postavy", + "Player Name": "Meno hráča", + "Post-Event Effects": "Účinky po podujatí", + "Real name of the player": "Skutočné meno hráča", + "Required Conditions": "Požadované stavy", + "Required Effects": "Požadované účinky", + "Required Score": "Požadovaná hodnota", + "Required Skills": "Požadované zručnosti", + "Required Stats": "Požadované vlastnosti", + "Requirement Overrides": "Výnimky z predpokladov", + "Setting Name": "Názov herného sveta", + "Silver Pieces": "Strieborné mince", + "Skill Name": "Názov zručnosti", + "Start Date": "Dátum začiatku", + "Starting value for all characters": "Počiatočná hodnota pre všetky postavy", + "Stat": "Vlastnosť", + "Status": "Status", + "System Notice": "Systémové oznámenie", + "Unique Artifact": "Jedinečný artefakt", + "Unique Condition": "Jedinečný stav", + "XP Amount": "Počet skúsenostných bodov", + "XP Award": "Udelenie skúsenostných bodov" }, "plurals": {} } diff --git a/l10n/sl.js b/l10n/sl.js index a49e01b4..923e45d2 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Brez — to je korenska veščina.", "Where the automation lives": "Kje živi avtomatizacija", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je to, kar se zgodi, ne da bi kdo kliknil: opomnik pred iztekom roka, potrditev ob oddaji. Tukaj jih bereš in urejaš — zdaj ni treba ničesar graditi.", - "Open Flows in the menu": "Odpri Flows v meniju" + "Open Flows in the menu": "Odpri Flows v meniju", + "Ability Name": "Ime sposobnosti", + "Affected Characters": "Prizadeti liki", + "Amount of copper pieces": "Število bakrenih kovancev", + "Amount of gold pieces": "Število zlatih kovancev", + "Amount of silver pieces": "Število srebrnih kovancev", + "Automatic system notices": "Samodejna sistemska obvestila", + "Award Reason": "Razlog za dodelitev", + "Awarded At": "Dodeljeno dne", + "Awarded By": "Dodelil", + "Background Story": "Zgodba ozadja", + "Base Value": "Osnovna vrednost", + "Character Card": "Kartica lika", + "Character Name": "Ime lika", + "Checked In At": "Prihod zabeležen dne", + "Checked In By": "Prihod zabeležil", + "Condition Name": "Ime stanja", + "Contact email address": "Kontaktni e-poštni naslov", + "Copper Pieces": "Bakreni kovanci", + "Effect Name": "Ime učinka", + "End Date": "Datum konca", + "Event Name": "Ime dogodka", + "Event description": "Opis dogodka", + "Event end date and time": "Datum in čas konca dogodka", + "Event location": "Kraj dogodka", + "Event name": "Ime dogodka", + "Event start date and time": "Datum in čas začetka dogodka", + "Faith": "Vera", + "Full name of the player": "Polno ime igralca", + "Game Master Notes (Private)": "Zapiski vodje igre (zasebni)", + "Game Master Notes (Public)": "Zapiski vodje igre (javni)", + "Gold Pieces": "Zlati kovanci", + "Item Name": "Ime predmeta", + "Items and Money": "Predmeti in denar", + "Mechanical Effect": "Igralni učinek", + "Modifier Value": "Vrednost modifikatorja", + "Name of the condition": "Ime stanja", + "Name of the effect": "Ime učinka", + "Name of the event": "Ime dogodka", + "Name of the item": "Ime predmeta", + "Name of the skill": "Ime veščine", + "Name of the stat": "Ime lastnosti", + "Nextcloud user": "Uporabnik Nextcloud", + "Notes about items and money": "Zapiski o predmetih in denarju", + "Notes about the player": "Zapiski o igralcu", + "Overridden At": "Izjema odobrena dne", + "Overridden By": "Izjemo odobril", + "Override Reason": "Razlog za izjemo", + "Owner": "Lastnik", + "Owner UID": "UID lastnika", + "Participating Characters": "Sodelujoči liki", + "Player Name": "Ime igralca", + "Post-Event Effects": "Učinki po dogodku", + "Real name of the player": "Pravo ime igralca", + "Required Conditions": "Zahtevana stanja", + "Required Effects": "Zahtevani učinki", + "Required Score": "Zahtevana vrednost", + "Required Skills": "Zahtevane veščine", + "Required Stats": "Zahtevane lastnosti", + "Requirement Overrides": "Izjeme od predpogojev", + "Setting Name": "Ime igralnega sveta", + "Silver Pieces": "Srebrni kovanci", + "Skill Name": "Ime veščine", + "Start Date": "Datum začetka", + "Starting value for all characters": "Začetna vrednost za vse like", + "Stat": "Lastnost", + "Status": "Status", + "System Notice": "Sistemsko obvestilo", + "Unique Artifact": "Edinstven artefakt", + "Unique Condition": "Edinstveno stanje", + "XP Amount": "Število izkušenjskih točk", + "XP Award": "Dodelitev izkušenjskih točk" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sl.json b/l10n/sl.json index f63f1d0c..cd16ee12 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Brez — to je korenska veščina.", "Where the automation lives": "Kje živi avtomatizacija", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows je to, kar se zgodi, ne da bi kdo kliknil: opomnik pred iztekom roka, potrditev ob oddaji. Tukaj jih bereš in urejaš — zdaj ni treba ničesar graditi.", - "Open Flows in the menu": "Odpri Flows v meniju" + "Open Flows in the menu": "Odpri Flows v meniju", + "Ability Name": "Ime sposobnosti", + "Affected Characters": "Prizadeti liki", + "Amount of copper pieces": "Število bakrenih kovancev", + "Amount of gold pieces": "Število zlatih kovancev", + "Amount of silver pieces": "Število srebrnih kovancev", + "Automatic system notices": "Samodejna sistemska obvestila", + "Award Reason": "Razlog za dodelitev", + "Awarded At": "Dodeljeno dne", + "Awarded By": "Dodelil", + "Background Story": "Zgodba ozadja", + "Base Value": "Osnovna vrednost", + "Character Card": "Kartica lika", + "Character Name": "Ime lika", + "Checked In At": "Prihod zabeležen dne", + "Checked In By": "Prihod zabeležil", + "Condition Name": "Ime stanja", + "Contact email address": "Kontaktni e-poštni naslov", + "Copper Pieces": "Bakreni kovanci", + "Effect Name": "Ime učinka", + "End Date": "Datum konca", + "Event Name": "Ime dogodka", + "Event description": "Opis dogodka", + "Event end date and time": "Datum in čas konca dogodka", + "Event location": "Kraj dogodka", + "Event name": "Ime dogodka", + "Event start date and time": "Datum in čas začetka dogodka", + "Faith": "Vera", + "Full name of the player": "Polno ime igralca", + "Game Master Notes (Private)": "Zapiski vodje igre (zasebni)", + "Game Master Notes (Public)": "Zapiski vodje igre (javni)", + "Gold Pieces": "Zlati kovanci", + "Item Name": "Ime predmeta", + "Items and Money": "Predmeti in denar", + "Mechanical Effect": "Igralni učinek", + "Modifier Value": "Vrednost modifikatorja", + "Name of the condition": "Ime stanja", + "Name of the effect": "Ime učinka", + "Name of the event": "Ime dogodka", + "Name of the item": "Ime predmeta", + "Name of the skill": "Ime veščine", + "Name of the stat": "Ime lastnosti", + "Nextcloud user": "Uporabnik Nextcloud", + "Notes about items and money": "Zapiski o predmetih in denarju", + "Notes about the player": "Zapiski o igralcu", + "Overridden At": "Izjema odobrena dne", + "Overridden By": "Izjemo odobril", + "Override Reason": "Razlog za izjemo", + "Owner": "Lastnik", + "Owner UID": "UID lastnika", + "Participating Characters": "Sodelujoči liki", + "Player Name": "Ime igralca", + "Post-Event Effects": "Učinki po dogodku", + "Real name of the player": "Pravo ime igralca", + "Required Conditions": "Zahtevana stanja", + "Required Effects": "Zahtevani učinki", + "Required Score": "Zahtevana vrednost", + "Required Skills": "Zahtevane veščine", + "Required Stats": "Zahtevane lastnosti", + "Requirement Overrides": "Izjeme od predpogojev", + "Setting Name": "Ime igralnega sveta", + "Silver Pieces": "Srebrni kovanci", + "Skill Name": "Ime veščine", + "Start Date": "Datum začetka", + "Starting value for all characters": "Začetna vrednost za vse like", + "Stat": "Lastnost", + "Status": "Status", + "System Notice": "Sistemsko obvestilo", + "Unique Artifact": "Edinstven artefakt", + "Unique Condition": "Edinstveno stanje", + "XP Amount": "Število izkušenjskih točk", + "XP Award": "Dodelitev izkušenjskih točk" }, "plurals": {} } diff --git a/l10n/sq.js b/l10n/sq.js index c4d7b786..d8c927ad 100644 --- a/l10n/sq.js +++ b/l10n/sq.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Asnjë — kjo është një shkathtësi bazë.", "Where the automation lives": "Ku jeton automatizimi", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows është ajo që ndodh pa klikuar askush: një kujtesë para se të skadojë një afat, një konfirmim në dorëzim. Këtu i lexoni dhe i redaktoni — nuk ka asgjë për të ndërtuar tani.", - "Open Flows in the menu": "Hapni Flows në meny" + "Open Flows in the menu": "Hapni Flows në meny", + "Ability Name": "Emri i aftësisë", + "Affected Characters": "Personazhet e prekur", + "Amount of copper pieces": "Sasia e monedhave prej bakri", + "Amount of gold pieces": "Sasia e monedhave prej ari", + "Amount of silver pieces": "Sasia e monedhave prej argjendi", + "Automatic system notices": "Njoftime automatike të sistemit", + "Award Reason": "Arsyeja e dhënies", + "Awarded At": "Dhënë më", + "Awarded By": "Dhënë nga", + "Background Story": "Historia e sfondit", + "Base Value": "Vlera bazë", + "Character Card": "Karta e personazhit", + "Character Name": "Emri i personazhit", + "Checked In At": "Mbërritja u regjistrua më", + "Checked In By": "Mbërritja u regjistrua nga", + "Condition Name": "Emri i gjendjes", + "Contact email address": "Adresa e e-mailit për kontakt", + "Copper Pieces": "Monedha prej bakri", + "Effect Name": "Emri i efektit", + "End Date": "Data e mbarimit", + "Event Name": "Emri i ngjarjes", + "Event description": "Përshkrimi i ngjarjes", + "Event end date and time": "Data dhe ora e mbarimit të ngjarjes", + "Event location": "Vendndodhja e ngjarjes", + "Event name": "Emri i ngjarjes", + "Event start date and time": "Data dhe ora e fillimit të ngjarjes", + "Faith": "Besimi", + "Full name of the player": "Emri i plotë i lojtarit", + "Game Master Notes (Private)": "Shënimet e udhëheqësit të lojës (private)", + "Game Master Notes (Public)": "Shënimet e udhëheqësit të lojës (publike)", + "Gold Pieces": "Monedha prej ari", + "Item Name": "Emri i artikullit", + "Items and Money": "Artikujt dhe paratë", + "Mechanical Effect": "Efekti në lojë", + "Modifier Value": "Vlera e modifikuesit", + "Name of the condition": "Emri i gjendjes", + "Name of the effect": "Emri i efektit", + "Name of the event": "Emri i ngjarjes", + "Name of the item": "Emri i artikullit", + "Name of the skill": "Emri i shkathtësisë", + "Name of the stat": "Emri i tiparit", + "Nextcloud user": "Përdorues i Nextcloud", + "Notes about items and money": "Shënime për artikujt dhe paratë", + "Notes about the player": "Shënime për lojtarin", + "Overridden At": "Përjashtimi u dha më", + "Overridden By": "Përjashtimi u dha nga", + "Override Reason": "Arsyeja e përjashtimit", + "Owner": "Pronari", + "Owner UID": "UID i pronarit", + "Participating Characters": "Personazhet pjesëmarrës", + "Player Name": "Emri i lojtarit", + "Post-Event Effects": "Efektet pas ngjarjes", + "Real name of the player": "Emri i vërtetë i lojtarit", + "Required Conditions": "Gjendjet e nevojshme", + "Required Effects": "Efektet e nevojshme", + "Required Score": "Vlera e nevojshme", + "Required Skills": "Shkathtësitë e nevojshme", + "Required Stats": "Tiparet e nevojshme", + "Requirement Overrides": "Përjashtimet nga parakushtet", + "Setting Name": "Emri i botës së lojës", + "Silver Pieces": "Monedha prej argjendi", + "Skill Name": "Emri i shkathtësisë", + "Start Date": "Data e fillimit", + "Starting value for all characters": "Vlera fillestare për të gjithë personazhet", + "Stat": "Tipar", + "Status": "Statusi", + "System Notice": "Njoftim i sistemit", + "Unique Artifact": "Artefakt unik", + "Unique Condition": "Gjendje unike", + "XP Amount": "Sasia e pikëve të përvojës", + "XP Award": "Dhënie e pikëve të përvojës" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sq.json b/l10n/sq.json index f0021e8d..b28083c0 100644 --- a/l10n/sq.json +++ b/l10n/sq.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Asnjë — kjo është një shkathtësi bazë.", "Where the automation lives": "Ku jeton automatizimi", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows është ajo që ndodh pa klikuar askush: një kujtesë para se të skadojë një afat, një konfirmim në dorëzim. Këtu i lexoni dhe i redaktoni — nuk ka asgjë për të ndërtuar tani.", - "Open Flows in the menu": "Hapni Flows në meny" + "Open Flows in the menu": "Hapni Flows në meny", + "Ability Name": "Emri i aftësisë", + "Affected Characters": "Personazhet e prekur", + "Amount of copper pieces": "Sasia e monedhave prej bakri", + "Amount of gold pieces": "Sasia e monedhave prej ari", + "Amount of silver pieces": "Sasia e monedhave prej argjendi", + "Automatic system notices": "Njoftime automatike të sistemit", + "Award Reason": "Arsyeja e dhënies", + "Awarded At": "Dhënë më", + "Awarded By": "Dhënë nga", + "Background Story": "Historia e sfondit", + "Base Value": "Vlera bazë", + "Character Card": "Karta e personazhit", + "Character Name": "Emri i personazhit", + "Checked In At": "Mbërritja u regjistrua më", + "Checked In By": "Mbërritja u regjistrua nga", + "Condition Name": "Emri i gjendjes", + "Contact email address": "Adresa e e-mailit për kontakt", + "Copper Pieces": "Monedha prej bakri", + "Effect Name": "Emri i efektit", + "End Date": "Data e mbarimit", + "Event Name": "Emri i ngjarjes", + "Event description": "Përshkrimi i ngjarjes", + "Event end date and time": "Data dhe ora e mbarimit të ngjarjes", + "Event location": "Vendndodhja e ngjarjes", + "Event name": "Emri i ngjarjes", + "Event start date and time": "Data dhe ora e fillimit të ngjarjes", + "Faith": "Besimi", + "Full name of the player": "Emri i plotë i lojtarit", + "Game Master Notes (Private)": "Shënimet e udhëheqësit të lojës (private)", + "Game Master Notes (Public)": "Shënimet e udhëheqësit të lojës (publike)", + "Gold Pieces": "Monedha prej ari", + "Item Name": "Emri i artikullit", + "Items and Money": "Artikujt dhe paratë", + "Mechanical Effect": "Efekti në lojë", + "Modifier Value": "Vlera e modifikuesit", + "Name of the condition": "Emri i gjendjes", + "Name of the effect": "Emri i efektit", + "Name of the event": "Emri i ngjarjes", + "Name of the item": "Emri i artikullit", + "Name of the skill": "Emri i shkathtësisë", + "Name of the stat": "Emri i tiparit", + "Nextcloud user": "Përdorues i Nextcloud", + "Notes about items and money": "Shënime për artikujt dhe paratë", + "Notes about the player": "Shënime për lojtarin", + "Overridden At": "Përjashtimi u dha më", + "Overridden By": "Përjashtimi u dha nga", + "Override Reason": "Arsyeja e përjashtimit", + "Owner": "Pronari", + "Owner UID": "UID i pronarit", + "Participating Characters": "Personazhet pjesëmarrës", + "Player Name": "Emri i lojtarit", + "Post-Event Effects": "Efektet pas ngjarjes", + "Real name of the player": "Emri i vërtetë i lojtarit", + "Required Conditions": "Gjendjet e nevojshme", + "Required Effects": "Efektet e nevojshme", + "Required Score": "Vlera e nevojshme", + "Required Skills": "Shkathtësitë e nevojshme", + "Required Stats": "Tiparet e nevojshme", + "Requirement Overrides": "Përjashtimet nga parakushtet", + "Setting Name": "Emri i botës së lojës", + "Silver Pieces": "Monedha prej argjendi", + "Skill Name": "Emri i shkathtësisë", + "Start Date": "Data e fillimit", + "Starting value for all characters": "Vlera fillestare për të gjithë personazhet", + "Stat": "Tipar", + "Status": "Statusi", + "System Notice": "Njoftim i sistemit", + "Unique Artifact": "Artefakt unik", + "Unique Condition": "Gjendje unike", + "XP Amount": "Sasia e pikëve të përvojës", + "XP Award": "Dhënie e pikëve të përvojës" }, "plurals": {} } diff --git a/l10n/sr.js b/l10n/sr.js index 91a39780..728b6ad1 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Нема — ово је основна вештина.", "Where the automation lives": "Где живи аутоматизација", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows је оно што се дешава без ичијег клика: подсетник пре истека рока, потврда при предаји. Овде их читаш и уређујеш — сада нема шта да се гради.", - "Open Flows in the menu": "Отвори Flows у менију" + "Open Flows in the menu": "Отвори Flows у менију", + "Ability Name": "Назив способности", + "Affected Characters": "Обухваћени ликови", + "Amount of copper pieces": "Број бакарних новчића", + "Amount of gold pieces": "Број златних новчића", + "Amount of silver pieces": "Број сребрних новчића", + "Automatic system notices": "Аутоматска системска обавештења", + "Award Reason": "Разлог доделе", + "Awarded At": "Додељено", + "Awarded By": "Доделио", + "Background Story": "Позадинска прича", + "Base Value": "Основна вредност", + "Character Card": "Картица лика", + "Character Name": "Име лика", + "Checked In At": "Долазак забележен", + "Checked In By": "Долазак забележио", + "Condition Name": "Назив стања", + "Contact email address": "Контакт адреса е-поште", + "Copper Pieces": "Бакарни новчићи", + "Effect Name": "Назив ефекта", + "End Date": "Датум завршетка", + "Event Name": "Назив догађаја", + "Event description": "Опис догађаја", + "Event end date and time": "Датум и време завршетка догађаја", + "Event location": "Место догађаја", + "Event name": "Назив догађаја", + "Event start date and time": "Датум и време почетка догађаја", + "Faith": "Вера", + "Full name of the player": "Пуно име играча", + "Game Master Notes (Private)": "Белешке водитеља игре (приватне)", + "Game Master Notes (Public)": "Белешке водитеља игре (јавне)", + "Gold Pieces": "Златни новчићи", + "Item Name": "Назив предмета", + "Items and Money": "Предмети и новац", + "Mechanical Effect": "Ефекат у игри", + "Modifier Value": "Вредност модификатора", + "Name of the condition": "Назив стања", + "Name of the effect": "Назив ефекта", + "Name of the event": "Назив догађаја", + "Name of the item": "Назив предмета", + "Name of the skill": "Назив вештине", + "Name of the stat": "Назив својства", + "Nextcloud user": "Nextcloud корисник", + "Notes about items and money": "Белешке о предметима и новцу", + "Notes about the player": "Белешке о играчу", + "Overridden At": "Изузетак одобрен", + "Overridden By": "Изузетак одобрио", + "Override Reason": "Разлог изузетка", + "Owner": "Власник", + "Owner UID": "UID власника", + "Participating Characters": "Ликови који учествују", + "Player Name": "Име играча", + "Post-Event Effects": "Ефекти након догађаја", + "Real name of the player": "Право име играча", + "Required Conditions": "Потребна стања", + "Required Effects": "Потребни ефекти", + "Required Score": "Потребна вредност", + "Required Skills": "Потребне вештине", + "Required Stats": "Потребна својства", + "Requirement Overrides": "Изузеци од предуслова", + "Setting Name": "Назив света игре", + "Silver Pieces": "Сребрни новчићи", + "Skill Name": "Назив вештине", + "Start Date": "Датум почетка", + "Starting value for all characters": "Почетна вредност за све ликове", + "Stat": "Својство", + "Status": "Статус", + "System Notice": "Системско обавештење", + "Unique Artifact": "Јединствени артефакт", + "Unique Condition": "Јединствено стање", + "XP Amount": "Број поена искуства", + "XP Award": "Додела поена искуства" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sr.json b/l10n/sr.json index ee0caea7..a836e17e 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Нема — ово је основна вештина.", "Where the automation lives": "Где живи аутоматизација", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows је оно што се дешава без ичијег клика: подсетник пре истека рока, потврда при предаји. Овде их читаш и уређујеш — сада нема шта да се гради.", - "Open Flows in the menu": "Отвори Flows у менију" + "Open Flows in the menu": "Отвори Flows у менију", + "Ability Name": "Назив способности", + "Affected Characters": "Обухваћени ликови", + "Amount of copper pieces": "Број бакарних новчића", + "Amount of gold pieces": "Број златних новчића", + "Amount of silver pieces": "Број сребрних новчића", + "Automatic system notices": "Аутоматска системска обавештења", + "Award Reason": "Разлог доделе", + "Awarded At": "Додељено", + "Awarded By": "Доделио", + "Background Story": "Позадинска прича", + "Base Value": "Основна вредност", + "Character Card": "Картица лика", + "Character Name": "Име лика", + "Checked In At": "Долазак забележен", + "Checked In By": "Долазак забележио", + "Condition Name": "Назив стања", + "Contact email address": "Контакт адреса е-поште", + "Copper Pieces": "Бакарни новчићи", + "Effect Name": "Назив ефекта", + "End Date": "Датум завршетка", + "Event Name": "Назив догађаја", + "Event description": "Опис догађаја", + "Event end date and time": "Датум и време завршетка догађаја", + "Event location": "Место догађаја", + "Event name": "Назив догађаја", + "Event start date and time": "Датум и време почетка догађаја", + "Faith": "Вера", + "Full name of the player": "Пуно име играча", + "Game Master Notes (Private)": "Белешке водитеља игре (приватне)", + "Game Master Notes (Public)": "Белешке водитеља игре (јавне)", + "Gold Pieces": "Златни новчићи", + "Item Name": "Назив предмета", + "Items and Money": "Предмети и новац", + "Mechanical Effect": "Ефекат у игри", + "Modifier Value": "Вредност модификатора", + "Name of the condition": "Назив стања", + "Name of the effect": "Назив ефекта", + "Name of the event": "Назив догађаја", + "Name of the item": "Назив предмета", + "Name of the skill": "Назив вештине", + "Name of the stat": "Назив својства", + "Nextcloud user": "Nextcloud корисник", + "Notes about items and money": "Белешке о предметима и новцу", + "Notes about the player": "Белешке о играчу", + "Overridden At": "Изузетак одобрен", + "Overridden By": "Изузетак одобрио", + "Override Reason": "Разлог изузетка", + "Owner": "Власник", + "Owner UID": "UID власника", + "Participating Characters": "Ликови који учествују", + "Player Name": "Име играча", + "Post-Event Effects": "Ефекти након догађаја", + "Real name of the player": "Право име играча", + "Required Conditions": "Потребна стања", + "Required Effects": "Потребни ефекти", + "Required Score": "Потребна вредност", + "Required Skills": "Потребне вештине", + "Required Stats": "Потребна својства", + "Requirement Overrides": "Изузеци од предуслова", + "Setting Name": "Назив света игре", + "Silver Pieces": "Сребрни новчићи", + "Skill Name": "Назив вештине", + "Start Date": "Датум почетка", + "Starting value for all characters": "Почетна вредност за све ликове", + "Stat": "Својство", + "Status": "Статус", + "System Notice": "Системско обавештење", + "Unique Artifact": "Јединствени артефакт", + "Unique Condition": "Јединствено стање", + "XP Amount": "Број поена искуства", + "XP Award": "Додела поена искуства" }, "plurals": {} } diff --git a/l10n/sv.js b/l10n/sv.js index 14f79034..aed0e38a 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Inga — detta är en grundfärdighet.", "Where the automation lives": "Där automatiseringen bor", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows är det som händer utan att någon klickar: en påminnelse innan en tidsfrist löper ut, en bekräftelse vid inlämning. Här läser och redigerar du dem — det finns inget att bygga nu.", - "Open Flows in the menu": "Öppna Flows i menyn" + "Open Flows in the menu": "Öppna Flows i menyn", + "Ability Name": "Namn på förmågan", + "Affected Characters": "Berörda karaktärer", + "Amount of copper pieces": "Antal kopparmynt", + "Amount of gold pieces": "Antal guldmynt", + "Amount of silver pieces": "Antal silvermynt", + "Automatic system notices": "Automatiska systemmeddelanden", + "Award Reason": "Skäl till tilldelningen", + "Awarded At": "Tilldelad den", + "Awarded By": "Tilldelad av", + "Background Story": "Bakgrundshistoria", + "Base Value": "Basvärde", + "Character Card": "Karaktärskort", + "Character Name": "Namn på karaktären", + "Checked In At": "Incheckad den", + "Checked In By": "Incheckad av", + "Condition Name": "Namn på tillståndet", + "Contact email address": "E-postadress för kontakt", + "Copper Pieces": "Kopparmynt", + "Effect Name": "Namn på effekten", + "End Date": "Slutdatum", + "Event Name": "Namn på evenemanget", + "Event description": "Beskrivning av evenemanget", + "Event end date and time": "Slutdatum och -tid för evenemanget", + "Event location": "Plats för evenemanget", + "Event name": "Namn på evenemanget", + "Event start date and time": "Startdatum och -tid för evenemanget", + "Faith": "Tro", + "Full name of the player": "Spelarens fullständiga namn", + "Game Master Notes (Private)": "Spelledarens anteckningar (privata)", + "Game Master Notes (Public)": "Spelledarens anteckningar (offentliga)", + "Gold Pieces": "Guldmynt", + "Item Name": "Namn på föremålet", + "Items and Money": "Föremål och pengar", + "Mechanical Effect": "Spelteknisk effekt", + "Modifier Value": "Modifierarens värde", + "Name of the condition": "Namn på tillståndet", + "Name of the effect": "Namn på effekten", + "Name of the event": "Namn på evenemanget", + "Name of the item": "Namn på föremålet", + "Name of the skill": "Namn på färdigheten", + "Name of the stat": "Namn på attributet", + "Nextcloud user": "Nextcloud-användare", + "Notes about items and money": "Anteckningar om föremål och pengar", + "Notes about the player": "Anteckningar om spelaren", + "Overridden At": "Åsidosatt den", + "Overridden By": "Åsidosatt av", + "Override Reason": "Skäl till åsidosättandet", + "Owner": "Ägare", + "Owner UID": "Ägarens UID", + "Participating Characters": "Deltagande karaktärer", + "Player Name": "Namn på spelaren", + "Post-Event Effects": "Effekter efter evenemanget", + "Real name of the player": "Spelarens riktiga namn", + "Required Conditions": "Nödvändiga tillstånd", + "Required Effects": "Nödvändiga effekter", + "Required Score": "Nödvändigt värde", + "Required Skills": "Nödvändiga färdigheter", + "Required Stats": "Nödvändiga attribut", + "Requirement Overrides": "Åsidosatta förkunskapskrav", + "Setting Name": "Namn på spelvärlden", + "Silver Pieces": "Silvermynt", + "Skill Name": "Namn på färdigheten", + "Start Date": "Startdatum", + "Starting value for all characters": "Startvärde för alla karaktärer", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Systemmeddelande", + "Unique Artifact": "Unik artefakt", + "Unique Condition": "Unikt tillstånd", + "XP Amount": "Antal erfarenhetspoäng", + "XP Award": "XP-tilldelning" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sv.json b/l10n/sv.json index f6f363e2..d7cba46f 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Inga — detta är en grundfärdighet.", "Where the automation lives": "Där automatiseringen bor", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows är det som händer utan att någon klickar: en påminnelse innan en tidsfrist löper ut, en bekräftelse vid inlämning. Här läser och redigerar du dem — det finns inget att bygga nu.", - "Open Flows in the menu": "Öppna Flows i menyn" + "Open Flows in the menu": "Öppna Flows i menyn", + "Ability Name": "Namn på förmågan", + "Affected Characters": "Berörda karaktärer", + "Amount of copper pieces": "Antal kopparmynt", + "Amount of gold pieces": "Antal guldmynt", + "Amount of silver pieces": "Antal silvermynt", + "Automatic system notices": "Automatiska systemmeddelanden", + "Award Reason": "Skäl till tilldelningen", + "Awarded At": "Tilldelad den", + "Awarded By": "Tilldelad av", + "Background Story": "Bakgrundshistoria", + "Base Value": "Basvärde", + "Character Card": "Karaktärskort", + "Character Name": "Namn på karaktären", + "Checked In At": "Incheckad den", + "Checked In By": "Incheckad av", + "Condition Name": "Namn på tillståndet", + "Contact email address": "E-postadress för kontakt", + "Copper Pieces": "Kopparmynt", + "Effect Name": "Namn på effekten", + "End Date": "Slutdatum", + "Event Name": "Namn på evenemanget", + "Event description": "Beskrivning av evenemanget", + "Event end date and time": "Slutdatum och -tid för evenemanget", + "Event location": "Plats för evenemanget", + "Event name": "Namn på evenemanget", + "Event start date and time": "Startdatum och -tid för evenemanget", + "Faith": "Tro", + "Full name of the player": "Spelarens fullständiga namn", + "Game Master Notes (Private)": "Spelledarens anteckningar (privata)", + "Game Master Notes (Public)": "Spelledarens anteckningar (offentliga)", + "Gold Pieces": "Guldmynt", + "Item Name": "Namn på föremålet", + "Items and Money": "Föremål och pengar", + "Mechanical Effect": "Spelteknisk effekt", + "Modifier Value": "Modifierarens värde", + "Name of the condition": "Namn på tillståndet", + "Name of the effect": "Namn på effekten", + "Name of the event": "Namn på evenemanget", + "Name of the item": "Namn på föremålet", + "Name of the skill": "Namn på färdigheten", + "Name of the stat": "Namn på attributet", + "Nextcloud user": "Nextcloud-användare", + "Notes about items and money": "Anteckningar om föremål och pengar", + "Notes about the player": "Anteckningar om spelaren", + "Overridden At": "Åsidosatt den", + "Overridden By": "Åsidosatt av", + "Override Reason": "Skäl till åsidosättandet", + "Owner": "Ägare", + "Owner UID": "Ägarens UID", + "Participating Characters": "Deltagande karaktärer", + "Player Name": "Namn på spelaren", + "Post-Event Effects": "Effekter efter evenemanget", + "Real name of the player": "Spelarens riktiga namn", + "Required Conditions": "Nödvändiga tillstånd", + "Required Effects": "Nödvändiga effekter", + "Required Score": "Nödvändigt värde", + "Required Skills": "Nödvändiga färdigheter", + "Required Stats": "Nödvändiga attribut", + "Requirement Overrides": "Åsidosatta förkunskapskrav", + "Setting Name": "Namn på spelvärlden", + "Silver Pieces": "Silvermynt", + "Skill Name": "Namn på färdigheten", + "Start Date": "Startdatum", + "Starting value for all characters": "Startvärde för alla karaktärer", + "Stat": "Attribut", + "Status": "Status", + "System Notice": "Systemmeddelande", + "Unique Artifact": "Unik artefakt", + "Unique Condition": "Unikt tillstånd", + "XP Amount": "Antal erfarenhetspoäng", + "XP Award": "XP-tilldelning" }, "plurals": {} } diff --git a/l10n/tr.js b/l10n/tr.js index 88459be9..5580dd03 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Yok — bu bir kök beceridir.", "Where the automation lives": "Otomasyonun yaşadığı yer", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows, kimse tıklamadan olan şeydir: bir süre dolmadan önce bir hatırlatma, gönderimde bir onay. Bunları burada okur ve düzenlersiniz — şimdi inşa edilecek bir şey yok.", - "Open Flows in the menu": "Menüden Flows'u açın" + "Open Flows in the menu": "Menüden Flows'u açın", + "Ability Name": "Yeteneğin adı", + "Affected Characters": "Etkilenen karakterler", + "Amount of copper pieces": "Bakır sikke miktarı", + "Amount of gold pieces": "Altın sikke miktarı", + "Amount of silver pieces": "Gümüş sikke miktarı", + "Automatic system notices": "Otomatik sistem bildirimleri", + "Award Reason": "Verilme nedeni", + "Awarded At": "Verilme tarihi", + "Awarded By": "Veren", + "Background Story": "Geçmiş hikâyesi", + "Base Value": "Temel değer", + "Character Card": "Karakter kartı", + "Character Name": "Karakterin adı", + "Checked In At": "Giriş kaydı tarihi", + "Checked In By": "Giriş kaydını yapan", + "Condition Name": "Durumun adı", + "Contact email address": "İletişim e-posta adresi", + "Copper Pieces": "Bakır sikkeler", + "Effect Name": "Etkinin adı", + "End Date": "Bitiş tarihi", + "Event Name": "Etkinliğin adı", + "Event description": "Etkinliğin açıklaması", + "Event end date and time": "Etkinliğin bitiş tarihi ve saati", + "Event location": "Etkinliğin konumu", + "Event name": "Etkinliğin adı", + "Event start date and time": "Etkinliğin başlangıç tarihi ve saati", + "Faith": "İnanç", + "Full name of the player": "Oyuncunun tam adı", + "Game Master Notes (Private)": "Oyun yöneticisinin notları (özel)", + "Game Master Notes (Public)": "Oyun yöneticisinin notları (herkese açık)", + "Gold Pieces": "Altın sikkeler", + "Item Name": "Eşyanın adı", + "Items and Money": "Eşyalar ve para", + "Mechanical Effect": "Oyun içi etki", + "Modifier Value": "Değiştiricinin değeri", + "Name of the condition": "Durumun adı", + "Name of the effect": "Etkinin adı", + "Name of the event": "Etkinliğin adı", + "Name of the item": "Eşyanın adı", + "Name of the skill": "Becerinin adı", + "Name of the stat": "Özelliğin adı", + "Nextcloud user": "Nextcloud kullanıcısı", + "Notes about items and money": "Eşyalar ve para hakkında notlar", + "Notes about the player": "Oyuncu hakkında notlar", + "Overridden At": "Muafiyet tarihi", + "Overridden By": "Muafiyeti veren", + "Override Reason": "Muafiyet nedeni", + "Owner": "Sahip", + "Owner UID": "Sahibin UID'si", + "Participating Characters": "Katılan karakterler", + "Player Name": "Oyuncunun adı", + "Post-Event Effects": "Etkinlik sonrası etkiler", + "Real name of the player": "Oyuncunun gerçek adı", + "Required Conditions": "Gerekli durumlar", + "Required Effects": "Gerekli etkiler", + "Required Score": "Gerekli değer", + "Required Skills": "Gerekli beceriler", + "Required Stats": "Gerekli özellikler", + "Requirement Overrides": "Ön koşul muafiyetleri", + "Setting Name": "Oyun dünyasının adı", + "Silver Pieces": "Gümüş sikkeler", + "Skill Name": "Becerinin adı", + "Start Date": "Başlangıç tarihi", + "Starting value for all characters": "Tüm karakterler için başlangıç değeri", + "Stat": "Özellik", + "Status": "Durum", + "System Notice": "Sistem bildirimi", + "Unique Artifact": "Benzersiz eser", + "Unique Condition": "Benzersiz durum", + "XP Amount": "Deneyim puanı miktarı", + "XP Award": "Deneyim puanı verilmesi" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/tr.json b/l10n/tr.json index b8ebee71..34a15975 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Yok — bu bir kök beceridir.", "Where the automation lives": "Otomasyonun yaşadığı yer", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows, kimse tıklamadan olan şeydir: bir süre dolmadan önce bir hatırlatma, gönderimde bir onay. Bunları burada okur ve düzenlersiniz — şimdi inşa edilecek bir şey yok.", - "Open Flows in the menu": "Menüden Flows'u açın" + "Open Flows in the menu": "Menüden Flows'u açın", + "Ability Name": "Yeteneğin adı", + "Affected Characters": "Etkilenen karakterler", + "Amount of copper pieces": "Bakır sikke miktarı", + "Amount of gold pieces": "Altın sikke miktarı", + "Amount of silver pieces": "Gümüş sikke miktarı", + "Automatic system notices": "Otomatik sistem bildirimleri", + "Award Reason": "Verilme nedeni", + "Awarded At": "Verilme tarihi", + "Awarded By": "Veren", + "Background Story": "Geçmiş hikâyesi", + "Base Value": "Temel değer", + "Character Card": "Karakter kartı", + "Character Name": "Karakterin adı", + "Checked In At": "Giriş kaydı tarihi", + "Checked In By": "Giriş kaydını yapan", + "Condition Name": "Durumun adı", + "Contact email address": "İletişim e-posta adresi", + "Copper Pieces": "Bakır sikkeler", + "Effect Name": "Etkinin adı", + "End Date": "Bitiş tarihi", + "Event Name": "Etkinliğin adı", + "Event description": "Etkinliğin açıklaması", + "Event end date and time": "Etkinliğin bitiş tarihi ve saati", + "Event location": "Etkinliğin konumu", + "Event name": "Etkinliğin adı", + "Event start date and time": "Etkinliğin başlangıç tarihi ve saati", + "Faith": "İnanç", + "Full name of the player": "Oyuncunun tam adı", + "Game Master Notes (Private)": "Oyun yöneticisinin notları (özel)", + "Game Master Notes (Public)": "Oyun yöneticisinin notları (herkese açık)", + "Gold Pieces": "Altın sikkeler", + "Item Name": "Eşyanın adı", + "Items and Money": "Eşyalar ve para", + "Mechanical Effect": "Oyun içi etki", + "Modifier Value": "Değiştiricinin değeri", + "Name of the condition": "Durumun adı", + "Name of the effect": "Etkinin adı", + "Name of the event": "Etkinliğin adı", + "Name of the item": "Eşyanın adı", + "Name of the skill": "Becerinin adı", + "Name of the stat": "Özelliğin adı", + "Nextcloud user": "Nextcloud kullanıcısı", + "Notes about items and money": "Eşyalar ve para hakkında notlar", + "Notes about the player": "Oyuncu hakkında notlar", + "Overridden At": "Muafiyet tarihi", + "Overridden By": "Muafiyeti veren", + "Override Reason": "Muafiyet nedeni", + "Owner": "Sahip", + "Owner UID": "Sahibin UID'si", + "Participating Characters": "Katılan karakterler", + "Player Name": "Oyuncunun adı", + "Post-Event Effects": "Etkinlik sonrası etkiler", + "Real name of the player": "Oyuncunun gerçek adı", + "Required Conditions": "Gerekli durumlar", + "Required Effects": "Gerekli etkiler", + "Required Score": "Gerekli değer", + "Required Skills": "Gerekli beceriler", + "Required Stats": "Gerekli özellikler", + "Requirement Overrides": "Ön koşul muafiyetleri", + "Setting Name": "Oyun dünyasının adı", + "Silver Pieces": "Gümüş sikkeler", + "Skill Name": "Becerinin adı", + "Start Date": "Başlangıç tarihi", + "Starting value for all characters": "Tüm karakterler için başlangıç değeri", + "Stat": "Özellik", + "Status": "Durum", + "System Notice": "Sistem bildirimi", + "Unique Artifact": "Benzersiz eser", + "Unique Condition": "Benzersiz durum", + "XP Amount": "Deneyim puanı miktarı", + "XP Award": "Deneyim puanı verilmesi" }, "plurals": {} } diff --git a/l10n/uk.js b/l10n/uk.js index eb0e7519..e0426db4 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -152,7 +152,78 @@ OC.L10N.register( "None — this is a root skill.": "Немає — це базова навичка.", "Where the automation lives": "Де живе автоматизація", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows — це те, що відбувається без жодного кліку: нагадування до завершення строку, підтвердження під час подання. Тут ви їх читаєте та редагуєте — зараз нічого будувати не потрібно.", - "Open Flows in the menu": "Відкрийте Flows у меню" + "Open Flows in the menu": "Відкрийте Flows у меню", + "Ability Name": "Назва здібності", + "Affected Characters": "Уражені персонажі", + "Amount of copper pieces": "Кількість мідних монет", + "Amount of gold pieces": "Кількість золотих монет", + "Amount of silver pieces": "Кількість срібних монет", + "Automatic system notices": "Автоматичні системні сповіщення", + "Award Reason": "Причина нарахування", + "Awarded At": "Нараховано", + "Awarded By": "Нарахував", + "Background Story": "Передісторія персонажа", + "Base Value": "Базове значення", + "Character Card": "Картка персонажа", + "Character Name": "Ім'я персонажа", + "Checked In At": "Прибуття зафіксовано", + "Checked In By": "Прибуття зафіксував", + "Condition Name": "Назва стану", + "Contact email address": "Контактна адреса електронної пошти", + "Copper Pieces": "Мідні монети", + "Effect Name": "Назва ефекту", + "End Date": "Дата завершення", + "Event Name": "Назва події", + "Event description": "Опис події", + "Event end date and time": "Дата й час завершення події", + "Event location": "Місце проведення події", + "Event name": "Назва події", + "Event start date and time": "Дата й час початку події", + "Faith": "Віра", + "Full name of the player": "Повне ім'я гравця", + "Game Master Notes (Private)": "Нотатки ведучого гри (приватні)", + "Game Master Notes (Public)": "Нотатки ведучого гри (загальнодоступні)", + "Gold Pieces": "Золоті монети", + "Item Name": "Назва предмета", + "Items and Money": "Предмети та гроші", + "Mechanical Effect": "Ігровий ефект", + "Modifier Value": "Значення модифікатора", + "Name of the condition": "Назва стану", + "Name of the effect": "Назва ефекту", + "Name of the event": "Назва події", + "Name of the item": "Назва предмета", + "Name of the skill": "Назва навички", + "Name of the stat": "Назва характеристики", + "Nextcloud user": "Користувач Nextcloud", + "Notes about items and money": "Нотатки про предмети та гроші", + "Notes about the player": "Нотатки про гравця", + "Overridden At": "Виняток надано", + "Overridden By": "Виняток надав", + "Override Reason": "Причина винятку", + "Owner": "Власник", + "Owner UID": "UID власника", + "Participating Characters": "Персонажі, що беруть участь", + "Player Name": "Ім'я гравця", + "Post-Event Effects": "Ефекти після події", + "Real name of the player": "Справжнє ім'я гравця", + "Required Conditions": "Потрібні стани", + "Required Effects": "Потрібні ефекти", + "Required Score": "Потрібне значення", + "Required Skills": "Потрібні навички", + "Required Stats": "Потрібні характеристики", + "Requirement Overrides": "Винятки з вимог", + "Setting Name": "Назва світу гри", + "Silver Pieces": "Срібні монети", + "Skill Name": "Назва навички", + "Start Date": "Дата початку", + "Starting value for all characters": "Початкове значення для всіх персонажів", + "Stat": "Характеристика", + "Status": "Статус", + "System Notice": "Системне сповіщення", + "Unique Artifact": "Унікальний артефакт", + "Unique Condition": "Унікальний стан", + "XP Amount": "Кількість очок досвіду", + "XP Award": "Нарахування очок досвіду" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/uk.json b/l10n/uk.json index 322c1ca2..1c7d8140 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -151,7 +151,78 @@ "None — this is a root skill.": "Немає — це базова навичка.", "Where the automation lives": "Де живе автоматизація", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows — це те, що відбувається без жодного кліку: нагадування до завершення строку, підтвердження під час подання. Тут ви їх читаєте та редагуєте — зараз нічого будувати не потрібно.", - "Open Flows in the menu": "Відкрийте Flows у меню" + "Open Flows in the menu": "Відкрийте Flows у меню", + "Ability Name": "Назва здібності", + "Affected Characters": "Уражені персонажі", + "Amount of copper pieces": "Кількість мідних монет", + "Amount of gold pieces": "Кількість золотих монет", + "Amount of silver pieces": "Кількість срібних монет", + "Automatic system notices": "Автоматичні системні сповіщення", + "Award Reason": "Причина нарахування", + "Awarded At": "Нараховано", + "Awarded By": "Нарахував", + "Background Story": "Передісторія персонажа", + "Base Value": "Базове значення", + "Character Card": "Картка персонажа", + "Character Name": "Ім'я персонажа", + "Checked In At": "Прибуття зафіксовано", + "Checked In By": "Прибуття зафіксував", + "Condition Name": "Назва стану", + "Contact email address": "Контактна адреса електронної пошти", + "Copper Pieces": "Мідні монети", + "Effect Name": "Назва ефекту", + "End Date": "Дата завершення", + "Event Name": "Назва події", + "Event description": "Опис події", + "Event end date and time": "Дата й час завершення події", + "Event location": "Місце проведення події", + "Event name": "Назва події", + "Event start date and time": "Дата й час початку події", + "Faith": "Віра", + "Full name of the player": "Повне ім'я гравця", + "Game Master Notes (Private)": "Нотатки ведучого гри (приватні)", + "Game Master Notes (Public)": "Нотатки ведучого гри (загальнодоступні)", + "Gold Pieces": "Золоті монети", + "Item Name": "Назва предмета", + "Items and Money": "Предмети та гроші", + "Mechanical Effect": "Ігровий ефект", + "Modifier Value": "Значення модифікатора", + "Name of the condition": "Назва стану", + "Name of the effect": "Назва ефекту", + "Name of the event": "Назва події", + "Name of the item": "Назва предмета", + "Name of the skill": "Назва навички", + "Name of the stat": "Назва характеристики", + "Nextcloud user": "Користувач Nextcloud", + "Notes about items and money": "Нотатки про предмети та гроші", + "Notes about the player": "Нотатки про гравця", + "Overridden At": "Виняток надано", + "Overridden By": "Виняток надав", + "Override Reason": "Причина винятку", + "Owner": "Власник", + "Owner UID": "UID власника", + "Participating Characters": "Персонажі, що беруть участь", + "Player Name": "Ім'я гравця", + "Post-Event Effects": "Ефекти після події", + "Real name of the player": "Справжнє ім'я гравця", + "Required Conditions": "Потрібні стани", + "Required Effects": "Потрібні ефекти", + "Required Score": "Потрібне значення", + "Required Skills": "Потрібні навички", + "Required Stats": "Потрібні характеристики", + "Requirement Overrides": "Винятки з вимог", + "Setting Name": "Назва світу гри", + "Silver Pieces": "Срібні монети", + "Skill Name": "Назва навички", + "Start Date": "Дата початку", + "Starting value for all characters": "Початкове значення для всіх персонажів", + "Stat": "Характеристика", + "Status": "Статус", + "System Notice": "Системне сповіщення", + "Unique Artifact": "Унікальний артефакт", + "Unique Condition": "Унікальний стан", + "XP Amount": "Кількість очок досвіду", + "XP Award": "Нарахування очок досвіду" }, "plurals": {} } From 6b687edd44216f0de25e81281fdb4732b4dbaff7 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 07:00:09 +0200 Subject: [PATCH 05/35] chore(register): drop the stale larping_register.json (#624) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit check:specs failed on development: larping_register.json: missing or incomplete top-level x-openregister block (needs at least { type, app }) The file is a leftover from the larpingapp -> larpinq rename. It is an OpenAPI document (openapi/info/components) with no x-openregister block at all, and larpinq_register.json beside it carries that block correctly and is the one the app actually uses. Verified before removing: nothing in the repository references it — not PHP, not JS, not a workflow, not another register. The validator picked it up only because it matches the *register*.json glob. check:specs now PASSES (2 register files, 2 pre-existing warnings about stub schemas in larpinq_register.json, which this change does not touch). lint and build both exit 0. --- lib/Settings/larping_register.json | 466 ----------------------------- 1 file changed, 466 deletions(-) delete mode 100644 lib/Settings/larping_register.json diff --git a/lib/Settings/larping_register.json b/lib/Settings/larping_register.json deleted file mode 100644 index ceca12a8..00000000 --- a/lib/Settings/larping_register.json +++ /dev/null @@ -1,466 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "Larping", - "description": "The Larping Register is a comprehensive data structure designed to support Live Action Role-Playing (LARP) games. It provides a framework for managing characters, players, skills, items, conditions, and events within a LARP setting. This register enables game masters and players to track character progression, manage game events, and handle complex game mechanics like skills, conditions, and effects. Perfect for both small-scale LARP events and large campaign management.", - "version": "1.0.7" - }, - "components": { - "registers": { - "larping": { - "slug": "larping", - "title": "Larping", - "version": "1.0.7", - "description": "A comprehensive register for managing LARP game data, including character sheets, player information, game mechanics, and event management. This register provides the core data structures needed for running and managing LARP games.", - "schemas": [ - "character", - "player", - "effect", - "stat", - "item", - "skill", - "event", - "condition" - ], - "source": "", - "tablePrefix": "", - "folder": "Open Registers/Larping Register", - "updated": "2025-04-01T17:47:20+00:00", - "created": "2025-04-01T15:37:02+00:00", - "owner": null, - "application": null, - "organisation": null, - "authorization": [], - "deleted": null - } - }, - "schemas": { - "character": { - "slug": "character", - "title": "Character", - "description": "Represents a player character in the LARP game. Contains all character-specific information including stats, skills, conditions, and inventory. This schema is central to the game as it ties together all other aspects of character management.", - "version": "1.0.1", - "summary": "Core character information and attributes", - "required": ["name"], - "properties": { - "gold": { - "type": "integer", - "description": "Amount of gold coins the character possesses" - }, - "faith": { - "type": "string", - "description": "The religious belief or faith system the character follows" - }, - "OCName": { - "type": "string", - "description": "Out-of-Character name of the player controlling this character" - }, - "silver": { - "type": "integer", - "description": "Amount of silver coins the character possesses" - }, - "copper": { - "type": "integer", - "description": "Amount of copper coins the character possesses" - }, - "approved": { - "type": "string", - "description": "Approval status of the character by game masters" - }, - "background": { - "type": "string", - "description": "Character's backstory and history" - }, - "itemsAndMoney": { - "type": "string", - "description": "Detailed description of character's inventory and wealth" - }, - "slNotesPublic": { - "type": "string", - "description": "Public notes visible to all players" - }, - "slNotesPrivate": { - "type": "string", - "description": "Private notes only visible to game masters" - }, - "skills": { - "type": "array", - "description": "List of skills the character has learned" - }, - "name": { - "type": "string", - "description": "In-game name of the character" - }, - "type": { - "type": "string", - "description": "Character type or class" - }, - "card": { - "type": "string", - "description": "Character card identifier" - }, - "notice": { - "type": "string", - "description": "Important notices about the character" - }, - "description": { - "type": "string", - "description": "Physical description and appearance of the character" - }, - "stats": { - "type": "object", - "description": "Character's base statistics and attributes" - }, - "events": { - "type": "array", - "description": "Events the character has participated in" - }, - "conditions": { - "type": "array", - "description": "Active conditions affecting the character" - }, - "embedded": { - "type": "object", - "description": "Additional embedded data for the character" - } - }, - "archive": [], - "source": "", - "hardValidation": false, - "maxDepth": 0, - "owner": null, - "application": null, - "organisation": null, - "authorization": [], - "deleted": null, - "configuration": null - }, - "player": { - "slug": "player", - "title": "Player", - "description": "Represents a real person participating in the LARP game. Contains player-specific information and preferences, separate from their character data.", - "version": "1.0.1", - "summary": "Player information and preferences", - "required": ["name"], - "properties": { - "name": { - "type": "string", - "description": "Real name of the player" - }, - "email": { - "type": "string", - "description": "Contact email address" - }, - "preferences": { - "type": "object", - "description": "Player's game preferences and settings" - } - }, - "archive": [], - "source": "", - "hardValidation": false, - "maxDepth": 0, - "owner": null, - "application": null, - "organisation": null, - "authorization": [], - "deleted": null, - "configuration": null - }, - "effect": { - "slug": "effect", - "title": "Effect", - "description": "Represents a game effect that can modify character stats or behavior. Effects can be applied through items, skills, or conditions.", - "version": "1.0.1", - "summary": "Game effects and modifiers", - "required": ["name", "description"], - "properties": { - "cumulative": { - "type": "string", - "description": "Whether the effect can stack with similar effects" - }, - "stat": { - "type": "string", - "description": "The stat this effect modifies" - }, - "name": { - "type": "string", - "description": "Name of the effect" - }, - "description": { - "type": "string", - "description": "Detailed description of what the effect does" - }, - "modification": { - "type": "string", - "description": "Type of modification (add, subtract, multiply, etc.)" - }, - "modifier": { - "type": "integer", - "description": "Numerical value of the modification" - }, - "embedded": { - "type": "object", - "description": "Additional embedded data for the effect" - } - }, - "archive": [], - "source": "", - "hardValidation": false, - "maxDepth": 0, - "owner": null, - "application": null, - "organisation": null, - "authorization": [], - "deleted": null, - "configuration": null - }, - "stat": { - "slug": "stat", - "title": "Stat", - "description": "Represents a base statistic or attribute that characters can have. Stats can be modified by effects and are used for skill requirements.", - "version": "1.0.1", - "summary": "Character statistics and attributes", - "required": ["name", "base"], - "properties": { - "description": { - "type": "string", - "description": "Detailed description of what the stat represents" - }, - "name": { - "type": "string", - "description": "Name of the stat" - }, - "base": { - "type": "integer", - "description": "Base value of the stat before modifications" - } - }, - "archive": [], - "source": "", - "hardValidation": false, - "maxDepth": 0, - "owner": null, - "application": null, - "organisation": null, - "authorization": [], - "deleted": null, - "configuration": null - }, - "item": { - "slug": "item", - "title": "Item", - "description": "Represents physical items that characters can possess. Items can have effects and may be unique or common.", - "version": "1.0.1", - "summary": "Game items and equipment", - "required": ["name"], - "properties": { - "effect": { - "type": "string", - "description": "Legacy field for simple effect description" - }, - "description": { - "type": "string", - "description": "Detailed description of the item" - }, - "effects": { - "type": "array", - "description": "List of effects this item provides" - }, - "unique": { - "type": "boolean", - "description": "Whether this is a unique item" - }, - "name": { - "type": "string", - "description": "Name of the item" - }, - "characters": { - "type": "array", - "description": "Characters currently possessing this item" - }, - "embedded": { - "type": "object", - "description": "Additional embedded data for the item" - } - }, - "archive": [], - "source": "", - "hardValidation": false, - "maxDepth": 0, - "owner": null, - "application": null, - "organisation": null, - "authorization": [], - "deleted": null, - "configuration": null - }, - "skill": { - "slug": "skill", - "title": "Skill", - "description": "Represents abilities that characters can learn. Skills may have requirements and can provide effects when used.", - "version": "1.0.1", - "summary": "Character abilities and skills", - "required": ["name", "description"], - "properties": { - "requiredEffects": { - "type": "array", - "description": "Effects required to learn this skill" - }, - "effect": { - "type": "string", - "description": "Legacy field for simple effect description" - }, - "name": { - "type": "string", - "description": "Name of the skill" - }, - "effects": { - "type": "array", - "description": "Effects this skill provides when used" - }, - "requiredSkills": { - "type": "array", - "description": "Other skills required to learn this skill" - }, - "requiredStats": { - "type": "array", - "description": "Stats required to learn this skill" - }, - "requiredConditions": { - "type": "array", - "description": "Conditions required to learn this skill" - }, - "requiredScore": { - "type": "integer", - "description": "Minimum score required in specified stats" - }, - "description": { - "type": "string", - "description": "Detailed description of what the skill does" - }, - "embedded": { - "type": "object", - "description": "Additional embedded data for the skill" - } - }, - "archive": [], - "source": "", - "hardValidation": false, - "maxDepth": 0, - "owner": null, - "application": null, - "organisation": null, - "authorization": [], - "deleted": null, - "configuration": null - }, - "event": { - "slug": "event", - "title": "Event", - "description": "Represents LARP events or game sessions. Contains information about timing, location, and participating characters.", - "version": "1.0.1", - "summary": "Game events and sessions", - "required": ["name", "startDate", "endDate"], - "properties": { - "name": { - "type": "string", - "description": "Name of the event" - }, - "description": { - "type": "string", - "description": "Detailed description of the event" - }, - "location": { - "type": "string", - "description": "Physical location where the event takes place" - }, - "endDate": { - "type": "string", - "description": "End date and time of the event" - }, - "characters": { - "type": "array", - "description": "Characters participating in this event" - }, - "startDate": { - "type": "string", - "description": "Start date and time of the event" - }, - "effects": { - "type": "array", - "description": "Effects active during this event" - }, - "embedded": { - "type": "object", - "description": "Additional embedded data for the event" - } - }, - "archive": [], - "source": "", - "hardValidation": false, - "maxDepth": 0, - "owner": null, - "application": null, - "organisation": null, - "authorization": [], - "deleted": null, - "configuration": null - }, - "condition": { - "slug": "condition", - "title": "Condition", - "description": "Represents temporary or permanent conditions that can affect characters. Conditions can provide effects and may be unique.", - "version": "1.0.1", - "summary": "Character conditions and status effects", - "required": ["name", "description"], - "properties": { - "characters": { - "type": "array", - "description": "Characters currently affected by this condition" - }, - "effect": { - "type": "string", - "description": "Legacy field for simple effect description" - }, - "effects": { - "type": "array", - "description": "Effects this condition applies" - }, - "description": { - "type": "string", - "description": "Detailed description of the condition" - }, - "unique": { - "type": "boolean", - "description": "Whether this condition can only affect a character once" - }, - "name": { - "type": "string", - "description": "Name of the condition" - }, - "embedded": { - "type": "object", - "description": "Additional embedded data for the condition" - } - }, - "archive": [], - "source": "", - "hardValidation": false, - "maxDepth": 0, - "owner": null, - "application": null, - "organisation": null, - "authorization": [], - "deleted": null, - "configuration": null - } - }, - "endpoints": [], - "sources": [], - "mappings": [], - "jobs": [], - "synchronizations": [], - "rules": [] - } -} \ No newline at end of file From 8774f39aee1e80fc58ad1fad1f7b3993ea4b3120 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 07:10:15 +0200 Subject: [PATCH 06/35] fix(register): drop the pre-rename register file the gate rejects (#625) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit check:specs fails on development: [validate-register] ERROR lib/Settings/larping_register.json: missing or incomplete top-level x-openregister block (needs at least { type, ... [validate-register] FAIL — 1 error(s), 12 warning(s). lib/Settings/larping_register.json is residue from before the app was renamed larpingapp -> larpinq. It was last touched on 2026-04-23 ('Working on the larping refactor for object store'), carries only { openapi, info, components } with no x-openregister block at all, and is 15KB against the 33KB larpinq_register.json that replaced it. Nothing loads it. ConfigFileLoaderService names the current file explicitly: private const REGISTER_FILE = '/lib/Settings/larpinq_register.json' and a repo-wide grep for 'larping_register' returns no other hit. The only thing that reads it is the gate, which scans lib/Settings for *register*.json and correctly refuses a register declaring no register. Deleting rather than back-filling the block: adding x-openregister would make a dead file valid, and a second register file that nothing loads is the next reader's puzzle. OpenRegister slugs are frozen once written into stored data -- this file never declared one, so nothing can be pointing at it. From 482cfe29c2b5a8e8873ab81f3fa2019479fffed9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 07:35:01 +0200 Subject: [PATCH 07/35] chore(release): 0.2.6-unstable.20260831051044 (#627) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- appinfo/info.xml | 2 +- openapi.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index 5b3ce9ad..124b6d35 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -46,7 +46,7 @@ Maak een [featureverzoek](https://github.com/ConductionNL/larpinq/issues) **Support:** neem voor support contact op met support@conduction.nl. Voor een Service Level Agreement (SLA), neem contact op met sales@conduction.nl. ]]> - 0.2.4-unstable.20260830175353 + 0.2.6-unstable.20260831051044 EUPL-1.2 Conduction Larpinq diff --git a/openapi.json b/openapi.json index 3a09c85d..a7dd642a 100644 --- a/openapi.json +++ b/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "dsonextcloud", - "version": "0.2.4-unstable.20260830175353", + "version": "0.2.6-unstable.20260831051044", "description": "DSO Nextcloud", "license": { "name": "agpl" From d772447d9b0da886086aebd344b35c4478d41a31 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 07:37:39 +0200 Subject: [PATCH 08/35] chore(deps): refresh the shared Conduction locks (#628) hydra-gates v1.10.0 -> v1.10.0 nc-vue 2.25.1 -> 2.26.0 Lock-only: both packages are already declared with caret ranges that permit these versions, so nothing about what this app ACCEPTS changes - only what it currently resolves to. Opened by the weekly fleet shared-dependency bump, because a lock nobody re-resolves is a pin nobody chose. Merging is gated by this repository's own suite, deliberately: taking hydra-gates v1.8.1 added patchObject() to a published interface, which is a load-time fatal for any concrete double that implements it without the method. CI is the only thing that can tell a safe bump from that. Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5fedab11..624514cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1829,9 +1829,9 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "2.25.1", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.25.1.tgz", - "integrity": "sha512-c5sY4XnHrfGUIUEatJEIT5jK78k9REj2UCqXylbHiDPkv1HpUx7Sf3XtfDxAd4xPjn/kbO094rNqShK4tPnY7w==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.26.0.tgz", + "integrity": "sha512-PrEd1Ej9UMXTw7qzq6WqqPnwdO2yLlJvj8/Lz7fGbtrUbO8xUAkPwgJlKNbsWHv2DhhF5G/MRN4ZA+YvNDaJIg==", "license": "EUPL-1.2", "dependencies": { "@ckpack/vue-color": "^1.6.0", From 75d798f3353ee4821358ec4ed89ef81504ed88c5 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 09:44:43 +0200 Subject: [PATCH 09/35] chore(deps): take @conduction/nextcloud-vue 2.27.0 (#631) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Carries the two KPI-card fixes this dashboard reads: the canonical card is flat and horizontal (no grey box inside the white card CnWidgetWrapper already draws), and a calendar-aligned date range follows the reader's calendar rather than UTC — "Current month" previously showed a To of 1 September in CEST on 31 August. The caret range already allowed it; only the lockfile pinned this app back. Lockfile only, and npm pruned nothing. --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 624514cd..4437fd63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1829,9 +1829,9 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.26.0.tgz", - "integrity": "sha512-PrEd1Ej9UMXTw7qzq6WqqPnwdO2yLlJvj8/Lz7fGbtrUbO8xUAkPwgJlKNbsWHv2DhhF5G/MRN4ZA+YvNDaJIg==", + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.27.0.tgz", + "integrity": "sha512-64IS6VrAp4c+Hr9AAS9/z6AzznmaPfbO4GrZtmOX57dLCpJORkn5M/wSKpAC6ZG+gUHTJeXDUiabut9bV0kRnQ==", "license": "EUPL-1.2", "dependencies": { "@ckpack/vue-color": "^1.6.0", From 72d8fac5136b775920cbf875b146adef4137500c Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 12:30:41 +0200 Subject: [PATCH 10/35] fix(kpi): drop hardcoded KPI colours so the cards follow the theme (#636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per-widget `valueColor` is applied as an INLINE style on the number, so it beats the canonical card accent, and a hex literal opts the card out of NL Design System theming — which kpi-card.css forbids outright, because the nldesign app re-themes by overriding the Nextcloud tokens. Two outcomes, no third: * a colour that merely restated the default accent is deleted — `#0082c9` IS `--color-primary-element` in the default theme, so the tile looks identical and now re-themes correctly; * a colour that carried meaning becomes `variant`, which is themed and drives the icon tint and the number together so the two cannot disagree. `variant` on a stat/delta resolves through VARIANT_COLORS, which was moved onto the `-text` tokens first (nextcloud-vue#888) — the plain fill tokens failed WCAG AA at 1.08:1 as a foreground colour, and these conversions would have been the first tiles to hit that path. Edited as text rather than re-serialised, so the manifest keeps its hand-laid-out formatting; every `valueColor` in this file was confirmed to sit on a KPI widget first. Manifest schema validation passes. --- src/manifest.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/manifest.json b/src/manifest.json index 0ee3bd5b..829ba419 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -95,10 +95,10 @@ "title": "Dashboard", "config": { "widgets": [ - { "id": "kpi-characters", "title": "Characters", "type": "stat", "content": { "label": "Characters", "route": { "name": "Characters" }, "icon": "AccountGroup", "valueColor": "#0082c9", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "character", "metric": "count", "filter": {} } } }, - { "id": "kpi-events", "title": "Events", "type": "stat", "content": { "label": "Events", "route": { "name": "Events" }, "icon": "Calendar", "valueColor": "#0082c9", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "larping_event", "metric": "count", "filter": {} } } }, - { "id": "kpi-items", "title": "Items", "type": "stat", "content": { "label": "Items", "route": { "name": "Items" }, "icon": "Star", "valueColor": "#0082c9", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "larping_item", "metric": "count", "filter": {} } } }, - { "id": "kpi-players", "title": "Players", "type": "stat", "content": { "label": "Players", "route": { "name": "Players" }, "icon": "Account", "valueColor": "#0082c9", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "player", "metric": "count", "filter": {} } } }, + { "id": "kpi-characters", "title": "Characters", "type": "stat", "content": { "label": "Characters", "route": { "name": "Characters" }, "icon": "AccountGroup", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "character", "metric": "count", "filter": {} } } }, + { "id": "kpi-events", "title": "Events", "type": "stat", "content": { "label": "Events", "route": { "name": "Events" }, "icon": "Calendar", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "larping_event", "metric": "count", "filter": {} } } }, + { "id": "kpi-items", "title": "Items", "type": "stat", "content": { "label": "Items", "route": { "name": "Items" }, "icon": "Star", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "larping_item", "metric": "count", "filter": {} } } }, + { "id": "kpi-players", "title": "Players", "type": "stat", "content": { "label": "Players", "route": { "name": "Players" }, "icon": "Account", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "player", "metric": "count", "filter": {} } } }, { "id": "recent-characters", "title": "Recent characters", "type": "object-table", "content": { "register": "larpinq", "schema": "character", "filter": {}, "sort": { "field": "created", "dir": "desc" }, "limit": 6, "rowRoute": "CharacterDetail", "rowIcon": "AccountGroup", "hideHeader": true, "viewAllRoute": { "name": "Characters" }, "viewAllLabel": "View all characters", "emptyText": "No characters yet", "columns": [{ "key": "name", "label": "Name" }, { "key": "type", "label": "Type" }] } }, { "id": "recent-events", "title": "Recent events", "type": "object-table", "content": { "register": "larpinq", "schema": "larping_event", "filter": {}, "sort": { "field": "startDate", "dir": "desc" }, "limit": 6, "rowRoute": "EventDetail", "rowIcon": "CalendarStar", "hideHeader": true, "viewAllRoute": { "name": "Events" }, "viewAllLabel": "View all events", "emptyText": "No events yet", "columns": [{ "key": "name", "label": "Event" }, { "key": "startDate", "label": "Starts" }] } }, { "id": "skill-usage", "title": "Skill usage by characters", "type": "chart", "content": { "chartKind": "donut", "legendPosition": "bottom", "emptyLabel": "No skill data available", "dataSource": { "register": "larpinq", "schema": "character", "aggregate": { "groupBy": "skills", "metric": "count", "topN": 10, "otherBucket": true, "labelResolve": { "schema": "skill", "labelField": "name" } } } } } From 3afd99521b2564816ef72fc1c463596f238e6851 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 12:34:57 +0200 Subject: [PATCH 11/35] fix(composer): declare ext-xsl so dependabot can resolve (#633) Dependabot cannot propose composer updates for this app. Its updater fails with: Your requirements could not be resolved to an installable set of packages. - edgedesign/phpqa[v1.27.0, ..., v1.27.2] require ext-xsl * -> it is missing from your system. config.platform pins php 8.3 so composer resolves against a known PHP version, but says nothing about extensions. edgedesign/phpqa requires ext-xsl and the resolving environment does not have it, so the resolve fails before any bump can be computed. CI is unaffected, which is why this went unnoticed: composer install replays the committed lock and never re-resolves, so the pipeline stays green while dependabot -- which does re-resolve -- fails every time. The shared quality.yml installs no xsl extension anywhere and never invokes phpqa. Declaring ext-xsl beside the php pin makes resolution assume exactly what the committed lockfile already assumes. Verified in a clean composer:2 container without --ignore-platform-reqs: the same file fails without this line and resolves (103 installs, lock written) with it. Co-authored-by: Conduction Release Bot --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index b66376c0..539ee2ed 100644 --- a/composer.json +++ b/composer.json @@ -103,7 +103,8 @@ "optimize-autoloader": true, "sort-packages": true, "platform": { - "php": "8.3" + "php": "8.3", + "ext-xsl": "1" } } } From 779009780aaa4aaa5f34da25850a13edcf97a248 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 13:21:51 +0200 Subject: [PATCH 12/35] chore(deps): take @conduction/nextcloud-vue 2.27.2 (#640) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Levels this app with the fleet. 2.27.2 adds two fixes the earlier 2.27.0 pin does not carry: * headerless is no longer chromeless — a flat KPI card in a borderless wrapper had no card, border or background at all; * a stat `variant` paints from the `-text` tokens rather than the fill tokens, which failed WCAG AA at 1.08:1 as a foreground colour. The KPI colour cleanup converted hardcoded values to `variant`, so this is what makes those conversions contrast-safe. Lockfile only, and npm pruned nothing. --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4437fd63..12a9aad1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1829,9 +1829,9 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.27.0.tgz", - "integrity": "sha512-64IS6VrAp4c+Hr9AAS9/z6AzznmaPfbO4GrZtmOX57dLCpJORkn5M/wSKpAC6ZG+gUHTJeXDUiabut9bV0kRnQ==", + "version": "2.27.2", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.27.2.tgz", + "integrity": "sha512-FhDF3FvM+ee0Jx7z70Lki7o7Mm4DeX/GsOqHo33hOcdylzXR63UXLRbxKMedodEiIqgOFUAI6GTox735iyL8Dw==", "license": "EUPL-1.2", "dependencies": { "@ckpack/vue-color": "^1.6.0", From f28d4031066bbb89dce8faceacd82dd8392a467b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 16:04:38 +0200 Subject: [PATCH 13/35] chore(release): 0.2.7-unstable.20260831114923 (#642) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- appinfo/info.xml | 2 +- openapi.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index 124b6d35..c4b5ea64 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -46,7 +46,7 @@ Maak een [featureverzoek](https://github.com/ConductionNL/larpinq/issues) **Support:** neem voor support contact op met support@conduction.nl. Voor een Service Level Agreement (SLA), neem contact op met sales@conduction.nl. ]]> - 0.2.6-unstable.20260831051044 + 0.2.7-unstable.20260831114923 EUPL-1.2 Conduction Larpinq diff --git a/openapi.json b/openapi.json index a7dd642a..e82a3da2 100644 --- a/openapi.json +++ b/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "dsonextcloud", - "version": "0.2.6-unstable.20260831051044", + "version": "0.2.7-unstable.20260831114923", "description": "DSO Nextcloud", "license": { "name": "agpl" From 65e8d2a0266e89eb99b7df9383cc980763fa4ad2 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 31 Aug 2026 18:56:58 +0200 Subject: [PATCH 14/35] fix(deps): make the npm overrides follow their direct dependency (#643) Dependabot cannot update these packages. Its npm updater fails with: npm error code EOVERRIDE npm error Override for conflicts with direct dependency The package is listed BOTH as a direct dependency and as a literal overrides entry pinned to the same range. Dependabot bumps the direct dependency and does not move the override, npm rejects the mismatched pair, and the update is abandoned -- so these packages can never be updated, security advisories included. npm's self-reference is the idiom for exactly this: $ tells the override to follow whatever the direct dependency resolves to, instead of a range that has to be kept in lockstep by hand. This repo already uses it (see the vue entry under @vue/test-utils). Transitive consumers still get pinned to one version -- the direct dependency's -- which is what the override was there to do. What changes is that the pin tracks the dependency instead of duplicating it. Verified in a clean container: bumping the direct dependency with the literal override reproduces the EOVERRIDE above; with the self-reference the same bump resolves. Co-authored-by: Conduction Release Bot --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index bb2ab954..8b704594 100644 --- a/package.json +++ b/package.json @@ -60,8 +60,8 @@ }, "overrides": { "libxmljs2": "^0.37.0", - "@nextcloud/axios": "~2.5.2", - "@nextcloud/l10n": "3.4.1" + "@nextcloud/axios": "$@nextcloud/axios", + "@nextcloud/l10n": "$@nextcloud/l10n" }, "devDependencies": { "@babel/core": "^7.22.9", From e416b7ea6819b9e965432e9d219b3f58d3d123b1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 22:12:58 +0200 Subject: [PATCH 15/35] chore(release): 0.2.8-unstable.20260831165721 (#644) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- appinfo/info.xml | 2 +- openapi.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index c4b5ea64..ec563486 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -46,7 +46,7 @@ Maak een [featureverzoek](https://github.com/ConductionNL/larpinq/issues) **Support:** neem voor support contact op met support@conduction.nl. Voor een Service Level Agreement (SLA), neem contact op met sales@conduction.nl. ]]> - 0.2.7-unstable.20260831114923 + 0.2.8-unstable.20260831165721 EUPL-1.2 Conduction Larpinq diff --git a/openapi.json b/openapi.json index e82a3da2..7e01e7d7 100644 --- a/openapi.json +++ b/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "dsonextcloud", - "version": "0.2.7-unstable.20260831114923", + "version": "0.2.8-unstable.20260831165721", "description": "DSO Nextcloud", "license": { "name": "agpl" From a6d50f530a119188ba582c0cce738d3729a29b02 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 06:56:10 +0200 Subject: [PATCH 16/35] chore(register): rename the skill slug to larping_skill (#645) * chore(register): rename the skill slug to larping_skill Pipelinq also ships a schema slugged `skill`, an agent competence matched against request categories for routing. Larpinq's is a character skill bought with experience points. Slugs are global on a shared OpenRegister and a bare relation resolves by slug alone, so the two could bind to each other. Measured on the dev instance: schema id 55 (pipelinq) and id 1231 (larpinq). The prefix follows this register's own `larping_item` and `larping_event`, which exist for the same reason. The OBJECT TYPE stays `skill`. Only the slug it maps to changes, exactly as `item` maps to `larping_item`: - SettingsLoadService::OBJECT_TYPE_SCHEMA_SLUGS, the value only - PortalContributionProvider skillCatalog, a real schema binding - src/manifest.json, five real schema bindings - the register's own slug, three $refs and its schema list - three mock seed objects SettingsController::objectTypes and store.js SCHEMA_SLUGS are type keys, not slugs: both already list `item` and `event` rather than the prefixed slugs, so both stay as they are. * fix(portal): bind skillCatalog by dict key, matching its siblings PortalContributionProviderTest::testScopingMapMatchesRegisterAtHead caught this. The provider binds every collection by the register's DICT KEY, not by the slug: its 'event' and 'item' entries sit beside slugs larping_event and larping_item. Moving skillCatalog to the new slug broke that convention and the test that pins it. The slug rename itself stands. Only this binding goes back. * test(newman): point skillSchema at the renamed slug The API resolves an object collection by SLUG, which is why itemSchema is larping_item and eventSchema is larping_event. skillSchema was still 'skill' and the 'skill created (2xx)' assertion failed against a slug that no longer exists. --------- Co-authored-by: Conduction Release Bot --- lib/Service/SettingsLoadService.php | 2 +- lib/Settings/larpinq_mock_register.json | 6 +++--- lib/Settings/larpinq_register.json | 14 +++++++------- src/manifest.json | 10 +++++----- tests/integration/larpinq.postman_collection.json | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/Service/SettingsLoadService.php b/lib/Service/SettingsLoadService.php index 3943a030..5049f463 100644 --- a/lib/Service/SettingsLoadService.php +++ b/lib/Service/SettingsLoadService.php @@ -73,7 +73,7 @@ class SettingsLoadService { 'character' => 'character', 'player' => 'player', 'ability' => 'ability', - 'skill' => 'skill', + 'skill' => 'larping_skill', 'item' => 'larping_item', 'condition' => 'condition', 'effect' => 'effect', diff --git a/lib/Settings/larpinq_mock_register.json b/lib/Settings/larpinq_mock_register.json index 9ebd9e43..4e4a86b4 100644 --- a/lib/Settings/larpinq_mock_register.json +++ b/lib/Settings/larpinq_mock_register.json @@ -465,7 +465,7 @@ { "@self": { "register": "larpinq", - "schema": "skill", + "schema": "larping_skill", "slug": "skill-voorbeeld-name-1-1" }, "name": "Voorbeeld Name 1", @@ -492,7 +492,7 @@ { "@self": { "register": "larpinq", - "schema": "skill", + "schema": "larping_skill", "slug": "skill-voorbeeld-name-2-2" }, "name": "Voorbeeld Name 2", @@ -519,7 +519,7 @@ { "@self": { "register": "larpinq", - "schema": "skill", + "schema": "larping_skill", "slug": "skill-voorbeeld-name-3-3" }, "name": "Voorbeeld Name 3", diff --git a/lib/Settings/larpinq_register.json b/lib/Settings/larpinq_register.json index 09fa10b0..1ce85480 100644 --- a/lib/Settings/larpinq_register.json +++ b/lib/Settings/larpinq_register.json @@ -2,8 +2,8 @@ "openapi": "3.0.0", "info": { "title": "Larpinq Register", - "description": "Live Action Role Playing character management register for the Larpinq Nextcloud app. Manages characters, players, abilities, skills, items, conditions, effects, events, and worlds.", - "version": "1.2.0" + "description": "Live Action Role Playing character management register for the Larpinq Nextcloud app. Manages characters, players, abilities, skills, items, conditions, effects, events, and worlds. v1.3.0 renames the `skill` schema slug to `larping_skill`. Pipelinq also ships a `skill`, an agent competence used for routing, and slugs are global on a shared OpenRegister. The prefix follows this register's own `larping_item` and `larping_event`. The object type stays `skill`; only the slug it maps to changes.", + "version": "1.3.0" }, "x-openregister": { "type": "application", @@ -23,7 +23,7 @@ "character", "player", "ability", - "skill", + "larping_skill", "larping_item", "condition", "effect", @@ -180,7 +180,7 @@ "type": "string", "format": "uuid" }, - "$ref": "skill", + "$ref": "larping_skill", "x-relation-filter": { "setting": "@object.setting" }, "visible": false, "title": "Skills" @@ -238,7 +238,7 @@ "skill": { "type": "string", "format": "uuid", - "$ref": "skill", + "$ref": "larping_skill", "x-relation-filter": { "setting": "@object.setting" }, "description": "The assigned skill whose requirements are waived", "title": "Skill" @@ -430,7 +430,7 @@ } }, "skill": { - "slug": "skill", + "slug": "larping_skill", "title": "Skill", "icon": "SwordCross", "version": "1.2.0", @@ -484,7 +484,7 @@ "type": "string", "format": "uuid" }, - "$ref": "skill", + "$ref": "larping_skill", "x-relation-filter": { "setting": "@object.setting" }, "visible": false, "title": "Required Skills" diff --git a/src/manifest.json b/src/manifest.json index 829ba419..06cd6a18 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -101,7 +101,7 @@ { "id": "kpi-players", "title": "Players", "type": "stat", "content": { "label": "Players", "route": { "name": "Players" }, "icon": "Account", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "player", "metric": "count", "filter": {} } } }, { "id": "recent-characters", "title": "Recent characters", "type": "object-table", "content": { "register": "larpinq", "schema": "character", "filter": {}, "sort": { "field": "created", "dir": "desc" }, "limit": 6, "rowRoute": "CharacterDetail", "rowIcon": "AccountGroup", "hideHeader": true, "viewAllRoute": { "name": "Characters" }, "viewAllLabel": "View all characters", "emptyText": "No characters yet", "columns": [{ "key": "name", "label": "Name" }, { "key": "type", "label": "Type" }] } }, { "id": "recent-events", "title": "Recent events", "type": "object-table", "content": { "register": "larpinq", "schema": "larping_event", "filter": {}, "sort": { "field": "startDate", "dir": "desc" }, "limit": 6, "rowRoute": "EventDetail", "rowIcon": "CalendarStar", "hideHeader": true, "viewAllRoute": { "name": "Events" }, "viewAllLabel": "View all events", "emptyText": "No events yet", "columns": [{ "key": "name", "label": "Event" }, { "key": "startDate", "label": "Starts" }] } }, - { "id": "skill-usage", "title": "Skill usage by characters", "type": "chart", "content": { "chartKind": "donut", "legendPosition": "bottom", "emptyLabel": "No skill data available", "dataSource": { "register": "larpinq", "schema": "character", "aggregate": { "groupBy": "skills", "metric": "count", "topN": 10, "otherBucket": true, "labelResolve": { "schema": "skill", "labelField": "name" } } } } } + { "id": "skill-usage", "title": "Skill usage by characters", "type": "chart", "content": { "chartKind": "donut", "legendPosition": "bottom", "emptyLabel": "No skill data available", "dataSource": { "register": "larpinq", "schema": "character", "aggregate": { "groupBy": "skills", "metric": "count", "topN": 10, "otherBucket": true, "labelResolve": { "schema": "larping_skill", "labelField": "name" } } } } } ], "layout": [ { "id": 1, "widgetId": "kpi-characters", "gridX": 0, "gridY": 0, "gridWidth": 3, "gridHeight": 2, "showTitle": false }, @@ -224,7 +224,7 @@ { "id": "ability-data", "type": "data", "title": "Ability", "icon": "Gauge", "content": { "columns": 2 } }, { "id": "ability-base", "type": "stat", "title": "Base value", "icon": "Gauge", "content": { "label": "Base value", "icon": "Gauge", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "ability", "metric": "sum", "field": "base", "filter": { "id": "@objectId" } } } }, { "id": "ability-effects", "type": "object-list", "title": "Effects modifying this ability", "icon": "TrendingUp", "content": { "register": "larpinq", "schema": "effect", "filter": { "abilities": "@objectId" }, "columns": [ { "key": "name", "label": "Effect" }, { "key": "modifier", "label": "Modifier" }, { "key": "modification", "label": "Direction" }, { "key": "cumulative", "label": "Stacks" } ], "limit": 50, "viewAllRoute": "Effects", "viewAllQuery": { "abilities": "@objectId" }, "emptyText": "No effects modify this stat yet." } }, - { "id": "ability-skills", "type": "object-list", "title": "Skills requiring this stat", "icon": "School", "content": { "register": "larpinq", "schema": "skill", "filter": { "requiredStats": "@objectId" }, "columns": [ { "key": "name", "label": "Skill" }, { "key": "requiredScore", "label": "Min score" } ], "limit": 50, "viewAllRoute": "Skills", "viewAllQuery": { "requiredStats": "@objectId" }, "emptyText": "No skills require this stat yet." } }, + { "id": "ability-skills", "type": "object-list", "title": "Skills requiring this stat", "icon": "School", "content": { "register": "larpinq", "schema": "larping_skill", "filter": { "requiredStats": "@objectId" }, "columns": [ { "key": "name", "label": "Skill" }, { "key": "requiredScore", "label": "Min score" } ], "limit": 50, "viewAllRoute": "Skills", "viewAllQuery": { "requiredStats": "@objectId" }, "emptyText": "No skills require this stat yet." } }, { "id": "ability-related", "type": "related", "title": "Related", "icon": "LinkVariant" } ], "layout": [ @@ -248,7 +248,7 @@ "route": "/skills", "type": "index", "title": "Skills", - "config": { "register": "larpinq", "schema": "skill", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { "register": "larpinq", "schema": "larping_skill", "documentationUrl": "https://larpinq.conduction.nl" } }, { "id": "SkillTree", @@ -266,7 +266,7 @@ "title": "Skill", "config": { "register": "larpinq", - "schema": "skill", + "schema": "larping_skill", "documentationUrl": "https://larpinq.conduction.nl", "_note": "Skill = a learnable, XP-purchased ability with prerequisites (rules-object archetype, prerequisite-heavy). The body leads with the skill's flavour + mechanical effect (data, 8-wide) beside a related rail that surfaces the four prerequisite groups the schema carries (required skills, required stats, required conditions, required effects) plus the effects it grants — the whole dependency tree in one place. Below, an object-list of characters who have learned this skill (character.skills contains @objectId) lets a GM see adoption. Pure rules object: no comms, no files.", "widgets": [ @@ -383,7 +383,7 @@ { "id": "effect-data", "type": "data", "title": "Effect", "icon": "Lightbulb", "content": { "columns": 2 } }, { "id": "effect-modifier", "type": "stat", "title": "Modifier", "icon": "TrendingUp", "content": { "label": "Modifier value", "icon": "TrendingUp", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "effect", "metric": "sum", "field": "modifier", "filter": { "id": "@objectId" } } } }, { "id": "effect-abilities", "type": "related", "title": "Modifies abilities", "icon": "LinkVariant", "content": { "groups": [ { "key": "abilities", "label": "Abilities" } ] } }, - { "id": "effect-skills", "type": "object-list", "title": "Skills granting this effect", "icon": "School", "content": { "register": "larpinq", "schema": "skill", "filter": { "effects": "@objectId" }, "columns": [ { "key": "name", "label": "Skill" } ], "limit": 50, "viewAllRoute": "Skills", "viewAllQuery": { "effects": "@objectId" }, "emptyText": "No skills grant this effect yet." } }, + { "id": "effect-skills", "type": "object-list", "title": "Skills granting this effect", "icon": "School", "content": { "register": "larpinq", "schema": "larping_skill", "filter": { "effects": "@objectId" }, "columns": [ { "key": "name", "label": "Skill" } ], "limit": 50, "viewAllRoute": "Skills", "viewAllQuery": { "effects": "@objectId" }, "emptyText": "No skills grant this effect yet." } }, { "id": "effect-items", "type": "object-list", "title": "Items granting this effect", "icon": "Package", "content": { "register": "larpinq", "schema": "larping_item", "filter": { "effects": "@objectId" }, "columns": [ { "key": "name", "label": "Item" } ], "limit": 50, "viewAllRoute": "Items", "viewAllQuery": { "effects": "@objectId" }, "emptyText": "No items grant this effect yet." } }, { "id": "effect-conditions", "type": "object-list", "title": "Conditions granting this effect", "icon": "AlertCircleOutline", "content": { "register": "larpinq", "schema": "condition", "filter": { "effects": "@objectId" }, "columns": [ { "key": "name", "label": "Condition" } ], "limit": 50, "viewAllRoute": "Conditions", "viewAllQuery": { "effects": "@objectId" }, "emptyText": "No conditions grant this effect yet." } } ], diff --git a/tests/integration/larpinq.postman_collection.json b/tests/integration/larpinq.postman_collection.json index 9bfb7502..f9189eef 100644 --- a/tests/integration/larpinq.postman_collection.json +++ b/tests/integration/larpinq.postman_collection.json @@ -12,7 +12,7 @@ { "key": "register", "value": "larpinq" }, { "key": "charSchema", "value": "character" }, { "key": "itemSchema", "value": "larping_item" }, - { "key": "skillSchema", "value": "skill" }, + { "key": "skillSchema", "value": "larping_skill" }, { "key": "conditionSchema", "value": "condition" }, { "key": "effectSchema", "value": "effect" }, { "key": "eventSchema", "value": "larping_event" }, From 8652f52a712a6229aff56dd8d7140792b463bccd Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 06:59:16 +0200 Subject: [PATCH 17/35] fix(dashboard): drop the second Refresh from the dashboard header (#646) The dashboard shipped two Refresh controls side by side. CnActionsMenu renders one as the first item of the page-level Actions overflow menu, and the manifest declared another as a header button next to that menu. They did the same thing. A "type": "refresh" headerAction is dispatched as emit(PAGE_REFRESH_CHANNEL, {}), which is the exact signal CnActionsMenu broadcasts on refresh-channel="cn:page:refresh". Same channel, same subscribers. Removing the header action takes away the duplicate and nothing else. An app that wants to keep a prominent Refresh button can stand the menu item down with showRefresh: false instead. openregister's dashboard does that. Shipping both is what this removes. --- src/manifest.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/manifest.json b/src/manifest.json index 06cd6a18..9bb6ca8c 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -116,8 +116,7 @@ "headerActions": [ { "id": "new-character", "label": "New character", "type": "open-form", "icon": "Plus", "variant": "primary", "register": "larpinq", "schema": "character", "onSuccessRoute": "Characters" }, { "id": "new-item", "label": "New item", "type": "open-form", "icon": "Plus", "register": "larpinq", "schema": "larping_item", "onSuccessRoute": "Items" }, - { "id": "new-condition", "label": "New condition", "type": "open-form", "icon": "Plus", "register": "larpinq", "schema": "condition", "onSuccessRoute": "Conditions" }, - { "id": "refresh-dashboard", "label": "Refresh dashboard", "type": "refresh", "icon": "Refresh" } + { "id": "new-condition", "label": "New condition", "type": "open-form", "icon": "Plus", "register": "larpinq", "schema": "condition", "onSuccessRoute": "Conditions" } ] } }, From e400d49e6f0653f8d3c08d4101be9e1f28d1f744 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 08:02:27 +0200 Subject: [PATCH 18/35] fix(e2e): expect the slug the register actually ships, larping_skill (#649) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit development E2E has been failing on: ::error::Larpinq schemas missing after import: [skill] ::error::The e2e suite cannot seed abilities, effects, skills or characters without them. The schema imported perfectly well. The seed was looking for the wrong name. ci-seed.sh matches on SLUG, and the run own diagnostic printed the answer: [ci-seed] schemas present: [... larping_attendance, larping_event, larping_item, larping_skill ...] larping_skill is right there. The required list already carried the larping_ prefix for item, event and attendance, so this is one entry that was missed when the others were prefixed. Fixed on the SEED side deliberately. An OpenRegister register slug is frozen once data references it, so renaming larping_skill to match the test would be the destructive way round → see the fleet renaming rules. Verified every required slug against the register files: all eleven are declared, none missing. Co-authored-by: Conduction Release Bot --- tests/e2e/ci-seed.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/ci-seed.sh b/tests/e2e/ci-seed.sh index 5a70d3d8..77059918 100755 --- a/tests/e2e/ci-seed.sh +++ b/tests/e2e/ci-seed.sh @@ -203,7 +203,7 @@ path, kind, code = sys.argv[1], sys.argv[2], sys.argv[3] required = { 'registers': ['larpinq'], 'schemas': [ - 'character', 'player', 'ability', 'skill', 'larping_item', + 'character', 'player', 'ability', 'larping_skill', 'larping_item', 'condition', 'effect', 'larping_event', 'setting', 'xpAward', 'larping_attendance', ], From ec299139f54673037f8f22ad0574ecf260ac71c6 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 10:17:49 +0200 Subject: [PATCH 19/35] feat(router): give larpinq the SPA catch-all, and move it to clean path URLs (#651) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(dashboard): drop the second Refresh from the dashboard header The dashboard shipped two Refresh controls side by side. CnActionsMenu renders one as the first item of the page-level Actions overflow menu, and the manifest declared another as a header button next to that menu. They did the same thing. A "type": "refresh" headerAction is dispatched as emit(PAGE_REFRESH_CHANNEL, {}), which is the exact signal CnActionsMenu broadcasts on refresh-channel="cn:page:refresh". Same channel, same subscribers. Removing the header action takes away the duplicate and nothing else. An app that wants to keep a prominent Refresh button can stand the menu item down with showRefresh: false instead. openregister's dashboard does that. Shipping both is what this removes. * feat(router): give larpinq the SPA catch-all, and move it to clean path URLs larpinq was the ONE app of the fleet's seven hash-routed apps that could not simply switch: its sub-paths 404'd at the server. Measured 2026-09-01, /apps/larpinq/characters and /events both returned 404 while every other hash-mode app answered 200 with the app shell. ⚠️ Grepping routes.php for `catchAll`/`AppHost` had named the WRONG app. `Routes::standard()` installs the catch-all without either string appearing, so the grep measured whether the file MENTIONS it, not whether the route exists -- it flagged zaakafhandelapp (which was fine) and cleared larpinq (which was not). Only requesting a sub-path settles it. Three changes, in the order they had to happen: 1. DashboardController::catchAll(), delegating to page(), so the SPA is served on any sub-path. 2. appinfo/routes.php rebuilt on \OCA\OpenRegister\AppHost\Routes::standard(). Every existing route is passed through as $extra -- `standard()` lets an $extra route override a canonical one of the same name, so dashboard#page, settings#* and preferences#* keep their exact URLs and verbs, and domain routes stay ahead of the /{path} fallback. 3. createWebHashHistory -> createWebHistory, with routerBase() derived from the URL actually being served. Nextcloud serves the app under BOTH /apps/larpinq/... and /index.php/apps/larpinq/...; generateUrl() returns only one. This app's own specs use both spellings (/apps/larpinq in _nav.ts and docs-screenshots, /index.php/apps/larpinq in the visual spec), so either would break whichever base was fixed. Also de-hashed the DeepLinkRegistrationListener's 8 URL templates and their test. Those templates are handed to OTHER apps to link into larpinq, so a stale `#` would have kept sending every cross-app deep link to the dashboard -- silently, since the router resolves nothing and the catch-all redirects to `/`. Audited the four already-converted apps (stackiq, zaakafhandelapp, opencatalogi, keepiq): none register hash deep links, so nothing was shipped with that gap. ⚠️ The catch-all does not take effect until Nextcloud's route cache is dropped. With memcache.local = APCu, `occ app:disable/enable` is NOT enough -- sub-paths kept 404ing with the correct routes.php already in place. Restarting the container cleared it and all four URLs went from 404 to routed. Verified against the published @conduction/nextcloud-vue (USE_LOCAL_LIB=false): /apps/larpinq/ -> Dashboard /apps/larpinq/characters -> Characters /index.php/apps/larpinq/characters -> Characters /index.php/apps/larpinq/events -> Events RELOAD on the /index.php form -> 200, still Events No hash anywhere. eslint exits 0, prettier --check on the FULL glob is clean, webpack compiles, and both PHP files pass php -l. The listener's unit test was updated in lockstep with the same 8 replacements; there is no phpunit in this checkout, so CI runs it. --- appinfo/routes.php | 74 ++++++++++++------- lib/Controller/DashboardController.php | 20 +++++ lib/Listener/DeepLinkRegistrationListener.php | 21 ++++-- src/main.js | 25 ++++++- .../spec-coverage/detail-forms-admin.spec.ts | 2 +- .../spec-coverage/settings-roadmap.spec.ts | 2 +- tests/e2e/spec-coverage/spa-ui.spec.ts | 4 +- tests/e2e/visual/larpinq.visual.spec.ts | 4 +- .../DeepLinkRegistrationListenerTest.php | 16 ++-- 9 files changed, 118 insertions(+), 50 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index e747579b..e8815ddb 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -1,28 +1,50 @@ [ - // Page routes - ['name' => 'dashboard#page', 'url' => '/', 'verb' => 'GET'], - ['name' => 'characters#downloadPdf', 'url' => '/characters/{id}/download/{template}', 'verb' => 'GET'], - ['name' => 'events#downloadRunsheet', 'url' => '/events/{id}/runsheet/{template}', 'verb' => 'GET'], - ['name' => 'events#roster', 'url' => '/api/events/{id}/roster', 'verb' => 'GET'], - ['name' => 'events#recordAttendance', 'url' => '/api/events/{id}/attendance', 'verb' => 'POST'], - ['name' => 'characters#requirementReport', 'url' => '/api/characters/{id}/requirement-report', 'verb' => 'GET'], - ['name' => 'settings#index', 'url' => 'api/settings', 'verb' => 'GET'], - ['name' => 'settings#create', 'url' => 'api/settings', 'verb' => 'POST'], - // Canonical AppHost settings write (OpenRegister\AppHost\Routes::standard()). - // `settings#create` above stays as the legacy POST alias; both reach the - // same SettingsController::update(). URL spelled without a leading slash - // to match its two siblings — RouteParser ltrims it either way. - ['name' => 'settings#update', 'url' => 'api/settings', 'verb' => 'PUT'], - ['name' => 'settings#reimport', 'url' => 'api/settings/reimport', 'verb' => 'POST'], - // First-time setup wizard (ADR-042). - ['name' => 'setup#status', 'url' => '/api/setup/status', 'verb' => 'GET'], - ['name' => 'setup#saveConfig', 'url' => '/api/setup/config', 'verb' => 'POST'], - ['name' => 'setup#runAction', 'url' => '/api/setup/action/{actionId}', 'verb' => 'POST'], - // Generic per-user preferences (used by shared nextcloud-vue widgets, e.g. CnSupportDialog). - ['name' => 'preferences#getPreference', 'url' => '/api/preferences/{key}', 'verb' => 'GET'], - ['name' => 'preferences#setPreference', 'url' => '/api/preferences/{key}', 'verb' => 'PUT'], - ], -]; +declare(strict_types=1); + +/* + * Larpinq route table. + * + * Built through \OCA\OpenRegister\AppHost\Routes::standard(), which appends + * the SPA catch-all (`dashboard#catchAll` on `/{path}`) after every route + * below. Without that catch-all the server has no handler for + * `/apps/larpinq/`, so deep links and reloads 404 before the SPA loads + * — measured 2026-09-01, larpinq was the ONLY one of the fleet's seven + * hash-routed apps whose sub-paths returned 404 rather than the app shell, + * which is what blocked it from moving to history routing. + * + * Routes listed here are passed as `$extra`; `standard()` lets an `$extra` + * route override a canonical one of the same name, so the existing + * `dashboard#page`, `settings#*` and `preferences#*` entries below keep their + * exact URLs and verbs. Domain routes are inserted BEFORE the catch-all, so + * they keep priority over the `/{path}` fallback. + * + * This file references no OCA\OpenRegister symbol other than the pure array + * builder Routes::standard(), so it is safe to require even when OpenRegister + * is disabled. + */ + +return \OCA\OpenRegister\AppHost\Routes::standard([ + // Page routes + ['name' => 'dashboard#page', 'url' => '/', 'verb' => 'GET'], + ['name' => 'characters#downloadPdf', 'url' => '/characters/{id}/download/{template}', 'verb' => 'GET'], + ['name' => 'events#downloadRunsheet', 'url' => '/events/{id}/runsheet/{template}', 'verb' => 'GET'], + ['name' => 'events#roster', 'url' => '/api/events/{id}/roster', 'verb' => 'GET'], + ['name' => 'events#recordAttendance', 'url' => '/api/events/{id}/attendance', 'verb' => 'POST'], + ['name' => 'characters#requirementReport', 'url' => '/api/characters/{id}/requirement-report', 'verb' => 'GET'], + ['name' => 'settings#index', 'url' => 'api/settings', 'verb' => 'GET'], + ['name' => 'settings#create', 'url' => 'api/settings', 'verb' => 'POST'], + // Canonical AppHost settings write (OpenRegister\AppHost\Routes::standard()). + // `settings#create` above stays as the legacy POST alias; both reach the + // same SettingsController::update(). URL spelled without a leading slash + // to match its two siblings — RouteParser ltrims it either way. + ['name' => 'settings#update', 'url' => 'api/settings', 'verb' => 'PUT'], + ['name' => 'settings#reimport', 'url' => 'api/settings/reimport', 'verb' => 'POST'], + // First-time setup wizard (ADR-042). + ['name' => 'setup#status', 'url' => '/api/setup/status', 'verb' => 'GET'], + ['name' => 'setup#saveConfig', 'url' => '/api/setup/config', 'verb' => 'POST'], + ['name' => 'setup#runAction', 'url' => '/api/setup/action/{actionId}', 'verb' => 'POST'], + // Generic per-user preferences (used by shared nextcloud-vue widgets, e.g. CnSupportDialog). + ['name' => 'preferences#getPreference', 'url' => '/api/preferences/{key}', 'verb' => 'GET'], + ['name' => 'preferences#setPreference', 'url' => '/api/preferences/{key}', 'verb' => 'PUT'], +]); diff --git a/lib/Controller/DashboardController.php b/lib/Controller/DashboardController.php index 373e1d5c..430eeac5 100644 --- a/lib/Controller/DashboardController.php +++ b/lib/Controller/DashboardController.php @@ -73,4 +73,24 @@ public function page(): TemplateResponse { [] ); }//end page() + + /** + * Serve the SPA for deep links (Vue history mode). Delegates to {@see page()}. + * + * Without this the server has no handler for `/apps/larpinq/`, so a + * deep link or a RELOAD on any sub-path 404s before the SPA ever loads — + * which is why this app was the one of the seven still unable to move off + * hash routing. Measured before this change: /apps/larpinq/characters and + * /events both returned 404, while every other hash-mode app answered 200. + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return TemplateResponse + * + * @spec exclude Vue history-mode fallback — delegates to page(); pure framework plumbing, no domain logic. + */ + public function catchAll(): TemplateResponse { + return $this->page(); + }//end catchAll() }//end class diff --git a/lib/Listener/DeepLinkRegistrationListener.php b/lib/Listener/DeepLinkRegistrationListener.php index 70a799a5..948c6bcc 100644 --- a/lib/Listener/DeepLinkRegistrationListener.php +++ b/lib/Listener/DeepLinkRegistrationListener.php @@ -84,14 +84,19 @@ class DeepLinkRegistrationListener implements IEventListener { * @var array */ private const DEEP_LINK_MAP = [ - 'character' => '/apps/larpinq/#/characters/{uuid}', - 'player' => '/apps/larpinq/#/players/{uuid}', - 'ability' => '/apps/larpinq/#/abilities/{uuid}', - 'skill' => '/apps/larpinq/#/skills/{uuid}', - 'larping_item' => '/apps/larpinq/#/items/{uuid}', - 'condition' => '/apps/larpinq/#/conditions/{uuid}', - 'effect' => '/apps/larpinq/#/effects/{uuid}', - 'larping_event' => '/apps/larpinq/#/events/{uuid}', + // Path URLs, not `#/` fragments: larpinq moved to vue-router history + // mode. These templates are handed to OTHER apps to link into larpinq, so + // a stale `#` here would keep sending every cross-app deep link to the + // dashboard — silently, because the router resolves nothing and the + // catch-all redirects to `/`. + 'character' => '/apps/larpinq/characters/{uuid}', + 'player' => '/apps/larpinq/players/{uuid}', + 'ability' => '/apps/larpinq/abilities/{uuid}', + 'skill' => '/apps/larpinq/skills/{uuid}', + 'larping_item' => '/apps/larpinq/items/{uuid}', + 'condition' => '/apps/larpinq/conditions/{uuid}', + 'effect' => '/apps/larpinq/effects/{uuid}', + 'larping_event' => '/apps/larpinq/events/{uuid}', ]; /** diff --git a/src/main.js b/src/main.js index bf41519b..8e07cd24 100644 --- a/src/main.js +++ b/src/main.js @@ -15,7 +15,7 @@ import { } from '@nextcloud/l10n' import { generateUrl } from '@nextcloud/router' import { createApp, h } from 'vue' -import { createRouter, createWebHashHistory } from 'vue-router' +import { createRouter, createWebHistory } from 'vue-router' import App from './App.vue' import appIcons from './icons.js' import bundledManifest from './manifest.json' @@ -342,8 +342,29 @@ function routesFromManifest(manifest) { return routes } +/** + * The router base for THIS page load. + * + * ⚠️ `generateUrl('/apps/larpinq')` alone is not enough. Nextcloud serves the + * app under BOTH `/apps/larpinq/...` and `/index.php/apps/larpinq/...`, but + * `generateUrl()` returns only the form the instance is configured for. A + * visitor arriving on the other form falls outside the router base, vue-router + * cannot resolve the path, and the catch-all redirects to `/`: they land on the + * dashboard with no error and the deep link is silently swallowed. + * + * This app's own specs use BOTH spellings — `/apps/larpinq` in `_nav.ts` and + * the docs-screenshots spec, `/index.php/apps/larpinq` in the visual spec — so + * one or the other would break whichever base was hardcoded. + * + * @return {string} The base path vue-router should strip from the URL. + */ +function routerBase() { + const match = window.location.pathname.match(/^(.*\/apps\/larpinq)(?:\/|$)/) + return match ? match[1] : generateUrl('/apps/larpinq') +} + const router = createRouter({ - history: createWebHashHistory(generateUrl('/apps/larpinq')), + history: createWebHistory(routerBase()), routes: routesFromManifest(manifest), }) try { diff --git a/tests/e2e/spec-coverage/detail-forms-admin.spec.ts b/tests/e2e/spec-coverage/detail-forms-admin.spec.ts index d5c126ce..3055bc26 100644 --- a/tests/e2e/spec-coverage/detail-forms-admin.spec.ts +++ b/tests/e2e/spec-coverage/detail-forms-admin.spec.ts @@ -189,7 +189,7 @@ async function navTo(page: Page, slug: string): Promise { * Navigate to a detail route via the app's hash router. * * The router runs in `mode: 'hash'` (src/main.js — fleet #133 deep-link fix), - * so the canonical detail URL is `/apps/larpinq/#//`. Loading that + * so the canonical detail URL is `/apps/larpinq//`. Loading that * URL serves the SPA root from the server (no 404 — the hash fragment is never * sent to the backend) and the client-side hash router resolves the detail * route. This is the deep-link path the hash-mode change exists to support, so diff --git a/tests/e2e/spec-coverage/settings-roadmap.spec.ts b/tests/e2e/spec-coverage/settings-roadmap.spec.ts index 21e0c456..30e3145a 100644 --- a/tests/e2e/spec-coverage/settings-roadmap.spec.ts +++ b/tests/e2e/spec-coverage/settings-roadmap.spec.ts @@ -27,7 +27,7 @@ const BASE = '/apps/larpinq' /** * Hard-load the target in-app route via the app's hash router. The router runs * in `mode: 'hash'` (src/main.js — fleet #133 deep-link fix), so in-app routes - * are addressed as /apps/larpinq/#/. Loading that URL serves the SPA + * are addressed as /apps/larpinq/. Loading that URL serves the SPA * root from the server (the hash fragment is never sent to the backend, so no * 404) and the client-side router resolves the view. A fresh load per test * avoids the shared-list-state collapse where in-session sidebar navigation diff --git a/tests/e2e/spec-coverage/spa-ui.spec.ts b/tests/e2e/spec-coverage/spa-ui.spec.ts index 6242b003..a51a2dea 100644 --- a/tests/e2e/spec-coverage/spa-ui.spec.ts +++ b/tests/e2e/spec-coverage/spa-ui.spec.ts @@ -32,7 +32,7 @@ const TS = Date.now() * * The Vue SPA uses hash mode with base `/apps/larpinq` (src/main.js — * fleet #133 deep-link fix). In-app routes (/characters, /abilities, …) are - * addressed via the URL hash: /apps/larpinq/#/. The hash fragment is + * addressed via the URL hash: /apps/larpinq/. The hash fragment is * never sent to the backend, so the SPA root is always served and Vue Router's * hashchange listener resolves the view client-side. Strategy: land on the SPA * root first, wait for Vue to mount, then set window.location.hash so the @@ -72,7 +72,7 @@ async function go(page: Page, route: string): Promise { } // Resolve the target path relative to the app base. The router runs in // hash mode (src/main.js — fleet #133 deep-link fix), so in-app routes are - // addressed via the URL hash: /apps/larpinq/#/. Driving the hash + // addressed via the URL hash: /apps/larpinq/. Driving the hash // directly lets Vue Router's hashchange listener resolve the view (the old // history.pushState to a bare /apps/larpinq/ path no longer routes // under hash mode and addresses a server path that 404s on reload). diff --git a/tests/e2e/visual/larpinq.visual.spec.ts b/tests/e2e/visual/larpinq.visual.spec.ts index 84eee7db..7ef7ed44 100644 --- a/tests/e2e/visual/larpinq.visual.spec.ts +++ b/tests/e2e/visual/larpinq.visual.spec.ts @@ -17,10 +17,10 @@ const APP = '/index.php/apps/larpinq' test.describe('Larpinq — visual baselines', () => { test('dashboard', async ({ page }) => { - await shootSurface(page, `${APP}/#/`, 'dashboard.png') + await shootSurface(page, `${APP}/`, 'dashboard.png') }) test('characters list', async ({ page }) => { - await shootByNav(page, `${APP}/#/`, 'Characters', 'characters.png') + await shootByNav(page, `${APP}/`, 'Characters', 'characters.png') }) }) diff --git a/tests/unit/Listener/DeepLinkRegistrationListenerTest.php b/tests/unit/Listener/DeepLinkRegistrationListenerTest.php index 1efccdeb..5ba896df 100644 --- a/tests/unit/Listener/DeepLinkRegistrationListenerTest.php +++ b/tests/unit/Listener/DeepLinkRegistrationListenerTest.php @@ -175,13 +175,13 @@ public function testHandleUsesCorrectUrlPatterns(): void { $bySlug = array_column($event->links, 'urlTemplate', 'schemaSlug'); - self::assertSame('/apps/larpinq/#/characters/{uuid}', $bySlug['character']); - self::assertSame('/apps/larpinq/#/players/{uuid}', $bySlug['player']); - self::assertSame('/apps/larpinq/#/abilities/{uuid}', $bySlug['ability']); - self::assertSame('/apps/larpinq/#/skills/{uuid}', $bySlug['skill']); - self::assertSame('/apps/larpinq/#/items/{uuid}', $bySlug['larping_item']); - self::assertSame('/apps/larpinq/#/conditions/{uuid}', $bySlug['condition']); - self::assertSame('/apps/larpinq/#/effects/{uuid}', $bySlug['effect']); - self::assertSame('/apps/larpinq/#/events/{uuid}', $bySlug['larping_event']); + self::assertSame('/apps/larpinq/characters/{uuid}', $bySlug['character']); + self::assertSame('/apps/larpinq/players/{uuid}', $bySlug['player']); + self::assertSame('/apps/larpinq/abilities/{uuid}', $bySlug['ability']); + self::assertSame('/apps/larpinq/skills/{uuid}', $bySlug['skill']); + self::assertSame('/apps/larpinq/items/{uuid}', $bySlug['larping_item']); + self::assertSame('/apps/larpinq/conditions/{uuid}', $bySlug['condition']); + self::assertSame('/apps/larpinq/effects/{uuid}', $bySlug['effect']); + self::assertSame('/apps/larpinq/events/{uuid}', $bySlug['larping_event']); }//end testHandleUsesCorrectUrlPatterns() }//end class From 602fa3a5268e21c28714bd128fbc180248e950b0 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 11:40:11 +0200 Subject: [PATCH 20/35] fix(routes): guard the AppHost builder with class_exists (#653) Follow-up to #651, which turned PHPUnit red on development: four errors, all reading Error: Class "OCA\OpenRegister\AppHost\Routes" not found Nextcloud includes appinfo/routes.php for EVERY larpinq request, and PHPUnit includes it without booting sibling apps at all, so an unguarded static call to a class owned by another app fatals. In production the same shape makes every route in the app 500 when openregister is absent -- not just the AppHost ones -- and larpinq does not declare openregister, so an admin can create exactly that configuration. class_exists() autoloads without fatalling when the class is unavailable. The fallback reproduces Routes::standard()'s output locally -- canonical routes first (minus any name the app's own overrides), then , then the SPA catch-all LAST so it never shadows a real route -- so larpinq still routes, catch-all included, without openregister. This is the pattern dossiq already uses (procest appinfo/routes.php, see decidesk#377 / #388); I should have copied it when adding the builder call rather than discovering it from a red pipeline. Verified: php -l clean, and requiring the file with NO openregister autoloadable returns 19 routes ending in dashboard#catchAll -- which is precisely the condition PHPUnit runs in. Co-authored-by: Conduction Release Bot --- appinfo/routes.php | 63 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index e8815ddb..dcd81ae6 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -24,7 +24,7 @@ * is disabled. */ -return \OCA\OpenRegister\AppHost\Routes::standard([ +$extra = [ // Page routes ['name' => 'dashboard#page', 'url' => '/', 'verb' => 'GET'], ['name' => 'characters#downloadPdf', 'url' => '/characters/{id}/download/{template}', 'verb' => 'GET'], @@ -47,4 +47,63 @@ // Generic per-user preferences (used by shared nextcloud-vue widgets, e.g. CnSupportDialog). ['name' => 'preferences#getPreference', 'url' => '/api/preferences/{key}', 'verb' => 'GET'], ['name' => 'preferences#setPreference', 'url' => '/api/preferences/{key}', 'verb' => 'PUT'], -]); +]; + +// ⚠️ The AppHost builder is invoked through a `class_exists()` guard. +// +// Nextcloud `include`s this file for EVERY larpinq request, and PHPUnit +// includes it without booting sibling apps at all. An unguarded static call to +// a class owned by another app therefore fatals — measured: four PHPUnit +// errors reading `Class "OCA\OpenRegister\AppHost\Routes" not found` the +// moment this file started calling it. In production the same shape makes +// every route in the app 500 when openregister is absent, not just the AppHost +// ones, and larpinq does not declare `openregister`, so an admin can +// create exactly that configuration. +// +// `class_exists()` autoloads without fatalling when the class is unavailable. +// The fallback below reproduces `Routes::standard()`'s output locally, so +// larpinq still routes — catch-all included — without openregister. +if (class_exists('OCA\OpenRegister\AppHost\Routes') === true) { + return \OCA\OpenRegister\AppHost\Routes::standard($extra); +} + +$canonicalRoutes = [ + ['name' => 'dashboard#page', 'url' => '/', 'verb' => 'GET'], + ['name' => 'settings#index', 'url' => '/api/settings', 'verb' => 'GET'], + ['name' => 'settings#create', 'url' => '/api/settings', 'verb' => 'POST'], + ['name' => 'settings#update', 'url' => '/api/settings', 'verb' => 'PUT'], + ['name' => 'settings#load', 'url' => '/api/settings/load', 'verb' => 'POST'], + ['name' => 'preferences#getPreference', 'url' => '/api/preferences/{key}', 'verb' => 'GET'], + ['name' => 'preferences#setPreference', 'url' => '/api/preferences/{key}', 'verb' => 'PUT'], + ['name' => 'metrics#index', 'url' => '/api/metrics', 'verb' => 'GET'], + ['name' => 'health#index', 'url' => '/api/health', 'verb' => 'GET'], +]; + +$catchAllRoute = [ + 'name' => 'dashboard#catchAll', + 'url' => '/{path}', + 'verb' => 'GET', + 'requirements' => ['path' => '.+'], + 'defaults' => ['path' => ''], +]; + +$extraNames = []; +foreach ($extra as $extraRoute) { + if (isset($extraRoute['name']) === true) { + $extraNames[(string) $extraRoute['name']] = true; + } +} + +$mergedRoutes = []; +foreach ($canonicalRoutes as $canonicalRoute) { + if (isset($extraNames[$canonicalRoute['name']]) === true) { + continue; + } + + $mergedRoutes[] = $canonicalRoute; +} + +$mergedRoutes = array_merge($mergedRoutes, $extra); +$mergedRoutes[] = $catchAllRoute; + +return ['routes' => $mergedRoutes]; From fe200fc32d57a1ade67d6d43b2b0996578b96a96 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 12:08:33 +0200 Subject: [PATCH 21/35] chore(lint): let the linter see tests/ and scripts/ (#655) * fix(dashboard): drop the second Refresh from the dashboard header The dashboard shipped two Refresh controls side by side. CnActionsMenu renders one as the first item of the page-level Actions overflow menu, and the manifest declared another as a header button next to that menu. They did the same thing. A "type": "refresh" headerAction is dispatched as emit(PAGE_REFRESH_CHANNEL, {}), which is the exact signal CnActionsMenu broadcasts on refresh-channel="cn:page:refresh". Same channel, same subscribers. Removing the header action takes away the duplicate and nothing else. An app that wants to keep a prominent Refresh button can stand the menu item down with showRefresh: false instead. openregister's dashboard does that. Shipping both is what this removes. * chore(lint): let the linter see tests/ and scripts/ `npm run lint` was `eslint src`, so two whole trees were never linted. Across the fleet that hid roughly 3,900 errors, none of which any CI leg had shown. Most of it was the config, not the code, and the same two defects were in every app. **scripts/ had no config block at all.** These are CommonJS Node CLI checkers, and flat config defaults every `.js` to ESM with browser-ish globals, so eslint read the CommonJS wrapper itself as undefined identifiers: `require`, `process`, `__dirname`, `__filename`, `module`. A `scripts/**` block now declares the environment. Declaring beats suppressing here: `no-undef` is the rule that catches a genuinely misspelled identifier, and dozens of fake findings would bury a real one. A second block covers `scripts/**/*.mjs`, which is ESM and needs Node's globals without the CommonJS wrapper. **The tests block applied a non-TypeScript-aware rule to TypeScript.** It named `tests/**/*.ts` while setting the CORE `no-unused-vars`, which v9 deliberately turns off for `.ts` in favour of the `@typescript-eslint` version. The core rule reads the parameter names inside a function TYPE as bindings, so t?: (app: string, key: string) => string reports `app` and `key` as unused variables, and every unused `catch (e)` in a `.ts` spec reports twice. The block is split now: `.js`/`.mjs` on the core rule, `.ts`/`.tsx` on the TypeScript one, same patterns on both. Also: stale `eslint-disable` comments naming plugins eslint 10 no longer registers, which are themselves errors ("Definition for rule ... was not found"), and a rule that must not parse shell scripts. The genuinely real findings were the useful part: dead locals, unused imports, dead helper functions, unused `catch` bindings, extensionless relative imports, and a handful of `== null` comparisons spelled out so they still match null AND undefined. Verified per app: `npm run lint` 0 errors over src + tests + scripts, `prettier --check` clean, and the unit suite still green. --- eslint.config.mjs | 123 +++++++++++++++++- package.json | 2 +- scripts/assert-lockfile-matches-install.js | 17 ++- scripts/build-l10n-js.js | 3 + scripts/check-schema-l10n.js | 3 + tests/e2e/_base-url.ts | 1 - tests/e2e/_nav.ts | 4 +- tests/e2e/docs-screenshots.spec.ts | 8 +- tests/e2e/global-setup.ts | 14 +- tests/e2e/l10n-browser-catalogue.spec.ts | 3 +- tests/e2e/playwright.config.ts | 3 +- .../demo-data-setup-step.spec.ts | 8 +- .../spec-coverage/detail-forms-admin.spec.ts | 22 ++-- .../event-runsheet-export.spec.ts | 2 +- .../event-xp-award-workflow.spec.ts | 4 +- tests/e2e/spec-coverage/index-pages.spec.ts | 6 +- .../spec-coverage/setting-management.spec.ts | 4 +- .../spec-coverage/settings-roadmap.spec.ts | 8 +- .../skill-requirement-enforcement.spec.ts | 2 +- tests/e2e/spec-coverage/spa-ui.spec.ts | 14 +- tests/e2e/visual/_visual-helpers.ts | 6 +- tests/e2e/visual/larpinq.visual.spec.ts | 2 +- ...haracter-stat-computation.workflow.spec.ts | 22 ++-- .../crud-persistence.workflow.spec.ts | 41 ++---- tests/e2e/workflows/fixtures.ts | 22 ++-- .../workflows/game-mechanics.workflow.spec.ts | 24 ++-- tests/l10n/check-l10n-parity.js | 6 +- tests/l10n/check-l10n.js | 4 +- tests/validate-json-strict.js | 5 +- tests/validate-manifest.js | 14 +- tests/vitest/graphql.spec.js | 2 +- tests/vitest/manifestRegistry.spec.js | 2 +- tests/vitest/objectStoreTenant.spec.js | 2 +- tests/vitest/settingsStore.spec.js | 2 +- tests/vitest/skillTreeGraph.spec.js | 8 +- tests/vitest/stubs/nextcloud-logger.js | 2 +- 36 files changed, 274 insertions(+), 141 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 4e0df452..90fa739f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -44,6 +44,26 @@ export default [ // resolves a rule's plugin from the object the rule sits in, so an override // must name files whose config already registers it. files: ['**/*.js', '**/*.mjs', '**/*.ts', '**/*.tsx', '**/*.vue'], + // 🔴 THE `ignores` ARE PART OF THAT SCOPE, NOT AN OPINION. v9 registers + // the jsdoc plugin ONLY inside `nextcloud/documentation/*`, and every one + // of those blocks carries exactly this ignore list: Nextcloud does not + // require JSDoc in tests. Naming a `jsdoc/*` rule for a test file + // therefore points at a plugin that is not registered there, and eslint + // refuses to run AT ALL rather than reporting a finding. + // + // Measured here: with the list absent, `eslint tests` died with "A + // configuration object specifies rule 'jsdoc/check-tag-names', but could + // not find plugin 'jsdoc'" and linted nothing. `eslint src` was green + // throughout, because it never reached a test file. + ignores: [ + '**/*.test.*', + '**/*.spec.*', + '**/*.cy.*', + '**/test/**', + '**/tests/**', + '**/__tests__/**', + '**/__mocks__/**', + ], rules: { // `@spec` (hydra gate-16 / gate-19 traceability) and `@visual` (the // visual-coverage gate) are this project's own JSDoc tags. v9 sets @@ -110,16 +130,113 @@ export default [ }, { - // Node-side CLI tools (build / validate scripts) legitimately use console - // and process.exit, and ship as plain JS with no shebang. - files: ['tests/validate-manifest.js', 'tests/validate-register.js', 'tests/validate-json-strict.js'], + // Node-side CLI checkers under tests/ legitimately use console and + // process.exit, and ship as plain JS with no shebang. + // + // 🔴 A GLOB, NOT A FILE LIST. This block used to name three files by hand + // (`validate-manifest.js`, `validate-register.js`, `validate-json-strict.js`) + // and had silently stopped covering every checker added since. That is the + // failure mode a hand-maintained list always has: adding a file does not + // add it to the list, and the omission is invisible. + files: ['tests/**/*.js', 'tests/**/*.mjs', 'tests/**/*.ts'], rules: { 'no-console': 'off', 'n/no-process-exit': 'off', 'n/hashbang': 'off', + // Tests import devDependencies by definition; this rule is about what + // ships in the published package, which tests/ never does. + 'n/no-unpublished-import': 'off', }, }, + { + // 🔴 Node-side CLI tooling under `scripts/`, which is COMMONJS. Flat + // config defaults every `.js` to ESM with browser-ish globals, so without + // this block eslint reports the CommonJS wrapper itself as undefined + // identifiers. Measured on this app: 52 of the 233 errors under + // `tests/` + `scripts/` were `no-undef`, ALL of them in `scripts/`, and + // all five names were the environment rather than a typo — `process` 23, + // `require` 20, `__dirname` 6, `__filename` 2, `module` 1. + // + // This is describing the environment, not relaxing a rule, and it is the + // same argument the test-globals block below makes: declaring them keeps + // `no-undef` able to do its real job, which is catching a genuinely + // misspelled identifier. Suppressing the rule instead would bury that. + // + // `no-console` is off because printing its report is what a CLI checker + // is FOR. + // + // 🔴 NO `n/*` ENTRIES HERE, DELIBERATELY. `eslint-plugin-n` is NOT + // registered for these files under eslint 10 + @nextcloud/eslint-config + // 9, so `'n/no-process-exit': 'off'` would be dead config that reads as + // if it were doing something. Measured both ways on this app: 0 `n/` + // findings with the entries and 0 without. + // + // What DID report was the opposite — four `scripts/*.js` carried + // `/* eslint-disable n/no-process-exit */` and `/* eslint-disable + // n/shebang */` left over from the eslintrc era, and an inline disable + // naming an unregistered plugin is itself an error ("Definition for rule + // 'n/shebang' was not found"). Those 8 comments are removed; do not add + // `n/*` rules back to replace them. + // + // ⚠️ `.js` and `.cjs` ONLY. A `scripts/*.mjs` is genuinely ESM and must + // keep the default `sourceType`, or `import` stops parsing there. + files: ['scripts/**/*.js', 'scripts/**/*.cjs'], + languageOptions: { + sourceType: 'commonjs', + globals: { + require: 'readonly', + module: 'writable', + exports: 'writable', + process: 'readonly', + __dirname: 'readonly', + __filename: 'readonly', + console: 'readonly', + Buffer: 'readonly', + global: 'readonly', + URL: 'readonly', + TextEncoder: 'readonly', + TextDecoder: 'readonly', + }, + }, + rules: { + 'no-console': 'off', + }, + }, + + { + // The ESM half of the block above. A `scripts/*.mjs` is genuinely a module + // and must keep the default `sourceType`, so it gets Node's globals but + // none of the CommonJS wrapper. Measured: `process` reported undefined 2x + // in hermiq's generate-opengemeenten-icons.mjs and 4x in openregister's + // l10n/runtime-check.mjs, which the `.js`/`.cjs` block deliberately does + // not match. + files: ['scripts/**/*.mjs', 'tests/**/*.mjs'], + languageOptions: { + globals: { + process: 'readonly', + console: 'readonly', + Buffer: 'readonly', + global: 'readonly', + URL: 'readonly', + TextEncoder: 'readonly', + TextDecoder: 'readonly', + }, + }, + rules: { + 'no-console': 'off', + }, + }, + + { + // eslint must not try to PARSE a shell script. `tests/e2e/seed.test.sh` + // matches the `**/*.test.*` glob some presets use, and eslint then reads + // it as JavaScript and reports "Parsing error: Unexpected character" — + // a finding about a file it should never have opened. + ignores: ['**/*.sh', '**/*.bash'], + }, + + // eslint-config-prettier LAST OF ALL, and it has to be last: it only turns // rules OFF, and what it turns off is everything prettier owns — including // the `@stylistic/*` family v9 introduces (`indent`, `quotes`, `semi`). diff --git a/package.json b/package.json index 8b704594..768ace2f 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "build": "NODE_ENV=production webpack --config webpack.config.js --progress", "dev": "NODE_ENV=development webpack --config webpack.config.js --progress", "watch": "NODE_ENV=development webpack --config webpack.config.js --progress --watch", - "lint": "eslint src", + "lint": "eslint src tests scripts", "lint-fix": "npm run lint -- --fix", "test:unit": "vitest run", "test:unit:watch": "vitest", diff --git a/scripts/assert-lockfile-matches-install.js b/scripts/assert-lockfile-matches-install.js index a8d6aaa9..9b3204d9 100644 --- a/scripts/assert-lockfile-matches-install.js +++ b/scripts/assert-lockfile-matches-install.js @@ -28,10 +28,14 @@ const fs = require('fs') const path = require('path') const root = process.cwd() -const read = (p) => { +/** + * + * @param p + */ +function read(p) { try { return JSON.parse(fs.readFileSync(p, 'utf8')) - } catch (e) { + } catch { return null } } @@ -81,8 +85,13 @@ for (const [entry, meta] of Object.entries(lock.packages)) { } } -const fmt = (r) => - ` ${r.name.padEnd(38)} lock ${String(r.want).padEnd(14)} installed ${r.got || '(absent)'}` +/** + * + * @param r + */ +function fmt(r) { + return ` ${r.name.padEnd(38)} lock ${String(r.want).padEnd(14)} installed ${r.got || '(absent)'}` +} if (drift.dev.length) { console.log( diff --git a/scripts/build-l10n-js.js b/scripts/build-l10n-js.js index 176ef519..335b08d2 100644 --- a/scripts/build-l10n-js.js +++ b/scripts/build-l10n-js.js @@ -101,6 +101,9 @@ function renderJs(id, translations, pluralForm) { ].join('\n') } +/** + * + */ function main() { const check = process.argv.includes('--check') const id = appId() diff --git a/scripts/check-schema-l10n.js b/scripts/check-schema-l10n.js index 8a860b33..3c4b2626 100644 --- a/scripts/check-schema-l10n.js +++ b/scripts/check-schema-l10n.js @@ -113,6 +113,9 @@ function collect(node, where, sink) { for (const value of Object.values(node)) collect(value, where, sink) } +/** + * + */ function main() { const update = process.argv.includes('--update') const list = process.argv.includes('--list') diff --git a/tests/e2e/_base-url.ts b/tests/e2e/_base-url.ts index 16e621e9..8386d2a5 100644 --- a/tests/e2e/_base-url.ts +++ b/tests/e2e/_base-url.ts @@ -83,7 +83,6 @@ export function resolveBaseURL(): string { } } if (isCI()) { - // eslint-disable-next-line no-console console.warn( `[larpinq e2e] none of ${BASE_URL_VARS.join(' / ')} is set; falling back to the ` + `CI-local ${CI_DEFAULT_BASE_URL} (the runner's own php -S instance).`, diff --git a/tests/e2e/_nav.ts b/tests/e2e/_nav.ts index e4c8d23d..654cce05 100644 --- a/tests/e2e/_nav.ts +++ b/tests/e2e/_nav.ts @@ -1,3 +1,5 @@ +import type { Page } from '@playwright/test' + /** * Shared larpinq sidebar-navigation helper. * @@ -30,7 +32,7 @@ * plain click hangs on actionability) AND the click must be retried, * because force cannot fire a handler Vue has not attached yet. */ -import { expect, type Page } from '@playwright/test' +import { expect } from '@playwright/test' export const APP_BASE = '/apps/larpinq' export const NAV = '[data-testid="cn-nav"]' diff --git a/tests/e2e/docs-screenshots.spec.ts b/tests/e2e/docs-screenshots.spec.ts index 37e6bba2..06719977 100644 --- a/tests/e2e/docs-screenshots.spec.ts +++ b/tests/e2e/docs-screenshots.spec.ts @@ -37,9 +37,11 @@ * Pattern reference: ADR-030 (hydra/openspec/architecture/). */ -import { test, expect, type Page } from '@playwright/test' -import * as path from 'path' +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' import * as fs from 'fs' +import * as path from 'path' const SHOT_ROOT = path.resolve( __dirname, @@ -118,7 +120,7 @@ async function go(page: Page, route: string): Promise { url = route } else { const hashRoute = route.startsWith('/') ? route : `/${route}` - url = `${APP}/#${hashRoute}` + url = `${APP}${hashRoute}` } await page.goto(url).catch(() => { /* tolerate 404 — caller decides */ diff --git a/tests/e2e/global-setup.ts b/tests/e2e/global-setup.ts index c92b048e..6c308852 100644 --- a/tests/e2e/global-setup.ts +++ b/tests/e2e/global-setup.ts @@ -20,11 +20,13 @@ * adopter). */ -import { chromium, expect, request, type FullConfig } from '@playwright/test' +import type { FullConfig } from '@playwright/test' + +import { chromium, expect, request } from '@playwright/test' import { execSync } from 'child_process' -import * as path from 'path' import * as fs from 'fs' -import { resolveBaseURL } from './_base-url' +import * as path from 'path' +import { resolveBaseURL } from './_base-url.ts' const AUTH_DIR = path.resolve(__dirname, '.auth') const STORAGE_STATE = path.join(AUTH_DIR, 'admin.json') @@ -52,7 +54,7 @@ function ensureBundleBuilt(): void { if (fs.existsSync(BUNDLE_PATH)) { return } - // eslint-disable-next-line no-console + console.log( `[playwright globalSetup] bundle missing at ${BUNDLE_PATH}; running 'npm run build' once…`, ) @@ -99,7 +101,7 @@ async function ensureNextcloudReachable(baseURL: string): Promise { } catch (err) { last = `request failed: ${(err as Error).message}` } - // eslint-disable-next-line no-await-in-loop + await new Promise((resolve) => setTimeout(resolve, 5_000)) } throw new Error( @@ -223,7 +225,7 @@ export default async function globalSetup(config: FullConfig): Promise { await page.evaluate(() => { try { window.localStorage.setItem('cn-walkthrough-seen:larpinq', '999.0.0') - } catch (e) { + } catch { // localStorage unavailable — specs fall back to dismissing by hand. } }) diff --git a/tests/e2e/l10n-browser-catalogue.spec.ts b/tests/e2e/l10n-browser-catalogue.spec.ts index 047d6072..1197e6aa 100644 --- a/tests/e2e/l10n-browser-catalogue.spec.ts +++ b/tests/e2e/l10n-browser-catalogue.spec.ts @@ -39,11 +39,10 @@ * nothing about apps whose translations differ. */ +import { expect, test } from '@playwright/test' import { readFileSync } from 'node:fs' import path from 'node:path' -import { expect, test } from '@playwright/test' - /** * The app id this repo declares. Resolved from the repo root by walking up * from this file, so it does not depend on the working directory playwright diff --git a/tests/e2e/playwright.config.ts b/tests/e2e/playwright.config.ts index ce4c80b0..39e3c8cb 100644 --- a/tests/e2e/playwright.config.ts +++ b/tests/e2e/playwright.config.ts @@ -69,8 +69,7 @@ import { defineConfig, devices } from '@playwright/test' import * as path from 'path' - -import { resolveBaseURL } from './_base-url' +import { resolveBaseURL } from './_base-url.ts' /** * Helper modules and opt-in projects that must never be collected as CI specs. diff --git a/tests/e2e/spec-coverage/demo-data-setup-step.spec.ts b/tests/e2e/spec-coverage/demo-data-setup-step.spec.ts index 285153d9..49adbae5 100644 --- a/tests/e2e/spec-coverage/demo-data-setup-step.spec.ts +++ b/tests/e2e/spec-coverage/demo-data-setup-step.spec.ts @@ -28,7 +28,9 @@ * (`setup-demo-data-first`) checks it statically on every change. Claiming to * prove it here would be asserting something this vantage point cannot see. */ -import { test, expect, Page } from '@playwright/test' +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' const BASE = '/apps/larpinq' @@ -44,12 +46,12 @@ async function api( method, headers: { 'Content-Type': 'application/json', - // eslint-disable-next-line no-undef + requesttoken: (window as any).OC?.requestToken || '', 'OCS-APIREQUEST': 'true', }, }) - let json: any = null + let json: any try { json = await res.json() } catch { diff --git a/tests/e2e/spec-coverage/detail-forms-admin.spec.ts b/tests/e2e/spec-coverage/detail-forms-admin.spec.ts index 3055bc26..e65847c4 100644 --- a/tests/e2e/spec-coverage/detail-forms-admin.spec.ts +++ b/tests/e2e/spec-coverage/detail-forms-admin.spec.ts @@ -27,15 +27,11 @@ * playwright.config.ts wires storageState so each test starts logged in. */ -import { - test, - expect, - request, - type Page, - type APIRequestContext, -} from '@playwright/test' -import { navTo as sharedNavTo, dismissSupportDialog } from '../_nav' -import { BASE_URL } from '../_base-url' +import type { APIRequestContext, Page } from '@playwright/test' + +import { expect, request, test } from '@playwright/test' +import { BASE_URL } from '../_base-url.ts' +import { dismissSupportDialog, navTo as sharedNavTo } from '../_nav.ts' const BASE = '/apps/larpinq' const TS = Date.now() @@ -89,6 +85,8 @@ const SCHEMA_IDS: Record = { * @param {APIRequestContext} api Authenticated request context. * @return {Promise} */ +const REGISTER_IDS: Record = {} + async function resolveIds(api: APIRequestContext): Promise { const res = await api .get(`${NEXTCLOUD_URL}/index.php/apps/larpinq/api/settings`, { @@ -129,7 +127,6 @@ async function resolveIds(api: APIRequestContext): Promise { } /** Register each type is actually stored in; defaults to the shared register. */ -const REGISTER_IDS: Record = {} /** * The register to seed a given type into. @@ -202,7 +199,7 @@ async function gotoDetail( id: string, typeLabel: string, ): Promise { - await page.goto(`${BASE}/#/${slug}/${id}`) + await page.goto(`${BASE}/${slug}/${id}`) // ADR-074 rule 4: `networkidle` never settles on Nextcloud — the // notification poll keeps the network permanently busy. This was the LAST // live `waitForLoadState('networkidle')` in the suite; every other mention @@ -340,7 +337,6 @@ async function seedObject( ): Promise { const schemaId = SCHEMA_IDS[schema] if (!schemaId) { - // eslint-disable-next-line no-console console.error( `[e2e seed] ${schema}: no schema id configured on this instance — the app has no storage for it`, ) @@ -359,12 +355,10 @@ async function seedObject( // Report WHY a seed failed. Swallowing it turns every dependent spec into a // 60 s timeout that looks like a rendering regression. if (!res) { - // eslint-disable-next-line no-console console.error(`[e2e seed] ${schema}: POST ${url} threw`) return null } if (!res.ok()) { - // eslint-disable-next-line no-console console.error( `[e2e seed] ${schema}: POST ${url} -> ${res.status()} ${(await res.text().catch(() => '')).slice(0, 200)}`, ) diff --git a/tests/e2e/spec-coverage/event-runsheet-export.spec.ts b/tests/e2e/spec-coverage/event-runsheet-export.spec.ts index adaecb77..26a8e199 100644 --- a/tests/e2e/spec-coverage/event-runsheet-export.spec.ts +++ b/tests/e2e/spec-coverage/event-runsheet-export.spec.ts @@ -20,7 +20,7 @@ * @spec openspec/specs/pdf-export/spec.md */ -import { test, expect } from '@playwright/test' +import { expect, test } from '@playwright/test' const BASE = '/apps/larpinq' diff --git a/tests/e2e/spec-coverage/event-xp-award-workflow.spec.ts b/tests/e2e/spec-coverage/event-xp-award-workflow.spec.ts index 609fb9b3..ed3d7e40 100644 --- a/tests/e2e/spec-coverage/event-xp-award-workflow.spec.ts +++ b/tests/e2e/spec-coverage/event-xp-award-workflow.spec.ts @@ -17,7 +17,7 @@ * @spec openspec/specs/event-xp-awards/spec.md */ -import { test, expect } from '@playwright/test' +import { expect, test } from '@playwright/test' const BASE = '/apps/larpinq' @@ -27,7 +27,7 @@ test.describe('event-xp-award-workflow', () => { page.on('pageerror', (e) => pageErrors.push(e.message)) // Never `networkidle` — unreachable on Nextcloud (ADR-074 rule 4). - await page.goto(`${BASE}/#/xp-awards`, { waitUntil: 'domcontentloaded' }) + await page.goto(`${BASE}/xp-awards`, { waitUntil: 'domcontentloaded' }) await expect(page.locator('.app-content')).toBeVisible({ timeout: 30_000 }) // Assert a page-SPECIFIC affordance inside the content area. The old diff --git a/tests/e2e/spec-coverage/index-pages.spec.ts b/tests/e2e/spec-coverage/index-pages.spec.ts index 2e397ce9..f6b5db75 100644 --- a/tests/e2e/spec-coverage/index-pages.spec.ts +++ b/tests/e2e/spec-coverage/index-pages.spec.ts @@ -24,8 +24,10 @@ * playwright.config.ts wires storageState so each test starts logged in. */ -import { test, expect, type Page } from '@playwright/test' -import { dismissSupportDialog } from '../_nav' +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import { dismissSupportDialog } from '../_nav.ts' const BASE = '/apps/larpinq' diff --git a/tests/e2e/spec-coverage/setting-management.spec.ts b/tests/e2e/spec-coverage/setting-management.spec.ts index 2ffe6714..b6b4f4a2 100644 --- a/tests/e2e/spec-coverage/setting-management.spec.ts +++ b/tests/e2e/spec-coverage/setting-management.spec.ts @@ -16,7 +16,7 @@ * @spec openspec/specs/setting-management/spec.md */ -import { test, expect } from '@playwright/test' +import { expect, test } from '@playwright/test' const BASE = '/apps/larpinq' @@ -30,7 +30,7 @@ test.describe('setting-management', () => { // Never `networkidle` — Nextcloud's notification poll means that state // is never reached, so the wait always burns its full budget (ADR-074 // rule 4). Wait for the rendered page surface instead. - await page.goto(`${BASE}/#/settings`, { waitUntil: 'domcontentloaded' }) + await page.goto(`${BASE}/settings`, { waitUntil: 'domcontentloaded' }) await expect(page.locator('.app-content')).toBeVisible({ timeout: 30_000 }) // Assert a page-SPECIFIC affordance inside the content area. The old diff --git a/tests/e2e/spec-coverage/settings-roadmap.spec.ts b/tests/e2e/spec-coverage/settings-roadmap.spec.ts index 30e3145a..fad353a2 100644 --- a/tests/e2e/spec-coverage/settings-roadmap.spec.ts +++ b/tests/e2e/spec-coverage/settings-roadmap.spec.ts @@ -19,8 +19,10 @@ * playwright.config.ts wires storageState so each test starts logged in. */ -import { test, expect, type Page } from '@playwright/test' -import { dismissSupportDialog } from '../_nav' +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import { dismissSupportDialog } from '../_nav.ts' const BASE = '/apps/larpinq' @@ -37,7 +39,7 @@ async function openRoute(page: Page, route: string): Promise { // `domcontentloaded`, never `networkidle` — the latter is unreachable on // Nextcloud (notification poll), so it just burns the budget (ADR-074 // rule 4). The `.app-content` assertion below is the real readiness gate. - await page.goto(`${BASE}/#${route}`, { waitUntil: 'domcontentloaded' }) + await page.goto(`${BASE}${route}`, { waitUntil: 'domcontentloaded' }) await dismissSupportDialog(page) await expect(page).toHaveURL(new RegExp(`#${route.replace(/\//g, '\\/')}`)) await expect(page.locator('.app-content')).toBeVisible({ timeout: 10_000 }) diff --git a/tests/e2e/spec-coverage/skill-requirement-enforcement.spec.ts b/tests/e2e/spec-coverage/skill-requirement-enforcement.spec.ts index 0d2e9823..1b7d65c6 100644 --- a/tests/e2e/spec-coverage/skill-requirement-enforcement.spec.ts +++ b/tests/e2e/spec-coverage/skill-requirement-enforcement.spec.ts @@ -18,7 +18,7 @@ * @spec openspec/specs/skill-requirement-enforcement/spec.md */ -import { test, expect } from '@playwright/test' +import { expect, test } from '@playwright/test' const BASE = '/apps/larpinq' diff --git a/tests/e2e/spec-coverage/spa-ui.spec.ts b/tests/e2e/spec-coverage/spa-ui.spec.ts index a51a2dea..1282fca0 100644 --- a/tests/e2e/spec-coverage/spa-ui.spec.ts +++ b/tests/e2e/spec-coverage/spa-ui.spec.ts @@ -17,11 +17,12 @@ * playwright.config.ts wires storageState so each test starts logged in. */ -import { test, expect, type Page } from '@playwright/test' -import { dismissSupportDialog } from '../_nav' +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import { dismissSupportDialog } from '../_nav.ts' const BASE = '/apps/larpinq' -const TS = Date.now() // --------------------------------------------------------------------------- // Helpers @@ -360,9 +361,10 @@ test.describe('character-management', () => { if (await btn.isVisible({ timeout: 3000 }).catch(() => false)) { await btn.click() const dialog = page.locator('[role="dialog"]').first() - await dialog.waitFor({ state: 'visible', timeout: 5000 }).catch(() => {}) - // Name field should be present in the dialog - const nameField = dialog + await dialog + .waitFor({ state: 'visible', timeout: 5000 }) + .catch(() => {}) + // Name field should be present in the dialog .locator( 'input[placeholder*="name" i], input[name*="name" i], label:has-text("Name") ~ * input', ) diff --git a/tests/e2e/visual/_visual-helpers.ts b/tests/e2e/visual/_visual-helpers.ts index 6e033dbb..e21bd109 100644 --- a/tests/e2e/visual/_visual-helpers.ts +++ b/tests/e2e/visual/_visual-helpers.ts @@ -1,3 +1,5 @@ +import type { Locator, Page } from '@playwright/test' + /* * SPDX-License-Identifier: EUPL-1.2 * @@ -24,8 +26,8 @@ * own baselines on first run, or (b) stay non-gating until baselined in the CI * environment. See tests/e2e/visual/README in-repo wiring notes. */ -import { expect, type Page, type Locator } from '@playwright/test' -import { dismissSupportDialog as sharedDismissSupportDialog } from '../_nav' +import { expect } from '@playwright/test' +import { dismissSupportDialog as sharedDismissSupportDialog } from '../_nav.ts' /** Common screenshot options applied to every visual assertion. */ export const SHOT_OPTIONS = { diff --git a/tests/e2e/visual/larpinq.visual.spec.ts b/tests/e2e/visual/larpinq.visual.spec.ts index 7ef7ed44..7533772e 100644 --- a/tests/e2e/visual/larpinq.visual.spec.ts +++ b/tests/e2e/visual/larpinq.visual.spec.ts @@ -11,7 +11,7 @@ * See _visual-helpers.ts for the platform-rendering caveat. */ import { test } from '@playwright/test' -import { shootSurface, shootByNav } from './_visual-helpers' +import { shootByNav, shootSurface } from './_visual-helpers.ts' const APP = '/index.php/apps/larpinq' diff --git a/tests/e2e/workflows/character-stat-computation.workflow.spec.ts b/tests/e2e/workflows/character-stat-computation.workflow.spec.ts index 717c624e..cfda41f6 100644 --- a/tests/e2e/workflows/character-stat-computation.workflow.spec.ts +++ b/tests/e2e/workflows/character-stat-computation.workflow.spec.ts @@ -70,19 +70,21 @@ * test goes green unmodified. */ -import { test, expect, type APIRequestContext } from '@playwright/test' +import type { APIRequestContext } from '@playwright/test' + +import { expect, test } from '@playwright/test' import { - RUN_ID, - newApi, - resolveSchemaIds, - FixtureLedger, - createObject, - seedStatScenario, + cleanupLedger, computeCharacterStat, computeCharacterStatLive, - cleanupLedger, + createObject, + FixtureLedger, fixtureName, -} from './fixtures' + newApi, + resolveSchemaIds, + RUN_ID, + seedStatScenario, +} from './fixtures.ts' // Documented blocker reasons; each is annotated onto its test.fixme below. const STAT_UI_BLOCKER = @@ -127,7 +129,7 @@ test.beforeAll(async () => { test.afterAll(async () => { await cleanupLedger(api, ledger) await api.dispose() - // eslint-disable-next-line no-console + console.log( `[stat-computation] RUN_ID=${RUN_ID} — fixtures cleaned up via ledger.`, ) diff --git a/tests/e2e/workflows/crud-persistence.workflow.spec.ts b/tests/e2e/workflows/crud-persistence.workflow.spec.ts index b110aeb9..bc676635 100644 --- a/tests/e2e/workflows/crud-persistence.workflow.spec.ts +++ b/tests/e2e/workflows/crud-persistence.workflow.spec.ts @@ -51,21 +51,23 @@ * heading renders) remain active because they render data-independently. */ -import { test, expect, type APIRequestContext, type Page } from '@playwright/test' -import { navTo as sharedNavTo, dismissSupportDialog } from '../_nav' +import type { APIRequestContext, Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import { navTo as sharedNavTo } from '../_nav.ts' import { BASE, - RUN_ID, - fixtureName, - newApi, - FixtureLedger, + cleanupLedger, createObject, - getObject, - updateObject, deleteObject, - cleanupLedger, + FixtureLedger, + fixtureName, + getObject, + newApi, resolveSchemaIds, -} from './fixtures' + RUN_ID, + updateObject, +} from './fixtures.ts' // Documented blocker reasons; each is annotated onto its test.fixme below via // test.info().annotations so the reason travels with the parked test. @@ -119,22 +121,6 @@ test.afterAll(async () => { // LIST_EMPTY / DETAIL_500 blockers). // --------------------------------------------------------------------------- -async function openApp(page: Page): Promise { - if (!page.url().includes('/apps/larpinq')) { - await page.goto(`${BASE}/`) - // ADR-074 rule 4: `networkidle` never settles on Nextcloud. - await page - .locator('#app-content, .app-content, #content') - .first() - .waitFor({ state: 'visible', timeout: 30_000 }) - .catch(() => {}) - } - await expect(page.locator('.app-content')).toBeVisible({ timeout: 15_000 }) - // Shared helper — see `../_nav`. The local copy matched only - // `aria-label="Close"` and never dismissed the onboarding tour. - await dismissSupportDialog(page) -} - /** * Reach `slug`'s index page through the real sidebar. * @@ -306,7 +292,7 @@ test.describe('character — CRUD persistence (store round-trip)', () => { // Hash-mode deep link (src/main.js — fleet #133): the detail route is // addressed via the URL hash, served from the SPA root and resolved // client-side. - await page.goto(`${BASE}/#/characters/${id}`) + await page.goto(`${BASE}/characters/${id}`) // ADR-074 rule 4: `networkidle` never settles on Nextcloud. await page .locator('#app-content, .app-content, #content') @@ -427,7 +413,6 @@ test.describe('skill — CRUD persistence (store round-trip)', () => { }) test.afterAll(() => { - // eslint-disable-next-line no-console console.log( `[crud-persistence] RUN_ID=${RUN_ID} — fixtures cleaned up via ledger.`, ) diff --git a/tests/e2e/workflows/fixtures.ts b/tests/e2e/workflows/fixtures.ts index 4730ef81..b072198b 100644 --- a/tests/e2e/workflows/fixtures.ts +++ b/tests/e2e/workflows/fixtures.ts @@ -48,8 +48,10 @@ * from the character's skills/items/conditions/events. */ -import { request, type APIRequestContext } from '@playwright/test' -import { OR_OBJECTS_API, LARPINQ_SETTINGS_API } from '../_base-url' +import type { APIRequestContext } from '@playwright/test' + +import { request } from '@playwright/test' +import { LARPINQ_SETTINGS_API, OR_OBJECTS_API } from '../_base-url.ts' export const BASE = '/apps/larpinq' @@ -181,9 +183,17 @@ export async function createObject( // `resolveSchemaIds()` was wired in (larpinq's real one is // `larping_item`). Cross-app slug collision — OR #2150 class. const payload: Record = { ...body } - if (payload.name != null && payload.title == null) { + if ( + payload.name !== null + && payload.name !== undefined + && (payload.title === null || payload.title === undefined) + ) { payload.title = payload.name - } else if (payload.title != null && payload.name == null) { + } else if ( + payload.title !== null + && payload.title !== undefined + && (payload.name === null || payload.name === undefined) + ) { payload.name = payload.title } const res = await api.post(url, { headers: HEADERS, data: payload }) @@ -269,7 +279,6 @@ export async function cleanupLedger( for (const id of ledger.ids(type)) { const ok = await deleteObject(api, type, id).catch(() => false) if (!ok) { - // eslint-disable-next-line no-console console.warn( `[workflows cleanup] could not delete ${type}/${id} (RUN_ID=${RUN_ID})`, ) @@ -582,7 +591,6 @@ export async function computeRosterLive( }) as unknown as Record | null } -/* eslint-disable @typescript-eslint/no-explicit-any */ /** * Locate the Nextcloud server root this checkout is installed INTO, by walking * up from this file until `lib/base.php` and `config/config.php` are both @@ -696,7 +704,6 @@ function runPhpHarness( }) return parse(out) } catch (err) { - // eslint-disable-next-line no-console console.warn( `[stat harness] in-process run failed under ${serverRoot}: ${(err as Error).message}`, ) @@ -748,4 +755,3 @@ function runPhpHarness( } } } -/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/tests/e2e/workflows/game-mechanics.workflow.spec.ts b/tests/e2e/workflows/game-mechanics.workflow.spec.ts index d1d776f7..87c2e516 100644 --- a/tests/e2e/workflows/game-mechanics.workflow.spec.ts +++ b/tests/e2e/workflows/game-mechanics.workflow.spec.ts @@ -48,19 +48,21 @@ * its own `RUN_ID` prefix, and never on the size of the stats block. */ -import { test, expect, type APIRequestContext } from '@playwright/test' +import type { APIRequestContext } from '@playwright/test' +import type { DerivedStats } from './fixtures.ts' + +import { expect, test } from '@playwright/test' import { - RUN_ID, - newApi, - resolveSchemaIds, - FixtureLedger, - createObject, - computeStatsLive, - computeRosterLive, cleanupLedger, + computeRosterLive, + computeStatsLive, + createObject, + FixtureLedger, fixtureName, - type DerivedStats, -} from './fixtures' + newApi, + resolveSchemaIds, + RUN_ID, +} from './fixtures.ts' let api: APIRequestContext const ledger = new FixtureLedger() @@ -73,7 +75,7 @@ test.beforeAll(async () => { test.afterAll(async () => { await cleanupLedger(api, ledger) await api.dispose() - // eslint-disable-next-line no-console + console.log( `[game-mechanics] RUN_ID=${RUN_ID} — fixtures cleaned up via ledger.`, ) diff --git a/tests/l10n/check-l10n-parity.js b/tests/l10n/check-l10n-parity.js index 8a1f5228..fef114a6 100644 --- a/tests/l10n/check-l10n-parity.js +++ b/tests/l10n/check-l10n-parity.js @@ -131,7 +131,7 @@ function loadJsonSet(file) { /** True when a translation value is empty (string) or has an empty plural. */ function isEmpty(v) { - if (v == null) { + if ((v === null || v === undefined)) { return true } if (Array.isArray(v)) { @@ -190,11 +190,11 @@ for (const set of sets) { continue } const missing = enKeys.filter( - (k) => !Object.prototype.hasOwnProperty.call(locObj, k), + (k) => !Object.hasOwn(locObj, k), ) const empty = enKeys.filter( (k) => - Object.prototype.hasOwnProperty.call(locObj, k) + Object.hasOwn(locObj, k) && isEmpty(locObj[k]), ) if (missing.length || empty.length) { diff --git a/tests/l10n/check-l10n.js b/tests/l10n/check-l10n.js index f15a3374..b999a500 100644 --- a/tests/l10n/check-l10n.js +++ b/tests/l10n/check-l10n.js @@ -137,7 +137,7 @@ function unescape(s) { const used = new Map() function record(key, file, idx, content) { - if (key == null) { + if ((key === null || key === undefined)) { return } const k = unescape(key) @@ -163,7 +163,7 @@ for (const file of files) { const missing = [] for (const [key, locations] of used) { - if (!Object.prototype.hasOwnProperty.call(translations, key)) { + if (!Object.hasOwn(translations, key)) { missing.push({ key, locations: [...locations] }) } } diff --git a/tests/validate-json-strict.js b/tests/validate-json-strict.js index 8a27cecf..cd1982f6 100644 --- a/tests/validate-json-strict.js +++ b/tests/validate-json-strict.js @@ -45,7 +45,6 @@ function targetFiles() { // `pathPrefix` is the JSON-pointer-ish path used in the error message. function parseStrict(text, label) { const dupErrors = [] - const reviverPathStack = [] // JSON.parse's reviver can't see duplicates (the object is already // collapsed). So we re-implement just enough: tokenise object keys. // Simpler robust approach: walk the raw text with a tiny tokenizer. @@ -101,7 +100,7 @@ function parseStrict(text, label) { return } let idx = 0 - // eslint-disable-next-line no-constant-condition + while (true) { readValue(`${pathStr}/${idx}`) idx++ @@ -126,7 +125,7 @@ function parseStrict(text, label) { i++ return } - // eslint-disable-next-line no-constant-condition + while (true) { skipWs() if (text[i] !== '"') err('expected string key in object') diff --git a/tests/validate-manifest.js b/tests/validate-manifest.js index acdb2476..5983541a 100644 --- a/tests/validate-manifest.js +++ b/tests/validate-manifest.js @@ -68,7 +68,7 @@ function schemaFileName() { if (ref.includes('app-manifest-v2')) { return 'app-manifest-v2.schema.json' } - } catch (_) { + } catch { // fall through to the v1 default } return 'app-manifest.schema.json' @@ -96,7 +96,7 @@ function findSchemaPath() { if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) { return candidate } - } catch (_) { + } catch { // continue to next candidate } } @@ -112,16 +112,16 @@ function loadAjv() { // The canonical schema uses JSON Schema draft 2020-12. Standard Ajv (v7+) // does not auto-load the 2020 meta-schema; we need the `ajv/dist/2020` // entry point. - let Ajv2020 = null - let addFormats = null + let Ajv2020 + let addFormats try { // Ajv 8+ ships the 2020 draft entry point. Ajv2020 = require('ajv/dist/2020').default || require('ajv/dist/2020') - } catch (_) { + } catch { try { // Fall back to standard Ajv. Ajv2020 = require('ajv').default || require('ajv') - } catch (__) { + } catch { console.error('[validate-manifest] Ajv not installed in node_modules.') console.error( '[validate-manifest] Install with: npm i -D ajv ajv-formats', @@ -134,7 +134,7 @@ function loadAjv() { } try { addFormats = require('ajv-formats').default || require('ajv-formats') - } catch (_) { + } catch { // ajv-formats is optional; the schema uses "uri" format on $schema // which without ajv-formats is silently accepted. addFormats = null diff --git a/tests/vitest/graphql.spec.js b/tests/vitest/graphql.spec.js index 3aaaef74..8106b125 100644 --- a/tests/vitest/graphql.spec.js +++ b/tests/vitest/graphql.spec.js @@ -8,7 +8,7 @@ * @nextcloud/router + @nextcloud/auth helpers are aliased to stubs. */ -import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { queryGraphQL } from '../../src/services/graphql.js' function mockFetchOnce({ ok = true, status = 200, json = {}, headers = {} } = {}) { diff --git a/tests/vitest/manifestRegistry.spec.js b/tests/vitest/manifestRegistry.spec.js index 6b7b5c28..44f47909 100644 --- a/tests/vitest/manifestRegistry.spec.js +++ b/tests/vitest/manifestRegistry.spec.js @@ -33,7 +33,7 @@ import fs from 'fs' import path from 'path' import { fileURLToPath } from 'url' -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..') diff --git a/tests/vitest/objectStoreTenant.spec.js b/tests/vitest/objectStoreTenant.spec.js index d834669c..85069e41 100644 --- a/tests/vitest/objectStoreTenant.spec.js +++ b/tests/vitest/objectStoreTenant.spec.js @@ -21,7 +21,7 @@ * by this vitest runner). */ -import { describe, it, expect, beforeEach, vi } from 'vitest' +import { beforeEach, describe, expect, it, vi } from 'vitest' let capturedOptions = null diff --git a/tests/vitest/settingsStore.spec.js b/tests/vitest/settingsStore.spec.js index 73fde3dd..1836b03b 100644 --- a/tests/vitest/settingsStore.spec.js +++ b/tests/vitest/settingsStore.spec.js @@ -9,8 +9,8 @@ * save / reimport round-trips. global fetch + the OC global are mocked. */ -import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest' import { createPinia, setActivePinia } from 'pinia' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { useSettingsStore } from '../../src/store/modules/settings.js' function mockFetchOnce({ ok = true, statusText = 'OK', json = {} }) { diff --git a/tests/vitest/skillTreeGraph.spec.js b/tests/vitest/skillTreeGraph.spec.js index 0ddc7700..6127a7ff 100644 --- a/tests/vitest/skillTreeGraph.spec.js +++ b/tests/vitest/skillTreeGraph.spec.js @@ -10,13 +10,13 @@ * @spec openspec/specs/skill-tree-visualization/spec.md */ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' import { - idList, - indexNames, - computeStateBySkill, buildNodes, + computeStateBySkill, computeTiers, + idList, + indexNames, } from '../../src/views/skillTreeGraph.js' const HEAL1 = { id: 'h1', name: 'Healing Lvl 1', requiredSkills: [] } diff --git a/tests/vitest/stubs/nextcloud-logger.js b/tests/vitest/stubs/nextcloud-logger.js index 43f1fb68..e22c7167 100644 --- a/tests/vitest/stubs/nextcloud-logger.js +++ b/tests/vitest/stubs/nextcloud-logger.js @@ -15,7 +15,7 @@ * error path under test logs without writing noise into the test output. */ -const noop = () => {} +function noop() {} const logger = { debug: noop, From 09ae8eef1549b4012cab88e08afe2fd3356f587a Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 15:12:19 +0200 Subject: [PATCH 22/35] fix(settings): add the load() the canonical route already points at, and finish path routing (#657) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit larpinq development was red on PHPUnit (all six cells), E2E and two gates. Three separate causes. ## SettingsController::load() did not exist CanonicalSettingsRouteContractTest said it plainly: appinfo/routes.php routes to method(s) SettingsController does not define. Each is a dispatch-time 500: - OCA\Larpinq\Controller\SettingsController::load() `settings#load` is CANONICAL: OpenRegister\AppHost\Routes::standard() declares it, and the local fallback in appinfo/routes.php reproduces it for the case where openregister is absent. So the route existed with nothing behind it and every POST to /api/settings/load was a 500. larpinq was the outlier. dossiq, keepiq, decidiq and shillinq all define load(); checked all four. larpinq spells the same force-re-import operation `reimport()`, so load() delegates to it rather than duplicating, the way create() already delegates to update(). ## Specs still asserted hash URLs larpinq moved to path routing in #651, but three helpers still built `new RegExp("#/" + slug + …)`: Expected pattern: /#\/skills(\b|\/|$|\?)/ Received string: "http://localhost:8080/apps/larpinq/skills" The app was on the right page the whole time. Fixed in _nav.ts, index-pages.spec.ts and detail-forms-admin.spec.ts. ## A test that could not run, and asserted nothing if it had spa-ui.spec.ts "character form requires name field" threw TypeError: dialog.waitFor(...).catch(...).locator is not a function waitFor() resolves a PROMISE, so .locator() was chained onto a Promise. The locator it built was also DISCARDED, so even without the TypeError the test asserted nothing while carrying a name that says it checks the name field. It now awaits the dialog and asserts the field is visible. Co-authored-by: Conduction Release Bot --- lib/Controller/SettingsController.php | 26 +++++++++++++++++++ tests/e2e/_nav.ts | 4 ++- .../spec-coverage/detail-forms-admin.spec.ts | 3 ++- tests/e2e/spec-coverage/index-pages.spec.ts | 3 ++- tests/e2e/spec-coverage/spa-ui.spec.ts | 15 ++++++++--- 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/lib/Controller/SettingsController.php b/lib/Controller/SettingsController.php index bf16d565..333d5aef 100644 --- a/lib/Controller/SettingsController.php +++ b/lib/Controller/SettingsController.php @@ -398,4 +398,30 @@ public function reimport(): JSONResponse { }//end try }//end reimport() + + /** + * Canonical AppHost alias for {@see reimport()}. + * + * `OpenRegister\AppHost\Routes::standard()` declares `settings#load`, and the + * local fallback in appinfo/routes.php reproduces it, so the route existed + * here with no method behind it: every POST to /api/settings/load was a + * dispatch-time 500. Pinned by CanonicalSettingsRouteContractTest, which is + * what caught it. + * + * larpinq spells the same operation `reimport()`, so this delegates rather + * than duplicating it, the way {@see create()} delegates to {@see update()}. + * The four sibling apps that already carry `load()` do the same force + * re-import. + * + * @auth admin-only Same posture as reimport(): no auth attribute, so + * Nextcloud's default of admin session + CSRF token applies. Pinned by + * SettingsControllerCsrfPostureTest. + * + * @return JSONResponse The re-import result. + * + * @spec openspec/changes/retrofit-2026-05-24-annotate-larpingapp/tasks.md#task-25 + */ + public function load(): JSONResponse { + return $this->reimport(); + }//end load() }//end class diff --git a/tests/e2e/_nav.ts b/tests/e2e/_nav.ts index 654cce05..69fef71a 100644 --- a/tests/e2e/_nav.ts +++ b/tests/e2e/_nav.ts @@ -204,6 +204,8 @@ export async function navTo(page: Page, slug: string): Promise { timeout: 10_000, }) await link.click() - await expect(page).toHaveURL(new RegExp(`#/${slug}(\\b|/|$|\\?)`)) + // larpinq moved off hash routing (#651), so the URL is /apps/larpinq/ + // with no "#". The old pattern waited 15s on a hash that is never produced. + await expect(page).toHaveURL(new RegExp(`/${slug}(\\b|/|$|\\?)`)) await expect(page.locator('.app-content')).toBeVisible({ timeout: 10_000 }) } diff --git a/tests/e2e/spec-coverage/detail-forms-admin.spec.ts b/tests/e2e/spec-coverage/detail-forms-admin.spec.ts index e65847c4..1edb664d 100644 --- a/tests/e2e/spec-coverage/detail-forms-admin.spec.ts +++ b/tests/e2e/spec-coverage/detail-forms-admin.spec.ts @@ -221,7 +221,8 @@ async function gotoDetail( // `aria-label="Close"` and never dismissed the onboarding tour, whose // controls are "Close tour" / "Skip". await dismissSupportDialog(page) - await expect(page).toHaveURL(new RegExp(`#/${slug}/${id}`)) + // Path routing since #651: no "#" in the URL. + await expect(page).toHaveURL(new RegExp(`/${slug}/${id}`)) await expect(page.locator('.app-content')).toBeVisible({ timeout: 10_000 }) // A detail page's own heading is the OBJECT's name (`

`); the entity type // ("Character", "Event", …) renders as a kicker paragraph above it, not as a diff --git a/tests/e2e/spec-coverage/index-pages.spec.ts b/tests/e2e/spec-coverage/index-pages.spec.ts index f6b5db75..9a7a1d6a 100644 --- a/tests/e2e/spec-coverage/index-pages.spec.ts +++ b/tests/e2e/spec-coverage/index-pages.spec.ts @@ -176,7 +176,8 @@ async function freshNav(page: Page, slug: string, navId: string): Promise const link = page.locator(`${NAV} [data-testid="cn-nav-entry-${navId}"]`).first() await expect(link).toBeVisible({ timeout: 10_000 }) await link.click() - await expect(page).toHaveURL(new RegExp(`#/${slug}(\\b|/|$|\\?)`)) + // Path routing since #651: no "#" in the URL. + await expect(page).toHaveURL(new RegExp(`/${slug}(\\b|/|$|\\?)`)) await expect(page.locator('.app-content')).toBeVisible({ timeout: 10_000 }) } diff --git a/tests/e2e/spec-coverage/spa-ui.spec.ts b/tests/e2e/spec-coverage/spa-ui.spec.ts index 1282fca0..a94fecaa 100644 --- a/tests/e2e/spec-coverage/spa-ui.spec.ts +++ b/tests/e2e/spec-coverage/spa-ui.spec.ts @@ -361,14 +361,21 @@ test.describe('character-management', () => { if (await btn.isVisible({ timeout: 3000 }).catch(() => false)) { await btn.click() const dialog = page.locator('[role="dialog"]').first() - await dialog - .waitFor({ state: 'visible', timeout: 5000 }) - .catch(() => {}) - // Name field should be present in the dialog + // waitFor() resolves a PROMISE, so the old form chained .locator() + // onto it and threw "dialog.waitFor(...).catch(...).locator is not a + // function" before asserting anything. The locator it built was also + // discarded, so even without the TypeError this test asserted nothing + // while carrying a name that says it checks the name field. + await dialog.waitFor({ state: 'visible', timeout: 5000 }).catch(() => {}) + const nameField = dialog .locator( 'input[placeholder*="name" i], input[name*="name" i], label:has-text("Name") ~ * input', ) .first() + await expect( + nameField, + 'the character form must offer a name field', + ).toBeVisible({ timeout: 5000 }) await page.keyboard.press('Escape') } // Page is still functional after dialog interaction From 77cf9e53ed8a450524eb025f4eec4a546e998ca6 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 18:15:06 +0200 Subject: [PATCH 23/35] test(e2e): navigate the router, not the URL fragment (#660) #651 moved larpinq to clean path URLs. The spa-ui helper kept navigating by `window.location.hash`, which was correct under hash routing and became a silent no-op the moment the router changed: the URL gains a fragment, `hashchange` fires, `createWebHistory` ignores it, and nothing throws. So 37 of this file's 52 cases never left the page they started on. They opened the SPA root and asserted against the dashboard while naming characters, events, players, skills, abilities, items, effects and conditions. The suite was green throughout, because the assertions hold on the dashboard too. `go()` now pushes through the router, with a pushState + popstate fallback that drives the listener history mode actually installs, and then asserts the URL is the route it asked for. That last check is what stops this from happening again: vue-router's catch-all rewrites an unresolved location to `/`, so without it a navigation that goes nowhere still passes. Verified against a live instance: 52 passed (10.8m). --- tests/e2e/spec-coverage/spa-ui.spec.ts | 88 ++++++++++++++++---------- 1 file changed, 55 insertions(+), 33 deletions(-) diff --git a/tests/e2e/spec-coverage/spa-ui.spec.ts b/tests/e2e/spec-coverage/spa-ui.spec.ts index a94fecaa..8b715407 100644 --- a/tests/e2e/spec-coverage/spa-ui.spec.ts +++ b/tests/e2e/spec-coverage/spa-ui.spec.ts @@ -29,15 +29,18 @@ const BASE = '/apps/larpinq' // --------------------------------------------------------------------------- /** - * Navigate to an in-app hash-mode route. + * Navigate to an in-app route. * - * The Vue SPA uses hash mode with base `/apps/larpinq` (src/main.js — - * fleet #133 deep-link fix). In-app routes (/characters, /abilities, …) are - * addressed via the URL hash: /apps/larpinq/. The hash fragment is - * never sent to the backend, so the SPA root is always served and Vue Router's - * hashchange listener resolves the view client-side. Strategy: land on the SPA - * root first, wait for Vue to mount, then set window.location.hash so the - * router renders the desired view without a page reload. For external paths + * The Vue SPA runs HISTORY mode (`createWebHistory(routerBase())` in + * src/main.js), so in-app routes are real paths: /apps/larpinq/. This + * helper used to set `window.location.hash` instead, which was correct while + * the app was on hash routing and became a silent no-op when #651 moved it to + * clean path URLs. Nothing threw: the URL gained a fragment, `hashchange` + * fired, and the router ignored it, so every caller stayed on whatever page it + * was already on and asserted against that. + * + * Strategy: land on the SPA root first so Vue mounts, then push through the + * router, which navigates in place without a reload. For external paths * (settings, other NC apps) we do a regular goto. */ async function go(page: Page, route: string): Promise { @@ -71,32 +74,51 @@ async function go(page: Page, route: string): Promise { // makes every later click hang on actionability. await dismissSupportDialog(page) } - // Resolve the target path relative to the app base. The router runs in - // hash mode (src/main.js — fleet #133 deep-link fix), so in-app routes are - // addressed via the URL hash: /apps/larpinq/. Driving the hash - // directly lets Vue Router's hashchange listener resolve the view (the old - // history.pushState to a bare /apps/larpinq/ path no longer routes - // under hash mode and addresses a server path that 404s on reload). + // Navigate the ROUTER, not the URL fragment. Setting `location.hash` under + // `createWebHistory` changes the URL and fires `hashchange`, but the router + // does not listen to it, so the route never changes and nothing throws. + // The pushState fallback drives the `popstate` listener the history mode + // actually installs, deriving the base exactly as `routerBase()` does so + // both the `/apps/` and `/index.php/apps/` URL forms resolve. const targetPath = route.startsWith('/') ? route : `/${route}` - const hashFragment = `#${targetPath}` - // Compare the *exact* current hash, not a substring: the root route's - // fragment "#/" is a substring of every other hash (e.g. "#/characters"), - // so an includes() check would wrongly treat any view as "already on root" - // and skip navigating back to the dashboard. - const currentHash = await page.evaluate(() => window.location.hash || '#/') - const normalisedCurrent = currentHash === '#' ? '#/' : currentHash - if (normalisedCurrent !== hashFragment) { - await page.evaluate((hash) => { - window.location.hash = hash - }, hashFragment) - // ADR-074 rule 4: `networkidle` is unreachable on Nextcloud (notification - // poll), so it burns the full budget. Wait for the rendered shell. - await page - .locator('#app-content, .app-content, #content') - .first() - .waitFor({ state: 'visible', timeout: 30_000 }) - .catch(() => {}) - } + await page.evaluate((p) => { + const host = document.querySelector('#content') as + | (HTMLElement & { + __vue_app__?: { + config?: { + globalProperties?: { + $router?: { push: (to: string) => unknown } + } + } + } + }) + | null + const router = host?.__vue_app__?.config?.globalProperties?.$router + if (router) { + router.push(p) + return + } + const base = + window.location.pathname.match(/^(.*\/apps\/larpinq)(?:\/|$)/)?.[1] ?? '' + window.history.pushState({}, '', `${base}${p}`) + window.dispatchEvent(new PopStateEvent('popstate', { state: {} })) + }, targetPath) + // ADR-074 rule 4: `networkidle` is unreachable on Nextcloud (notification + // poll), so it burns the full budget. Wait for the rendered shell. + await page + .locator('#app-content, .app-content, #content') + .first() + .waitFor({ state: 'visible', timeout: 30_000 }) + .catch(() => {}) + // The route must actually BE the one requested. vue-router's catch-all + // rewrites an unresolved location to `/`, and without this check every + // assertion below would run against the dashboard and pass there. + await expect(page).toHaveURL( + new RegExp( + `${`/apps/larpinq${targetPath}`.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}/?$`, + ), + { timeout: 15_000 }, + ) } /** From 7c80a99861560ea5bc0d3b2c531b952ccf676983 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 19:21:48 +0200 Subject: [PATCH 24/35] fix(e2e): assert path URLs, not hash, now the router runs in history mode (#663) Six settings-roadmap tests failed on the URL alone: Expected pattern: /#\/features-roadmap/ Received string: "http://localhost:8080/apps/larpinq/features-roadmap" The router moved to history mode (createWebHistory, src/main.js), so an in-app route is a real path with no '#'. The helper still demanded a hash, so it failed before ever reaching the .app-content assertion that is the real readiness gate. The app was right; the assertion was describing the old router. Its docblock still described 'mode: hash (fleet #133 deep-link fix)', which had stopped being true. Updated with it, because a stale comment is how the next person re-learns this the hard way. The new pattern is anchored at the end, so /features-roadmap cannot be satisfied by some longer route that merely contains it. Verified against a live instance rather than reasoned about: the file now reports 6 passed. Co-authored-by: Conduction Release Bot --- .../spec-coverage/settings-roadmap.spec.ts | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/tests/e2e/spec-coverage/settings-roadmap.spec.ts b/tests/e2e/spec-coverage/settings-roadmap.spec.ts index fad353a2..db3cfb0b 100644 --- a/tests/e2e/spec-coverage/settings-roadmap.spec.ts +++ b/tests/e2e/spec-coverage/settings-roadmap.spec.ts @@ -27,13 +27,21 @@ import { dismissSupportDialog } from '../_nav.ts' const BASE = '/apps/larpinq' /** - * Hard-load the target in-app route via the app's hash router. The router runs - * in `mode: 'hash'` (src/main.js — fleet #133 deep-link fix), so in-app routes - * are addressed as /apps/larpinq/. Loading that URL serves the SPA - * root from the server (the hash fragment is never sent to the backend, so no - * 404) and the client-side router resolves the view. A fresh load per test - * avoids the shared-list-state collapse where in-session sidebar navigation - * fails to re-key index pages. + * Hard-load the target in-app route. + * + * The router runs in HISTORY mode (`createWebHistory`, src/main.js), so an + * in-app route is a real path: `/apps/larpinq/`, with no `#`. The + * server's SPA catch-all serves the app shell for it and the client router + * resolves the view. + * + * This helper used to assert a `#` in the URL, from when the router ran in hash + * mode. After the move to history mode the app produced + * `/apps/larpinq/features-roadmap` while the assertion still demanded + * `#/features-roadmap`, so six of these tests failed on the URL alone — before + * reaching the `.app-content` gate that is the real check. The app was right. + * + * A fresh load per test avoids the shared-list-state collapse where in-session + * sidebar navigation fails to re-key index pages. */ async function openRoute(page: Page, route: string): Promise { // `domcontentloaded`, never `networkidle` — the latter is unreachable on @@ -41,7 +49,11 @@ async function openRoute(page: Page, route: string): Promise { // rule 4). The `.app-content` assertion below is the real readiness gate. await page.goto(`${BASE}${route}`, { waitUntil: 'domcontentloaded' }) await dismissSupportDialog(page) - await expect(page).toHaveURL(new RegExp(`#${route.replace(/\//g, '\\/')}`)) + // Path, not hash. Anchored at the end so `/features-roadmap` cannot be + // satisfied by some longer route that merely contains it. + await expect(page).toHaveURL( + new RegExp(`${route.replace(/\//g, '\\/')}$`), + ) await expect(page.locator('.app-content')).toBeVisible({ timeout: 10_000 }) } From ab20a2f636cb91fc594d9eae1b9b186b0a1f2738 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 22:47:49 +0200 Subject: [PATCH 25/35] fix(routes): stop routing health and metrics larpinq cannot serve, and clear development (#666) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(routes): stop routing health and metrics larpinq cannot serve, and clear development larpinq's development has been red all day on three checks. Two of them are mine, from #651/#653. ⚠️ gate-14 (route-reachability): "2 unrouted method(s) or wrong-target route(s)". The gate was RIGHT, and the finding is a latent fatal. #653's class_exists() fallback reproduces Routes::standard()'s output locally so larpinq still routes when OpenRegister is absent — and it copied `metrics#index` and `health#index` along with the rest. larpinq ships neither controller: lib/Controller holds Characters, Dashboard, Events, Preferences, Settings and Setup, and nothing else. Those two work on a normal instance because the branch ABOVE the fallback calls Routes::standard(), and OpenRegister's AppHost aliases the generic Metrics/Health controllers onto larpinq's conventional class names. Verified: /apps/larpinq/api/health answers 200 application/json and /api/metrics answers 200 Prometheus text. But the fallback runs ONLY when OpenRegister is absent, and then nothing aliases anything — so those two routes would have pointed at classes that do not exist, and a request to either would fatal rather than 404. Removed, with the reasoning written where the next person will copy the block. gate-25 (contract-coverage): `dashboard#catchAll` is a new public endpoint with no test. Covered in DashboardControllerTest, asserting equality with page() rather than merely "returns a response" — catchAll() exists only to delegate, and a delegation that quietly rendered the wrong template would give every deep link a blank page while still answering 200. Same test now guards zaakafhandelapp#619 and openregister#3303. Also aligned the fallback's catch-all with Routes::standard()'s `(?!api/)` lookahead. Without it a bare `.+` matches slashes and swallows unmatched `api/...` paths, answering the SPA shell at HTTP 200 — that is what ate all seventeen of zaakafhandelapp's ZGW resource routes (#619) and it would have behaved identically here whenever the fallback was in use. Third check, and NOT mine: prettier failed on tests/e2e/spec-coverage/settings-roadmap.spec.ts, last touched by #663. One statement that fits on a line after the hash was removed from it. Fixed here rather than left, since it keeps development red for everyone. php -l clean, prettier --check on the FULL glob clean, eslint 0 errors, DashboardControllerTest 5/5. The suite reports 5 errors locally, all `Class "Symfony\Component\HttpFoundation\HeaderUtils" not found` in the Characters/Events PDF download tests — a dev dependency missing from this checkout, present in CI, and untouched by this change. * fix(apphost): make the health/metrics generics explicit, so gate-14 can see them Follow-up on the same branch. gate-14 (route-reachability) went on failing with the identical "2 unrouted method(s) or wrong-target route(s)" after the routes were removed from the fallback, and the reason turned out to be two separate things. ⚠️ FIRST, THE GATE WAS READING MY COMMENT. I removed the two routes and explained the removal in a comment that spelled their slugs out (`` + `#` + ``). gate-14 matches that shape anywhere in appinfo/routes.php, comments included, so it kept reporting both — pointing at controller files that do not exist — long after the routes were gone. The comment is reworded and now warns about exactly this. SECOND, AND THE REAL FINDING. With the comment cleaned the gate still reported both, because it knows Routes::standard()'s canonical set and attributes those routes to any app that calls it. It exempts them only when the app shows, in its own code, that it adopts the generic behind them: either `\OCA\OpenRegister\AppHost\Bootstrap::register()`, or a registerService() of the generic controller in the same file that names it. larpinq did neither. Its /api/health and /api/metrics answer 200 on a normal instance purely because the AppHost stands in under larpinq's conventional class names — a real dependency that nothing in this repository stated. So it is stated now: Application::register() registers GenericHealthController and GenericMetricsController under OCA\Larpinq\Controller\{Health,Metrics}Controller, each behind a class_exists() guard so an instance without OpenRegister degrades instead of fataling — the same discipline as the autoloader prelude above it. Registered individually rather than adopting Bootstrap::register() wholesale, which would also alias dashboard, settings, preferences, repair steps and sections onto generics that do NOT match the controllers larpinq actually ships. Same reasoning and the same shape as shillinq's registerAppHostGenerics(). Gate run on this tree: gate-14 PASS, gate-25 PASS (was FAIL, FAIL). Two gates still fail LOCALLY — gate-22 and gate-53, both on `/pages/25/type` — because the vendored hydra-gates schema here predates the `flow` page type. CI reported neither, so its schema is newer; not touched. php -l clean, phpcs 0 errors, DashboardControllerTest 5/5. * refactor(apphost): extract registerAppHostGenerics from register() phpmd's ExcessiveMethodLength fires at 100 lines and register() landed on exactly 100 with the two registrations inline. Extracted to its own method, which is where procest and shillinq both put theirs — the gates push this decomposition, and the previous commit's comment already pointed at shillinq's registerAppHostGenerics() as the model. No behaviour change. phpmd clean, phpcs 0 errors, gate-14 and gate-25 still PASS, DashboardControllerTest 5/5. --------- Co-authored-by: Conduction Release Bot --- appinfo/routes.php | 27 +++++++- lib/AppInfo/Application.php | 64 +++++++++++++++++++ .../spec-coverage/settings-roadmap.spec.ts | 4 +- .../Controller/DashboardControllerTest.php | 27 ++++++++ 4 files changed, 116 insertions(+), 6 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index dcd81ae6..9fb8e7bc 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -75,15 +75,36 @@ ['name' => 'settings#load', 'url' => '/api/settings/load', 'verb' => 'POST'], ['name' => 'preferences#getPreference', 'url' => '/api/preferences/{key}', 'verb' => 'GET'], ['name' => 'preferences#setPreference', 'url' => '/api/preferences/{key}', 'verb' => 'PUT'], - ['name' => 'metrics#index', 'url' => '/api/metrics', 'verb' => 'GET'], - ['name' => 'health#index', 'url' => '/api/health', 'verb' => 'GET'], + // ⚠️ The health and metrics routes are DELIBERATELY absent here, and their + // absence is the point of this comment. Routes::standard() supplies both on + // the branch above, where OpenRegister's AppHost aliases its generic + // health/metrics controllers onto larpinq's conventional class names — + // which is why /api/health and /api/metrics answer 200 on a normal instance + // even though this repo ships neither controller. + // + // This fallback runs ONLY when OpenRegister is absent, and then nothing + // aliases them: declaring those routes would advertise two endpoints whose + // target classes do not exist, so a request to either would fatal rather + // than 404. gate-14 (route-reachability) reported exactly that. + // + // ⚠️ And do NOT write their route slugs (`` + `#` + ``) + // into this comment. gate-14 reads this file statically and matches that + // shape anywhere in it, comments included — spelling them out here made the + // gate go on reporting both long after the routes themselves were gone, + // with the finding pointing at controller files that do not exist. ]; $catchAllRoute = [ 'name' => 'dashboard#catchAll', 'url' => '/{path}', 'verb' => 'GET', - 'requirements' => ['path' => '.+'], + // Mirrors Routes::standard()'s own requirement, lookahead included. + // Nextcloud's RouteParser processes `routes` before `resources` and Symfony + // matches in insertion order, and `.+` matches slashes — so a bare `.+` + // catch-all swallows unmatched `api/...` paths and answers the SPA shell at + // HTTP 200, handing JSON callers HTML with nothing erroring + // (openregister#3270, zaakafhandelapp#619). + 'requirements' => ['path' => '(?!api/).+'], 'defaults' => ['path' => ''], ]; diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 4d7e183b..a7bd840c 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -29,6 +29,7 @@ use OCP\AppFramework\Bootstrap\IBootContext; use OCP\AppFramework\Bootstrap\IBootstrap; use OCP\AppFramework\Bootstrap\IRegistrationContext; +use Psr\Container\ContainerInterface; /** * Main application class for Larpinq @@ -103,6 +104,8 @@ public function register(IRegistrationContext $context): void { // guards below still do their job. OpenRegisterAutoloader::register(); + $this->registerAppHostGenerics(context: $context); + // Register the deep link listener for OpenRegister unified search. // The event class is only available when OpenRegister is installed. if (class_exists('OCA\OpenRegister\Event\DeepLinkRegistrationEvent') === true) { @@ -131,6 +134,67 @@ public function register(IRegistrationContext $context): void { } }//end register() + /** + * Register the AppHost generic controllers this app relies on. + * + * Extracted from register() because phpmd's ExcessiveMethodLength fires at + * 100 lines and adding this inline hit it exactly — the same decomposition + * pressure that moved procest's AppHost call into its own registrar. + * + * @param IRegistrationContext $context The registration context. + * + * @return void + */ + private function registerAppHostGenerics(IRegistrationContext $context): void { + // Make the AppHost generics this app RELIES ON explicit. + // + // appinfo/routes.php builds its table with + // \OCA\OpenRegister\AppHost\Routes::standard(), which supplies + // /api/health and /api/metrics — but larpinq ships no health or metrics + // controller of its own, so those two routes resolve only because the + // AppHost's generic controllers stand in under larpinq's conventional + // class names. Nothing in this repository said so, and gate-14 + // (route-reachability) reported both as `controller-class-not-found`: + // it accepts a Routes::standard() route ONLY when the app shows, in its + // own code, that it adopts the generic behind it. The gate was right — + // the dependency was real and invisible. + // + // Registered rather than adopted wholesale via Bootstrap::register(), + // which would also alias dashboard, settings, preferences, repair steps + // and sections onto generics that do NOT match larpinq's own + // controllers. Same reasoning, and the same shape, as shillinq. + if (class_exists('OCA\OpenRegister\AppHost\Controller\GenericHealthController') === true) { + $context->registerService( + 'OCA\Larpinq\Controller\HealthController', + static function (ContainerInterface $c): object { + $class = 'OCA\OpenRegister\AppHost\Controller\GenericHealthController'; + return new $class( + appName: self::APP_ID, + request: $c->get('OCP\IRequest'), + manifestLoader: $c->get('OCA\OpenRegister\AppHost\Observability\ManifestLoader'), + executor: $c->get('OCA\OpenRegister\AppHost\Observability\HealthCheckExecutor') + ); + } + ); + } + + if (class_exists('OCA\OpenRegister\AppHost\Controller\GenericMetricsController') === true) { + $context->registerService( + 'OCA\Larpinq\Controller\MetricsController', + static function (ContainerInterface $c): object { + $class = 'OCA\OpenRegister\AppHost\Controller\GenericMetricsController'; + return new $class( + appName: self::APP_ID, + request: $c->get('OCP\IRequest'), + manifestLoader: $c->get('OCA\OpenRegister\AppHost\Observability\ManifestLoader'), + engine: $c->get('OCA\OpenRegister\AppHost\Observability\MetricsEngine') + ); + } + ); + } + }//end registerAppHostGenerics() + + /** * Boot the application. * diff --git a/tests/e2e/spec-coverage/settings-roadmap.spec.ts b/tests/e2e/spec-coverage/settings-roadmap.spec.ts index db3cfb0b..6b20f16e 100644 --- a/tests/e2e/spec-coverage/settings-roadmap.spec.ts +++ b/tests/e2e/spec-coverage/settings-roadmap.spec.ts @@ -51,9 +51,7 @@ async function openRoute(page: Page, route: string): Promise { await dismissSupportDialog(page) // Path, not hash. Anchored at the end so `/features-roadmap` cannot be // satisfied by some longer route that merely contains it. - await expect(page).toHaveURL( - new RegExp(`${route.replace(/\//g, '\\/')}$`), - ) + await expect(page).toHaveURL(new RegExp(`${route.replace(/\//g, '\\/')}$`)) await expect(page.locator('.app-content')).toBeVisible({ timeout: 10_000 }) } diff --git a/tests/unit/Controller/DashboardControllerTest.php b/tests/unit/Controller/DashboardControllerTest.php index 10095591..47c26e78 100644 --- a/tests/unit/Controller/DashboardControllerTest.php +++ b/tests/unit/Controller/DashboardControllerTest.php @@ -41,6 +41,33 @@ public function testPageReturnsTemplateResponse(): void { self::assertInstanceOf(TemplateResponse::class, $result); } + /** + * The SPA catch-all serves the same shell as page(). + * + * `dashboard#catchAll` at GET /{path} is what makes larpinq's deep links + * work: before it, /apps/larpinq/characters and /events 404'd at the + * SERVER, which is why this app could not simply switch to history routing + * with the others. It is a public network-facing endpoint, so gate-25 + * (contract-coverage) wants a test rather than an `@contract exclude`. + * + * Asserting equality with page() rather than merely "returns a response" is + * the point: catchAll() exists only to delegate, and a delegation that + * quietly rendered the wrong template would hand every deep link a blank + * page while still answering HTTP 200. + * + * @return void + */ + public function testCatchAllServesTheSameShellAsPage(): void { + $result = $this->controller->catchAll(); + $page = $this->controller->page(); + + self::assertInstanceOf(TemplateResponse::class, $result); + self::assertSame('index', $result->getTemplateName()); + self::assertSame($page->getTemplateName(), $result->getTemplateName()); + self::assertSame($page->getRenderAs(), $result->getRenderAs()); + self::assertSame($page->getParams(), $result->getParams()); + } + public function testPageUsesIndexTemplate(): void { $result = $this->controller->page(); From d278b95bf6c90e389a3454ef1d5114da94e2969f Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 1 Sep 2026 23:18:00 +0200 Subject: [PATCH 26/35] test: collect the unit tests that were sitting in an uncollected directory (#669) phpunit.xml collects ./tests/unit. A second ./tests/Unit existed beside it, holding Service/DemoDataServiceTest.php. On a case-sensitive filesystem those are different directories, so that file was never collected and its 7 tests have never run in CI. Nothing about the file was wrong, which is why this went unnoticed: it is green the moment it is collected. Collected tests go from 239 to 246. Found while working #667 (closed, superseded by #666); this is the one finding there that #666 does not cover. Co-authored-by: Conduction Release Bot --- tests/{Unit => unit}/Service/DemoDataServiceTest.php | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{Unit => unit}/Service/DemoDataServiceTest.php (100%) diff --git a/tests/Unit/Service/DemoDataServiceTest.php b/tests/unit/Service/DemoDataServiceTest.php similarity index 100% rename from tests/Unit/Service/DemoDataServiceTest.php rename to tests/unit/Service/DemoDataServiceTest.php From bf3c73e62c24ad6d6484f6f5e291d1c487e74cba Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Wed, 2 Sep 2026 00:11:57 +0200 Subject: [PATCH 27/35] fix(observability): declare the health checks the endpoint reports (#671) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * style(manifest): run prettier over src/manifest.json Formatting only: the JSON parses to an identical structure before and after. Its own commit because it is large and mechanical. The file was never prettier-clean, and Frontend Check (format) is scoped to changed FILES rather than changed lines, so any edit to the manifest fails that job until it is formatted once. * fix(observability): declare the health checks the endpoint reports #666 wired /api/health and /api/metrics to OpenRegister's generic controllers, which was the missing binding. This adds what they read. HealthCheckExecutor iterates the manifest's observability descriptors. With no observability block it iterates an empty list, so /api/health answers 200 with an empty `checks` object — it would report `ok` with the database down, which is the one thing a health endpoint must never do. Two checks, matching shillinq's: `database` (critical) and `openregister` (degraded). Metrics stay the implicit larpinq_info and larpinq_up gauges the engine adds. Also widens the URL escape in settings-roadmap.spec.ts. CodeQL reports the slash-only slash-escape as js/incomplete-sanitization, high: it leaves `.`, `?`, `+`, `(` and backslash live in the pattern. Nothing is exploitable — every route in that file is a literal — but a route containing a `.` would silently match more than it names. Verified against a live instance while the binding was in place: /api/health 200 returning exactly these two checks, both ok, and /api/metrics 401 anonymous. --- src/manifest.json | 1861 +++++++++++++++-- .../spec-coverage/settings-roadmap.spec.ts | 9 +- 2 files changed, 1702 insertions(+), 168 deletions(-) diff --git a/src/manifest.json b/src/manifest.json index 9bb6ca8c..50b7f517 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -7,10 +7,35 @@ "version": 1, "completionConfigKey": "setup_completed_version", "steps": [ - { "id": "welcome", "type": "info", "title": "Welcome to LARPing", "body": "Manage your live-action roleplay world, with characters, players, items and events all in one place. One quick step provisions your data store, then you're ready to play." }, - { "id": "demo-data", "type": "run-action", "action": "install-demo-data", "title": "Demo data (optional)", "required": false, "body": "Load an example LARP with characters, skills, items and events, so lists, character sheets and the event calendar show a working product right away. Optional, and safe to run more than once. Skip this on a production install." }, - { "id": "provision", "type": "run-action", "title": "Provision your world", "required": true, "action": "provision", "body": "Create the Larpinq register and schemas in OpenRegister: the data store for characters, players, abilities, skills, items, conditions, effects, events and settings. This normally runs automatically on install; run it here if OpenRegister was enabled after Larpinq, or to repair a partial install. It is safe to run more than once." }, - { "id": "done", "type": "summary", "title": "You're ready", "healthCheck": true, "body": "That's it. Your world's data store is provisioned. Jump into the Dashboard to see it at a glance, and reopen this setup or the guided tour anytime from the app's … menu." } + { + "id": "welcome", + "type": "info", + "title": "Welcome to LARPing", + "body": "Manage your live-action roleplay world, with characters, players, items and events all in one place. One quick step provisions your data store, then you're ready to play." + }, + { + "id": "demo-data", + "type": "run-action", + "action": "install-demo-data", + "title": "Demo data (optional)", + "required": false, + "body": "Load an example LARP with characters, skills, items and events, so lists, character sheets and the event calendar show a working product right away. Optional, and safe to run more than once. Skip this on a production install." + }, + { + "id": "provision", + "type": "run-action", + "title": "Provision your world", + "required": true, + "action": "provision", + "body": "Create the Larpinq register and schemas in OpenRegister: the data store for characters, players, abilities, skills, items, conditions, effects, events and settings. This normally runs automatically on install; run it here if OpenRegister was enabled after Larpinq, or to repair a partial install. It is safe to run more than once." + }, + { + "id": "done", + "type": "summary", + "title": "You're ready", + "healthCheck": true, + "body": "That's it. Your world's data store is provisioned. Jump into the Dashboard to see it at a glance, and reopen this setup or the guided tour anytime from the app's … menu." + } ] }, "walkthrough": { @@ -24,19 +49,97 @@ "trigger": "first-visit", "minAppVersion": "0.1.27", "steps": [ - { "id": "welcome", "sinceVersion": "0.1.27", "placement": "center", "title": "Welcome to LARPing", "body": "Let's take a quick spin through your world. We'll create a character and an event together so you can see how the pieces fit, and you'll add each record yourself.", "target": { "kind": "page", "ref": "Dashboard" }, "advanceOn": { "type": "manual" } }, - { "id": "go-characters", "sinceVersion": "0.1.27", "placement": "right", "body": "Characters are the heart of your world. Open Characters from the menu to get started.", "task": "Click Characters in the menu", "target": { "kind": "nav-item", "ref": "Characters" }, "advanceOn": { "type": "route-match", "route": "Characters" } }, - { "id": "create-character", "sinceVersion": "0.1.27", "placement": "bottom", "allowManualNext": true, "body": "Add your first character. Give them a name and a type, and save. You can flesh out abilities, skills and items later.", "task": "Click New and save a character", "target": { "kind": "element", "ref": "index-add" }, "advanceOn": { "type": "object-created", "register": "larpinq", "schema": "character", "capture": { "characterId": ":id" } } }, - { "id": "go-events", "sinceVersion": "0.1.27", "placement": "right", "body": "Events are the game sessions where your world comes alive. Open Events from the menu.", "task": "Click Events in the menu", "target": { "kind": "nav-item", "ref": "Events" }, "advanceOn": { "type": "route-match", "route": "Events" } }, - { "id": "create-event", "sinceVersion": "0.1.27", "placement": "bottom", "allowManualNext": true, "body": "Create your first event. Name it and set a start date, then save. Your characters can join it from here.", "task": "Click New and save an event", "target": { "kind": "element", "ref": "index-add" }, "advanceOn": { "type": "object-created", "register": "larpinq", "schema": "larping_event", "capture": { "eventId": ":id" } } }, - { "id": "see-flows", "sinceVersion": "0.6.0", "placement": "right", "optional": true, "allowManualNext": true, "title": "Where the automation lives", "body": "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.", "task": "Open Flows in the menu", "target": {"kind": "nav-item", "ref": "Flows"}, "advanceOn": {"type": "route-match", "route": "Flows"}} , - { "id": "done", "sinceVersion": "0.1.27", "placement": "center", "title": "Your world has its first character", "body": "Add more characters and events from the menu, and the Dashboard tracks them as your world grows. The documentation covers the rest.", "task": "Open the documentation to keep going", "target": { "kind": "nav-item", "ref": "Documentation" }, "advanceOn": { "type": "manual" } } + { + "id": "welcome", + "sinceVersion": "0.1.27", + "placement": "center", + "title": "Welcome to LARPing", + "body": "Let's take a quick spin through your world. We'll create a character and an event together so you can see how the pieces fit, and you'll add each record yourself.", + "target": { "kind": "page", "ref": "Dashboard" }, + "advanceOn": { "type": "manual" } + }, + { + "id": "go-characters", + "sinceVersion": "0.1.27", + "placement": "right", + "body": "Characters are the heart of your world. Open Characters from the menu to get started.", + "task": "Click Characters in the menu", + "target": { "kind": "nav-item", "ref": "Characters" }, + "advanceOn": { "type": "route-match", "route": "Characters" } + }, + { + "id": "create-character", + "sinceVersion": "0.1.27", + "placement": "bottom", + "allowManualNext": true, + "body": "Add your first character. Give them a name and a type, and save. You can flesh out abilities, skills and items later.", + "task": "Click New and save a character", + "target": { "kind": "element", "ref": "index-add" }, + "advanceOn": { + "type": "object-created", + "register": "larpinq", + "schema": "character", + "capture": { "characterId": ":id" } + } + }, + { + "id": "go-events", + "sinceVersion": "0.1.27", + "placement": "right", + "body": "Events are the game sessions where your world comes alive. Open Events from the menu.", + "task": "Click Events in the menu", + "target": { "kind": "nav-item", "ref": "Events" }, + "advanceOn": { "type": "route-match", "route": "Events" } + }, + { + "id": "create-event", + "sinceVersion": "0.1.27", + "placement": "bottom", + "allowManualNext": true, + "body": "Create your first event. Name it and set a start date, then save. Your characters can join it from here.", + "task": "Click New and save an event", + "target": { "kind": "element", "ref": "index-add" }, + "advanceOn": { + "type": "object-created", + "register": "larpinq", + "schema": "larping_event", + "capture": { "eventId": ":id" } + } + }, + { + "id": "see-flows", + "sinceVersion": "0.6.0", + "placement": "right", + "optional": true, + "allowManualNext": true, + "title": "Where the automation lives", + "body": "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.", + "task": "Open Flows in the menu", + "target": { "kind": "nav-item", "ref": "Flows" }, + "advanceOn": { "type": "route-match", "route": "Flows" } + }, + { + "id": "done", + "sinceVersion": "0.1.27", + "placement": "center", + "title": "Your world has its first character", + "body": "Add more characters and events from the menu, and the Dashboard tracks them as your world grows. The documentation covers the rest.", + "task": "Open the documentation to keep going", + "target": { "kind": "nav-item", "ref": "Documentation" }, + "advanceOn": { "type": "manual" } + } ] } ] }, "menu": [ - { "id": "Dashboard", "label": "Dashboard", "icon": "ViewDashboardOutline", "route": "Dashboard", "order": 10 }, + { + "id": "Dashboard", + "label": "Dashboard", + "icon": "ViewDashboardOutline", + "route": "Dashboard", + "order": 10 + }, { "id": "CharactersGroup", "label": "Characters", @@ -44,8 +147,20 @@ "order": 20, "open": true, "children": [ - { "id": "Characters", "label": "Characters", "icon": "BriefcaseAccountOutline", "route": "Characters", "order": 20 }, - { "id": "Players", "label": "Players", "icon": "AccountGroupOutline", "route": "Players", "order": 30 } + { + "id": "Characters", + "label": "Characters", + "icon": "BriefcaseAccountOutline", + "route": "Characters", + "order": 20 + }, + { + "id": "Players", + "label": "Players", + "icon": "AccountGroupOutline", + "route": "Players", + "order": 30 + } ] }, { @@ -55,11 +170,41 @@ "order": 40, "open": true, "children": [ - { "id": "Abilities", "label": "Abilities", "icon": "FlashOutline", "route": "Abilities", "order": 40 }, - { "id": "Skills", "label": "Skills", "icon": "ToolboxOutline", "route": "Skills", "order": 50 }, - { "id": "SkillTree", "label": "Skill tree", "icon": "ToolboxOutline", "route": "SkillTree", "order": 55 }, - { "id": "Conditions", "label": "Conditions", "icon": "EmoticonSickOutline", "route": "Conditions", "order": 70 }, - { "id": "Effects", "label": "Effects", "icon": "MagicStaff", "route": "Effects", "order": 80 } + { + "id": "Abilities", + "label": "Abilities", + "icon": "FlashOutline", + "route": "Abilities", + "order": 40 + }, + { + "id": "Skills", + "label": "Skills", + "icon": "ToolboxOutline", + "route": "Skills", + "order": 50 + }, + { + "id": "SkillTree", + "label": "Skill tree", + "icon": "ToolboxOutline", + "route": "SkillTree", + "order": 55 + }, + { + "id": "Conditions", + "label": "Conditions", + "icon": "EmoticonSickOutline", + "route": "Conditions", + "order": 70 + }, + { + "id": "Effects", + "label": "Effects", + "icon": "MagicStaff", + "route": "Effects", + "order": 80 + } ] }, { @@ -69,15 +214,60 @@ "order": 60, "open": true, "children": [ - { "id": "Items", "label": "Items", "icon": "Sword", "route": "Items", "order": 60 }, - { "id": "Events", "label": "Events", "icon": "CalendarMonthOutline","route": "Events", "order": 90 }, - { "id": "XpAwards", "label": "XP Awards", "icon": "StarPlusOutline", "route": "XpAwards", "order": 95 } + { + "id": "Items", + "label": "Items", + "icon": "Sword", + "route": "Items", + "order": 60 + }, + { + "id": "Events", + "label": "Events", + "icon": "CalendarMonthOutline", + "route": "Events", + "order": 90 + }, + { + "id": "XpAwards", + "label": "XP Awards", + "icon": "StarPlusOutline", + "route": "XpAwards", + "order": 95 + } ] }, - { "id": "Settings", "label": "Worlds", "icon": "Earth", "route": "Settings", "order": 25 }, - { "id": "GameSettings", "label": "Game Settings", "icon": "CogOutline", "route": "GameSettings", "order": 100, "section": "settings" }, - { "id": "Documentation", "label": "Documentation", "icon": "BookOpenVariantOutline", "href": "https://larpinq.conduction.nl", "section": "footer", "order": 90 }, - { "id": "FeaturesRoadmapMenu","label": "Features & roadmap","icon": "MapMarkerPath","route": "FeaturesRoadmap", "section": "footer", "order": 91 }, + { + "id": "Settings", + "label": "Worlds", + "icon": "Earth", + "route": "Settings", + "order": 25 + }, + { + "id": "GameSettings", + "label": "Game Settings", + "icon": "CogOutline", + "route": "GameSettings", + "order": 100, + "section": "settings" + }, + { + "id": "Documentation", + "label": "Documentation", + "icon": "BookOpenVariantOutline", + "href": "https://larpinq.conduction.nl", + "section": "footer", + "order": 90 + }, + { + "id": "FeaturesRoadmapMenu", + "label": "Features & roadmap", + "icon": "MapMarkerPath", + "route": "FeaturesRoadmap", + "section": "footer", + "order": 91 + }, { "id": "FlowsMenu", "label": "Flows", @@ -87,6 +277,20 @@ "order": 96 } ], + "observability": { + "_note": "Declarative health descriptors for the AppHost engine (ADR-040 / ADR-006). Application::registerAppHostGenerics() aliases OpenRegister's GenericHealthController and GenericMetricsController onto larpinq's controller names, and those read THIS block at request time. Without it HealthCheckExecutor iterates an empty descriptor list, so /api/health answers 200 with an empty `checks` object — it would report `ok` with the database down. Metrics are the implicit larpinq_info and larpinq_up gauges the engine adds; health is public and metrics admin-only, per ADR-006.", + "health": { + "statusCodePolicy": "adr006", + "checks": [ + { "id": "database", "type": "database", "severity": "critical" }, + { + "id": "openregister", + "type": "orAvailable", + "severity": "degraded" + } + ] + } + }, "pages": [ { "id": "Dashboard", @@ -95,28 +299,235 @@ "title": "Dashboard", "config": { "widgets": [ - { "id": "kpi-characters", "title": "Characters", "type": "stat", "content": { "label": "Characters", "route": { "name": "Characters" }, "icon": "AccountGroup", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "character", "metric": "count", "filter": {} } } }, - { "id": "kpi-events", "title": "Events", "type": "stat", "content": { "label": "Events", "route": { "name": "Events" }, "icon": "Calendar", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "larping_event", "metric": "count", "filter": {} } } }, - { "id": "kpi-items", "title": "Items", "type": "stat", "content": { "label": "Items", "route": { "name": "Items" }, "icon": "Star", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "larping_item", "metric": "count", "filter": {} } } }, - { "id": "kpi-players", "title": "Players", "type": "stat", "content": { "label": "Players", "route": { "name": "Players" }, "icon": "Account", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "player", "metric": "count", "filter": {} } } }, - { "id": "recent-characters", "title": "Recent characters", "type": "object-table", "content": { "register": "larpinq", "schema": "character", "filter": {}, "sort": { "field": "created", "dir": "desc" }, "limit": 6, "rowRoute": "CharacterDetail", "rowIcon": "AccountGroup", "hideHeader": true, "viewAllRoute": { "name": "Characters" }, "viewAllLabel": "View all characters", "emptyText": "No characters yet", "columns": [{ "key": "name", "label": "Name" }, { "key": "type", "label": "Type" }] } }, - { "id": "recent-events", "title": "Recent events", "type": "object-table", "content": { "register": "larpinq", "schema": "larping_event", "filter": {}, "sort": { "field": "startDate", "dir": "desc" }, "limit": 6, "rowRoute": "EventDetail", "rowIcon": "CalendarStar", "hideHeader": true, "viewAllRoute": { "name": "Events" }, "viewAllLabel": "View all events", "emptyText": "No events yet", "columns": [{ "key": "name", "label": "Event" }, { "key": "startDate", "label": "Starts" }] } }, - { "id": "skill-usage", "title": "Skill usage by characters", "type": "chart", "content": { "chartKind": "donut", "legendPosition": "bottom", "emptyLabel": "No skill data available", "dataSource": { "register": "larpinq", "schema": "character", "aggregate": { "groupBy": "skills", "metric": "count", "topN": 10, "otherBucket": true, "labelResolve": { "schema": "larping_skill", "labelField": "name" } } } } } + { + "id": "kpi-characters", + "title": "Characters", + "type": "stat", + "content": { + "label": "Characters", + "route": { "name": "Characters" }, + "icon": "AccountGroup", + "format": { "style": "number" }, + "source": { + "register": "larpinq", + "schema": "character", + "metric": "count", + "filter": {} + } + } + }, + { + "id": "kpi-events", + "title": "Events", + "type": "stat", + "content": { + "label": "Events", + "route": { "name": "Events" }, + "icon": "Calendar", + "format": { "style": "number" }, + "source": { + "register": "larpinq", + "schema": "larping_event", + "metric": "count", + "filter": {} + } + } + }, + { + "id": "kpi-items", + "title": "Items", + "type": "stat", + "content": { + "label": "Items", + "route": { "name": "Items" }, + "icon": "Star", + "format": { "style": "number" }, + "source": { + "register": "larpinq", + "schema": "larping_item", + "metric": "count", + "filter": {} + } + } + }, + { + "id": "kpi-players", + "title": "Players", + "type": "stat", + "content": { + "label": "Players", + "route": { "name": "Players" }, + "icon": "Account", + "format": { "style": "number" }, + "source": { + "register": "larpinq", + "schema": "player", + "metric": "count", + "filter": {} + } + } + }, + { + "id": "recent-characters", + "title": "Recent characters", + "type": "object-table", + "content": { + "register": "larpinq", + "schema": "character", + "filter": {}, + "sort": { "field": "created", "dir": "desc" }, + "limit": 6, + "rowRoute": "CharacterDetail", + "rowIcon": "AccountGroup", + "hideHeader": true, + "viewAllRoute": { "name": "Characters" }, + "viewAllLabel": "View all characters", + "emptyText": "No characters yet", + "columns": [ + { "key": "name", "label": "Name" }, + { "key": "type", "label": "Type" } + ] + } + }, + { + "id": "recent-events", + "title": "Recent events", + "type": "object-table", + "content": { + "register": "larpinq", + "schema": "larping_event", + "filter": {}, + "sort": { "field": "startDate", "dir": "desc" }, + "limit": 6, + "rowRoute": "EventDetail", + "rowIcon": "CalendarStar", + "hideHeader": true, + "viewAllRoute": { "name": "Events" }, + "viewAllLabel": "View all events", + "emptyText": "No events yet", + "columns": [ + { "key": "name", "label": "Event" }, + { "key": "startDate", "label": "Starts" } + ] + } + }, + { + "id": "skill-usage", + "title": "Skill usage by characters", + "type": "chart", + "content": { + "chartKind": "donut", + "legendPosition": "bottom", + "emptyLabel": "No skill data available", + "dataSource": { + "register": "larpinq", + "schema": "character", + "aggregate": { + "groupBy": "skills", + "metric": "count", + "topN": 10, + "otherBucket": true, + "labelResolve": { + "schema": "larping_skill", + "labelField": "name" + } + } + } + } + } ], "layout": [ - { "id": 1, "widgetId": "kpi-characters", "gridX": 0, "gridY": 0, "gridWidth": 3, "gridHeight": 2, "showTitle": false }, - { "id": 2, "widgetId": "kpi-events", "gridX": 3, "gridY": 0, "gridWidth": 3, "gridHeight": 2, "showTitle": false }, - { "id": 3, "widgetId": "kpi-items", "gridX": 6, "gridY": 0, "gridWidth": 3, "gridHeight": 2, "showTitle": false }, - { "id": 4, "widgetId": "kpi-players", "gridX": 9, "gridY": 0, "gridWidth": 3, "gridHeight": 2, "showTitle": false }, - { "id": 5, "widgetId": "recent-characters", "gridX": 0, "gridY": 2, "gridWidth": 6, "gridHeight": 4 }, - { "id": 6, "widgetId": "recent-events", "gridX": 6, "gridY": 2, "gridWidth": 6, "gridHeight": 4 }, - { "id": 7, "widgetId": "skill-usage", "gridX": 0, "gridY": 6, "gridWidth": 12, "gridHeight": 5 } + { + "id": 1, + "widgetId": "kpi-characters", + "gridX": 0, + "gridY": 0, + "gridWidth": 3, + "gridHeight": 2, + "showTitle": false + }, + { + "id": 2, + "widgetId": "kpi-events", + "gridX": 3, + "gridY": 0, + "gridWidth": 3, + "gridHeight": 2, + "showTitle": false + }, + { + "id": 3, + "widgetId": "kpi-items", + "gridX": 6, + "gridY": 0, + "gridWidth": 3, + "gridHeight": 2, + "showTitle": false + }, + { + "id": 4, + "widgetId": "kpi-players", + "gridX": 9, + "gridY": 0, + "gridWidth": 3, + "gridHeight": 2, + "showTitle": false + }, + { + "id": 5, + "widgetId": "recent-characters", + "gridX": 0, + "gridY": 2, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": 6, + "widgetId": "recent-events", + "gridX": 6, + "gridY": 2, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": 7, + "widgetId": "skill-usage", + "gridX": 0, + "gridY": 6, + "gridWidth": 12, + "gridHeight": 5 + } ], "documentationUrl": "https://larpinq.conduction.nl", "headerActions": [ - { "id": "new-character", "label": "New character", "type": "open-form", "icon": "Plus", "variant": "primary", "register": "larpinq", "schema": "character", "onSuccessRoute": "Characters" }, - { "id": "new-item", "label": "New item", "type": "open-form", "icon": "Plus", "register": "larpinq", "schema": "larping_item", "onSuccessRoute": "Items" }, - { "id": "new-condition", "label": "New condition", "type": "open-form", "icon": "Plus", "register": "larpinq", "schema": "condition", "onSuccessRoute": "Conditions" } + { + "id": "new-character", + "label": "New character", + "type": "open-form", + "icon": "Plus", + "variant": "primary", + "register": "larpinq", + "schema": "character", + "onSuccessRoute": "Characters" + }, + { + "id": "new-item", + "label": "New item", + "type": "open-form", + "icon": "Plus", + "register": "larpinq", + "schema": "larping_item", + "onSuccessRoute": "Items" + }, + { + "id": "new-condition", + "label": "New condition", + "type": "open-form", + "icon": "Plus", + "register": "larpinq", + "schema": "condition", + "onSuccessRoute": "Conditions" + } ] } }, @@ -125,7 +536,11 @@ "route": "/characters", "type": "index", "title": "Characters", - "config": { "register": "larpinq", "schema": "character", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "character", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "CharacterDetail", @@ -138,28 +553,196 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "ADR-062 rollout: split the sheet into identity (name/player/setting/description/background/faith, 6 fields) vs game state & notes (type/approved/gold/silver/copper/itemsAndMoney/card/notice/GM notes, 10 fields) per rule 3. The loose XP + Gold stat cards fold into one stats-block (rule 2, same-flavor simple KPIs) top-right, aligned with the identity row. The right rail lists the linked mechanics (skills/items/conditions) and event participation as related groups so a GM can see the whole build at a glance. The character portrait/sheet lives in the photos leaf (schema declares linkedType 'photos') as a body integration widget. XP awards granted to this character are shown as an object-list (xpAward.character FK = @objectId) — GM hand-awarded per xpAward's schema description, so allowCreate stays on (default). No email/calendar on the body: the character schema declares only 'photos'. Sidebar is audit-history only — the photos leaf already lives in the body, so it is not duplicated as a sidebar tab.", "widgets": [ - { "id": "char-identity", "type": "data", "title": "Identity", "icon": "Account", "content": { "columns": 2, "include": [ "name", "ocName", "setting", "description", "background", "faith" ] } }, - { "id": "char-stats-xp-awarded", "type": "stats-block", "title": "XP awarded", "icon": "Trophy", "content": { "entries": [ { "title": "XP awarded", "register": "larpinq", "schema": "xpAward", "metric": "sum", "field": "amount", "filter": { "character": "@objectId" }, "route": { "name": "XpAwards", "query": { "character": "@objectId" } } } ] } }, - { "id": "char-stats-gold-pieces", "type": "stats-block", "title": "Gold pieces", "icon": "Trophy", "content": { "entries": [ { "title": "Gold pieces", "register": "larpinq", "schema": "character", "metric": "sum", "field": "gold", "filter": { "id": "@objectId" } } ] } }, - { "id": "char-progress", "type": "data", "title": "Game state & notes", "icon": "ClipboardList", "content": { "columns": 2, "include": [ "type", "approved", "gold", "silver", "copper", "itemsAndMoney", "card", "notice", "slNotesPublic", "slNotesPrivate" ] } }, - { "id": "char-related", "type": "related", "title": "Build & world", "icon": "LinkVariant", "content": { "groups": [ { "key": "skills", "label": "Skills" }, { "key": "items", "label": "Items" }, { "key": "conditions", "label": "Conditions" }, { "key": "events", "label": "Events" } ] } }, - { "id": "char-xpawards", "type": "object-list", "title": "XP award history", "icon": "Trophy", "content": { "register": "larpinq", "schema": "xpAward", "filter": { "character": "@objectId" }, "sort": { "field": "awardedAt", "dir": "desc" }, "columns": [ { "key": "event", "label": "Event" }, { "key": "amount", "label": "XP" }, { "key": "reason", "label": "Reason" }, { "key": "awardedAt", "label": "Awarded" } ], "limit": 50, "viewAllRoute": "XpAwards", "viewAllQuery": { "character": "@objectId" }, "emptyText": "No XP awarded yet." } }, - { "id": "char-photos", "type": "integration", "integrationId": "photos", "title": "Portrait & sheet", "icon": "FileDocument" } + { + "id": "char-identity", + "type": "data", + "title": "Identity", + "icon": "Account", + "content": { + "columns": 2, + "include": [ + "name", + "ocName", + "setting", + "description", + "background", + "faith" + ] + } + }, + { + "id": "char-stats-xp-awarded", + "type": "stats-block", + "title": "XP awarded", + "icon": "Trophy", + "content": { + "entries": [ + { + "title": "XP awarded", + "register": "larpinq", + "schema": "xpAward", + "metric": "sum", + "field": "amount", + "filter": { "character": "@objectId" }, + "route": { + "name": "XpAwards", + "query": { "character": "@objectId" } + } + } + ] + } + }, + { + "id": "char-stats-gold-pieces", + "type": "stats-block", + "title": "Gold pieces", + "icon": "Trophy", + "content": { + "entries": [ + { + "title": "Gold pieces", + "register": "larpinq", + "schema": "character", + "metric": "sum", + "field": "gold", + "filter": { "id": "@objectId" } + } + ] + } + }, + { + "id": "char-progress", + "type": "data", + "title": "Game state & notes", + "icon": "ClipboardList", + "content": { + "columns": 2, + "include": [ + "type", + "approved", + "gold", + "silver", + "copper", + "itemsAndMoney", + "card", + "notice", + "slNotesPublic", + "slNotesPrivate" + ] + } + }, + { + "id": "char-related", + "type": "related", + "title": "Build & world", + "icon": "LinkVariant", + "content": { + "groups": [ + { "key": "skills", "label": "Skills" }, + { "key": "items", "label": "Items" }, + { "key": "conditions", "label": "Conditions" }, + { "key": "events", "label": "Events" } + ] + } + }, + { + "id": "char-xpawards", + "type": "object-list", + "title": "XP award history", + "icon": "Trophy", + "content": { + "register": "larpinq", + "schema": "xpAward", + "filter": { "character": "@objectId" }, + "sort": { "field": "awardedAt", "dir": "desc" }, + "columns": [ + { "key": "event", "label": "Event" }, + { "key": "amount", "label": "XP" }, + { "key": "reason", "label": "Reason" }, + { "key": "awardedAt", "label": "Awarded" } + ], + "limit": 50, + "viewAllRoute": "XpAwards", + "viewAllQuery": { "character": "@objectId" }, + "emptyText": "No XP awarded yet." + } + }, + { + "id": "char-photos", + "type": "integration", + "integrationId": "photos", + "title": "Portrait & sheet", + "icon": "FileDocument" + } ], "layout": [ - { "id": "1", "widgetId": "char-identity", "gridX": 0, "gridY": 0, "gridWidth": 8, "gridHeight": 4 }, - { "id": "2a", "widgetId": "char-stats-xp-awarded", "gridX": 8, "gridY": 0, "gridWidth": 4, "gridHeight": 2 }, - { "id": "2b", "widgetId": "char-stats-gold-pieces", "gridX": 8, "gridY": 2, "gridWidth": 4, "gridHeight": 2 }, - { "id": "3", "widgetId": "char-progress", "gridX": 0, "gridY": 4, "gridWidth": 8, "gridHeight": 6 }, - { "id": "4", "widgetId": "char-related", "gridX": 8, "gridY": 4, "gridWidth": 4, "gridHeight": 6 }, - { "id": "5", "widgetId": "char-xpawards", "gridX": 0, "gridY": 10, "gridWidth": 12, "gridHeight": 4 }, - { "id": "6", "widgetId": "char-photos", "gridX": 0, "gridY": 14, "gridWidth": 12, "gridHeight": 4 } + { + "id": "1", + "widgetId": "char-identity", + "gridX": 0, + "gridY": 0, + "gridWidth": 8, + "gridHeight": 4 + }, + { + "id": "2a", + "widgetId": "char-stats-xp-awarded", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 2 + }, + { + "id": "2b", + "widgetId": "char-stats-gold-pieces", + "gridX": 8, + "gridY": 2, + "gridWidth": 4, + "gridHeight": 2 + }, + { + "id": "3", + "widgetId": "char-progress", + "gridX": 0, + "gridY": 4, + "gridWidth": 8, + "gridHeight": 6 + }, + { + "id": "4", + "widgetId": "char-related", + "gridX": 8, + "gridY": 4, + "gridWidth": 4, + "gridHeight": 6 + }, + { + "id": "5", + "widgetId": "char-xpawards", + "gridX": 0, + "gridY": 10, + "gridWidth": 12, + "gridHeight": 4 + }, + { + "id": "6", + "widgetId": "char-photos", + "gridX": 0, + "gridY": 14, + "gridWidth": 12, + "gridHeight": 4 + } ], "sidebar": { "enabled": true, "showMetadata": true, "tabs": [ - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -169,7 +752,11 @@ "route": "/players", "type": "index", "title": "Players", - "config": { "register": "larpinq", "schema": "player", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "player", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "PlayerDetail", @@ -182,22 +769,91 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "Player = the real-world person behind the characters (person archetype). The player schema is deliberately thin (name + notes) and its only declared linkedType is 'contacts', so the body is person-first: identity/notes (data, 7-wide) beside the linked Nextcloud contact card (contacts integration, 5-wide) for phone/email/address. ADR-062 correction: round 1 claimed characters attach by OC name string with no reliable FK — that was stale; character.ocName carries a canonical $ref to player, so a 'characters played' object-list (character.ocName = @objectId) is now added beside Related. No email/calendar/talk widgets on the body — the schema declares only 'contacts'. Sidebar is audit-history only — the contact card already lives in the body, so it is not duplicated as a sidebar tab.", "widgets": [ - { "id": "player-data", "type": "data", "title": "Player", "icon": "Account", "content": { "columns": 1 } }, - { "id": "player-contacts", "type": "integration", "integrationId": "contacts", "title": "Contact card", "icon": "AccountBoxOutline" }, - { "id": "player-related", "type": "related", "title": "Related", "icon": "LinkVariant" }, - { "id": "player-characters", "type": "object-list", "title": "Characters played", "icon": "Briefcase", "content": { "register": "larpinq", "schema": "character", "filter": { "ocName": "@objectId" }, "columns": [ { "key": "name", "label": "Character" }, { "key": "type", "label": "Type" }, { "key": "approved", "label": "Approved" } ], "limit": 50, "viewAllRoute": "Characters", "viewAllQuery": { "ocName": "@objectId" }, "emptyText": "No characters played yet." } } + { + "id": "player-data", + "type": "data", + "title": "Player", + "icon": "Account", + "content": { "columns": 1 } + }, + { + "id": "player-contacts", + "type": "integration", + "integrationId": "contacts", + "title": "Contact card", + "icon": "AccountBoxOutline" + }, + { + "id": "player-related", + "type": "related", + "title": "Related", + "icon": "LinkVariant" + }, + { + "id": "player-characters", + "type": "object-list", + "title": "Characters played", + "icon": "Briefcase", + "content": { + "register": "larpinq", + "schema": "character", + "filter": { "ocName": "@objectId" }, + "columns": [ + { "key": "name", "label": "Character" }, + { "key": "type", "label": "Type" }, + { "key": "approved", "label": "Approved" } + ], + "limit": 50, + "viewAllRoute": "Characters", + "viewAllQuery": { "ocName": "@objectId" }, + "emptyText": "No characters played yet." + } + } ], "layout": [ - { "id": "1", "widgetId": "player-data", "gridX": 0, "gridY": 0, "gridWidth": 7, "gridHeight": 4 }, - { "id": "2", "widgetId": "player-contacts", "gridX": 7, "gridY": 0, "gridWidth": 5, "gridHeight": 4 }, - { "id": "3", "widgetId": "player-related", "gridX": 0, "gridY": 4, "gridWidth": 6, "gridHeight": 4 }, - { "id": "4", "widgetId": "player-characters", "gridX": 6, "gridY": 4, "gridWidth": 6, "gridHeight": 4 } + { + "id": "1", + "widgetId": "player-data", + "gridX": 0, + "gridY": 0, + "gridWidth": 7, + "gridHeight": 4 + }, + { + "id": "2", + "widgetId": "player-contacts", + "gridX": 7, + "gridY": 0, + "gridWidth": 5, + "gridHeight": 4 + }, + { + "id": "3", + "widgetId": "player-related", + "gridX": 0, + "gridY": 4, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": "4", + "widgetId": "player-characters", + "gridX": 6, + "gridY": 4, + "gridWidth": 6, + "gridHeight": 4 + } ], "sidebar": { "enabled": true, "showMetadata": true, "tabs": [ - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -207,7 +863,11 @@ "route": "/abilities", "type": "index", "title": "Abilities", - "config": { "register": "larpinq", "schema": "ability", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "ability", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "AbilityDetail", @@ -220,24 +880,131 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "Ability = a numeric stat (XP, Mana, Health, Armor) that characters track (rules-object archetype). The body is definition-first: the stat's name/description/base value (data, 8-wide) plus a large base-value stat card (single distinct KPI — kept loose, not folded into a stats-block), then the reverse index of what touches this stat — the effects that modify it (effect.abilities FK = @objectId) and the skills that gate on it (skill.requiredStats contains @objectId). This is a pure rules object: no comms, no files, no attachments — a GM reads it to understand how a stat is wired into the ruleset.", "widgets": [ - { "id": "ability-data", "type": "data", "title": "Ability", "icon": "Gauge", "content": { "columns": 2 } }, - { "id": "ability-base", "type": "stat", "title": "Base value", "icon": "Gauge", "content": { "label": "Base value", "icon": "Gauge", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "ability", "metric": "sum", "field": "base", "filter": { "id": "@objectId" } } } }, - { "id": "ability-effects", "type": "object-list", "title": "Effects modifying this ability", "icon": "TrendingUp", "content": { "register": "larpinq", "schema": "effect", "filter": { "abilities": "@objectId" }, "columns": [ { "key": "name", "label": "Effect" }, { "key": "modifier", "label": "Modifier" }, { "key": "modification", "label": "Direction" }, { "key": "cumulative", "label": "Stacks" } ], "limit": 50, "viewAllRoute": "Effects", "viewAllQuery": { "abilities": "@objectId" }, "emptyText": "No effects modify this stat yet." } }, - { "id": "ability-skills", "type": "object-list", "title": "Skills requiring this stat", "icon": "School", "content": { "register": "larpinq", "schema": "larping_skill", "filter": { "requiredStats": "@objectId" }, "columns": [ { "key": "name", "label": "Skill" }, { "key": "requiredScore", "label": "Min score" } ], "limit": 50, "viewAllRoute": "Skills", "viewAllQuery": { "requiredStats": "@objectId" }, "emptyText": "No skills require this stat yet." } }, - { "id": "ability-related", "type": "related", "title": "Related", "icon": "LinkVariant" } + { + "id": "ability-data", + "type": "data", + "title": "Ability", + "icon": "Gauge", + "content": { "columns": 2 } + }, + { + "id": "ability-base", + "type": "stat", + "title": "Base value", + "icon": "Gauge", + "content": { + "label": "Base value", + "icon": "Gauge", + "format": { "style": "number" }, + "source": { + "register": "larpinq", + "schema": "ability", + "metric": "sum", + "field": "base", + "filter": { "id": "@objectId" } + } + } + }, + { + "id": "ability-effects", + "type": "object-list", + "title": "Effects modifying this ability", + "icon": "TrendingUp", + "content": { + "register": "larpinq", + "schema": "effect", + "filter": { "abilities": "@objectId" }, + "columns": [ + { "key": "name", "label": "Effect" }, + { "key": "modifier", "label": "Modifier" }, + { "key": "modification", "label": "Direction" }, + { "key": "cumulative", "label": "Stacks" } + ], + "limit": 50, + "viewAllRoute": "Effects", + "viewAllQuery": { "abilities": "@objectId" }, + "emptyText": "No effects modify this stat yet." + } + }, + { + "id": "ability-skills", + "type": "object-list", + "title": "Skills requiring this stat", + "icon": "School", + "content": { + "register": "larpinq", + "schema": "larping_skill", + "filter": { "requiredStats": "@objectId" }, + "columns": [ + { "key": "name", "label": "Skill" }, + { "key": "requiredScore", "label": "Min score" } + ], + "limit": 50, + "viewAllRoute": "Skills", + "viewAllQuery": { "requiredStats": "@objectId" }, + "emptyText": "No skills require this stat yet." + } + }, + { + "id": "ability-related", + "type": "related", + "title": "Related", + "icon": "LinkVariant" + } ], "layout": [ - { "id": "1", "widgetId": "ability-data", "gridX": 0, "gridY": 0, "gridWidth": 8, "gridHeight": 3 }, - { "id": "2", "widgetId": "ability-base", "gridX": 8, "gridY": 0, "gridWidth": 4, "gridHeight": 3, "showTitle": false }, - { "id": "3", "widgetId": "ability-effects", "gridX": 0, "gridY": 3, "gridWidth": 6, "gridHeight": 4 }, - { "id": "4", "widgetId": "ability-skills", "gridX": 6, "gridY": 3, "gridWidth": 6, "gridHeight": 4 }, - { "id": "5", "widgetId": "ability-related", "gridX": 0, "gridY": 7, "gridWidth": 12, "gridHeight": 3 } + { + "id": "1", + "widgetId": "ability-data", + "gridX": 0, + "gridY": 0, + "gridWidth": 8, + "gridHeight": 3 + }, + { + "id": "2", + "widgetId": "ability-base", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 3, + "showTitle": false + }, + { + "id": "3", + "widgetId": "ability-effects", + "gridX": 0, + "gridY": 3, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": "4", + "widgetId": "ability-skills", + "gridX": 6, + "gridY": 3, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": "5", + "widgetId": "ability-related", + "gridX": 0, + "gridY": 7, + "gridWidth": 12, + "gridHeight": 3 + } ], "sidebar": { "enabled": true, "showMetadata": true, "tabs": [ - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -247,7 +1014,11 @@ "route": "/skills", "type": "index", "title": "Skills", - "config": { "register": "larpinq", "schema": "larping_skill", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "larping_skill", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "SkillTree", @@ -269,20 +1040,97 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "Skill = a learnable, XP-purchased ability with prerequisites (rules-object archetype, prerequisite-heavy). The body leads with the skill's flavour + mechanical effect (data, 8-wide) beside a related rail that surfaces the four prerequisite groups the schema carries (required skills, required stats, required conditions, required effects) plus the effects it grants — the whole dependency tree in one place. Below, an object-list of characters who have learned this skill (character.skills contains @objectId) lets a GM see adoption. Pure rules object: no comms, no files.", "widgets": [ - { "id": "skill-data", "type": "data", "title": "Skill", "icon": "School", "content": { "columns": 2 } }, - { "id": "skill-prereqs", "type": "related", "title": "Effects & prerequisites", "icon": "Sitemap", "content": { "groups": [ { "key": "effects", "label": "Grants effects" }, { "key": "requiredSkills", "label": "Requires skills" }, { "key": "requiredStats", "label": "Requires stats" }, { "key": "requiredConditions", "label": "Requires conditions" }, { "key": "requiredEffects", "label": "Requires effects" } ] } }, - { "id": "skill-characters", "type": "object-list", "title": "Characters with this skill", "icon": "AccountGroup", "content": { "register": "larpinq", "schema": "character", "filter": { "skills": "@objectId" }, "columns": [ { "key": "name", "label": "Character" }, { "key": "type", "label": "Type" }, { "key": "approved", "label": "Approved" } ], "limit": 50, "viewAllRoute": "Characters", "viewAllQuery": { "skills": "@objectId" }, "emptyText": "No characters have learned this skill yet." } } + { + "id": "skill-data", + "type": "data", + "title": "Skill", + "icon": "School", + "content": { "columns": 2 } + }, + { + "id": "skill-prereqs", + "type": "related", + "title": "Effects & prerequisites", + "icon": "Sitemap", + "content": { + "groups": [ + { "key": "effects", "label": "Grants effects" }, + { + "key": "requiredSkills", + "label": "Requires skills" + }, + { + "key": "requiredStats", + "label": "Requires stats" + }, + { + "key": "requiredConditions", + "label": "Requires conditions" + }, + { + "key": "requiredEffects", + "label": "Requires effects" + } + ] + } + }, + { + "id": "skill-characters", + "type": "object-list", + "title": "Characters with this skill", + "icon": "AccountGroup", + "content": { + "register": "larpinq", + "schema": "character", + "filter": { "skills": "@objectId" }, + "columns": [ + { "key": "name", "label": "Character" }, + { "key": "type", "label": "Type" }, + { "key": "approved", "label": "Approved" } + ], + "limit": 50, + "viewAllRoute": "Characters", + "viewAllQuery": { "skills": "@objectId" }, + "emptyText": "No characters have learned this skill yet." + } + } ], "layout": [ - { "id": "1", "widgetId": "skill-data", "gridX": 0, "gridY": 0, "gridWidth": 8, "gridHeight": 5 }, - { "id": "2", "widgetId": "skill-prereqs", "gridX": 8, "gridY": 0, "gridWidth": 4, "gridHeight": 5 }, - { "id": "3", "widgetId": "skill-characters", "gridX": 0, "gridY": 5, "gridWidth": 12, "gridHeight": 4 } + { + "id": "1", + "widgetId": "skill-data", + "gridX": 0, + "gridY": 0, + "gridWidth": 8, + "gridHeight": 5 + }, + { + "id": "2", + "widgetId": "skill-prereqs", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 5 + }, + { + "id": "3", + "widgetId": "skill-characters", + "gridX": 0, + "gridY": 5, + "gridWidth": 12, + "gridHeight": 4 + } ], "sidebar": { "enabled": true, "showMetadata": true, "tabs": [ - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -292,7 +1140,11 @@ "route": "/items", "type": "index", "title": "Items", - "config": { "register": "larpinq", "schema": "larping_item", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "larping_item", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "ItemDetail", @@ -305,22 +1157,95 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "Item = a magical/special object that grants effects to its holder (rules-object archetype, ownership-tracked). The body leads with the item's player-visible story description + GM mechanical effect (data, 8-wide) beside the effects it confers (related), then an object-list of the characters currently holding it (item.characters contains @objectId / character.items) — critical for unique artifacts where only one holder may exist. Files are on the body because props and physrep photos/handouts are commonly attached to items. No email/calendar: the item schema declares no comms linkedTypes.", "widgets": [ - { "id": "item-data", "type": "data", "title": "Item", "icon": "Package", "content": { "columns": 2 } }, - { "id": "item-effects", "type": "related", "title": "Effects", "icon": "LinkVariant", "content": { "groups": [ { "key": "effects", "label": "Grants effects" } ] } }, - { "id": "item-holders", "type": "object-list", "title": "Held by", "icon": "AccountGroup", "content": { "register": "larpinq", "schema": "character", "filter": { "items": "@objectId" }, "columns": [ { "key": "name", "label": "Character" }, { "key": "type", "label": "Type" } ], "limit": 50, "viewAllRoute": "Characters", "viewAllQuery": { "items": "@objectId" }, "emptyText": "Nobody is holding this item yet." } }, - { "id": "item-files", "type": "integration", "integrationId": "files", "title": "Props & handouts", "icon": "FolderOutline" } + { + "id": "item-data", + "type": "data", + "title": "Item", + "icon": "Package", + "content": { "columns": 2 } + }, + { + "id": "item-effects", + "type": "related", + "title": "Effects", + "icon": "LinkVariant", + "content": { + "groups": [ + { "key": "effects", "label": "Grants effects" } + ] + } + }, + { + "id": "item-holders", + "type": "object-list", + "title": "Held by", + "icon": "AccountGroup", + "content": { + "register": "larpinq", + "schema": "character", + "filter": { "items": "@objectId" }, + "columns": [ + { "key": "name", "label": "Character" }, + { "key": "type", "label": "Type" } + ], + "limit": 50, + "viewAllRoute": "Characters", + "viewAllQuery": { "items": "@objectId" }, + "emptyText": "Nobody is holding this item yet." + } + }, + { + "id": "item-files", + "type": "integration", + "integrationId": "files", + "title": "Props & handouts", + "icon": "FolderOutline" + } ], "layout": [ - { "id": "1", "widgetId": "item-data", "gridX": 0, "gridY": 0, "gridWidth": 8, "gridHeight": 4 }, - { "id": "2", "widgetId": "item-effects", "gridX": 8, "gridY": 0, "gridWidth": 4, "gridHeight": 4 }, - { "id": "3", "widgetId": "item-holders", "gridX": 0, "gridY": 4, "gridWidth": 6, "gridHeight": 4 }, - { "id": "4", "widgetId": "item-files", "gridX": 6, "gridY": 4, "gridWidth": 6, "gridHeight": 4 } + { + "id": "1", + "widgetId": "item-data", + "gridX": 0, + "gridY": 0, + "gridWidth": 8, + "gridHeight": 4 + }, + { + "id": "2", + "widgetId": "item-effects", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 4 + }, + { + "id": "3", + "widgetId": "item-holders", + "gridX": 0, + "gridY": 4, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": "4", + "widgetId": "item-files", + "gridX": 6, + "gridY": 4, + "gridWidth": 6, + "gridHeight": 4 + } ], "sidebar": { "enabled": true, "showMetadata": true, "tabs": [ - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -330,7 +1255,11 @@ "route": "/conditions", "type": "index", "title": "Conditions", - "config": { "register": "larpinq", "schema": "condition", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "condition", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "ConditionDetail", @@ -343,20 +1272,80 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "Condition = a positive/negative status earned through gameplay (not purchased) that applies automated effects (rules-object archetype). The body leads with the flavour + mechanical description (data, 8-wide) beside the automated effects it applies (related), then an object-list of the characters currently affected (condition.characters contains @objectId / character.conditions) — the live 'who is currently poisoned/blessed' roster a GM needs during play. Pure rules object: no comms, no files.", "widgets": [ - { "id": "condition-data", "type": "data", "title": "Condition", "icon": "AlertCircleOutline", "content": { "columns": 2 } }, - { "id": "condition-effects", "type": "related", "title": "Applied effects", "icon": "LinkVariant", "content": { "groups": [ { "key": "effects", "label": "Applies effects" } ] } }, - { "id": "condition-characters", "type": "object-list", "title": "Currently affecting", "icon": "AccountGroup", "content": { "register": "larpinq", "schema": "character", "filter": { "conditions": "@objectId" }, "columns": [ { "key": "name", "label": "Character" }, { "key": "type", "label": "Type" } ], "limit": 50, "viewAllRoute": "Characters", "viewAllQuery": { "conditions": "@objectId" }, "emptyText": "No characters are currently affected." } } + { + "id": "condition-data", + "type": "data", + "title": "Condition", + "icon": "AlertCircleOutline", + "content": { "columns": 2 } + }, + { + "id": "condition-effects", + "type": "related", + "title": "Applied effects", + "icon": "LinkVariant", + "content": { + "groups": [ + { "key": "effects", "label": "Applies effects" } + ] + } + }, + { + "id": "condition-characters", + "type": "object-list", + "title": "Currently affecting", + "icon": "AccountGroup", + "content": { + "register": "larpinq", + "schema": "character", + "filter": { "conditions": "@objectId" }, + "columns": [ + { "key": "name", "label": "Character" }, + { "key": "type", "label": "Type" } + ], + "limit": 50, + "viewAllRoute": "Characters", + "viewAllQuery": { "conditions": "@objectId" }, + "emptyText": "No characters are currently affected." + } + } ], "layout": [ - { "id": "1", "widgetId": "condition-data", "gridX": 0, "gridY": 0, "gridWidth": 8, "gridHeight": 4 }, - { "id": "2", "widgetId": "condition-effects", "gridX": 8, "gridY": 0, "gridWidth": 4, "gridHeight": 4 }, - { "id": "3", "widgetId": "condition-characters", "gridX": 0, "gridY": 4, "gridWidth": 12, "gridHeight": 4 } + { + "id": "1", + "widgetId": "condition-data", + "gridX": 0, + "gridY": 0, + "gridWidth": 8, + "gridHeight": 4 + }, + { + "id": "2", + "widgetId": "condition-effects", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 4 + }, + { + "id": "3", + "widgetId": "condition-characters", + "gridX": 0, + "gridY": 4, + "gridWidth": 12, + "gridHeight": 4 + } ], "sidebar": { "enabled": true, "showMetadata": true, "tabs": [ - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -366,7 +1355,11 @@ "route": "/effects", "type": "index", "title": "Effects", - "config": { "register": "larpinq", "schema": "effect", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "effect", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "EffectDetail", @@ -379,26 +1372,150 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "Effect = the atomic stat modifier (+N / -N to an ability, cumulative or not) that the stat engine applies (rules-object archetype, leaf of the mechanics graph). The body leads with the definition (data, 8-wide) and a bold signed-modifier stat card so the magnitude reads instantly, plus the abilities it modifies (related). Below, three object-lists give the full reverse index of what carries this effect — skills, items and conditions (each schema's effects[] contains @objectId) — so a designer can trace every source before rebalancing. Pure rules object: no comms, no files.", "widgets": [ - { "id": "effect-data", "type": "data", "title": "Effect", "icon": "Lightbulb", "content": { "columns": 2 } }, - { "id": "effect-modifier", "type": "stat", "title": "Modifier", "icon": "TrendingUp", "content": { "label": "Modifier value", "icon": "TrendingUp", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "effect", "metric": "sum", "field": "modifier", "filter": { "id": "@objectId" } } } }, - { "id": "effect-abilities", "type": "related", "title": "Modifies abilities", "icon": "LinkVariant", "content": { "groups": [ { "key": "abilities", "label": "Abilities" } ] } }, - { "id": "effect-skills", "type": "object-list", "title": "Skills granting this effect", "icon": "School", "content": { "register": "larpinq", "schema": "larping_skill", "filter": { "effects": "@objectId" }, "columns": [ { "key": "name", "label": "Skill" } ], "limit": 50, "viewAllRoute": "Skills", "viewAllQuery": { "effects": "@objectId" }, "emptyText": "No skills grant this effect yet." } }, - { "id": "effect-items", "type": "object-list", "title": "Items granting this effect", "icon": "Package", "content": { "register": "larpinq", "schema": "larping_item", "filter": { "effects": "@objectId" }, "columns": [ { "key": "name", "label": "Item" } ], "limit": 50, "viewAllRoute": "Items", "viewAllQuery": { "effects": "@objectId" }, "emptyText": "No items grant this effect yet." } }, - { "id": "effect-conditions", "type": "object-list", "title": "Conditions granting this effect", "icon": "AlertCircleOutline", "content": { "register": "larpinq", "schema": "condition", "filter": { "effects": "@objectId" }, "columns": [ { "key": "name", "label": "Condition" } ], "limit": 50, "viewAllRoute": "Conditions", "viewAllQuery": { "effects": "@objectId" }, "emptyText": "No conditions grant this effect yet." } } + { + "id": "effect-data", + "type": "data", + "title": "Effect", + "icon": "Lightbulb", + "content": { "columns": 2 } + }, + { + "id": "effect-modifier", + "type": "stat", + "title": "Modifier", + "icon": "TrendingUp", + "content": { + "label": "Modifier value", + "icon": "TrendingUp", + "format": { "style": "number" }, + "source": { + "register": "larpinq", + "schema": "effect", + "metric": "sum", + "field": "modifier", + "filter": { "id": "@objectId" } + } + } + }, + { + "id": "effect-abilities", + "type": "related", + "title": "Modifies abilities", + "icon": "LinkVariant", + "content": { + "groups": [{ "key": "abilities", "label": "Abilities" }] + } + }, + { + "id": "effect-skills", + "type": "object-list", + "title": "Skills granting this effect", + "icon": "School", + "content": { + "register": "larpinq", + "schema": "larping_skill", + "filter": { "effects": "@objectId" }, + "columns": [{ "key": "name", "label": "Skill" }], + "limit": 50, + "viewAllRoute": "Skills", + "viewAllQuery": { "effects": "@objectId" }, + "emptyText": "No skills grant this effect yet." + } + }, + { + "id": "effect-items", + "type": "object-list", + "title": "Items granting this effect", + "icon": "Package", + "content": { + "register": "larpinq", + "schema": "larping_item", + "filter": { "effects": "@objectId" }, + "columns": [{ "key": "name", "label": "Item" }], + "limit": 50, + "viewAllRoute": "Items", + "viewAllQuery": { "effects": "@objectId" }, + "emptyText": "No items grant this effect yet." + } + }, + { + "id": "effect-conditions", + "type": "object-list", + "title": "Conditions granting this effect", + "icon": "AlertCircleOutline", + "content": { + "register": "larpinq", + "schema": "condition", + "filter": { "effects": "@objectId" }, + "columns": [{ "key": "name", "label": "Condition" }], + "limit": 50, + "viewAllRoute": "Conditions", + "viewAllQuery": { "effects": "@objectId" }, + "emptyText": "No conditions grant this effect yet." + } + } ], "layout": [ - { "id": "1", "widgetId": "effect-data", "gridX": 0, "gridY": 0, "gridWidth": 8, "gridHeight": 3 }, - { "id": "2", "widgetId": "effect-modifier", "gridX": 8, "gridY": 0, "gridWidth": 4, "gridHeight": 3, "showTitle": false }, - { "id": "3", "widgetId": "effect-abilities", "gridX": 8, "gridY": 3, "gridWidth": 4, "gridHeight": 4 }, - { "id": "4", "widgetId": "effect-skills", "gridX": 0, "gridY": 3, "gridWidth": 4, "gridHeight": 4 }, - { "id": "5", "widgetId": "effect-items", "gridX": 4, "gridY": 3, "gridWidth": 4, "gridHeight": 4 }, - { "id": "6", "widgetId": "effect-conditions", "gridX": 0, "gridY": 7, "gridWidth": 8, "gridHeight": 4 } + { + "id": "1", + "widgetId": "effect-data", + "gridX": 0, + "gridY": 0, + "gridWidth": 8, + "gridHeight": 3 + }, + { + "id": "2", + "widgetId": "effect-modifier", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 3, + "showTitle": false + }, + { + "id": "3", + "widgetId": "effect-abilities", + "gridX": 8, + "gridY": 3, + "gridWidth": 4, + "gridHeight": 4 + }, + { + "id": "4", + "widgetId": "effect-skills", + "gridX": 0, + "gridY": 3, + "gridWidth": 4, + "gridHeight": 4 + }, + { + "id": "5", + "widgetId": "effect-items", + "gridX": 4, + "gridY": 3, + "gridWidth": 4, + "gridHeight": 4 + }, + { + "id": "6", + "widgetId": "effect-conditions", + "gridX": 0, + "gridY": 7, + "gridWidth": 8, + "gridHeight": 4 + } ], "sidebar": { "enabled": true, "showMetadata": true, "tabs": [ - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -408,7 +1525,11 @@ "route": "/events", "type": "index", "title": "Events", - "config": { "register": "larpinq", "schema": "larping_event", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "larping_event", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "EventDetail", @@ -421,36 +1542,232 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "Event = a LARP gathering where players bring their characters (session/meeting archetype). This is the one entity that communicates: the schema declares calendar, maps and forms linkedTypes (merged from the event-calendar-leaf / event-location-to-maps-leaf / event-signup-to-forms-leaf register fragments), so the body earns a calendar widget (scheduling the session from startDate/endDate), a location map, and the sign-up form, plus the participating characters (character.events contains @objectId) as the primary roster. The loose Attendees + XP-granted stat cards fold into one stats-block (rule 2, same-flavor simple KPIs) top-right. Post-event effects applied to attendees are shown via related. After the event, the XP awarding ritual produces one xpAward per grant (xpAward.event FK = @objectId), shown as an object-list — GM hand-awarded per xpAward's schema description, so allowCreate stays on. Files carries the event pack/handouts. All three declared leaves (calendar, maps, forms) are now body widgets — none are held back to sidebar tabs. The sidebar carries the Check-in tab (the event check-in roster, an app-registry section — see the sidebar _note) plus audit history. No email/talk: the schema declares calendar/maps/forms only.", "widgets": [ - { "id": "event-data", "type": "data", "title": "Event", "icon": "Calendar", "content": { "columns": 2 } }, - { "id": "event-stats-attendees", "type": "stats-block", "title": "Attendees", "icon": "AccountGroup", "content": { "entries": [ { "title": "Attendees", "register": "larpinq", "schema": "character", "metric": "count", "filter": { "events": "@objectId" } } ] } }, - { "id": "event-stats-xp-granted", "type": "stats-block", "title": "XP granted", "icon": "AccountGroup", "content": { "entries": [ { "title": "XP granted", "register": "larpinq", "schema": "xpAward", "metric": "sum", "field": "amount", "filter": { "event": "@objectId" } } ] } }, - { "id": "event-calendar", "type": "integration", "integrationId": "calendar", "title": "Schedule", "icon": "Calendar" }, - { "id": "event-effects", "type": "related", "title": "Post-event effects", "icon": "LinkVariant", "content": { "groups": [ { "key": "effects", "label": "Effects applied after event" } ] } }, - { "id": "event-maps", "type": "integration", "integrationId": "maps", "title": "Location", "icon": "MapMarker" }, - { "id": "event-forms", "type": "integration", "integrationId": "forms", "title": "Sign-up", "icon": "FileSign" }, - { "id": "event-roster", "type": "object-list", "title": "Participating characters", "icon": "AccountGroup", "content": { "register": "larpinq", "schema": "character", "filter": { "events": "@objectId" }, "columns": [ { "key": "name", "label": "Character" }, { "key": "ocName", "label": "Player" }, { "key": "type", "label": "Type" }, { "key": "approved", "label": "Approved" } ], "limit": 100, "viewAllRoute": "Characters", "viewAllQuery": { "events": "@objectId" }, "emptyText": "No characters registered yet." } }, - { "id": "event-xpawards", "type": "object-list", "title": "XP awards", "icon": "Trophy", "content": { "register": "larpinq", "schema": "xpAward", "filter": { "event": "@objectId" }, "sort": { "field": "awardedAt", "dir": "desc" }, "columns": [ { "key": "character", "label": "Character" }, { "key": "amount", "label": "XP" }, { "key": "reason", "label": "Reason" } ], "limit": 100, "viewAllRoute": "XpAwards", "viewAllQuery": { "event": "@objectId" }, "emptyText": "No XP granted yet." } }, - { "id": "event-files", "type": "integration", "integrationId": "files", "title": "Event pack", "icon": "FolderOutline" } + { + "id": "event-data", + "type": "data", + "title": "Event", + "icon": "Calendar", + "content": { "columns": 2 } + }, + { + "id": "event-stats-attendees", + "type": "stats-block", + "title": "Attendees", + "icon": "AccountGroup", + "content": { + "entries": [ + { + "title": "Attendees", + "register": "larpinq", + "schema": "character", + "metric": "count", + "filter": { "events": "@objectId" } + } + ] + } + }, + { + "id": "event-stats-xp-granted", + "type": "stats-block", + "title": "XP granted", + "icon": "AccountGroup", + "content": { + "entries": [ + { + "title": "XP granted", + "register": "larpinq", + "schema": "xpAward", + "metric": "sum", + "field": "amount", + "filter": { "event": "@objectId" } + } + ] + } + }, + { + "id": "event-calendar", + "type": "integration", + "integrationId": "calendar", + "title": "Schedule", + "icon": "Calendar" + }, + { + "id": "event-effects", + "type": "related", + "title": "Post-event effects", + "icon": "LinkVariant", + "content": { + "groups": [ + { + "key": "effects", + "label": "Effects applied after event" + } + ] + } + }, + { + "id": "event-maps", + "type": "integration", + "integrationId": "maps", + "title": "Location", + "icon": "MapMarker" + }, + { + "id": "event-forms", + "type": "integration", + "integrationId": "forms", + "title": "Sign-up", + "icon": "FileSign" + }, + { + "id": "event-roster", + "type": "object-list", + "title": "Participating characters", + "icon": "AccountGroup", + "content": { + "register": "larpinq", + "schema": "character", + "filter": { "events": "@objectId" }, + "columns": [ + { "key": "name", "label": "Character" }, + { "key": "ocName", "label": "Player" }, + { "key": "type", "label": "Type" }, + { "key": "approved", "label": "Approved" } + ], + "limit": 100, + "viewAllRoute": "Characters", + "viewAllQuery": { "events": "@objectId" }, + "emptyText": "No characters registered yet." + } + }, + { + "id": "event-xpawards", + "type": "object-list", + "title": "XP awards", + "icon": "Trophy", + "content": { + "register": "larpinq", + "schema": "xpAward", + "filter": { "event": "@objectId" }, + "sort": { "field": "awardedAt", "dir": "desc" }, + "columns": [ + { "key": "character", "label": "Character" }, + { "key": "amount", "label": "XP" }, + { "key": "reason", "label": "Reason" } + ], + "limit": 100, + "viewAllRoute": "XpAwards", + "viewAllQuery": { "event": "@objectId" }, + "emptyText": "No XP granted yet." + } + }, + { + "id": "event-files", + "type": "integration", + "integrationId": "files", + "title": "Event pack", + "icon": "FolderOutline" + } ], "layout": [ - { "id": "1", "widgetId": "event-data", "gridX": 0, "gridY": 0, "gridWidth": 8, "gridHeight": 4 }, - { "id": "2a", "widgetId": "event-stats-attendees", "gridX": 8, "gridY": 0, "gridWidth": 4, "gridHeight": 2 }, - { "id": "2b", "widgetId": "event-stats-xp-granted", "gridX": 8, "gridY": 2, "gridWidth": 4, "gridHeight": 2 }, - { "id": "4", "widgetId": "event-calendar", "gridX": 0, "gridY": 4, "gridWidth": 8, "gridHeight": 4 }, - { "id": "5", "widgetId": "event-effects", "gridX": 8, "gridY": 4, "gridWidth": 4, "gridHeight": 4 }, - { "id": "6", "widgetId": "event-maps", "gridX": 0, "gridY": 8, "gridWidth": 6, "gridHeight": 4 }, - { "id": "7", "widgetId": "event-forms", "gridX": 6, "gridY": 8, "gridWidth": 6, "gridHeight": 4 }, - { "id": "8", "widgetId": "event-roster", "gridX": 0, "gridY": 12, "gridWidth": 12, "gridHeight": 4 }, - { "id": "9", "widgetId": "event-xpawards", "gridX": 0, "gridY": 16, "gridWidth": 6, "gridHeight": 4 }, - { "id": "10", "widgetId": "event-files", "gridX": 6, "gridY": 16, "gridWidth": 6, "gridHeight": 4 } + { + "id": "1", + "widgetId": "event-data", + "gridX": 0, + "gridY": 0, + "gridWidth": 8, + "gridHeight": 4 + }, + { + "id": "2a", + "widgetId": "event-stats-attendees", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 2 + }, + { + "id": "2b", + "widgetId": "event-stats-xp-granted", + "gridX": 8, + "gridY": 2, + "gridWidth": 4, + "gridHeight": 2 + }, + { + "id": "4", + "widgetId": "event-calendar", + "gridX": 0, + "gridY": 4, + "gridWidth": 8, + "gridHeight": 4 + }, + { + "id": "5", + "widgetId": "event-effects", + "gridX": 8, + "gridY": 4, + "gridWidth": 4, + "gridHeight": 4 + }, + { + "id": "6", + "widgetId": "event-maps", + "gridX": 0, + "gridY": 8, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": "7", + "widgetId": "event-forms", + "gridX": 6, + "gridY": 8, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": "8", + "widgetId": "event-roster", + "gridX": 0, + "gridY": 12, + "gridWidth": 12, + "gridHeight": 4 + }, + { + "id": "9", + "widgetId": "event-xpawards", + "gridX": 0, + "gridY": 16, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": "10", + "widgetId": "event-files", + "gridX": 6, + "gridY": 16, + "gridWidth": 6, + "gridHeight": 4 + } ], "sidebar": { "enabled": true, "showMetadata": true, "_note": "The Check-in tab is the ONLY entry point to the event check-in roster. `component: \"EventRoster\"` resolves through CnObjectSidebar.resolveTabComponent(), which looks the string up in the v2 registry (src/registry.js — `EventRoster: { kind: 'section', component: ... }`) before falling back to the legacy customComponents map. The tab is handed `sharedTabProps` (objectId / objectType / register / schema / apiBase), which is where EventRoster.vue's `objectId` prop comes from. Do NOT confuse this with the `event-roster` BODY widget above: that one is a read-only `object-list` of participating characters and carries no check-in / no-show controls, which is why its presence hid the fact that the check-in surface was unreachable (#286). Pinned by tests/vitest/manifestRegistry.spec.js.", "tabs": [ - { "id": "checkin", "label": "Check-in", "icon": "AccountCheck", "component": "EventRoster" }, - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "checkin", + "label": "Check-in", + "icon": "AccountCheck", + "component": "EventRoster" + }, + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -461,7 +1778,11 @@ "type": "index", "_note": "The page id and route stay `Settings` / `/settings`: they are deep-link surface and the persisted OpenRegister property is still `setting`. Only the user-visible TITLE is renamed to `Worlds` — see the SettingDetail _note below for why.", "title": "Worlds", - "config": { "register": "larpinq", "schema": "setting", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "setting", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "SettingDetail", @@ -474,26 +1795,163 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "NAMING: the user-visible term for this entity is WORLD, never \"setting\". In LARP a setting is the game world; in a Nextcloud UI \"Setting\" means a preference, and every one of the 35 non-Dutch locales took the UI reading and translated it as Einstellung / Paramètre / Configuración. That is unfixable by retranslating, because one English source string cannot carry both meanings — so the ENGLISH WORD changed instead. The persisted OpenRegister property is still `setting` and the page id / route are still Settings / /settings; only labels moved. The schema's own summary already said \"A LARP world / campaign\" and its icon was already Earth. WHAT THIS PAGE IS: a world/campaign that scopes the roster and rules (config/container archetype). Most game entities carry an optional 'setting' UUID that points here, so this page is a scoping dashboard: the definition + active/archived status (data) sits beside a stats-block (characters + events counts, folded from two loose KPIs per rule 2), then object-lists roll up everything scoped to this campaign — characters and events (each filtered where setting = @objectId). Related surfaces any other scoped mechanics. A pure configuration container: no comms, no files.", "widgets": [ - { "id": "setting-data", "type": "data", "title": "World", "icon": "Earth", "content": { "columns": 1 } }, - { "id": "setting-stats-characters", "type": "stats-block", "title": "Characters", "icon": "ChartBar", "content": { "entries": [ { "title": "Characters", "register": "larpinq", "schema": "character", "metric": "count", "filter": { "setting": "@objectId" }, "route": { "name": "Characters", "query": { "setting": "@objectId" } } } ] } }, - { "id": "setting-stats-events", "type": "stats-block", "title": "Events", "icon": "ChartBar", "content": { "entries": [ { "title": "Events", "register": "larpinq", "schema": "larping_event", "metric": "count", "filter": { "setting": "@objectId" }, "route": { "name": "Events", "query": { "setting": "@objectId" } } } ] } }, - { "id": "setting-characters", "type": "object-list", "title": "Characters in this world", "icon": "AccountGroup", "content": { "register": "larpinq", "schema": "character", "filter": { "setting": "@objectId" }, "columns": [ { "key": "name", "label": "Character" }, { "key": "type", "label": "Type" }, { "key": "approved", "label": "Approved" } ], "limit": 100, "viewAllRoute": "Characters", "viewAllQuery": { "setting": "@objectId" }, "emptyText": "No characters in this world yet." } }, - { "id": "setting-events", "type": "object-list", "title": "Events in this world", "icon": "Calendar", "content": { "register": "larpinq", "schema": "larping_event", "filter": { "setting": "@objectId" }, "sort": { "field": "startDate", "dir": "desc" }, "columns": [ { "key": "name", "label": "Event" }, { "key": "startDate", "label": "Starts" }, { "key": "location", "label": "Location" } ], "limit": 100, "viewAllRoute": "Events", "viewAllQuery": { "setting": "@objectId" }, "emptyText": "No events in this world yet." } }, - { "id": "setting-related", "type": "related", "title": "Related", "icon": "LinkVariant" } + { + "id": "setting-data", + "type": "data", + "title": "World", + "icon": "Earth", + "content": { "columns": 1 } + }, + { + "id": "setting-stats-characters", + "type": "stats-block", + "title": "Characters", + "icon": "ChartBar", + "content": { + "entries": [ + { + "title": "Characters", + "register": "larpinq", + "schema": "character", + "metric": "count", + "filter": { "setting": "@objectId" }, + "route": { + "name": "Characters", + "query": { "setting": "@objectId" } + } + } + ] + } + }, + { + "id": "setting-stats-events", + "type": "stats-block", + "title": "Events", + "icon": "ChartBar", + "content": { + "entries": [ + { + "title": "Events", + "register": "larpinq", + "schema": "larping_event", + "metric": "count", + "filter": { "setting": "@objectId" }, + "route": { + "name": "Events", + "query": { "setting": "@objectId" } + } + } + ] + } + }, + { + "id": "setting-characters", + "type": "object-list", + "title": "Characters in this world", + "icon": "AccountGroup", + "content": { + "register": "larpinq", + "schema": "character", + "filter": { "setting": "@objectId" }, + "columns": [ + { "key": "name", "label": "Character" }, + { "key": "type", "label": "Type" }, + { "key": "approved", "label": "Approved" } + ], + "limit": 100, + "viewAllRoute": "Characters", + "viewAllQuery": { "setting": "@objectId" }, + "emptyText": "No characters in this world yet." + } + }, + { + "id": "setting-events", + "type": "object-list", + "title": "Events in this world", + "icon": "Calendar", + "content": { + "register": "larpinq", + "schema": "larping_event", + "filter": { "setting": "@objectId" }, + "sort": { "field": "startDate", "dir": "desc" }, + "columns": [ + { "key": "name", "label": "Event" }, + { "key": "startDate", "label": "Starts" }, + { "key": "location", "label": "Location" } + ], + "limit": 100, + "viewAllRoute": "Events", + "viewAllQuery": { "setting": "@objectId" }, + "emptyText": "No events in this world yet." + } + }, + { + "id": "setting-related", + "type": "related", + "title": "Related", + "icon": "LinkVariant" + } ], "layout": [ - { "id": "1", "widgetId": "setting-data", "gridX": 0, "gridY": 0, "gridWidth": 8, "gridHeight": 4 }, - { "id": "2a", "widgetId": "setting-stats-characters", "gridX": 8, "gridY": 0, "gridWidth": 4, "gridHeight": 2 }, - { "id": "2b", "widgetId": "setting-stats-events", "gridX": 8, "gridY": 2, "gridWidth": 4, "gridHeight": 2 }, - { "id": "4", "widgetId": "setting-characters", "gridX": 0, "gridY": 4, "gridWidth": 6, "gridHeight": 4 }, - { "id": "5", "widgetId": "setting-events", "gridX": 6, "gridY": 4, "gridWidth": 6, "gridHeight": 4 }, - { "id": "6", "widgetId": "setting-related", "gridX": 0, "gridY": 8, "gridWidth": 12, "gridHeight": 3 } + { + "id": "1", + "widgetId": "setting-data", + "gridX": 0, + "gridY": 0, + "gridWidth": 8, + "gridHeight": 4 + }, + { + "id": "2a", + "widgetId": "setting-stats-characters", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 2 + }, + { + "id": "2b", + "widgetId": "setting-stats-events", + "gridX": 8, + "gridY": 2, + "gridWidth": 4, + "gridHeight": 2 + }, + { + "id": "4", + "widgetId": "setting-characters", + "gridX": 0, + "gridY": 4, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": "5", + "widgetId": "setting-events", + "gridX": 6, + "gridY": 4, + "gridWidth": 6, + "gridHeight": 4 + }, + { + "id": "6", + "widgetId": "setting-related", + "gridX": 0, + "gridY": 8, + "gridWidth": 12, + "gridHeight": 3 + } ], "sidebar": { "enabled": true, "showMetadata": true, "tabs": [ - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -503,7 +1961,11 @@ "route": "/xp-awards", "type": "index", "title": "XP Awards", - "config": { "register": "larpinq", "schema": "xpAward", "documentationUrl": "https://larpinq.conduction.nl" } + "config": { + "register": "larpinq", + "schema": "xpAward", + "documentationUrl": "https://larpinq.conduction.nl" + } }, { "id": "XpAwardDetail", @@ -516,20 +1978,81 @@ "documentationUrl": "https://larpinq.conduction.nl", "_note": "XP Award = a single audited grant of experience to one character for one event (log/ledger-record archetype). GM-write-only, effectively append-only, so the page is read-oriented: the full grant record (amount, reason, awardedBy, awardedAt — data, single column for readability) beside a bold amount stat card, with a related rail linking straight to the two FK parents (the event it was earned at and the character who received it) so a reviewer can jump up the chain. No object-lists, no comms, no files — a ledger line has no children and nothing to communicate.", "widgets": [ - { "id": "xpaward-data", "type": "data", "title": "Award record", "icon": "ClipboardList", "content": { "columns": 1 } }, - { "id": "xpaward-amount", "type": "stat", "title": "XP", "icon": "Trophy", "content": { "label": "XP awarded", "icon": "Trophy", "format": { "style": "number" }, "source": { "register": "larpinq", "schema": "xpAward", "metric": "sum", "field": "amount", "filter": { "id": "@objectId" } } } }, - { "id": "xpaward-related", "type": "related", "title": "Event & character", "icon": "LinkVariant", "content": { "groups": [ { "key": "event", "label": "Event" }, { "key": "character", "label": "Character" } ] } } + { + "id": "xpaward-data", + "type": "data", + "title": "Award record", + "icon": "ClipboardList", + "content": { "columns": 1 } + }, + { + "id": "xpaward-amount", + "type": "stat", + "title": "XP", + "icon": "Trophy", + "content": { + "label": "XP awarded", + "icon": "Trophy", + "format": { "style": "number" }, + "source": { + "register": "larpinq", + "schema": "xpAward", + "metric": "sum", + "field": "amount", + "filter": { "id": "@objectId" } + } + } + }, + { + "id": "xpaward-related", + "type": "related", + "title": "Event & character", + "icon": "LinkVariant", + "content": { + "groups": [ + { "key": "event", "label": "Event" }, + { "key": "character", "label": "Character" } + ] + } + } ], "layout": [ - { "id": "1", "widgetId": "xpaward-data", "gridX": 0, "gridY": 0, "gridWidth": 8, "gridHeight": 4 }, - { "id": "2", "widgetId": "xpaward-amount", "gridX": 8, "gridY": 0, "gridWidth": 4, "gridHeight": 2, "showTitle": false }, - { "id": "3", "widgetId": "xpaward-related", "gridX": 8, "gridY": 2, "gridWidth": 4, "gridHeight": 2 } + { + "id": "1", + "widgetId": "xpaward-data", + "gridX": 0, + "gridY": 0, + "gridWidth": 8, + "gridHeight": 4 + }, + { + "id": "2", + "widgetId": "xpaward-amount", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "3", + "widgetId": "xpaward-related", + "gridX": 8, + "gridY": 2, + "gridWidth": 4, + "gridHeight": 2 + } ], "sidebar": { "enabled": true, "showMetadata": true, "tabs": [ - { "id": "audit", "label": "History", "icon": "History", "widgets": [ { "type": "audit" } ] } + { + "id": "audit", + "label": "History", + "icon": "History", + "widgets": [{ "type": "audit" }] + } ] } } @@ -541,7 +2064,11 @@ "title": "Game Settings", "config": { "sections": [ - { "id": "general", "title": "General", "component": "GameSettingsSection" } + { + "id": "general", + "title": "General", + "component": "GameSettingsSection" + } ] } }, diff --git a/tests/e2e/spec-coverage/settings-roadmap.spec.ts b/tests/e2e/spec-coverage/settings-roadmap.spec.ts index 6b20f16e..4b7752a8 100644 --- a/tests/e2e/spec-coverage/settings-roadmap.spec.ts +++ b/tests/e2e/spec-coverage/settings-roadmap.spec.ts @@ -51,7 +51,14 @@ async function openRoute(page: Page, route: string): Promise { await dismissSupportDialog(page) // Path, not hash. Anchored at the end so `/features-roadmap` cannot be // satisfied by some longer route that merely contains it. - await expect(page).toHaveURL(new RegExp(`${route.replace(/\//g, '\\/')}$`)) + // Escape the whole regex metacharacter set, not just `/`. Escaping slashes + // alone leaves `.`, `?`, `+`, `(` and backslash live in the pattern, which + // CodeQL reports as js/incomplete-sanitization (high). Today's routes are + // literals so nothing is exploitable, but a route containing `.` would + // silently match more than it names. + await expect(page).toHaveURL( + new RegExp(`${route.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`), + ) await expect(page.locator('.app-content')).toBeVisible({ timeout: 10_000 }) } From de14fd6754e9dc2fa59e1144adee246e9e5aeacc Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Wed, 2 Sep 2026 20:08:48 +0200 Subject: [PATCH 28/35] Takes nextcloud-vue 2.31.1 so a hovered KPI tile stops drawing a card inside (#674) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit its own card. ⚠️ THE CAUSE IS AN INSET, NOT A COMPONENT. A card widget renders `flush` and then has its padding put BACK by the card-fit rule (`padding: 8px 14px`), so the KPI sits inside the wrapper while the WRAPPER draws the border, radius and background the user reads as "the card". The library's `--clickable:hover` rule then drew a 2px border and a drop shadow on the KPI itself, 8-14px in from the edge being hovered. Measured live on dossiq, while genuinely hovered: the tile carried a 2px rgb(0,103,158) border and its own shadow, inset 9px from the wrapper's top and 15px from its left. A non-card-fit tile sits at 1px, so its border lands on the wrapper's own edge and reads as one card. That inset is the whole difference, which is why it looked app-specific and was not. nextcloud-vue#932 moves the affordance to the wrapper. No layout change: nothing moves, one card outlines. Verified in the browser with a real pointer hover: before inner 2px rgb(0,103,158) + shadow wrapper grey, no shadow after inner transparent, no shadow wrapper rgb(0,103,158) + shadow Every app with clickable stat, gauge or delta tiles had this. This bump is one of the fleet sweep that clears it. Dependency change only: package.json and the nextcloud-vue entry in package-lock.json. Co-authored-by: Conduction Release Bot --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12a9aad1..57d36e01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.20", "license": "EUPL-1.2", "dependencies": { - "@conduction/nextcloud-vue": "^2.24.3", + "@conduction/nextcloud-vue": "^2.31.1", "@nextcloud/auth": "^2.5.0", "@nextcloud/axios": "~2.5.2", "@nextcloud/capabilities": "^1.2.1", @@ -1829,9 +1829,9 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.27.2.tgz", - "integrity": "sha512-FhDF3FvM+ee0Jx7z70Lki7o7Mm4DeX/GsOqHo33hOcdylzXR63UXLRbxKMedodEiIqgOFUAI6GTox735iyL8Dw==", + "version": "2.31.1", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.31.1.tgz", + "integrity": "sha512-tF1/7yNaBgxj5iHhpNuxVdUrPugfy2ePQZILl7y+fFJTq68tR7WPs8EqPin8aaCBc6ZxgWp1ciyY+NW9rXBMYA==", "license": "EUPL-1.2", "dependencies": { "@ckpack/vue-color": "^1.6.0", diff --git a/package.json b/package.json index 768ace2f..2312afad 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "extends @nextcloud/browserslist-config" ], "dependencies": { - "@conduction/nextcloud-vue": "^2.24.3", + "@conduction/nextcloud-vue": "^2.31.1", "@nextcloud/auth": "^2.5.0", "@nextcloud/axios": "~2.5.2", "@nextcloud/capabilities": "^1.2.1", From 3a6b56632b3ba7a75c71353de34274536479882d Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Thu, 3 Sep 2026 14:51:45 +0200 Subject: [PATCH 29/35] fix(ci): a standing release PR ran every development push twice Every push to development fired Code Quality TWICE on the same commit: once for the push event, once for the pull_request event of the permanently-open "Release: merge development into beta", whose head_ref IS development. The concurrency block is not the bug and must not be changed: it suffixes the group by event name deliberately so the push run is NOT cancelled by the PR run, because the push run is the only carrier of Coverage Baseline Check, SBOM and Features Extract. The consequence is that both lanes run to completion, so the duplicate has to be dropped at the job. The PR run is the one to drop: its head sha IS development's, which the push run already decided, and it runs strictly fewer jobs. Not done by removing `beta` from pull_request.branches, though that would also stop it: the release/v* and sync/main-to-beta PRs target beta too and genuinely need their run. Only the head_ref:development PR is redundant. A development -> main promotion PR is skipped by the same clause, for the same reason and just as correctly. Proven on openregister#3370 before rolling out: run 33757014196 (pull_request, sha 4f3ef5e9) completed as `skipped` with ZERO jobs in 72s, while the push run for the same sha ran the full suite. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/code-quality.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index ab396476..d327ea4f 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -98,6 +98,7 @@ permissions: jobs: quality: + if: (github.event_name != 'pull_request' || github.head_ref != 'development') # ConductionNL, NOT Conduction. e2faa092 ("org rename") pointed all eight # reusable-workflow calls in this repo at `Conduction/.github`, which # Actions cannot resolve — so from 2026-06-01 every run of this workflow From 85afbbfc3fe1c8b01aaacb90186f115aad7ac51b Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Thu, 3 Sep 2026 19:52:58 +0200 Subject: [PATCH 30/35] feat(chrome): give larpinq a Reports page with three declarative reports ADR-114 puts Documentation, Reports and Features & roadmap in the footer in that order. Larpinq had two of the three, at 90 and 91, which left no room between them, so the roadmap moves to 100 rather than squeezing Reports in. ADR-114 fixes the sequence; the numbers stay the app's. Character roster, Progression and World content are declarative type:dashboard pages over the app's own register. No bespoke Vue component and no per-app controller: the stat, chart and object-table widgets already read OpenRegister directly, so a starter report is a manifest change. The schema slug is NOT the seed key here. `event` is registered as `larping_event` and `skill` as `larping_skill`, because slugs are global on a shared OpenRegister and pipelinq also ships a `skill`. A widget naming the key renders an empty card and says nothing, so the e2e asserts a number reaches the page rather than only that the card exists. Every filter is scalar equality, the only kind OpenRegister's aggregation endpoint can evaluate. The two world donuts group by an ARRAY property on character and resolve their bucket labels through labelResolve, the same shape the Dashboard's skill-usage chart already uses: that is what answers what characters actually carry, which counting items cannot. Twenty-one strings across 36 locales. Parity passes on development and still passes here. --- l10n/be.js | 35 +- l10n/be.json | 35 +- l10n/bg.js | 35 +- l10n/bg.json | 35 +- l10n/bs.js | 35 +- l10n/bs.json | 35 +- l10n/ca.js | 35 +- l10n/ca.json | 35 +- l10n/cs.js | 35 +- l10n/cs.json | 35 +- l10n/da.js | 35 +- l10n/da.json | 35 +- l10n/de.js | 35 +- l10n/de.json | 35 +- l10n/el.js | 35 +- l10n/el.json | 35 +- l10n/es.js | 35 +- l10n/es.json | 35 +- l10n/et.js | 35 +- l10n/et.json | 35 +- l10n/fi.js | 35 +- l10n/fi.json | 35 +- l10n/fr.js | 35 +- l10n/fr.json | 35 +- l10n/ga.js | 35 +- l10n/ga.json | 35 +- l10n/hr.js | 35 +- l10n/hr.json | 35 +- l10n/hu.js | 35 +- l10n/hu.json | 35 +- l10n/is.js | 35 +- l10n/is.json | 35 +- l10n/it.js | 35 +- l10n/it.json | 35 +- l10n/lb.js | 35 +- l10n/lb.json | 35 +- l10n/lt.js | 35 +- l10n/lt.json | 35 +- l10n/lv.js | 35 +- l10n/lv.json | 35 +- l10n/mk.js | 35 +- l10n/mk.json | 35 +- l10n/mt.js | 35 +- l10n/mt.json | 35 +- l10n/nb.js | 35 +- l10n/nb.json | 35 +- l10n/nl.js | 35 +- l10n/nl.json | 35 +- l10n/pl.js | 35 +- l10n/pl.json | 35 +- l10n/pt.js | 35 +- l10n/pt.json | 35 +- l10n/rm.js | 35 +- l10n/rm.json | 35 +- l10n/ro.js | 35 +- l10n/ro.json | 35 +- l10n/ru.js | 35 +- l10n/ru.json | 35 +- l10n/sk.js | 35 +- l10n/sk.json | 35 +- l10n/sl.js | 35 +- l10n/sl.json | 35 +- l10n/sq.js | 35 +- l10n/sq.json | 35 +- l10n/sr.js | 35 +- l10n/sr.json | 35 +- l10n/sv.js | 35 +- l10n/sv.json | 35 +- l10n/tr.js | 35 +- l10n/tr.json | 35 +- l10n/uk.js | 35 +- l10n/uk.json | 35 +- src/icons.js | 2 + src/manifest.json | 613 ++++++++++++++++++++++++++++++++++- tests/e2e/app-chrome.spec.ts | 116 +++++++ 75 files changed, 3178 insertions(+), 73 deletions(-) create mode 100644 tests/e2e/app-chrome.spec.ts diff --git a/l10n/be.js b/l10n/be.js index 9bfee6d7..f6e25f6c 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Унікальны артэфакт", "Unique Condition": "Унікальны стан", "XP Amount": "Колькасць пунктаў вопыту", - "XP Award": "Налічэнне пунктаў вопыту" + "XP Award": "Налічэнне пунктаў вопыту", + "Reports": "Справаздачы", + "Pick a report to open it.": "Выберыце справаздачу, каб адкрыць яе.", + "Open": "Адкрыта", + "In progress": "У працы", + "Blocked": "Заблакіравана", + "Date": "Дата", + "Due": "Тэрмін", + "Assignee": "Прызначана", + "Who": "Хто", + "What": "Што", + "Minutes": "Хвіліны", + "Entries": "Запісы", + "Most recent": "Найноўшыя", + "Per person": "На асобу", + "By status": "Па статусе", + "By priority": "Па прыярытэце", + "Character roster": "Спіс персанажаў", + "Progression": "Прагрэс", + "World content": "Змест свету", + "Awaiting approval": "Чакае ўхвалення", + "Player characters": "Персанажы гульцоў", + "Awards": "Узнагароджанні", + "Experience": "Досвед", + "Experience awarded": "Налічаны досвед", + "Per character": "На персанажа", + "By type": "Па тыпе", + "By approval": "Па ўхваленні", + "Items carried by characters": "Прадметы, якія нясуць персанажы", + "Conditions on characters": "Станы персанажаў", + "Nothing awarded yet": "Яшчэ нічога не налічана", + "Who is playing what, and what is still waiting for approval.": "Хто што грае і што яшчэ чакае ўхвалення.", + "Experience awarded, and who earned it.": "Налічаны досвед і хто яго зарабіў.", + "How much the world holds, and what characters actually carry.": "Колькі змяшчае свет і што персанажы сапраўды нясуць." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/be.json b/l10n/be.json index e994ad25..69368ed3 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -222,7 +222,40 @@ "Unique Artifact": "Унікальны артэфакт", "Unique Condition": "Унікальны стан", "XP Amount": "Колькасць пунктаў вопыту", - "XP Award": "Налічэнне пунктаў вопыту" + "XP Award": "Налічэнне пунктаў вопыту", + "Reports": "Справаздачы", + "Pick a report to open it.": "Выберыце справаздачу, каб адкрыць яе.", + "Open": "Адкрыта", + "In progress": "У працы", + "Blocked": "Заблакіравана", + "Date": "Дата", + "Due": "Тэрмін", + "Assignee": "Прызначана", + "Who": "Хто", + "What": "Што", + "Minutes": "Хвіліны", + "Entries": "Запісы", + "Most recent": "Найноўшыя", + "Per person": "На асобу", + "By status": "Па статусе", + "By priority": "Па прыярытэце", + "Character roster": "Спіс персанажаў", + "Progression": "Прагрэс", + "World content": "Змест свету", + "Awaiting approval": "Чакае ўхвалення", + "Player characters": "Персанажы гульцоў", + "Awards": "Узнагароджанні", + "Experience": "Досвед", + "Experience awarded": "Налічаны досвед", + "Per character": "На персанажа", + "By type": "Па тыпе", + "By approval": "Па ўхваленні", + "Items carried by characters": "Прадметы, якія нясуць персанажы", + "Conditions on characters": "Станы персанажаў", + "Nothing awarded yet": "Яшчэ нічога не налічана", + "Who is playing what, and what is still waiting for approval.": "Хто што грае і што яшчэ чакае ўхвалення.", + "Experience awarded, and who earned it.": "Налічаны досвед і хто яго зарабіў.", + "How much the world holds, and what characters actually carry.": "Колькі змяшчае свет і што персанажы сапраўды нясуць." }, "plurals": {} } diff --git a/l10n/bg.js b/l10n/bg.js index f7c6dc13..6a2fb549 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Уникален артефакт", "Unique Condition": "Уникално състояние", "XP Amount": "Брой точки опит", - "XP Award": "Присъждане на точки опит" + "XP Award": "Присъждане на точки опит", + "Reports": "Отчети", + "Pick a report to open it.": "Изберете отчет, за да го отворите.", + "Open": "Отворени", + "In progress": "В процес", + "Blocked": "Блокирани", + "Date": "Дата", + "Due": "Краен срок", + "Assignee": "Възложено на", + "Who": "Кой", + "What": "Какво", + "Minutes": "Минути", + "Entries": "Записи", + "Most recent": "Най-скорошни", + "Per person": "На човек", + "By status": "По статус", + "By priority": "По приоритет", + "Character roster": "Списък с герои", + "Progression": "Развитие", + "World content": "Съдържание на света", + "Awaiting approval": "Чака одобрение", + "Player characters": "Герои на играчи", + "Awards": "Награди", + "Experience": "Опит", + "Experience awarded": "Присъден опит", + "Per character": "На герой", + "By type": "По тип", + "By approval": "По одобрение", + "Items carried by characters": "Предмети, носени от героите", + "Conditions on characters": "Състояния на героите", + "Nothing awarded yet": "Още нищо не е присъдено", + "Who is playing what, and what is still waiting for approval.": "Кой какво играе и какво още чака одобрение.", + "Experience awarded, and who earned it.": "Присъденият опит и кой го е спечелил.", + "How much the world holds, and what characters actually carry.": "Колко съдържа светът и какво наистина носят героите." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bg.json b/l10n/bg.json index 569466c4..4fb23644 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -222,7 +222,40 @@ "Unique Artifact": "Уникален артефакт", "Unique Condition": "Уникално състояние", "XP Amount": "Брой точки опит", - "XP Award": "Присъждане на точки опит" + "XP Award": "Присъждане на точки опит", + "Reports": "Отчети", + "Pick a report to open it.": "Изберете отчет, за да го отворите.", + "Open": "Отворени", + "In progress": "В процес", + "Blocked": "Блокирани", + "Date": "Дата", + "Due": "Краен срок", + "Assignee": "Възложено на", + "Who": "Кой", + "What": "Какво", + "Minutes": "Минути", + "Entries": "Записи", + "Most recent": "Най-скорошни", + "Per person": "На човек", + "By status": "По статус", + "By priority": "По приоритет", + "Character roster": "Списък с герои", + "Progression": "Развитие", + "World content": "Съдържание на света", + "Awaiting approval": "Чака одобрение", + "Player characters": "Герои на играчи", + "Awards": "Награди", + "Experience": "Опит", + "Experience awarded": "Присъден опит", + "Per character": "На герой", + "By type": "По тип", + "By approval": "По одобрение", + "Items carried by characters": "Предмети, носени от героите", + "Conditions on characters": "Състояния на героите", + "Nothing awarded yet": "Още нищо не е присъдено", + "Who is playing what, and what is still waiting for approval.": "Кой какво играе и какво още чака одобрение.", + "Experience awarded, and who earned it.": "Присъденият опит и кой го е спечелил.", + "How much the world holds, and what characters actually carry.": "Колко съдържа светът и какво наистина носят героите." }, "plurals": {} } diff --git a/l10n/bs.js b/l10n/bs.js index 1f1e42b4..e1d31be3 100644 --- a/l10n/bs.js +++ b/l10n/bs.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Jedinstveni artefakt", "Unique Condition": "Jedinstveno stanje", "XP Amount": "Broj bodova iskustva", - "XP Award": "Dodjela bodova iskustva" + "XP Award": "Dodjela bodova iskustva", + "Reports": "Izvještaji", + "Pick a report to open it.": "Odaberite izvještaj da biste ga otvorili.", + "Open": "Otvoreno", + "In progress": "U toku", + "Blocked": "Blokirano", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodijeljeno", + "Who": "Ko", + "What": "Šta", + "Minutes": "Minute", + "Entries": "Unosi", + "Most recent": "Najnovije", + "Per person": "Po osobi", + "By status": "Po statusu", + "By priority": "Po prioritetu", + "Character roster": "Spisak likova", + "Progression": "Napredak", + "World content": "Sadržaj svijeta", + "Awaiting approval": "Čeka odobrenje", + "Player characters": "Likovi igrača", + "Awards": "Dodjele", + "Experience": "Iskustvo", + "Experience awarded": "Dodijeljeno iskustvo", + "Per character": "Po liku", + "By type": "Po tipu", + "By approval": "Po odobrenju", + "Items carried by characters": "Predmeti koje likovi nose", + "Conditions on characters": "Stanja na likovima", + "Nothing awarded yet": "Još ništa nije dodijeljeno", + "Who is playing what, and what is still waiting for approval.": "Ko šta igra i šta još čeka odobrenje.", + "Experience awarded, and who earned it.": "Dodijeljeno iskustvo i ko ga je zaradio.", + "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i šta likovi zaista nose." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bs.json b/l10n/bs.json index 56787d60..c7590be0 100644 --- a/l10n/bs.json +++ b/l10n/bs.json @@ -222,7 +222,40 @@ "Unique Artifact": "Jedinstveni artefakt", "Unique Condition": "Jedinstveno stanje", "XP Amount": "Broj bodova iskustva", - "XP Award": "Dodjela bodova iskustva" + "XP Award": "Dodjela bodova iskustva", + "Reports": "Izvještaji", + "Pick a report to open it.": "Odaberite izvještaj da biste ga otvorili.", + "Open": "Otvoreno", + "In progress": "U toku", + "Blocked": "Blokirano", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodijeljeno", + "Who": "Ko", + "What": "Šta", + "Minutes": "Minute", + "Entries": "Unosi", + "Most recent": "Najnovije", + "Per person": "Po osobi", + "By status": "Po statusu", + "By priority": "Po prioritetu", + "Character roster": "Spisak likova", + "Progression": "Napredak", + "World content": "Sadržaj svijeta", + "Awaiting approval": "Čeka odobrenje", + "Player characters": "Likovi igrača", + "Awards": "Dodjele", + "Experience": "Iskustvo", + "Experience awarded": "Dodijeljeno iskustvo", + "Per character": "Po liku", + "By type": "Po tipu", + "By approval": "Po odobrenju", + "Items carried by characters": "Predmeti koje likovi nose", + "Conditions on characters": "Stanja na likovima", + "Nothing awarded yet": "Još ništa nije dodijeljeno", + "Who is playing what, and what is still waiting for approval.": "Ko šta igra i šta još čeka odobrenje.", + "Experience awarded, and who earned it.": "Dodijeljeno iskustvo i ko ga je zaradio.", + "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i šta likovi zaista nose." }, "plurals": {} } diff --git a/l10n/ca.js b/l10n/ca.js index 4c64d895..50974b09 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Artefacte únic", "Unique Condition": "Condició única", "XP Amount": "Quantitat de punts d'experiència", - "XP Award": "Concessió de punts d'experiència" + "XP Award": "Concessió de punts d'experiència", + "Reports": "Informes", + "Pick a report to open it.": "Trieu un informe per obrir-lo.", + "Open": "Obert", + "In progress": "En curs", + "Blocked": "Bloquejat", + "Date": "Data", + "Due": "Venciment", + "Assignee": "Assignat a", + "Who": "Qui", + "What": "Què", + "Minutes": "Minuts", + "Entries": "Entrades", + "Most recent": "Més recents", + "Per person": "Per persona", + "By status": "Per estat", + "By priority": "Per prioritat", + "Character roster": "Llista de personatges", + "Progression": "Progressió", + "World content": "Contingut del món", + "Awaiting approval": "Pendent d'aprovació", + "Player characters": "Personatges jugadors", + "Awards": "Concessions", + "Experience": "Experiència", + "Experience awarded": "Experiència concedida", + "Per character": "Per personatge", + "By type": "Per tipus", + "By approval": "Per aprovació", + "Items carried by characters": "Objectes que porten els personatges", + "Conditions on characters": "Estats als personatges", + "Nothing awarded yet": "Encara no s'ha concedit res", + "Who is playing what, and what is still waiting for approval.": "Qui juga a què, i què encara espera aprovació.", + "Experience awarded, and who earned it.": "L'experiència concedida i qui l'ha guanyada.", + "How much the world holds, and what characters actually carry.": "Quant conté el món, i què porten realment els personatges." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ca.json b/l10n/ca.json index 12afcf5d..2a8311df 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -222,7 +222,40 @@ "Unique Artifact": "Artefacte únic", "Unique Condition": "Condició única", "XP Amount": "Quantitat de punts d'experiència", - "XP Award": "Concessió de punts d'experiència" + "XP Award": "Concessió de punts d'experiència", + "Reports": "Informes", + "Pick a report to open it.": "Trieu un informe per obrir-lo.", + "Open": "Obert", + "In progress": "En curs", + "Blocked": "Bloquejat", + "Date": "Data", + "Due": "Venciment", + "Assignee": "Assignat a", + "Who": "Qui", + "What": "Què", + "Minutes": "Minuts", + "Entries": "Entrades", + "Most recent": "Més recents", + "Per person": "Per persona", + "By status": "Per estat", + "By priority": "Per prioritat", + "Character roster": "Llista de personatges", + "Progression": "Progressió", + "World content": "Contingut del món", + "Awaiting approval": "Pendent d'aprovació", + "Player characters": "Personatges jugadors", + "Awards": "Concessions", + "Experience": "Experiència", + "Experience awarded": "Experiència concedida", + "Per character": "Per personatge", + "By type": "Per tipus", + "By approval": "Per aprovació", + "Items carried by characters": "Objectes que porten els personatges", + "Conditions on characters": "Estats als personatges", + "Nothing awarded yet": "Encara no s'ha concedit res", + "Who is playing what, and what is still waiting for approval.": "Qui juga a què, i què encara espera aprovació.", + "Experience awarded, and who earned it.": "L'experiència concedida i qui l'ha guanyada.", + "How much the world holds, and what characters actually carry.": "Quant conté el món, i què porten realment els personatges." }, "plurals": {} } diff --git a/l10n/cs.js b/l10n/cs.js index 75ba4a52..8432b22d 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Jedinečný artefakt", "Unique Condition": "Jedinečný stav", "XP Amount": "Počet zkušenostních bodů", - "XP Award": "Udělení zkušenostních bodů" + "XP Award": "Udělení zkušenostních bodů", + "Reports": "Sestavy", + "Pick a report to open it.": "Vyberte sestavu, kterou chcete otevřít.", + "Open": "Otevřené", + "In progress": "Probíhá", + "Blocked": "Blokováno", + "Date": "Datum", + "Due": "Termín", + "Assignee": "Přiřazeno", + "Who": "Kdo", + "What": "Co", + "Minutes": "Minuty", + "Entries": "Záznamy", + "Most recent": "Nejnovější", + "Per person": "Na osobu", + "By status": "Podle stavu", + "By priority": "Podle priority", + "Character roster": "Seznam postav", + "Progression": "Postup", + "World content": "Obsah světa", + "Awaiting approval": "Čeká na schválení", + "Player characters": "Postavy hráčů", + "Awards": "Udělení", + "Experience": "Zkušenosti", + "Experience awarded": "Udělené zkušenosti", + "Per character": "Na postavu", + "By type": "Podle typu", + "By approval": "Podle schválení", + "Items carried by characters": "Předměty nesené postavami", + "Conditions on characters": "Stavy na postavách", + "Nothing awarded yet": "Zatím nic uděleno", + "Who is playing what, and what is still waiting for approval.": "Kdo hraje co a co ještě čeká na schválení.", + "Experience awarded, and who earned it.": "Udělené zkušenosti a kdo si je vysloužil.", + "How much the world holds, and what characters actually carry.": "Kolik svět obsahuje a co postavy skutečně nesou." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/cs.json b/l10n/cs.json index 52f281fb..8ef50a22 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -222,7 +222,40 @@ "Unique Artifact": "Jedinečný artefakt", "Unique Condition": "Jedinečný stav", "XP Amount": "Počet zkušenostních bodů", - "XP Award": "Udělení zkušenostních bodů" + "XP Award": "Udělení zkušenostních bodů", + "Reports": "Sestavy", + "Pick a report to open it.": "Vyberte sestavu, kterou chcete otevřít.", + "Open": "Otevřené", + "In progress": "Probíhá", + "Blocked": "Blokováno", + "Date": "Datum", + "Due": "Termín", + "Assignee": "Přiřazeno", + "Who": "Kdo", + "What": "Co", + "Minutes": "Minuty", + "Entries": "Záznamy", + "Most recent": "Nejnovější", + "Per person": "Na osobu", + "By status": "Podle stavu", + "By priority": "Podle priority", + "Character roster": "Seznam postav", + "Progression": "Postup", + "World content": "Obsah světa", + "Awaiting approval": "Čeká na schválení", + "Player characters": "Postavy hráčů", + "Awards": "Udělení", + "Experience": "Zkušenosti", + "Experience awarded": "Udělené zkušenosti", + "Per character": "Na postavu", + "By type": "Podle typu", + "By approval": "Podle schválení", + "Items carried by characters": "Předměty nesené postavami", + "Conditions on characters": "Stavy na postavách", + "Nothing awarded yet": "Zatím nic uděleno", + "Who is playing what, and what is still waiting for approval.": "Kdo hraje co a co ještě čeká na schválení.", + "Experience awarded, and who earned it.": "Udělené zkušenosti a kdo si je vysloužil.", + "How much the world holds, and what characters actually carry.": "Kolik svět obsahuje a co postavy skutečně nesou." }, "plurals": {} } diff --git a/l10n/da.js b/l10n/da.js index b174a399..97815e84 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Unik artefakt", "Unique Condition": "Unik tilstand", "XP Amount": "Antal erfaringspoint", - "XP Award": "XP-tildeling" + "XP Award": "XP-tildeling", + "Reports": "Rapporter", + "Pick a report to open it.": "Vælg en rapport for at åbne den.", + "Open": "Åben", + "In progress": "I gang", + "Blocked": "Blokeret", + "Date": "Dato", + "Due": "Forfalder", + "Assignee": "Tildelt", + "Who": "Hvem", + "What": "Hvad", + "Minutes": "Minutter", + "Entries": "Poster", + "Most recent": "Nyeste", + "Per person": "Per person", + "By status": "Efter status", + "By priority": "Efter prioritet", + "Character roster": "Karakterliste", + "Progression": "Progression", + "World content": "Verdensindhold", + "Awaiting approval": "Afventer godkendelse", + "Player characters": "Spillerkarakterer", + "Awards": "Tildelinger", + "Experience": "Erfaring", + "Experience awarded": "Tildelt erfaring", + "Per character": "Per karakter", + "By type": "Efter type", + "By approval": "Efter godkendelse", + "Items carried by characters": "Genstande båret af karakterer", + "Conditions on characters": "Tilstande på karakterer", + "Nothing awarded yet": "Intet tildelt endnu", + "Who is playing what, and what is still waiting for approval.": "Hvem spiller hvad, og hvad venter stadig på godkendelse.", + "Experience awarded, and who earned it.": "Tildelt erfaring, og hvem der har optjent den.", + "How much the world holds, and what characters actually carry.": "Hvor meget verden rummer, og hvad karaktererne faktisk bærer." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/da.json b/l10n/da.json index 752a061c..359080d9 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -222,7 +222,40 @@ "Unique Artifact": "Unik artefakt", "Unique Condition": "Unik tilstand", "XP Amount": "Antal erfaringspoint", - "XP Award": "XP-tildeling" + "XP Award": "XP-tildeling", + "Reports": "Rapporter", + "Pick a report to open it.": "Vælg en rapport for at åbne den.", + "Open": "Åben", + "In progress": "I gang", + "Blocked": "Blokeret", + "Date": "Dato", + "Due": "Forfalder", + "Assignee": "Tildelt", + "Who": "Hvem", + "What": "Hvad", + "Minutes": "Minutter", + "Entries": "Poster", + "Most recent": "Nyeste", + "Per person": "Per person", + "By status": "Efter status", + "By priority": "Efter prioritet", + "Character roster": "Karakterliste", + "Progression": "Progression", + "World content": "Verdensindhold", + "Awaiting approval": "Afventer godkendelse", + "Player characters": "Spillerkarakterer", + "Awards": "Tildelinger", + "Experience": "Erfaring", + "Experience awarded": "Tildelt erfaring", + "Per character": "Per karakter", + "By type": "Efter type", + "By approval": "Efter godkendelse", + "Items carried by characters": "Genstande båret af karakterer", + "Conditions on characters": "Tilstande på karakterer", + "Nothing awarded yet": "Intet tildelt endnu", + "Who is playing what, and what is still waiting for approval.": "Hvem spiller hvad, og hvad venter stadig på godkendelse.", + "Experience awarded, and who earned it.": "Tildelt erfaring, og hvem der har optjent den.", + "How much the world holds, and what characters actually carry.": "Hvor meget verden rummer, og hvad karaktererne faktisk bærer." }, "plurals": {} } diff --git a/l10n/de.js b/l10n/de.js index b4f22fe5..0bfcfba7 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Einzigartiges Artefakt", "Unique Condition": "Einzigartiger Zustand", "XP Amount": "Anzahl der Erfahrungspunkte", - "XP Award": "XP-Vergabe" + "XP Award": "XP-Vergabe", + "Reports": "Berichte", + "Pick a report to open it.": "Wählen Sie einen Bericht, um ihn zu öffnen.", + "Open": "Offen", + "In progress": "In Bearbeitung", + "Blocked": "Blockiert", + "Date": "Datum", + "Due": "Fällig", + "Assignee": "Zugewiesen an", + "Who": "Wer", + "What": "Was", + "Minutes": "Minuten", + "Entries": "Einträge", + "Most recent": "Zuletzt", + "Per person": "Pro Person", + "By status": "Nach Status", + "By priority": "Nach Priorität", + "Character roster": "Charakterliste", + "Progression": "Fortschritt", + "World content": "Weltinhalt", + "Awaiting approval": "Wartet auf Freigabe", + "Player characters": "Spielercharaktere", + "Awards": "Vergaben", + "Experience": "Erfahrung", + "Experience awarded": "Vergebene Erfahrung", + "Per character": "Pro Charakter", + "By type": "Nach Typ", + "By approval": "Nach Freigabe", + "Items carried by characters": "Von Charakteren getragene Gegenstände", + "Conditions on characters": "Zustände auf Charakteren", + "Nothing awarded yet": "Noch nichts vergeben", + "Who is playing what, and what is still waiting for approval.": "Wer was spielt und was noch auf Freigabe wartet.", + "Experience awarded, and who earned it.": "Vergebene Erfahrung und wer sie verdient hat.", + "How much the world holds, and what characters actually carry.": "Wie viel die Welt umfasst und was Charaktere wirklich tragen." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/de.json b/l10n/de.json index 2dc2f52f..26e89543 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -222,7 +222,40 @@ "Unique Artifact": "Einzigartiges Artefakt", "Unique Condition": "Einzigartiger Zustand", "XP Amount": "Anzahl der Erfahrungspunkte", - "XP Award": "XP-Vergabe" + "XP Award": "XP-Vergabe", + "Reports": "Berichte", + "Pick a report to open it.": "Wählen Sie einen Bericht, um ihn zu öffnen.", + "Open": "Offen", + "In progress": "In Bearbeitung", + "Blocked": "Blockiert", + "Date": "Datum", + "Due": "Fällig", + "Assignee": "Zugewiesen an", + "Who": "Wer", + "What": "Was", + "Minutes": "Minuten", + "Entries": "Einträge", + "Most recent": "Zuletzt", + "Per person": "Pro Person", + "By status": "Nach Status", + "By priority": "Nach Priorität", + "Character roster": "Charakterliste", + "Progression": "Fortschritt", + "World content": "Weltinhalt", + "Awaiting approval": "Wartet auf Freigabe", + "Player characters": "Spielercharaktere", + "Awards": "Vergaben", + "Experience": "Erfahrung", + "Experience awarded": "Vergebene Erfahrung", + "Per character": "Pro Charakter", + "By type": "Nach Typ", + "By approval": "Nach Freigabe", + "Items carried by characters": "Von Charakteren getragene Gegenstände", + "Conditions on characters": "Zustände auf Charakteren", + "Nothing awarded yet": "Noch nichts vergeben", + "Who is playing what, and what is still waiting for approval.": "Wer was spielt und was noch auf Freigabe wartet.", + "Experience awarded, and who earned it.": "Vergebene Erfahrung und wer sie verdient hat.", + "How much the world holds, and what characters actually carry.": "Wie viel die Welt umfasst und was Charaktere wirklich tragen." }, "plurals": {} } diff --git a/l10n/el.js b/l10n/el.js index 92729475..78d04c2a 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Μοναδικό τεχνούργημα", "Unique Condition": "Μοναδική κατάσταση", "XP Amount": "Αριθμός πόντων εμπειρίας", - "XP Award": "Απονομή πόντων εμπειρίας" + "XP Award": "Απονομή πόντων εμπειρίας", + "Reports": "Αναφορές", + "Pick a report to open it.": "Επιλέξτε μια αναφορά για να την ανοίξετε.", + "Open": "Ανοιχτά", + "In progress": "Σε εξέλιξη", + "Blocked": "Μπλοκαρισμένα", + "Date": "Ημερομηνία", + "Due": "Προθεσμία", + "Assignee": "Ανατέθηκε σε", + "Who": "Ποιος", + "What": "Τι", + "Minutes": "Λεπτά", + "Entries": "Καταχωρίσεις", + "Most recent": "Πιο πρόσφατα", + "Per person": "Ανά άτομο", + "By status": "Ανά κατάσταση", + "By priority": "Ανά προτεραιότητα", + "Character roster": "Κατάλογος χαρακτήρων", + "Progression": "Πρόοδος", + "World content": "Περιεχόμενο κόσμου", + "Awaiting approval": "Αναμένει έγκριση", + "Player characters": "Χαρακτήρες παικτών", + "Awards": "Απονομές", + "Experience": "Εμπειρία", + "Experience awarded": "Απονεμημένη εμπειρία", + "Per character": "Ανά χαρακτήρα", + "By type": "Ανά τύπο", + "By approval": "Ανά έγκριση", + "Items carried by characters": "Αντικείμενα που κουβαλούν οι χαρακτήρες", + "Conditions on characters": "Καταστάσεις στους χαρακτήρες", + "Nothing awarded yet": "Δεν έχει απονεμηθεί τίποτα ακόμη", + "Who is playing what, and what is still waiting for approval.": "Ποιος παίζει τι, και τι περιμένει ακόμη έγκριση.", + "Experience awarded, and who earned it.": "Η απονεμημένη εμπειρία και ποιος την κέρδισε.", + "How much the world holds, and what characters actually carry.": "Πόσα περιέχει ο κόσμος και τι κουβαλούν πραγματικά οι χαρακτήρες." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/el.json b/l10n/el.json index 9ecfe59e..df867e18 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -222,7 +222,40 @@ "Unique Artifact": "Μοναδικό τεχνούργημα", "Unique Condition": "Μοναδική κατάσταση", "XP Amount": "Αριθμός πόντων εμπειρίας", - "XP Award": "Απονομή πόντων εμπειρίας" + "XP Award": "Απονομή πόντων εμπειρίας", + "Reports": "Αναφορές", + "Pick a report to open it.": "Επιλέξτε μια αναφορά για να την ανοίξετε.", + "Open": "Ανοιχτά", + "In progress": "Σε εξέλιξη", + "Blocked": "Μπλοκαρισμένα", + "Date": "Ημερομηνία", + "Due": "Προθεσμία", + "Assignee": "Ανατέθηκε σε", + "Who": "Ποιος", + "What": "Τι", + "Minutes": "Λεπτά", + "Entries": "Καταχωρίσεις", + "Most recent": "Πιο πρόσφατα", + "Per person": "Ανά άτομο", + "By status": "Ανά κατάσταση", + "By priority": "Ανά προτεραιότητα", + "Character roster": "Κατάλογος χαρακτήρων", + "Progression": "Πρόοδος", + "World content": "Περιεχόμενο κόσμου", + "Awaiting approval": "Αναμένει έγκριση", + "Player characters": "Χαρακτήρες παικτών", + "Awards": "Απονομές", + "Experience": "Εμπειρία", + "Experience awarded": "Απονεμημένη εμπειρία", + "Per character": "Ανά χαρακτήρα", + "By type": "Ανά τύπο", + "By approval": "Ανά έγκριση", + "Items carried by characters": "Αντικείμενα που κουβαλούν οι χαρακτήρες", + "Conditions on characters": "Καταστάσεις στους χαρακτήρες", + "Nothing awarded yet": "Δεν έχει απονεμηθεί τίποτα ακόμη", + "Who is playing what, and what is still waiting for approval.": "Ποιος παίζει τι, και τι περιμένει ακόμη έγκριση.", + "Experience awarded, and who earned it.": "Η απονεμημένη εμπειρία και ποιος την κέρδισε.", + "How much the world holds, and what characters actually carry.": "Πόσα περιέχει ο κόσμος και τι κουβαλούν πραγματικά οι χαρακτήρες." }, "plurals": {} } diff --git a/l10n/es.js b/l10n/es.js index 78745a41..5aa44639 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Artefacto único", "Unique Condition": "Condición única", "XP Amount": "Cantidad de puntos de experiencia", - "XP Award": "Concesión de puntos de experiencia" + "XP Award": "Concesión de puntos de experiencia", + "Reports": "Informes", + "Pick a report to open it.": "Elija un informe para abrirlo.", + "Open": "Abierto", + "In progress": "En curso", + "Blocked": "Bloqueado", + "Date": "Fecha", + "Due": "Vence", + "Assignee": "Asignado a", + "Who": "Quién", + "What": "Qué", + "Minutes": "Minutos", + "Entries": "Entradas", + "Most recent": "Más recientes", + "Per person": "Por persona", + "By status": "Por estado", + "By priority": "Por prioridad", + "Character roster": "Lista de personajes", + "Progression": "Progresión", + "World content": "Contenido del mundo", + "Awaiting approval": "Pendiente de aprobación", + "Player characters": "Personajes jugadores", + "Awards": "Concesiones", + "Experience": "Experiencia", + "Experience awarded": "Experiencia concedida", + "Per character": "Por personaje", + "By type": "Por tipo", + "By approval": "Por aprobación", + "Items carried by characters": "Objetos que llevan los personajes", + "Conditions on characters": "Estados en los personajes", + "Nothing awarded yet": "Aún no se ha concedido nada", + "Who is playing what, and what is still waiting for approval.": "Quién juega qué, y qué sigue pendiente de aprobación.", + "Experience awarded, and who earned it.": "La experiencia concedida y quién la ganó.", + "How much the world holds, and what characters actually carry.": "Cuánto contiene el mundo, y qué llevan realmente los personajes." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/es.json b/l10n/es.json index e89279ae..2129284e 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -222,7 +222,40 @@ "Unique Artifact": "Artefacto único", "Unique Condition": "Condición única", "XP Amount": "Cantidad de puntos de experiencia", - "XP Award": "Concesión de puntos de experiencia" + "XP Award": "Concesión de puntos de experiencia", + "Reports": "Informes", + "Pick a report to open it.": "Elija un informe para abrirlo.", + "Open": "Abierto", + "In progress": "En curso", + "Blocked": "Bloqueado", + "Date": "Fecha", + "Due": "Vence", + "Assignee": "Asignado a", + "Who": "Quién", + "What": "Qué", + "Minutes": "Minutos", + "Entries": "Entradas", + "Most recent": "Más recientes", + "Per person": "Por persona", + "By status": "Por estado", + "By priority": "Por prioridad", + "Character roster": "Lista de personajes", + "Progression": "Progresión", + "World content": "Contenido del mundo", + "Awaiting approval": "Pendiente de aprobación", + "Player characters": "Personajes jugadores", + "Awards": "Concesiones", + "Experience": "Experiencia", + "Experience awarded": "Experiencia concedida", + "Per character": "Por personaje", + "By type": "Por tipo", + "By approval": "Por aprobación", + "Items carried by characters": "Objetos que llevan los personajes", + "Conditions on characters": "Estados en los personajes", + "Nothing awarded yet": "Aún no se ha concedido nada", + "Who is playing what, and what is still waiting for approval.": "Quién juega qué, y qué sigue pendiente de aprobación.", + "Experience awarded, and who earned it.": "La experiencia concedida y quién la ganó.", + "How much the world holds, and what characters actually carry.": "Cuánto contiene el mundo, y qué llevan realmente los personajes." }, "plurals": {} } diff --git a/l10n/et.js b/l10n/et.js index dba747d4..d5a90ced 100644 --- a/l10n/et.js +++ b/l10n/et.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Unikaalne artefakt", "Unique Condition": "Unikaalne seisund", "XP Amount": "Kogemuspunktide arv", - "XP Award": "Kogemuspunktide andmine" + "XP Award": "Kogemuspunktide andmine", + "Reports": "Aruanded", + "Pick a report to open it.": "Vali aruanne, et see avada.", + "Open": "Avatud", + "In progress": "Töös", + "Blocked": "Blokeeritud", + "Date": "Kuupäev", + "Due": "Tähtaeg", + "Assignee": "Määratud", + "Who": "Kes", + "What": "Mis", + "Minutes": "Minutid", + "Entries": "Kirjed", + "Most recent": "Uusimad", + "Per person": "Isiku kohta", + "By status": "Staatuse järgi", + "By priority": "Prioriteedi järgi", + "Character roster": "Tegelaste nimekiri", + "Progression": "Areng", + "World content": "Maailma sisu", + "Awaiting approval": "Ootab kinnitust", + "Player characters": "Mängijate tegelased", + "Awards": "Määramised", + "Experience": "Kogemus", + "Experience awarded": "Antud kogemus", + "Per character": "Tegelase kohta", + "By type": "Tüübi järgi", + "By approval": "Kinnituse järgi", + "Items carried by characters": "Tegelaste kantavad esemed", + "Conditions on characters": "Tegelaste seisundid", + "Nothing awarded yet": "Midagi pole veel antud", + "Who is playing what, and what is still waiting for approval.": "Kes mida mängib ja mis ootab veel kinnitust.", + "Experience awarded, and who earned it.": "Antud kogemus ja kes selle teenis.", + "How much the world holds, and what characters actually carry.": "Kui palju maailm sisaldab ja mida tegelased tegelikult kannavad." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/et.json b/l10n/et.json index 85ca0c4f..4e9712b7 100644 --- a/l10n/et.json +++ b/l10n/et.json @@ -222,7 +222,40 @@ "Unique Artifact": "Unikaalne artefakt", "Unique Condition": "Unikaalne seisund", "XP Amount": "Kogemuspunktide arv", - "XP Award": "Kogemuspunktide andmine" + "XP Award": "Kogemuspunktide andmine", + "Reports": "Aruanded", + "Pick a report to open it.": "Vali aruanne, et see avada.", + "Open": "Avatud", + "In progress": "Töös", + "Blocked": "Blokeeritud", + "Date": "Kuupäev", + "Due": "Tähtaeg", + "Assignee": "Määratud", + "Who": "Kes", + "What": "Mis", + "Minutes": "Minutid", + "Entries": "Kirjed", + "Most recent": "Uusimad", + "Per person": "Isiku kohta", + "By status": "Staatuse järgi", + "By priority": "Prioriteedi järgi", + "Character roster": "Tegelaste nimekiri", + "Progression": "Areng", + "World content": "Maailma sisu", + "Awaiting approval": "Ootab kinnitust", + "Player characters": "Mängijate tegelased", + "Awards": "Määramised", + "Experience": "Kogemus", + "Experience awarded": "Antud kogemus", + "Per character": "Tegelase kohta", + "By type": "Tüübi järgi", + "By approval": "Kinnituse järgi", + "Items carried by characters": "Tegelaste kantavad esemed", + "Conditions on characters": "Tegelaste seisundid", + "Nothing awarded yet": "Midagi pole veel antud", + "Who is playing what, and what is still waiting for approval.": "Kes mida mängib ja mis ootab veel kinnitust.", + "Experience awarded, and who earned it.": "Antud kogemus ja kes selle teenis.", + "How much the world holds, and what characters actually carry.": "Kui palju maailm sisaldab ja mida tegelased tegelikult kannavad." }, "plurals": {} } diff --git a/l10n/fi.js b/l10n/fi.js index ebc84f5b..81264868 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Ainutlaatuinen artefakti", "Unique Condition": "Ainutlaatuinen tila", "XP Amount": "Kokemuspisteiden määrä", - "XP Award": "Kokemuspisteiden myöntäminen" + "XP Award": "Kokemuspisteiden myöntäminen", + "Reports": "Raportit", + "Pick a report to open it.": "Valitse raportti avataksesi sen.", + "Open": "Avoin", + "In progress": "Käynnissä", + "Blocked": "Estetty", + "Date": "Päivämäärä", + "Due": "Määräpäivä", + "Assignee": "Vastuuhenkilö", + "Who": "Kuka", + "What": "Mitä", + "Minutes": "Minuutit", + "Entries": "Merkinnät", + "Most recent": "Uusimmat", + "Per person": "Henkilöä kohti", + "By status": "Tilan mukaan", + "By priority": "Prioriteetin mukaan", + "Character roster": "Hahmoluettelo", + "Progression": "Eteneminen", + "World content": "Maailman sisältö", + "Awaiting approval": "Odottaa hyväksyntää", + "Player characters": "Pelaajahahmot", + "Awards": "Myönnöt", + "Experience": "Kokemus", + "Experience awarded": "Myönnetty kokemus", + "Per character": "Hahmoa kohti", + "By type": "Tyypin mukaan", + "By approval": "Hyväksynnän mukaan", + "Items carried by characters": "Hahmojen kantamat esineet", + "Conditions on characters": "Hahmojen tilat", + "Nothing awarded yet": "Mitään ei ole vielä myönnetty", + "Who is playing what, and what is still waiting for approval.": "Kuka pelaa mitäkin ja mikä odottaa vielä hyväksyntää.", + "Experience awarded, and who earned it.": "Myönnetty kokemus ja kuka sen ansaitsi.", + "How much the world holds, and what characters actually carry.": "Kuinka paljon maailma sisältää ja mitä hahmot todella kantavat." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fi.json b/l10n/fi.json index 6fbf04e6..4a294d2c 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -222,7 +222,40 @@ "Unique Artifact": "Ainutlaatuinen artefakti", "Unique Condition": "Ainutlaatuinen tila", "XP Amount": "Kokemuspisteiden määrä", - "XP Award": "Kokemuspisteiden myöntäminen" + "XP Award": "Kokemuspisteiden myöntäminen", + "Reports": "Raportit", + "Pick a report to open it.": "Valitse raportti avataksesi sen.", + "Open": "Avoin", + "In progress": "Käynnissä", + "Blocked": "Estetty", + "Date": "Päivämäärä", + "Due": "Määräpäivä", + "Assignee": "Vastuuhenkilö", + "Who": "Kuka", + "What": "Mitä", + "Minutes": "Minuutit", + "Entries": "Merkinnät", + "Most recent": "Uusimmat", + "Per person": "Henkilöä kohti", + "By status": "Tilan mukaan", + "By priority": "Prioriteetin mukaan", + "Character roster": "Hahmoluettelo", + "Progression": "Eteneminen", + "World content": "Maailman sisältö", + "Awaiting approval": "Odottaa hyväksyntää", + "Player characters": "Pelaajahahmot", + "Awards": "Myönnöt", + "Experience": "Kokemus", + "Experience awarded": "Myönnetty kokemus", + "Per character": "Hahmoa kohti", + "By type": "Tyypin mukaan", + "By approval": "Hyväksynnän mukaan", + "Items carried by characters": "Hahmojen kantamat esineet", + "Conditions on characters": "Hahmojen tilat", + "Nothing awarded yet": "Mitään ei ole vielä myönnetty", + "Who is playing what, and what is still waiting for approval.": "Kuka pelaa mitäkin ja mikä odottaa vielä hyväksyntää.", + "Experience awarded, and who earned it.": "Myönnetty kokemus ja kuka sen ansaitsi.", + "How much the world holds, and what characters actually carry.": "Kuinka paljon maailma sisältää ja mitä hahmot todella kantavat." }, "plurals": {} } diff --git a/l10n/fr.js b/l10n/fr.js index 14f8ac12..8b9c0c5c 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Artefact unique", "Unique Condition": "Condition unique", "XP Amount": "Nombre de points d'expérience", - "XP Award": "Attribution de points d'expérience" + "XP Award": "Attribution de points d'expérience", + "Reports": "Rapports", + "Pick a report to open it.": "Choisissez un rapport pour l'ouvrir.", + "Open": "Ouvert", + "In progress": "En cours", + "Blocked": "Bloqué", + "Date": "Date", + "Due": "Échéance", + "Assignee": "Assigné à", + "Who": "Qui", + "What": "Quoi", + "Minutes": "Minutes", + "Entries": "Entrées", + "Most recent": "Les plus récents", + "Per person": "Par personne", + "By status": "Par statut", + "By priority": "Par priorité", + "Character roster": "Liste des personnages", + "Progression": "Progression", + "World content": "Contenu du monde", + "Awaiting approval": "En attente d'approbation", + "Player characters": "Personnages joueurs", + "Awards": "Attributions", + "Experience": "Expérience", + "Experience awarded": "Expérience attribuée", + "Per character": "Par personnage", + "By type": "Par type", + "By approval": "Par approbation", + "Items carried by characters": "Objets portés par les personnages", + "Conditions on characters": "États sur les personnages", + "Nothing awarded yet": "Rien d'attribué pour l'instant", + "Who is playing what, and what is still waiting for approval.": "Qui joue quoi, et ce qui attend encore une approbation.", + "Experience awarded, and who earned it.": "L'expérience attribuée et qui l'a gagnée.", + "How much the world holds, and what characters actually carry.": "Ce que contient le monde, et ce que les personnages portent réellement." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fr.json b/l10n/fr.json index 03e8bddc..89097304 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -222,7 +222,40 @@ "Unique Artifact": "Artefact unique", "Unique Condition": "Condition unique", "XP Amount": "Nombre de points d'expérience", - "XP Award": "Attribution de points d'expérience" + "XP Award": "Attribution de points d'expérience", + "Reports": "Rapports", + "Pick a report to open it.": "Choisissez un rapport pour l'ouvrir.", + "Open": "Ouvert", + "In progress": "En cours", + "Blocked": "Bloqué", + "Date": "Date", + "Due": "Échéance", + "Assignee": "Assigné à", + "Who": "Qui", + "What": "Quoi", + "Minutes": "Minutes", + "Entries": "Entrées", + "Most recent": "Les plus récents", + "Per person": "Par personne", + "By status": "Par statut", + "By priority": "Par priorité", + "Character roster": "Liste des personnages", + "Progression": "Progression", + "World content": "Contenu du monde", + "Awaiting approval": "En attente d'approbation", + "Player characters": "Personnages joueurs", + "Awards": "Attributions", + "Experience": "Expérience", + "Experience awarded": "Expérience attribuée", + "Per character": "Par personnage", + "By type": "Par type", + "By approval": "Par approbation", + "Items carried by characters": "Objets portés par les personnages", + "Conditions on characters": "États sur les personnages", + "Nothing awarded yet": "Rien d'attribué pour l'instant", + "Who is playing what, and what is still waiting for approval.": "Qui joue quoi, et ce qui attend encore une approbation.", + "Experience awarded, and who earned it.": "L'expérience attribuée et qui l'a gagnée.", + "How much the world holds, and what characters actually carry.": "Ce que contient le monde, et ce que les personnages portent réellement." }, "plurals": {} } diff --git a/l10n/ga.js b/l10n/ga.js index dee2a767..c48d786c 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Déantán uathúil", "Unique Condition": "Coinníoll uathúil", "XP Amount": "Líon na bpointí taithí", - "XP Award": "Bronnadh pointí taithí" + "XP Award": "Bronnadh pointí taithí", + "Reports": "Tuairiscí", + "Pick a report to open it.": "Roghnaigh tuairisc chun í a oscailt.", + "Open": "Oscailte", + "In progress": "Ar siúl", + "Blocked": "Bactha", + "Date": "Dáta", + "Due": "Spriocdháta", + "Assignee": "Sannta do", + "Who": "Cé", + "What": "Cad", + "Minutes": "Nóiméad", + "Entries": "Iontrálacha", + "Most recent": "Is déanaí", + "Per person": "In aghaidh an duine", + "By status": "De réir stádais", + "By priority": "De réir tosaíochta", + "Character roster": "Liosta carachtar", + "Progression": "Dul chun cinn", + "World content": "Ábhar an domhain", + "Awaiting approval": "Ag fanacht le faomhadh", + "Player characters": "Carachtair imreora", + "Awards": "Dámhachtainí", + "Experience": "Taithí", + "Experience awarded": "Taithí bronnta", + "Per character": "In aghaidh an charachtair", + "By type": "De réir cineáil", + "By approval": "De réir faofa", + "Items carried by characters": "Míreanna á n-iompar ag carachtair", + "Conditions on characters": "Coinníollacha ar charachtair", + "Nothing awarded yet": "Níl aon rud bronnta go fóill", + "Who is playing what, and what is still waiting for approval.": "Cé atá ag imirt cad, agus cad atá fós ag fanacht le faomhadh.", + "Experience awarded, and who earned it.": "An taithí a bronnadh, agus cé a thuill í.", + "How much the world holds, and what characters actually carry.": "Cé mhéad atá sa domhan, agus cad a iompraíonn carachtair i ndáiríre." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ga.json b/l10n/ga.json index 41890fd4..17d7eb6c 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -222,7 +222,40 @@ "Unique Artifact": "Déantán uathúil", "Unique Condition": "Coinníoll uathúil", "XP Amount": "Líon na bpointí taithí", - "XP Award": "Bronnadh pointí taithí" + "XP Award": "Bronnadh pointí taithí", + "Reports": "Tuairiscí", + "Pick a report to open it.": "Roghnaigh tuairisc chun í a oscailt.", + "Open": "Oscailte", + "In progress": "Ar siúl", + "Blocked": "Bactha", + "Date": "Dáta", + "Due": "Spriocdháta", + "Assignee": "Sannta do", + "Who": "Cé", + "What": "Cad", + "Minutes": "Nóiméad", + "Entries": "Iontrálacha", + "Most recent": "Is déanaí", + "Per person": "In aghaidh an duine", + "By status": "De réir stádais", + "By priority": "De réir tosaíochta", + "Character roster": "Liosta carachtar", + "Progression": "Dul chun cinn", + "World content": "Ábhar an domhain", + "Awaiting approval": "Ag fanacht le faomhadh", + "Player characters": "Carachtair imreora", + "Awards": "Dámhachtainí", + "Experience": "Taithí", + "Experience awarded": "Taithí bronnta", + "Per character": "In aghaidh an charachtair", + "By type": "De réir cineáil", + "By approval": "De réir faofa", + "Items carried by characters": "Míreanna á n-iompar ag carachtair", + "Conditions on characters": "Coinníollacha ar charachtair", + "Nothing awarded yet": "Níl aon rud bronnta go fóill", + "Who is playing what, and what is still waiting for approval.": "Cé atá ag imirt cad, agus cad atá fós ag fanacht le faomhadh.", + "Experience awarded, and who earned it.": "An taithí a bronnadh, agus cé a thuill í.", + "How much the world holds, and what characters actually carry.": "Cé mhéad atá sa domhan, agus cad a iompraíonn carachtair i ndáiríre." }, "plurals": {} } diff --git a/l10n/hr.js b/l10n/hr.js index 02b48763..6c0e5d51 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Jedinstveni artefakt", "Unique Condition": "Jedinstveno stanje", "XP Amount": "Broj bodova iskustva", - "XP Award": "Dodjela bodova iskustva" + "XP Award": "Dodjela bodova iskustva", + "Reports": "Izvješća", + "Pick a report to open it.": "Odaberite izvješće da ga otvorite.", + "Open": "Otvoreno", + "In progress": "U tijeku", + "Blocked": "Blokirano", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodijeljeno", + "Who": "Tko", + "What": "Što", + "Minutes": "Minute", + "Entries": "Unosi", + "Most recent": "Najnovije", + "Per person": "Po osobi", + "By status": "Po statusu", + "By priority": "Po prioritetu", + "Character roster": "Popis likova", + "Progression": "Napredak", + "World content": "Sadržaj svijeta", + "Awaiting approval": "Čeka odobrenje", + "Player characters": "Likovi igrača", + "Awards": "Dodjele", + "Experience": "Iskustvo", + "Experience awarded": "Dodijeljeno iskustvo", + "Per character": "Po liku", + "By type": "Po vrsti", + "By approval": "Po odobrenju", + "Items carried by characters": "Predmeti koje likovi nose", + "Conditions on characters": "Stanja na likovima", + "Nothing awarded yet": "Još ništa nije dodijeljeno", + "Who is playing what, and what is still waiting for approval.": "Tko što igra i što još čeka odobrenje.", + "Experience awarded, and who earned it.": "Dodijeljeno iskustvo i tko ga je zaradio.", + "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i što likovi zaista nose." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hr.json b/l10n/hr.json index 9bd9ba3a..00e6d206 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -222,7 +222,40 @@ "Unique Artifact": "Jedinstveni artefakt", "Unique Condition": "Jedinstveno stanje", "XP Amount": "Broj bodova iskustva", - "XP Award": "Dodjela bodova iskustva" + "XP Award": "Dodjela bodova iskustva", + "Reports": "Izvješća", + "Pick a report to open it.": "Odaberite izvješće da ga otvorite.", + "Open": "Otvoreno", + "In progress": "U tijeku", + "Blocked": "Blokirano", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodijeljeno", + "Who": "Tko", + "What": "Što", + "Minutes": "Minute", + "Entries": "Unosi", + "Most recent": "Najnovije", + "Per person": "Po osobi", + "By status": "Po statusu", + "By priority": "Po prioritetu", + "Character roster": "Popis likova", + "Progression": "Napredak", + "World content": "Sadržaj svijeta", + "Awaiting approval": "Čeka odobrenje", + "Player characters": "Likovi igrača", + "Awards": "Dodjele", + "Experience": "Iskustvo", + "Experience awarded": "Dodijeljeno iskustvo", + "Per character": "Po liku", + "By type": "Po vrsti", + "By approval": "Po odobrenju", + "Items carried by characters": "Predmeti koje likovi nose", + "Conditions on characters": "Stanja na likovima", + "Nothing awarded yet": "Još ništa nije dodijeljeno", + "Who is playing what, and what is still waiting for approval.": "Tko što igra i što još čeka odobrenje.", + "Experience awarded, and who earned it.": "Dodijeljeno iskustvo i tko ga je zaradio.", + "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i što likovi zaista nose." }, "plurals": {} } diff --git a/l10n/hu.js b/l10n/hu.js index 6e12e128..8295a4d9 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Egyedi artefaktum", "Unique Condition": "Egyedi állapot", "XP Amount": "Tapasztalati pontok száma", - "XP Award": "Tapasztalati pontok odaítélése" + "XP Award": "Tapasztalati pontok odaítélése", + "Reports": "Jelentések", + "Pick a report to open it.": "Válasszon egy jelentést a megnyitáshoz.", + "Open": "Nyitott", + "In progress": "Folyamatban", + "Blocked": "Blokkolva", + "Date": "Dátum", + "Due": "Határidő", + "Assignee": "Felelős", + "Who": "Ki", + "What": "Mit", + "Minutes": "Perc", + "Entries": "Bejegyzések", + "Most recent": "Legutóbbi", + "Per person": "Személyenként", + "By status": "Állapot szerint", + "By priority": "Prioritás szerint", + "Character roster": "Karakterlista", + "Progression": "Fejlődés", + "World content": "Világ tartalma", + "Awaiting approval": "Jóváhagyásra vár", + "Player characters": "Játékoskarakterek", + "Awards": "Odaítélések", + "Experience": "Tapasztalat", + "Experience awarded": "Odaítélt tapasztalat", + "Per character": "Karakterenként", + "By type": "Típus szerint", + "By approval": "Jóváhagyás szerint", + "Items carried by characters": "A karakterek által vitt tárgyak", + "Conditions on characters": "Karakterek állapotai", + "Nothing awarded yet": "Még semmit sem ítéltek oda", + "Who is playing what, and what is still waiting for approval.": "Ki mit játszik, és mi vár még jóváhagyásra.", + "Experience awarded, and who earned it.": "Az odaítélt tapasztalat és aki kiérdemelte.", + "How much the world holds, and what characters actually carry.": "Mennyit tartalmaz a világ, és mit hordanak valójában a karakterek." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hu.json b/l10n/hu.json index 747329fd..7ff40240 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -222,7 +222,40 @@ "Unique Artifact": "Egyedi artefaktum", "Unique Condition": "Egyedi állapot", "XP Amount": "Tapasztalati pontok száma", - "XP Award": "Tapasztalati pontok odaítélése" + "XP Award": "Tapasztalati pontok odaítélése", + "Reports": "Jelentések", + "Pick a report to open it.": "Válasszon egy jelentést a megnyitáshoz.", + "Open": "Nyitott", + "In progress": "Folyamatban", + "Blocked": "Blokkolva", + "Date": "Dátum", + "Due": "Határidő", + "Assignee": "Felelős", + "Who": "Ki", + "What": "Mit", + "Minutes": "Perc", + "Entries": "Bejegyzések", + "Most recent": "Legutóbbi", + "Per person": "Személyenként", + "By status": "Állapot szerint", + "By priority": "Prioritás szerint", + "Character roster": "Karakterlista", + "Progression": "Fejlődés", + "World content": "Világ tartalma", + "Awaiting approval": "Jóváhagyásra vár", + "Player characters": "Játékoskarakterek", + "Awards": "Odaítélések", + "Experience": "Tapasztalat", + "Experience awarded": "Odaítélt tapasztalat", + "Per character": "Karakterenként", + "By type": "Típus szerint", + "By approval": "Jóváhagyás szerint", + "Items carried by characters": "A karakterek által vitt tárgyak", + "Conditions on characters": "Karakterek állapotai", + "Nothing awarded yet": "Még semmit sem ítéltek oda", + "Who is playing what, and what is still waiting for approval.": "Ki mit játszik, és mi vár még jóváhagyásra.", + "Experience awarded, and who earned it.": "Az odaítélt tapasztalat és aki kiérdemelte.", + "How much the world holds, and what characters actually carry.": "Mennyit tartalmaz a világ, és mit hordanak valójában a karakterek." }, "plurals": {} } diff --git a/l10n/is.js b/l10n/is.js index 82ad1f3f..e92a0cee 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Einstakur gripur", "Unique Condition": "Einstakt ástand", "XP Amount": "Fjöldi reynslustiga", - "XP Award": "Veiting reynslustiga" + "XP Award": "Veiting reynslustiga", + "Reports": "Skýrslur", + "Pick a report to open it.": "Veldu skýrslu til að opna hana.", + "Open": "Opið", + "In progress": "Í vinnslu", + "Blocked": "Lokað", + "Date": "Dagsetning", + "Due": "Skiladagur", + "Assignee": "Úthlutað", + "Who": "Hver", + "What": "Hvað", + "Minutes": "Mínútur", + "Entries": "Færslur", + "Most recent": "Nýjast", + "Per person": "Á mann", + "By status": "Eftir stöðu", + "By priority": "Eftir forgangi", + "Character roster": "Persónulisti", + "Progression": "Framvinda", + "World content": "Efni heimsins", + "Awaiting approval": "Bíður samþykkis", + "Player characters": "Persónur leikmanna", + "Awards": "Veitingar", + "Experience": "Reynsla", + "Experience awarded": "Veitt reynsla", + "Per character": "Á persónu", + "By type": "Eftir tegund", + "By approval": "Eftir samþykki", + "Items carried by characters": "Hlutir sem persónur bera", + "Conditions on characters": "Ástand persóna", + "Nothing awarded yet": "Ekkert veitt enn", + "Who is playing what, and what is still waiting for approval.": "Hver spilar hvað og hvað bíður enn samþykkis.", + "Experience awarded, and who earned it.": "Veitt reynsla og hver ávann sér hana.", + "How much the world holds, and what characters actually carry.": "Hversu mikið heimurinn geymir og hvað persónur bera í raun." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/is.json b/l10n/is.json index 6f2bfb9d..c6d09949 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -222,7 +222,40 @@ "Unique Artifact": "Einstakur gripur", "Unique Condition": "Einstakt ástand", "XP Amount": "Fjöldi reynslustiga", - "XP Award": "Veiting reynslustiga" + "XP Award": "Veiting reynslustiga", + "Reports": "Skýrslur", + "Pick a report to open it.": "Veldu skýrslu til að opna hana.", + "Open": "Opið", + "In progress": "Í vinnslu", + "Blocked": "Lokað", + "Date": "Dagsetning", + "Due": "Skiladagur", + "Assignee": "Úthlutað", + "Who": "Hver", + "What": "Hvað", + "Minutes": "Mínútur", + "Entries": "Færslur", + "Most recent": "Nýjast", + "Per person": "Á mann", + "By status": "Eftir stöðu", + "By priority": "Eftir forgangi", + "Character roster": "Persónulisti", + "Progression": "Framvinda", + "World content": "Efni heimsins", + "Awaiting approval": "Bíður samþykkis", + "Player characters": "Persónur leikmanna", + "Awards": "Veitingar", + "Experience": "Reynsla", + "Experience awarded": "Veitt reynsla", + "Per character": "Á persónu", + "By type": "Eftir tegund", + "By approval": "Eftir samþykki", + "Items carried by characters": "Hlutir sem persónur bera", + "Conditions on characters": "Ástand persóna", + "Nothing awarded yet": "Ekkert veitt enn", + "Who is playing what, and what is still waiting for approval.": "Hver spilar hvað og hvað bíður enn samþykkis.", + "Experience awarded, and who earned it.": "Veitt reynsla og hver ávann sér hana.", + "How much the world holds, and what characters actually carry.": "Hversu mikið heimurinn geymir og hvað persónur bera í raun." }, "plurals": {} } diff --git a/l10n/it.js b/l10n/it.js index 9defde85..a7a6aa51 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Artefatto unico", "Unique Condition": "Condizione unica", "XP Amount": "Quantità di punti esperienza", - "XP Award": "Assegnazione di punti esperienza" + "XP Award": "Assegnazione di punti esperienza", + "Reports": "Report", + "Pick a report to open it.": "Scegli un report per aprirlo.", + "Open": "Aperto", + "In progress": "In corso", + "Blocked": "Bloccato", + "Date": "Data", + "Due": "Scadenza", + "Assignee": "Assegnato a", + "Who": "Chi", + "What": "Cosa", + "Minutes": "Minuti", + "Entries": "Voci", + "Most recent": "Più recenti", + "Per person": "Per persona", + "By status": "Per stato", + "By priority": "Per priorità", + "Character roster": "Elenco personaggi", + "Progression": "Progressione", + "World content": "Contenuti del mondo", + "Awaiting approval": "In attesa di approvazione", + "Player characters": "Personaggi giocanti", + "Awards": "Assegnazioni", + "Experience": "Esperienza", + "Experience awarded": "Esperienza assegnata", + "Per character": "Per personaggio", + "By type": "Per tipo", + "By approval": "Per approvazione", + "Items carried by characters": "Oggetti portati dai personaggi", + "Conditions on characters": "Condizioni sui personaggi", + "Nothing awarded yet": "Ancora nulla assegnato", + "Who is playing what, and what is still waiting for approval.": "Chi gioca cosa, e cosa attende ancora approvazione.", + "Experience awarded, and who earned it.": "L'esperienza assegnata e chi l'ha guadagnata.", + "How much the world holds, and what characters actually carry.": "Quanto contiene il mondo, e cosa portano davvero i personaggi." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/it.json b/l10n/it.json index 21dc0f82..f054df2b 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -222,7 +222,40 @@ "Unique Artifact": "Artefatto unico", "Unique Condition": "Condizione unica", "XP Amount": "Quantità di punti esperienza", - "XP Award": "Assegnazione di punti esperienza" + "XP Award": "Assegnazione di punti esperienza", + "Reports": "Report", + "Pick a report to open it.": "Scegli un report per aprirlo.", + "Open": "Aperto", + "In progress": "In corso", + "Blocked": "Bloccato", + "Date": "Data", + "Due": "Scadenza", + "Assignee": "Assegnato a", + "Who": "Chi", + "What": "Cosa", + "Minutes": "Minuti", + "Entries": "Voci", + "Most recent": "Più recenti", + "Per person": "Per persona", + "By status": "Per stato", + "By priority": "Per priorità", + "Character roster": "Elenco personaggi", + "Progression": "Progressione", + "World content": "Contenuti del mondo", + "Awaiting approval": "In attesa di approvazione", + "Player characters": "Personaggi giocanti", + "Awards": "Assegnazioni", + "Experience": "Esperienza", + "Experience awarded": "Esperienza assegnata", + "Per character": "Per personaggio", + "By type": "Per tipo", + "By approval": "Per approvazione", + "Items carried by characters": "Oggetti portati dai personaggi", + "Conditions on characters": "Condizioni sui personaggi", + "Nothing awarded yet": "Ancora nulla assegnato", + "Who is playing what, and what is still waiting for approval.": "Chi gioca cosa, e cosa attende ancora approvazione.", + "Experience awarded, and who earned it.": "L'esperienza assegnata e chi l'ha guadagnata.", + "How much the world holds, and what characters actually carry.": "Quanto contiene il mondo, e cosa portano davvero i personaggi." }, "plurals": {} } diff --git a/l10n/lb.js b/l10n/lb.js index fdd7d2f2..311d6724 100644 --- a/l10n/lb.js +++ b/l10n/lb.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Eenzegaartegt Artefakt", "Unique Condition": "Eenzegaartegen Zoustand", "XP Amount": "Unzuel un Erfarungspunkten", - "XP Award": "XP-Verginn" + "XP Award": "XP-Verginn", + "Reports": "Berichter", + "Pick a report to open it.": "Wielt e Bericht fir en opzemaachen.", + "Open": "Op", + "In progress": "A Gaang", + "Blocked": "Blockéiert", + "Date": "Datum", + "Due": "Fälleg", + "Assignee": "Zougewisen", + "Who": "Wien", + "What": "Wat", + "Minutes": "Minutten", + "Entries": "Andeel", + "Most recent": "Am rezentsten", + "Per person": "Pro Persoun", + "By status": "No Status", + "By priority": "No Prioritéit", + "Character roster": "Charakterlëscht", + "Progression": "Fortschrëtt", + "World content": "Weltinhalt", + "Awaiting approval": "Waart op Zoustëmmung", + "Player characters": "Spillercharakteren", + "Awards": "Verginn", + "Experience": "Erfarung", + "Experience awarded": "Vergiff Erfarung", + "Per character": "Pro Charakter", + "By type": "No Typ", + "By approval": "No Zoustëmmung", + "Items carried by characters": "Géigestänn déi Charakteren droen", + "Conditions on characters": "Zoustänn op Charakteren", + "Nothing awarded yet": "Nach näischt vergiff", + "Who is playing what, and what is still waiting for approval.": "Wien wat spillt a wat nach op Zoustëmmung waart.", + "Experience awarded, and who earned it.": "Vergiff Erfarung a wien se verdéngt huet.", + "How much the world holds, and what characters actually carry.": "Wéi vill d'Welt hält a wat Charakteren wierklech droen." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lb.json b/l10n/lb.json index c5b8dbdf..ec2d2488 100644 --- a/l10n/lb.json +++ b/l10n/lb.json @@ -222,7 +222,40 @@ "Unique Artifact": "Eenzegaartegt Artefakt", "Unique Condition": "Eenzegaartegen Zoustand", "XP Amount": "Unzuel un Erfarungspunkten", - "XP Award": "XP-Verginn" + "XP Award": "XP-Verginn", + "Reports": "Berichter", + "Pick a report to open it.": "Wielt e Bericht fir en opzemaachen.", + "Open": "Op", + "In progress": "A Gaang", + "Blocked": "Blockéiert", + "Date": "Datum", + "Due": "Fälleg", + "Assignee": "Zougewisen", + "Who": "Wien", + "What": "Wat", + "Minutes": "Minutten", + "Entries": "Andeel", + "Most recent": "Am rezentsten", + "Per person": "Pro Persoun", + "By status": "No Status", + "By priority": "No Prioritéit", + "Character roster": "Charakterlëscht", + "Progression": "Fortschrëtt", + "World content": "Weltinhalt", + "Awaiting approval": "Waart op Zoustëmmung", + "Player characters": "Spillercharakteren", + "Awards": "Verginn", + "Experience": "Erfarung", + "Experience awarded": "Vergiff Erfarung", + "Per character": "Pro Charakter", + "By type": "No Typ", + "By approval": "No Zoustëmmung", + "Items carried by characters": "Géigestänn déi Charakteren droen", + "Conditions on characters": "Zoustänn op Charakteren", + "Nothing awarded yet": "Nach näischt vergiff", + "Who is playing what, and what is still waiting for approval.": "Wien wat spillt a wat nach op Zoustëmmung waart.", + "Experience awarded, and who earned it.": "Vergiff Erfarung a wien se verdéngt huet.", + "How much the world holds, and what characters actually carry.": "Wéi vill d'Welt hält a wat Charakteren wierklech droen." }, "plurals": {} } diff --git a/l10n/lt.js b/l10n/lt.js index 37fa7db5..57c0d0c4 100644 --- a/l10n/lt.js +++ b/l10n/lt.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Unikalus artefaktas", "Unique Condition": "Unikali būsena", "XP Amount": "Patirties taškų skaičius", - "XP Award": "Patirties taškų skyrimas" + "XP Award": "Patirties taškų skyrimas", + "Reports": "Ataskaitos", + "Pick a report to open it.": "Pasirinkite ataskaitą, kad ją atidarytumėte.", + "Open": "Atviras", + "In progress": "Vykdoma", + "Blocked": "Užblokuota", + "Date": "Data", + "Due": "Terminas", + "Assignee": "Priskirta", + "Who": "Kas", + "What": "Kas", + "Minutes": "Minutės", + "Entries": "Įrašai", + "Most recent": "Naujausi", + "Per person": "Vienam asmeniui", + "By status": "Pagal būseną", + "By priority": "Pagal prioritetą", + "Character roster": "Personažų sąrašas", + "Progression": "Progresas", + "World content": "Pasaulio turinys", + "Awaiting approval": "Laukia patvirtinimo", + "Player characters": "Žaidėjų personažai", + "Awards": "Skyrimai", + "Experience": "Patirtis", + "Experience awarded": "Suteikta patirtis", + "Per character": "Vienam personažui", + "By type": "Pagal tipą", + "By approval": "Pagal patvirtinimą", + "Items carried by characters": "Personažų nešami daiktai", + "Conditions on characters": "Personažų būsenos", + "Nothing awarded yet": "Dar nieko nesuteikta", + "Who is playing what, and what is still waiting for approval.": "Kas ką žaidžia ir kas dar laukia patvirtinimo.", + "Experience awarded, and who earned it.": "Suteikta patirtis ir kas ją užsidirbo.", + "How much the world holds, and what characters actually carry.": "Kiek pasaulis apima ir ką personažai iš tikrųjų neša." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lt.json b/l10n/lt.json index c980e6f2..d70bee32 100644 --- a/l10n/lt.json +++ b/l10n/lt.json @@ -222,7 +222,40 @@ "Unique Artifact": "Unikalus artefaktas", "Unique Condition": "Unikali būsena", "XP Amount": "Patirties taškų skaičius", - "XP Award": "Patirties taškų skyrimas" + "XP Award": "Patirties taškų skyrimas", + "Reports": "Ataskaitos", + "Pick a report to open it.": "Pasirinkite ataskaitą, kad ją atidarytumėte.", + "Open": "Atviras", + "In progress": "Vykdoma", + "Blocked": "Užblokuota", + "Date": "Data", + "Due": "Terminas", + "Assignee": "Priskirta", + "Who": "Kas", + "What": "Kas", + "Minutes": "Minutės", + "Entries": "Įrašai", + "Most recent": "Naujausi", + "Per person": "Vienam asmeniui", + "By status": "Pagal būseną", + "By priority": "Pagal prioritetą", + "Character roster": "Personažų sąrašas", + "Progression": "Progresas", + "World content": "Pasaulio turinys", + "Awaiting approval": "Laukia patvirtinimo", + "Player characters": "Žaidėjų personažai", + "Awards": "Skyrimai", + "Experience": "Patirtis", + "Experience awarded": "Suteikta patirtis", + "Per character": "Vienam personažui", + "By type": "Pagal tipą", + "By approval": "Pagal patvirtinimą", + "Items carried by characters": "Personažų nešami daiktai", + "Conditions on characters": "Personažų būsenos", + "Nothing awarded yet": "Dar nieko nesuteikta", + "Who is playing what, and what is still waiting for approval.": "Kas ką žaidžia ir kas dar laukia patvirtinimo.", + "Experience awarded, and who earned it.": "Suteikta patirtis ir kas ją užsidirbo.", + "How much the world holds, and what characters actually carry.": "Kiek pasaulis apima ir ką personažai iš tikrųjų neša." }, "plurals": {} } diff --git a/l10n/lv.js b/l10n/lv.js index f592a8e6..9966eaa3 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Unikāls artefakts", "Unique Condition": "Unikāls stāvoklis", "XP Amount": "Pieredzes punktu skaits", - "XP Award": "Pieredzes punktu piešķiršana" + "XP Award": "Pieredzes punktu piešķiršana", + "Reports": "Pārskati", + "Pick a report to open it.": "Izvēlieties pārskatu, lai to atvērtu.", + "Open": "Atvērts", + "In progress": "Notiek", + "Blocked": "Bloķēts", + "Date": "Datums", + "Due": "Termiņš", + "Assignee": "Piešķirts", + "Who": "Kurš", + "What": "Kas", + "Minutes": "Minūtes", + "Entries": "Ieraksti", + "Most recent": "Jaunākie", + "Per person": "Uz personu", + "By status": "Pēc statusa", + "By priority": "Pēc prioritātes", + "Character roster": "Tēlu saraksts", + "Progression": "Progresija", + "World content": "Pasaules saturs", + "Awaiting approval": "Gaida apstiprinājumu", + "Player characters": "Spēlētāju tēli", + "Awards": "Piešķīrumi", + "Experience": "Pieredze", + "Experience awarded": "Piešķirtā pieredze", + "Per character": "Uz tēlu", + "By type": "Pēc veida", + "By approval": "Pēc apstiprinājuma", + "Items carried by characters": "Priekšmeti, ko nes tēli", + "Conditions on characters": "Stāvokļi tēliem", + "Nothing awarded yet": "Vēl nekas nav piešķirts", + "Who is playing what, and what is still waiting for approval.": "Kurš ko spēlē un kas vēl gaida apstiprinājumu.", + "Experience awarded, and who earned it.": "Piešķirtā pieredze un kurš to nopelnīja.", + "How much the world holds, and what characters actually carry.": "Cik daudz pasaule ietver un ko tēli patiešām nes." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lv.json b/l10n/lv.json index 48ff2b60..531baa3f 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -222,7 +222,40 @@ "Unique Artifact": "Unikāls artefakts", "Unique Condition": "Unikāls stāvoklis", "XP Amount": "Pieredzes punktu skaits", - "XP Award": "Pieredzes punktu piešķiršana" + "XP Award": "Pieredzes punktu piešķiršana", + "Reports": "Pārskati", + "Pick a report to open it.": "Izvēlieties pārskatu, lai to atvērtu.", + "Open": "Atvērts", + "In progress": "Notiek", + "Blocked": "Bloķēts", + "Date": "Datums", + "Due": "Termiņš", + "Assignee": "Piešķirts", + "Who": "Kurš", + "What": "Kas", + "Minutes": "Minūtes", + "Entries": "Ieraksti", + "Most recent": "Jaunākie", + "Per person": "Uz personu", + "By status": "Pēc statusa", + "By priority": "Pēc prioritātes", + "Character roster": "Tēlu saraksts", + "Progression": "Progresija", + "World content": "Pasaules saturs", + "Awaiting approval": "Gaida apstiprinājumu", + "Player characters": "Spēlētāju tēli", + "Awards": "Piešķīrumi", + "Experience": "Pieredze", + "Experience awarded": "Piešķirtā pieredze", + "Per character": "Uz tēlu", + "By type": "Pēc veida", + "By approval": "Pēc apstiprinājuma", + "Items carried by characters": "Priekšmeti, ko nes tēli", + "Conditions on characters": "Stāvokļi tēliem", + "Nothing awarded yet": "Vēl nekas nav piešķirts", + "Who is playing what, and what is still waiting for approval.": "Kurš ko spēlē un kas vēl gaida apstiprinājumu.", + "Experience awarded, and who earned it.": "Piešķirtā pieredze un kurš to nopelnīja.", + "How much the world holds, and what characters actually carry.": "Cik daudz pasaule ietver un ko tēli patiešām nes." }, "plurals": {} } diff --git a/l10n/mk.js b/l10n/mk.js index e66ee76a..6645cea1 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Уникатен артефакт", "Unique Condition": "Уникатна состојба", "XP Amount": "Број на поени искуство", - "XP Award": "Доделување поени искуство" + "XP Award": "Доделување поени искуство", + "Reports": "Извештаи", + "Pick a report to open it.": "Изберете извештај за да го отворите.", + "Open": "Отворено", + "In progress": "Во тек", + "Blocked": "Блокирано", + "Date": "Датум", + "Due": "Рок", + "Assignee": "Доделено", + "Who": "Кој", + "What": "Што", + "Minutes": "Минути", + "Entries": "Записи", + "Most recent": "Најнови", + "Per person": "По лице", + "By status": "По статус", + "By priority": "По приоритет", + "Character roster": "Список на ликови", + "Progression": "Напредок", + "World content": "Содржина на светот", + "Awaiting approval": "Чека одобрување", + "Player characters": "Ликови на играчи", + "Awards": "Доделувања", + "Experience": "Искуство", + "Experience awarded": "Доделено искуство", + "Per character": "По лик", + "By type": "По тип", + "By approval": "По одобрување", + "Items carried by characters": "Предмети што ги носат ликовите", + "Conditions on characters": "Состојби на ликовите", + "Nothing awarded yet": "Сè уште ништо не е доделено", + "Who is playing what, and what is still waiting for approval.": "Кој што игра и што сè уште чека одобрување.", + "Experience awarded, and who earned it.": "Доделеното искуство и кој го заработил.", + "How much the world holds, and what characters actually carry.": "Колку содржи светот и што навистина носат ликовите." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mk.json b/l10n/mk.json index 98e34663..faf891a3 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -222,7 +222,40 @@ "Unique Artifact": "Уникатен артефакт", "Unique Condition": "Уникатна состојба", "XP Amount": "Број на поени искуство", - "XP Award": "Доделување поени искуство" + "XP Award": "Доделување поени искуство", + "Reports": "Извештаи", + "Pick a report to open it.": "Изберете извештај за да го отворите.", + "Open": "Отворено", + "In progress": "Во тек", + "Blocked": "Блокирано", + "Date": "Датум", + "Due": "Рок", + "Assignee": "Доделено", + "Who": "Кој", + "What": "Што", + "Minutes": "Минути", + "Entries": "Записи", + "Most recent": "Најнови", + "Per person": "По лице", + "By status": "По статус", + "By priority": "По приоритет", + "Character roster": "Список на ликови", + "Progression": "Напредок", + "World content": "Содржина на светот", + "Awaiting approval": "Чека одобрување", + "Player characters": "Ликови на играчи", + "Awards": "Доделувања", + "Experience": "Искуство", + "Experience awarded": "Доделено искуство", + "Per character": "По лик", + "By type": "По тип", + "By approval": "По одобрување", + "Items carried by characters": "Предмети што ги носат ликовите", + "Conditions on characters": "Состојби на ликовите", + "Nothing awarded yet": "Сè уште ништо не е доделено", + "Who is playing what, and what is still waiting for approval.": "Кој што игра и што сè уште чека одобрување.", + "Experience awarded, and who earned it.": "Доделеното искуство и кој го заработил.", + "How much the world holds, and what characters actually carry.": "Колку содржи светот и што навистина носат ликовите." }, "plurals": {} } diff --git a/l10n/mt.js b/l10n/mt.js index 840d2b1e..c9c9c6d5 100644 --- a/l10n/mt.js +++ b/l10n/mt.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Artefatt uniku", "Unique Condition": "Kundizzjoni unika", "XP Amount": "Ammont ta' punti ta' esperjenza", - "XP Award": "Għoti ta' punti ta' esperjenza" + "XP Award": "Għoti ta' punti ta' esperjenza", + "Reports": "Rapporti", + "Pick a report to open it.": "Agħżel rapport biex tiftħu.", + "Open": "Miftuħ", + "In progress": "Għaddej", + "Blocked": "Imblukkat", + "Date": "Data", + "Due": "Skadenza", + "Assignee": "Assenjat lil", + "Who": "Min", + "What": "Xiex", + "Minutes": "Minuti", + "Entries": "Entrati", + "Most recent": "L-aktar reċenti", + "Per person": "Għal kull persuna", + "By status": "Skont l-istatus", + "By priority": "Skont il-prijorità", + "Character roster": "Lista tal-karattri", + "Progression": "Progressjoni", + "World content": "Kontenut tad-dinja", + "Awaiting approval": "Jistenna approvazzjoni", + "Player characters": "Karattri tal-plejers", + "Awards": "Għotjiet", + "Experience": "Esperjenza", + "Experience awarded": "Esperjenza mogħtija", + "Per character": "Għal kull karattru", + "By type": "Skont it-tip", + "By approval": "Skont l-approvazzjoni", + "Items carried by characters": "Oġġetti miġjuba mill-karattri", + "Conditions on characters": "Kundizzjonijiet fuq il-karattri", + "Nothing awarded yet": "Xejn ma ngħata s'issa", + "Who is playing what, and what is still waiting for approval.": "Min qed jilgħab xiex, u x'għadu jistenna approvazzjoni.", + "Experience awarded, and who earned it.": "L-esperjenza mogħtija u min qalagħha.", + "How much the world holds, and what characters actually carry.": "Kemm iżomm id-dinja, u x'iġorru tabilħaqq il-karattri." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mt.json b/l10n/mt.json index b44fa30b..39515da6 100644 --- a/l10n/mt.json +++ b/l10n/mt.json @@ -222,7 +222,40 @@ "Unique Artifact": "Artefatt uniku", "Unique Condition": "Kundizzjoni unika", "XP Amount": "Ammont ta' punti ta' esperjenza", - "XP Award": "Għoti ta' punti ta' esperjenza" + "XP Award": "Għoti ta' punti ta' esperjenza", + "Reports": "Rapporti", + "Pick a report to open it.": "Agħżel rapport biex tiftħu.", + "Open": "Miftuħ", + "In progress": "Għaddej", + "Blocked": "Imblukkat", + "Date": "Data", + "Due": "Skadenza", + "Assignee": "Assenjat lil", + "Who": "Min", + "What": "Xiex", + "Minutes": "Minuti", + "Entries": "Entrati", + "Most recent": "L-aktar reċenti", + "Per person": "Għal kull persuna", + "By status": "Skont l-istatus", + "By priority": "Skont il-prijorità", + "Character roster": "Lista tal-karattri", + "Progression": "Progressjoni", + "World content": "Kontenut tad-dinja", + "Awaiting approval": "Jistenna approvazzjoni", + "Player characters": "Karattri tal-plejers", + "Awards": "Għotjiet", + "Experience": "Esperjenza", + "Experience awarded": "Esperjenza mogħtija", + "Per character": "Għal kull karattru", + "By type": "Skont it-tip", + "By approval": "Skont l-approvazzjoni", + "Items carried by characters": "Oġġetti miġjuba mill-karattri", + "Conditions on characters": "Kundizzjonijiet fuq il-karattri", + "Nothing awarded yet": "Xejn ma ngħata s'issa", + "Who is playing what, and what is still waiting for approval.": "Min qed jilgħab xiex, u x'għadu jistenna approvazzjoni.", + "Experience awarded, and who earned it.": "L-esperjenza mogħtija u min qalagħha.", + "How much the world holds, and what characters actually carry.": "Kemm iżomm id-dinja, u x'iġorru tabilħaqq il-karattri." }, "plurals": {} } diff --git a/l10n/nb.js b/l10n/nb.js index 03fd0532..23366fb4 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Unik artefakt", "Unique Condition": "Unik tilstand", "XP Amount": "Antall erfaringspoeng", - "XP Award": "XP-tildeling" + "XP Award": "XP-tildeling", + "Reports": "Rapporter", + "Pick a report to open it.": "Velg en rapport for å åpne den.", + "Open": "Åpen", + "In progress": "Pågår", + "Blocked": "Blokkert", + "Date": "Dato", + "Due": "Frist", + "Assignee": "Tildelt", + "Who": "Hvem", + "What": "Hva", + "Minutes": "Minutter", + "Entries": "Oppføringer", + "Most recent": "Nyeste", + "Per person": "Per person", + "By status": "Etter status", + "By priority": "Etter prioritet", + "Character roster": "Karakterliste", + "Progression": "Progresjon", + "World content": "Verdensinnhold", + "Awaiting approval": "Venter på godkjenning", + "Player characters": "Spillerkarakterer", + "Awards": "Tildelinger", + "Experience": "Erfaring", + "Experience awarded": "Tildelt erfaring", + "Per character": "Per karakter", + "By type": "Etter type", + "By approval": "Etter godkjenning", + "Items carried by characters": "Gjenstander båret av karakterer", + "Conditions on characters": "Tilstander på karakterer", + "Nothing awarded yet": "Ingenting tildelt ennå", + "Who is playing what, and what is still waiting for approval.": "Hvem som spiller hva, og hva som fortsatt venter på godkjenning.", + "Experience awarded, and who earned it.": "Tildelt erfaring, og hvem som har opptjent den.", + "How much the world holds, and what characters actually carry.": "Hvor mye verden rommer, og hva karakterene faktisk bærer." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nb.json b/l10n/nb.json index 777c319e..7f1cc154 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -222,7 +222,40 @@ "Unique Artifact": "Unik artefakt", "Unique Condition": "Unik tilstand", "XP Amount": "Antall erfaringspoeng", - "XP Award": "XP-tildeling" + "XP Award": "XP-tildeling", + "Reports": "Rapporter", + "Pick a report to open it.": "Velg en rapport for å åpne den.", + "Open": "Åpen", + "In progress": "Pågår", + "Blocked": "Blokkert", + "Date": "Dato", + "Due": "Frist", + "Assignee": "Tildelt", + "Who": "Hvem", + "What": "Hva", + "Minutes": "Minutter", + "Entries": "Oppføringer", + "Most recent": "Nyeste", + "Per person": "Per person", + "By status": "Etter status", + "By priority": "Etter prioritet", + "Character roster": "Karakterliste", + "Progression": "Progresjon", + "World content": "Verdensinnhold", + "Awaiting approval": "Venter på godkjenning", + "Player characters": "Spillerkarakterer", + "Awards": "Tildelinger", + "Experience": "Erfaring", + "Experience awarded": "Tildelt erfaring", + "Per character": "Per karakter", + "By type": "Etter type", + "By approval": "Etter godkjenning", + "Items carried by characters": "Gjenstander båret av karakterer", + "Conditions on characters": "Tilstander på karakterer", + "Nothing awarded yet": "Ingenting tildelt ennå", + "Who is playing what, and what is still waiting for approval.": "Hvem som spiller hva, og hva som fortsatt venter på godkjenning.", + "Experience awarded, and who earned it.": "Tildelt erfaring, og hvem som har opptjent den.", + "How much the world holds, and what characters actually carry.": "Hvor mye verden rommer, og hva karakterene faktisk bærer." }, "plurals": {} } diff --git a/l10n/nl.js b/l10n/nl.js index aadf76b4..b51650d5 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -315,7 +315,40 @@ OC.L10N.register( "npc": "npc", "other": "overig", "player": "speler", - "positive": "positief" + "positive": "positief", + "Reports": "Rapporten", + "Pick a report to open it.": "Kies een rapport om het te openen.", + "Open": "Open", + "In progress": "In behandeling", + "Blocked": "Geblokkeerd", + "Date": "Datum", + "Due": "Deadline", + "Assignee": "Toegewezen aan", + "Who": "Wie", + "What": "Wat", + "Minutes": "Minuten", + "Entries": "Regels", + "Most recent": "Meest recent", + "Per person": "Per persoon", + "By status": "Op status", + "By priority": "Op prioriteit", + "Character roster": "Personagelijst", + "Progression": "Progressie", + "World content": "Wereldinhoud", + "Awaiting approval": "Wacht op goedkeuring", + "Player characters": "Spelerspersonages", + "Awards": "Toekenningen", + "Experience": "Ervaring", + "Experience awarded": "Toegekende ervaring", + "Per character": "Per personage", + "By type": "Op type", + "By approval": "Op goedkeuring", + "Items carried by characters": "Voorwerpen die personages dragen", + "Conditions on characters": "Aandoeningen op personages", + "Nothing awarded yet": "Nog niets toegekend", + "Who is playing what, and what is still waiting for approval.": "Wie wat speelt, en wat nog op goedkeuring wacht.", + "Experience awarded, and who earned it.": "Toegekende ervaring, en wie die verdiend heeft.", + "How much the world holds, and what characters actually carry.": "Hoeveel de wereld bevat, en wat personages werkelijk dragen." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nl.json b/l10n/nl.json index 33c100a8..6e9b5360 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -314,7 +314,40 @@ "npc": "npc", "other": "overig", "player": "speler", - "positive": "positief" + "positive": "positief", + "Reports": "Rapporten", + "Pick a report to open it.": "Kies een rapport om het te openen.", + "Open": "Open", + "In progress": "In behandeling", + "Blocked": "Geblokkeerd", + "Date": "Datum", + "Due": "Deadline", + "Assignee": "Toegewezen aan", + "Who": "Wie", + "What": "Wat", + "Minutes": "Minuten", + "Entries": "Regels", + "Most recent": "Meest recent", + "Per person": "Per persoon", + "By status": "Op status", + "By priority": "Op prioriteit", + "Character roster": "Personagelijst", + "Progression": "Progressie", + "World content": "Wereldinhoud", + "Awaiting approval": "Wacht op goedkeuring", + "Player characters": "Spelerspersonages", + "Awards": "Toekenningen", + "Experience": "Ervaring", + "Experience awarded": "Toegekende ervaring", + "Per character": "Per personage", + "By type": "Op type", + "By approval": "Op goedkeuring", + "Items carried by characters": "Voorwerpen die personages dragen", + "Conditions on characters": "Aandoeningen op personages", + "Nothing awarded yet": "Nog niets toegekend", + "Who is playing what, and what is still waiting for approval.": "Wie wat speelt, en wat nog op goedkeuring wacht.", + "Experience awarded, and who earned it.": "Toegekende ervaring, en wie die verdiend heeft.", + "How much the world holds, and what characters actually carry.": "Hoeveel de wereld bevat, en wat personages werkelijk dragen." }, "plurals": {}, "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/pl.js b/l10n/pl.js index abb8bab1..7e76450a 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Unikalny artefakt", "Unique Condition": "Unikalny stan", "XP Amount": "Liczba punktów doświadczenia", - "XP Award": "Przyznanie punktów doświadczenia" + "XP Award": "Przyznanie punktów doświadczenia", + "Reports": "Raporty", + "Pick a report to open it.": "Wybierz raport, aby go otworzyć.", + "Open": "Otwarte", + "In progress": "W toku", + "Blocked": "Zablokowane", + "Date": "Data", + "Due": "Termin", + "Assignee": "Przypisane do", + "Who": "Kto", + "What": "Co", + "Minutes": "Minuty", + "Entries": "Wpisy", + "Most recent": "Najnowsze", + "Per person": "Na osobę", + "By status": "Według statusu", + "By priority": "Według priorytetu", + "Character roster": "Lista postaci", + "Progression": "Postęp", + "World content": "Zawartość świata", + "Awaiting approval": "Oczekuje na zatwierdzenie", + "Player characters": "Postacie graczy", + "Awards": "Przyznania", + "Experience": "Doświadczenie", + "Experience awarded": "Przyznane doświadczenie", + "Per character": "Na postać", + "By type": "Według typu", + "By approval": "Według zatwierdzenia", + "Items carried by characters": "Przedmioty niesione przez postacie", + "Conditions on characters": "Stany postaci", + "Nothing awarded yet": "Nic jeszcze nie przyznano", + "Who is playing what, and what is still waiting for approval.": "Kto w co gra i co wciąż czeka na zatwierdzenie.", + "Experience awarded, and who earned it.": "Przyznane doświadczenie i kto na nie zapracował.", + "How much the world holds, and what characters actually carry.": "Ile zawiera świat i co postacie naprawdę noszą." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pl.json b/l10n/pl.json index 04dfe872..8865e79b 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -222,7 +222,40 @@ "Unique Artifact": "Unikalny artefakt", "Unique Condition": "Unikalny stan", "XP Amount": "Liczba punktów doświadczenia", - "XP Award": "Przyznanie punktów doświadczenia" + "XP Award": "Przyznanie punktów doświadczenia", + "Reports": "Raporty", + "Pick a report to open it.": "Wybierz raport, aby go otworzyć.", + "Open": "Otwarte", + "In progress": "W toku", + "Blocked": "Zablokowane", + "Date": "Data", + "Due": "Termin", + "Assignee": "Przypisane do", + "Who": "Kto", + "What": "Co", + "Minutes": "Minuty", + "Entries": "Wpisy", + "Most recent": "Najnowsze", + "Per person": "Na osobę", + "By status": "Według statusu", + "By priority": "Według priorytetu", + "Character roster": "Lista postaci", + "Progression": "Postęp", + "World content": "Zawartość świata", + "Awaiting approval": "Oczekuje na zatwierdzenie", + "Player characters": "Postacie graczy", + "Awards": "Przyznania", + "Experience": "Doświadczenie", + "Experience awarded": "Przyznane doświadczenie", + "Per character": "Na postać", + "By type": "Według typu", + "By approval": "Według zatwierdzenia", + "Items carried by characters": "Przedmioty niesione przez postacie", + "Conditions on characters": "Stany postaci", + "Nothing awarded yet": "Nic jeszcze nie przyznano", + "Who is playing what, and what is still waiting for approval.": "Kto w co gra i co wciąż czeka na zatwierdzenie.", + "Experience awarded, and who earned it.": "Przyznane doświadczenie i kto na nie zapracował.", + "How much the world holds, and what characters actually carry.": "Ile zawiera świat i co postacie naprawdę noszą." }, "plurals": {} } diff --git a/l10n/pt.js b/l10n/pt.js index 88923f06..7bcefc1a 100644 --- a/l10n/pt.js +++ b/l10n/pt.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Artefacto único", "Unique Condition": "Condição única", "XP Amount": "Quantidade de pontos de experiência", - "XP Award": "Atribuição de pontos de experiência" + "XP Award": "Atribuição de pontos de experiência", + "Reports": "Relatórios", + "Pick a report to open it.": "Escolha um relatório para o abrir.", + "Open": "Aberto", + "In progress": "Em curso", + "Blocked": "Bloqueado", + "Date": "Data", + "Due": "Prazo", + "Assignee": "Atribuído a", + "Who": "Quem", + "What": "O quê", + "Minutes": "Minutos", + "Entries": "Entradas", + "Most recent": "Mais recentes", + "Per person": "Por pessoa", + "By status": "Por estado", + "By priority": "Por prioridade", + "Character roster": "Lista de personagens", + "Progression": "Progressão", + "World content": "Conteúdo do mundo", + "Awaiting approval": "A aguardar aprovação", + "Player characters": "Personagens de jogador", + "Awards": "Atribuições", + "Experience": "Experiência", + "Experience awarded": "Experiência atribuída", + "Per character": "Por personagem", + "By type": "Por tipo", + "By approval": "Por aprovação", + "Items carried by characters": "Itens levados pelas personagens", + "Conditions on characters": "Estados nas personagens", + "Nothing awarded yet": "Ainda nada atribuído", + "Who is playing what, and what is still waiting for approval.": "Quem joga o quê, e o que ainda aguarda aprovação.", + "Experience awarded, and who earned it.": "A experiência atribuída e quem a ganhou.", + "How much the world holds, and what characters actually carry.": "Quanto o mundo contém, e o que as personagens realmente levam." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pt.json b/l10n/pt.json index 71e9d0c0..3e611802 100644 --- a/l10n/pt.json +++ b/l10n/pt.json @@ -222,7 +222,40 @@ "Unique Artifact": "Artefacto único", "Unique Condition": "Condição única", "XP Amount": "Quantidade de pontos de experiência", - "XP Award": "Atribuição de pontos de experiência" + "XP Award": "Atribuição de pontos de experiência", + "Reports": "Relatórios", + "Pick a report to open it.": "Escolha um relatório para o abrir.", + "Open": "Aberto", + "In progress": "Em curso", + "Blocked": "Bloqueado", + "Date": "Data", + "Due": "Prazo", + "Assignee": "Atribuído a", + "Who": "Quem", + "What": "O quê", + "Minutes": "Minutos", + "Entries": "Entradas", + "Most recent": "Mais recentes", + "Per person": "Por pessoa", + "By status": "Por estado", + "By priority": "Por prioridade", + "Character roster": "Lista de personagens", + "Progression": "Progressão", + "World content": "Conteúdo do mundo", + "Awaiting approval": "A aguardar aprovação", + "Player characters": "Personagens de jogador", + "Awards": "Atribuições", + "Experience": "Experiência", + "Experience awarded": "Experiência atribuída", + "Per character": "Por personagem", + "By type": "Por tipo", + "By approval": "Por aprovação", + "Items carried by characters": "Itens levados pelas personagens", + "Conditions on characters": "Estados nas personagens", + "Nothing awarded yet": "Ainda nada atribuído", + "Who is playing what, and what is still waiting for approval.": "Quem joga o quê, e o que ainda aguarda aprovação.", + "Experience awarded, and who earned it.": "A experiência atribuída e quem a ganhou.", + "How much the world holds, and what characters actually carry.": "Quanto o mundo contém, e o que as personagens realmente levam." }, "plurals": {} } diff --git a/l10n/rm.js b/l10n/rm.js index 71148699..679cce01 100644 --- a/l10n/rm.js +++ b/l10n/rm.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Artefact unic", "Unique Condition": "Conditiun unica", "XP Amount": "Dumber da puncts d'experientscha", - "XP Award": "Attribuziun da puncts d'experientscha" + "XP Award": "Attribuziun da puncts d'experientscha", + "Reports": "Rapports", + "Pick a report to open it.": "Tscherni in rapport per l'avrir.", + "Open": "Avert", + "In progress": "En lavur", + "Blocked": "Bloccà", + "Date": "Data", + "Due": "Termin", + "Assignee": "Attribuì a", + "Who": "Tgi", + "What": "Tge", + "Minutes": "Minutas", + "Entries": "Endataziuns", + "Most recent": "Ils pli novs", + "Per person": "Per persuna", + "By status": "Tenor il status", + "By priority": "Tenor la prioritad", + "Character roster": "Glista da persunas", + "Progression": "Progress", + "World content": "Cuntegn dal mund", + "Awaiting approval": "Spetga l'approvaziun", + "Player characters": "Persunas da giugaders", + "Awards": "Attribuziuns", + "Experience": "Experientscha", + "Experience awarded": "Experientscha attribuida", + "Per character": "Per persuna", + "By type": "Tenor il tip", + "By approval": "Tenor l'approvaziun", + "Items carried by characters": "Objects purtads da persunas", + "Conditions on characters": "Cundiziuns sin persunas", + "Nothing awarded yet": "Anc nagut attribuì", + "Who is playing what, and what is still waiting for approval.": "Tgi che giogia tge, e tge che spetga anc l'approvaziun.", + "Experience awarded, and who earned it.": "L'experientscha attribuida e tgi ch'i l'ha gudagnà.", + "How much the world holds, and what characters actually carry.": "Quant ch'il mund cuntegna e tge che las persunas portan propi." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/rm.json b/l10n/rm.json index a686f445..56f0a8a4 100644 --- a/l10n/rm.json +++ b/l10n/rm.json @@ -222,7 +222,40 @@ "Unique Artifact": "Artefact unic", "Unique Condition": "Conditiun unica", "XP Amount": "Dumber da puncts d'experientscha", - "XP Award": "Attribuziun da puncts d'experientscha" + "XP Award": "Attribuziun da puncts d'experientscha", + "Reports": "Rapports", + "Pick a report to open it.": "Tscherni in rapport per l'avrir.", + "Open": "Avert", + "In progress": "En lavur", + "Blocked": "Bloccà", + "Date": "Data", + "Due": "Termin", + "Assignee": "Attribuì a", + "Who": "Tgi", + "What": "Tge", + "Minutes": "Minutas", + "Entries": "Endataziuns", + "Most recent": "Ils pli novs", + "Per person": "Per persuna", + "By status": "Tenor il status", + "By priority": "Tenor la prioritad", + "Character roster": "Glista da persunas", + "Progression": "Progress", + "World content": "Cuntegn dal mund", + "Awaiting approval": "Spetga l'approvaziun", + "Player characters": "Persunas da giugaders", + "Awards": "Attribuziuns", + "Experience": "Experientscha", + "Experience awarded": "Experientscha attribuida", + "Per character": "Per persuna", + "By type": "Tenor il tip", + "By approval": "Tenor l'approvaziun", + "Items carried by characters": "Objects purtads da persunas", + "Conditions on characters": "Cundiziuns sin persunas", + "Nothing awarded yet": "Anc nagut attribuì", + "Who is playing what, and what is still waiting for approval.": "Tgi che giogia tge, e tge che spetga anc l'approvaziun.", + "Experience awarded, and who earned it.": "L'experientscha attribuida e tgi ch'i l'ha gudagnà.", + "How much the world holds, and what characters actually carry.": "Quant ch'il mund cuntegna e tge che las persunas portan propi." }, "plurals": {} } diff --git a/l10n/ro.js b/l10n/ro.js index 6142cbf3..6ffd71db 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Artefact unic", "Unique Condition": "Stare unică", "XP Amount": "Cantitatea de puncte de experiență", - "XP Award": "Acordare de puncte de experiență" + "XP Award": "Acordare de puncte de experiență", + "Reports": "Rapoarte", + "Pick a report to open it.": "Alegeți un raport pentru a-l deschide.", + "Open": "Deschis", + "In progress": "În curs", + "Blocked": "Blocat", + "Date": "Dată", + "Due": "Scadență", + "Assignee": "Atribuit lui", + "Who": "Cine", + "What": "Ce", + "Minutes": "Minute", + "Entries": "Intrări", + "Most recent": "Cele mai recente", + "Per person": "Per persoană", + "By status": "După stare", + "By priority": "După prioritate", + "Character roster": "Lista personajelor", + "Progression": "Progres", + "World content": "Conținutul lumii", + "Awaiting approval": "În așteptarea aprobării", + "Player characters": "Personajele jucătorilor", + "Awards": "Acordări", + "Experience": "Experiență", + "Experience awarded": "Experiență acordată", + "Per character": "Per personaj", + "By type": "După tip", + "By approval": "După aprobare", + "Items carried by characters": "Obiecte purtate de personaje", + "Conditions on characters": "Stări pe personaje", + "Nothing awarded yet": "Încă nu s-a acordat nimic", + "Who is playing what, and what is still waiting for approval.": "Cine joacă ce și ce mai așteaptă aprobare.", + "Experience awarded, and who earned it.": "Experiența acordată și cine a câștigat-o.", + "How much the world holds, and what characters actually carry.": "Cât conține lumea și ce poartă de fapt personajele." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ro.json b/l10n/ro.json index 252d1b4a..4f2df677 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -222,7 +222,40 @@ "Unique Artifact": "Artefact unic", "Unique Condition": "Stare unică", "XP Amount": "Cantitatea de puncte de experiență", - "XP Award": "Acordare de puncte de experiență" + "XP Award": "Acordare de puncte de experiență", + "Reports": "Rapoarte", + "Pick a report to open it.": "Alegeți un raport pentru a-l deschide.", + "Open": "Deschis", + "In progress": "În curs", + "Blocked": "Blocat", + "Date": "Dată", + "Due": "Scadență", + "Assignee": "Atribuit lui", + "Who": "Cine", + "What": "Ce", + "Minutes": "Minute", + "Entries": "Intrări", + "Most recent": "Cele mai recente", + "Per person": "Per persoană", + "By status": "După stare", + "By priority": "După prioritate", + "Character roster": "Lista personajelor", + "Progression": "Progres", + "World content": "Conținutul lumii", + "Awaiting approval": "În așteptarea aprobării", + "Player characters": "Personajele jucătorilor", + "Awards": "Acordări", + "Experience": "Experiență", + "Experience awarded": "Experiență acordată", + "Per character": "Per personaj", + "By type": "După tip", + "By approval": "După aprobare", + "Items carried by characters": "Obiecte purtate de personaje", + "Conditions on characters": "Stări pe personaje", + "Nothing awarded yet": "Încă nu s-a acordat nimic", + "Who is playing what, and what is still waiting for approval.": "Cine joacă ce și ce mai așteaptă aprobare.", + "Experience awarded, and who earned it.": "Experiența acordată și cine a câștigat-o.", + "How much the world holds, and what characters actually carry.": "Cât conține lumea și ce poartă de fapt personajele." }, "plurals": {} } diff --git a/l10n/ru.js b/l10n/ru.js index 3d78b445..af7f0fdf 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Уникальный артефакт", "Unique Condition": "Уникальное состояние", "XP Amount": "Количество очков опыта", - "XP Award": "Начисление очков опыта" + "XP Award": "Начисление очков опыта", + "Reports": "Отчёты", + "Pick a report to open it.": "Выберите отчёт, чтобы открыть его.", + "Open": "Открыто", + "In progress": "В работе", + "Blocked": "Заблокировано", + "Date": "Дата", + "Due": "Срок", + "Assignee": "Назначено", + "Who": "Кто", + "What": "Что", + "Minutes": "Минуты", + "Entries": "Записи", + "Most recent": "Самые новые", + "Per person": "На человека", + "By status": "По статусу", + "By priority": "По приоритету", + "Character roster": "Список персонажей", + "Progression": "Прогресс", + "World content": "Содержимое мира", + "Awaiting approval": "Ожидает одобрения", + "Player characters": "Персонажи игроков", + "Awards": "Начисления", + "Experience": "Опыт", + "Experience awarded": "Начисленный опыт", + "Per character": "На персонажа", + "By type": "По типу", + "By approval": "По одобрению", + "Items carried by characters": "Предметы, которые несут персонажи", + "Conditions on characters": "Состояния персонажей", + "Nothing awarded yet": "Пока ничего не начислено", + "Who is playing what, and what is still waiting for approval.": "Кто что играет и что ещё ждёт одобрения.", + "Experience awarded, and who earned it.": "Начисленный опыт и кто его заработал.", + "How much the world holds, and what characters actually carry.": "Сколько содержит мир и что персонажи действительно несут." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ru.json b/l10n/ru.json index 5570e3c3..d30caa62 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -222,7 +222,40 @@ "Unique Artifact": "Уникальный артефакт", "Unique Condition": "Уникальное состояние", "XP Amount": "Количество очков опыта", - "XP Award": "Начисление очков опыта" + "XP Award": "Начисление очков опыта", + "Reports": "Отчёты", + "Pick a report to open it.": "Выберите отчёт, чтобы открыть его.", + "Open": "Открыто", + "In progress": "В работе", + "Blocked": "Заблокировано", + "Date": "Дата", + "Due": "Срок", + "Assignee": "Назначено", + "Who": "Кто", + "What": "Что", + "Minutes": "Минуты", + "Entries": "Записи", + "Most recent": "Самые новые", + "Per person": "На человека", + "By status": "По статусу", + "By priority": "По приоритету", + "Character roster": "Список персонажей", + "Progression": "Прогресс", + "World content": "Содержимое мира", + "Awaiting approval": "Ожидает одобрения", + "Player characters": "Персонажи игроков", + "Awards": "Начисления", + "Experience": "Опыт", + "Experience awarded": "Начисленный опыт", + "Per character": "На персонажа", + "By type": "По типу", + "By approval": "По одобрению", + "Items carried by characters": "Предметы, которые несут персонажи", + "Conditions on characters": "Состояния персонажей", + "Nothing awarded yet": "Пока ничего не начислено", + "Who is playing what, and what is still waiting for approval.": "Кто что играет и что ещё ждёт одобрения.", + "Experience awarded, and who earned it.": "Начисленный опыт и кто его заработал.", + "How much the world holds, and what characters actually carry.": "Сколько содержит мир и что персонажи действительно несут." }, "plurals": {} } diff --git a/l10n/sk.js b/l10n/sk.js index 7b5b998e..d174c182 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Jedinečný artefakt", "Unique Condition": "Jedinečný stav", "XP Amount": "Počet skúsenostných bodov", - "XP Award": "Udelenie skúsenostných bodov" + "XP Award": "Udelenie skúsenostných bodov", + "Reports": "Zostavy", + "Pick a report to open it.": "Vyberte zostavu, ktorú chcete otvoriť.", + "Open": "Otvorené", + "In progress": "Prebieha", + "Blocked": "Blokované", + "Date": "Dátum", + "Due": "Termín", + "Assignee": "Priradené", + "Who": "Kto", + "What": "Čo", + "Minutes": "Minúty", + "Entries": "Záznamy", + "Most recent": "Najnovšie", + "Per person": "Na osobu", + "By status": "Podľa stavu", + "By priority": "Podľa priority", + "Character roster": "Zoznam postáv", + "Progression": "Postup", + "World content": "Obsah sveta", + "Awaiting approval": "Čaká na schválenie", + "Player characters": "Postavy hráčov", + "Awards": "Udelenia", + "Experience": "Skúsenosti", + "Experience awarded": "Udelené skúsenosti", + "Per character": "Na postavu", + "By type": "Podľa typu", + "By approval": "Podľa schválenia", + "Items carried by characters": "Predmety nesené postavami", + "Conditions on characters": "Stavy na postavách", + "Nothing awarded yet": "Zatiaľ nič neudelené", + "Who is playing what, and what is still waiting for approval.": "Kto hrá čo a čo ešte čaká na schválenie.", + "Experience awarded, and who earned it.": "Udelené skúsenosti a kto si ich zaslúžil.", + "How much the world holds, and what characters actually carry.": "Koľko svet obsahuje a čo postavy skutočne nesú." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sk.json b/l10n/sk.json index 5427bd0e..b54bbae9 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -222,7 +222,40 @@ "Unique Artifact": "Jedinečný artefakt", "Unique Condition": "Jedinečný stav", "XP Amount": "Počet skúsenostných bodov", - "XP Award": "Udelenie skúsenostných bodov" + "XP Award": "Udelenie skúsenostných bodov", + "Reports": "Zostavy", + "Pick a report to open it.": "Vyberte zostavu, ktorú chcete otvoriť.", + "Open": "Otvorené", + "In progress": "Prebieha", + "Blocked": "Blokované", + "Date": "Dátum", + "Due": "Termín", + "Assignee": "Priradené", + "Who": "Kto", + "What": "Čo", + "Minutes": "Minúty", + "Entries": "Záznamy", + "Most recent": "Najnovšie", + "Per person": "Na osobu", + "By status": "Podľa stavu", + "By priority": "Podľa priority", + "Character roster": "Zoznam postáv", + "Progression": "Postup", + "World content": "Obsah sveta", + "Awaiting approval": "Čaká na schválenie", + "Player characters": "Postavy hráčov", + "Awards": "Udelenia", + "Experience": "Skúsenosti", + "Experience awarded": "Udelené skúsenosti", + "Per character": "Na postavu", + "By type": "Podľa typu", + "By approval": "Podľa schválenia", + "Items carried by characters": "Predmety nesené postavami", + "Conditions on characters": "Stavy na postavách", + "Nothing awarded yet": "Zatiaľ nič neudelené", + "Who is playing what, and what is still waiting for approval.": "Kto hrá čo a čo ešte čaká na schválenie.", + "Experience awarded, and who earned it.": "Udelené skúsenosti a kto si ich zaslúžil.", + "How much the world holds, and what characters actually carry.": "Koľko svet obsahuje a čo postavy skutočne nesú." }, "plurals": {} } diff --git a/l10n/sl.js b/l10n/sl.js index 923e45d2..8f94befa 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Edinstven artefakt", "Unique Condition": "Edinstveno stanje", "XP Amount": "Število izkušenjskih točk", - "XP Award": "Dodelitev izkušenjskih točk" + "XP Award": "Dodelitev izkušenjskih točk", + "Reports": "Poročila", + "Pick a report to open it.": "Izberite poročilo, da ga odprete.", + "Open": "Odprto", + "In progress": "V teku", + "Blocked": "Blokirano", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodeljeno", + "Who": "Kdo", + "What": "Kaj", + "Minutes": "Minute", + "Entries": "Vnosi", + "Most recent": "Najnovejše", + "Per person": "Na osebo", + "By status": "Po stanju", + "By priority": "Po prednosti", + "Character roster": "Seznam likov", + "Progression": "Napredek", + "World content": "Vsebina sveta", + "Awaiting approval": "Čaka odobritev", + "Player characters": "Igralčevi liki", + "Awards": "Dodelitve", + "Experience": "Izkušnje", + "Experience awarded": "Dodeljene izkušnje", + "Per character": "Na lik", + "By type": "Po vrsti", + "By approval": "Po odobritvi", + "Items carried by characters": "Predmeti, ki jih nosijo liki", + "Conditions on characters": "Stanja na likih", + "Nothing awarded yet": "Še ni nič dodeljeno", + "Who is playing what, and what is still waiting for approval.": "Kdo igra kaj in kaj še čaka odobritev.", + "Experience awarded, and who earned it.": "Dodeljene izkušnje in kdo si jih je prislužil.", + "How much the world holds, and what characters actually carry.": "Koliko svet vsebuje in kaj liki dejansko nosijo." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sl.json b/l10n/sl.json index cd16ee12..c572814a 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -222,7 +222,40 @@ "Unique Artifact": "Edinstven artefakt", "Unique Condition": "Edinstveno stanje", "XP Amount": "Število izkušenjskih točk", - "XP Award": "Dodelitev izkušenjskih točk" + "XP Award": "Dodelitev izkušenjskih točk", + "Reports": "Poročila", + "Pick a report to open it.": "Izberite poročilo, da ga odprete.", + "Open": "Odprto", + "In progress": "V teku", + "Blocked": "Blokirano", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodeljeno", + "Who": "Kdo", + "What": "Kaj", + "Minutes": "Minute", + "Entries": "Vnosi", + "Most recent": "Najnovejše", + "Per person": "Na osebo", + "By status": "Po stanju", + "By priority": "Po prednosti", + "Character roster": "Seznam likov", + "Progression": "Napredek", + "World content": "Vsebina sveta", + "Awaiting approval": "Čaka odobritev", + "Player characters": "Igralčevi liki", + "Awards": "Dodelitve", + "Experience": "Izkušnje", + "Experience awarded": "Dodeljene izkušnje", + "Per character": "Na lik", + "By type": "Po vrsti", + "By approval": "Po odobritvi", + "Items carried by characters": "Predmeti, ki jih nosijo liki", + "Conditions on characters": "Stanja na likih", + "Nothing awarded yet": "Še ni nič dodeljeno", + "Who is playing what, and what is still waiting for approval.": "Kdo igra kaj in kaj še čaka odobritev.", + "Experience awarded, and who earned it.": "Dodeljene izkušnje in kdo si jih je prislužil.", + "How much the world holds, and what characters actually carry.": "Koliko svet vsebuje in kaj liki dejansko nosijo." }, "plurals": {} } diff --git a/l10n/sq.js b/l10n/sq.js index d8c927ad..63f8c274 100644 --- a/l10n/sq.js +++ b/l10n/sq.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Artefakt unik", "Unique Condition": "Gjendje unike", "XP Amount": "Sasia e pikëve të përvojës", - "XP Award": "Dhënie e pikëve të përvojës" + "XP Award": "Dhënie e pikëve të përvojës", + "Reports": "Raportet", + "Pick a report to open it.": "Zgjidhni një raport për ta hapur.", + "Open": "Hapur", + "In progress": "Në vazhdim", + "Blocked": "Bllokuar", + "Date": "Data", + "Due": "Afati", + "Assignee": "Caktuar për", + "Who": "Kush", + "What": "Çfarë", + "Minutes": "Minuta", + "Entries": "Regjistrime", + "Most recent": "Më të fundit", + "Per person": "Për person", + "By status": "Sipas statusit", + "By priority": "Sipas përparësisë", + "Character roster": "Lista e personazheve", + "Progression": "Përparimi", + "World content": "Përmbajtja e botës", + "Awaiting approval": "Në pritje të miratimit", + "Player characters": "Personazhet e lojtarëve", + "Awards": "Dhëniet", + "Experience": "Përvojë", + "Experience awarded": "Përvojë e dhënë", + "Per character": "Për personazh", + "By type": "Sipas llojit", + "By approval": "Sipas miratimit", + "Items carried by characters": "Sende që mbajnë personazhet", + "Conditions on characters": "Gjendjet e personazheve", + "Nothing awarded yet": "Ende asgjë nuk është dhënë", + "Who is playing what, and what is still waiting for approval.": "Kush luan çfarë, dhe çfarë pret ende miratim.", + "Experience awarded, and who earned it.": "Përvoja e dhënë dhe kush e fitoi atë.", + "How much the world holds, and what characters actually carry.": "Sa mban bota dhe çfarë mbajnë vërtet personazhet." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sq.json b/l10n/sq.json index b28083c0..da4660b7 100644 --- a/l10n/sq.json +++ b/l10n/sq.json @@ -222,7 +222,40 @@ "Unique Artifact": "Artefakt unik", "Unique Condition": "Gjendje unike", "XP Amount": "Sasia e pikëve të përvojës", - "XP Award": "Dhënie e pikëve të përvojës" + "XP Award": "Dhënie e pikëve të përvojës", + "Reports": "Raportet", + "Pick a report to open it.": "Zgjidhni një raport për ta hapur.", + "Open": "Hapur", + "In progress": "Në vazhdim", + "Blocked": "Bllokuar", + "Date": "Data", + "Due": "Afati", + "Assignee": "Caktuar për", + "Who": "Kush", + "What": "Çfarë", + "Minutes": "Minuta", + "Entries": "Regjistrime", + "Most recent": "Më të fundit", + "Per person": "Për person", + "By status": "Sipas statusit", + "By priority": "Sipas përparësisë", + "Character roster": "Lista e personazheve", + "Progression": "Përparimi", + "World content": "Përmbajtja e botës", + "Awaiting approval": "Në pritje të miratimit", + "Player characters": "Personazhet e lojtarëve", + "Awards": "Dhëniet", + "Experience": "Përvojë", + "Experience awarded": "Përvojë e dhënë", + "Per character": "Për personazh", + "By type": "Sipas llojit", + "By approval": "Sipas miratimit", + "Items carried by characters": "Sende që mbajnë personazhet", + "Conditions on characters": "Gjendjet e personazheve", + "Nothing awarded yet": "Ende asgjë nuk është dhënë", + "Who is playing what, and what is still waiting for approval.": "Kush luan çfarë, dhe çfarë pret ende miratim.", + "Experience awarded, and who earned it.": "Përvoja e dhënë dhe kush e fitoi atë.", + "How much the world holds, and what characters actually carry.": "Sa mban bota dhe çfarë mbajnë vërtet personazhet." }, "plurals": {} } diff --git a/l10n/sr.js b/l10n/sr.js index 728b6ad1..5291aa5d 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Јединствени артефакт", "Unique Condition": "Јединствено стање", "XP Amount": "Број поена искуства", - "XP Award": "Додела поена искуства" + "XP Award": "Додела поена искуства", + "Reports": "Извештаји", + "Pick a report to open it.": "Изаберите извештај да бисте га отворили.", + "Open": "Отворено", + "In progress": "У току", + "Blocked": "Блокирано", + "Date": "Датум", + "Due": "Рок", + "Assignee": "Додељено", + "Who": "Ко", + "What": "Шта", + "Minutes": "Минути", + "Entries": "Уноси", + "Most recent": "Најновије", + "Per person": "По особи", + "By status": "По статусу", + "By priority": "По приоритету", + "Character roster": "Списак ликова", + "Progression": "Напредак", + "World content": "Садржај света", + "Awaiting approval": "Чека одобрење", + "Player characters": "Ликови играча", + "Awards": "Доделе", + "Experience": "Искуство", + "Experience awarded": "Додељено искуство", + "Per character": "По лику", + "By type": "По типу", + "By approval": "По одобрењу", + "Items carried by characters": "Предмети које ликови носе", + "Conditions on characters": "Стања на ликовима", + "Nothing awarded yet": "Још ништа није додељено", + "Who is playing what, and what is still waiting for approval.": "Ко шта игра и шта још чека одобрење.", + "Experience awarded, and who earned it.": "Додељено искуство и ко га је зарадио.", + "How much the world holds, and what characters actually carry.": "Колико свет садржи и шта ликови заиста носе." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sr.json b/l10n/sr.json index a836e17e..39947cfd 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -222,7 +222,40 @@ "Unique Artifact": "Јединствени артефакт", "Unique Condition": "Јединствено стање", "XP Amount": "Број поена искуства", - "XP Award": "Додела поена искуства" + "XP Award": "Додела поена искуства", + "Reports": "Извештаји", + "Pick a report to open it.": "Изаберите извештај да бисте га отворили.", + "Open": "Отворено", + "In progress": "У току", + "Blocked": "Блокирано", + "Date": "Датум", + "Due": "Рок", + "Assignee": "Додељено", + "Who": "Ко", + "What": "Шта", + "Minutes": "Минути", + "Entries": "Уноси", + "Most recent": "Најновије", + "Per person": "По особи", + "By status": "По статусу", + "By priority": "По приоритету", + "Character roster": "Списак ликова", + "Progression": "Напредак", + "World content": "Садржај света", + "Awaiting approval": "Чека одобрење", + "Player characters": "Ликови играча", + "Awards": "Доделе", + "Experience": "Искуство", + "Experience awarded": "Додељено искуство", + "Per character": "По лику", + "By type": "По типу", + "By approval": "По одобрењу", + "Items carried by characters": "Предмети које ликови носе", + "Conditions on characters": "Стања на ликовима", + "Nothing awarded yet": "Још ништа није додељено", + "Who is playing what, and what is still waiting for approval.": "Ко шта игра и шта још чека одобрење.", + "Experience awarded, and who earned it.": "Додељено искуство и ко га је зарадио.", + "How much the world holds, and what characters actually carry.": "Колико свет садржи и шта ликови заиста носе." }, "plurals": {} } diff --git a/l10n/sv.js b/l10n/sv.js index aed0e38a..754cad53 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Unik artefakt", "Unique Condition": "Unikt tillstånd", "XP Amount": "Antal erfarenhetspoäng", - "XP Award": "XP-tilldelning" + "XP Award": "XP-tilldelning", + "Reports": "Rapporter", + "Pick a report to open it.": "Välj en rapport för att öppna den.", + "Open": "Öppen", + "In progress": "Pågår", + "Blocked": "Blockerad", + "Date": "Datum", + "Due": "Förfaller", + "Assignee": "Tilldelad", + "Who": "Vem", + "What": "Vad", + "Minutes": "Minuter", + "Entries": "Poster", + "Most recent": "Senaste", + "Per person": "Per person", + "By status": "Efter status", + "By priority": "Efter prioritet", + "Character roster": "Rollista", + "Progression": "Progression", + "World content": "Världens innehåll", + "Awaiting approval": "Väntar på godkännande", + "Player characters": "Spelarkaraktärer", + "Awards": "Tilldelningar", + "Experience": "Erfarenhet", + "Experience awarded": "Tilldelad erfarenhet", + "Per character": "Per karaktär", + "By type": "Efter typ", + "By approval": "Efter godkännande", + "Items carried by characters": "Föremål som karaktärer bär", + "Conditions on characters": "Tillstånd på karaktärer", + "Nothing awarded yet": "Inget tilldelat ännu", + "Who is playing what, and what is still waiting for approval.": "Vem som spelar vad, och vad som fortfarande väntar på godkännande.", + "Experience awarded, and who earned it.": "Tilldelad erfarenhet, och vem som förtjänat den.", + "How much the world holds, and what characters actually carry.": "Hur mycket världen rymmer, och vad karaktärerna faktiskt bär." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sv.json b/l10n/sv.json index d7cba46f..00334aac 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -222,7 +222,40 @@ "Unique Artifact": "Unik artefakt", "Unique Condition": "Unikt tillstånd", "XP Amount": "Antal erfarenhetspoäng", - "XP Award": "XP-tilldelning" + "XP Award": "XP-tilldelning", + "Reports": "Rapporter", + "Pick a report to open it.": "Välj en rapport för att öppna den.", + "Open": "Öppen", + "In progress": "Pågår", + "Blocked": "Blockerad", + "Date": "Datum", + "Due": "Förfaller", + "Assignee": "Tilldelad", + "Who": "Vem", + "What": "Vad", + "Minutes": "Minuter", + "Entries": "Poster", + "Most recent": "Senaste", + "Per person": "Per person", + "By status": "Efter status", + "By priority": "Efter prioritet", + "Character roster": "Rollista", + "Progression": "Progression", + "World content": "Världens innehåll", + "Awaiting approval": "Väntar på godkännande", + "Player characters": "Spelarkaraktärer", + "Awards": "Tilldelningar", + "Experience": "Erfarenhet", + "Experience awarded": "Tilldelad erfarenhet", + "Per character": "Per karaktär", + "By type": "Efter typ", + "By approval": "Efter godkännande", + "Items carried by characters": "Föremål som karaktärer bär", + "Conditions on characters": "Tillstånd på karaktärer", + "Nothing awarded yet": "Inget tilldelat ännu", + "Who is playing what, and what is still waiting for approval.": "Vem som spelar vad, och vad som fortfarande väntar på godkännande.", + "Experience awarded, and who earned it.": "Tilldelad erfarenhet, och vem som förtjänat den.", + "How much the world holds, and what characters actually carry.": "Hur mycket världen rymmer, och vad karaktärerna faktiskt bär." }, "plurals": {} } diff --git a/l10n/tr.js b/l10n/tr.js index 5580dd03..94c2405d 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Benzersiz eser", "Unique Condition": "Benzersiz durum", "XP Amount": "Deneyim puanı miktarı", - "XP Award": "Deneyim puanı verilmesi" + "XP Award": "Deneyim puanı verilmesi", + "Reports": "Raporlar", + "Pick a report to open it.": "Açmak için bir rapor seçin.", + "Open": "Açık", + "In progress": "Devam ediyor", + "Blocked": "Engellendi", + "Date": "Tarih", + "Due": "Bitiş", + "Assignee": "Atanan", + "Who": "Kim", + "What": "Ne", + "Minutes": "Dakika", + "Entries": "Kayıtlar", + "Most recent": "En yeni", + "Per person": "Kişi başına", + "By status": "Duruma göre", + "By priority": "Önceliğe göre", + "Character roster": "Karakter listesi", + "Progression": "İlerleme", + "World content": "Dünya içeriği", + "Awaiting approval": "Onay bekliyor", + "Player characters": "Oyuncu karakterleri", + "Awards": "Verilenler", + "Experience": "Deneyim", + "Experience awarded": "Verilen deneyim", + "Per character": "Karakter başına", + "By type": "Türe göre", + "By approval": "Onaya göre", + "Items carried by characters": "Karakterlerin taşıdığı eşyalar", + "Conditions on characters": "Karakterlerdeki durumlar", + "Nothing awarded yet": "Henüz bir şey verilmedi", + "Who is playing what, and what is still waiting for approval.": "Kimin ne oynadığı ve neyin hâlâ onay beklediği.", + "Experience awarded, and who earned it.": "Verilen deneyim ve onu kimin kazandığı.", + "How much the world holds, and what characters actually carry.": "Dünyanın ne kadar barındırdığı ve karakterlerin gerçekte ne taşıdığı." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/tr.json b/l10n/tr.json index 34a15975..863fb0b8 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -222,7 +222,40 @@ "Unique Artifact": "Benzersiz eser", "Unique Condition": "Benzersiz durum", "XP Amount": "Deneyim puanı miktarı", - "XP Award": "Deneyim puanı verilmesi" + "XP Award": "Deneyim puanı verilmesi", + "Reports": "Raporlar", + "Pick a report to open it.": "Açmak için bir rapor seçin.", + "Open": "Açık", + "In progress": "Devam ediyor", + "Blocked": "Engellendi", + "Date": "Tarih", + "Due": "Bitiş", + "Assignee": "Atanan", + "Who": "Kim", + "What": "Ne", + "Minutes": "Dakika", + "Entries": "Kayıtlar", + "Most recent": "En yeni", + "Per person": "Kişi başına", + "By status": "Duruma göre", + "By priority": "Önceliğe göre", + "Character roster": "Karakter listesi", + "Progression": "İlerleme", + "World content": "Dünya içeriği", + "Awaiting approval": "Onay bekliyor", + "Player characters": "Oyuncu karakterleri", + "Awards": "Verilenler", + "Experience": "Deneyim", + "Experience awarded": "Verilen deneyim", + "Per character": "Karakter başına", + "By type": "Türe göre", + "By approval": "Onaya göre", + "Items carried by characters": "Karakterlerin taşıdığı eşyalar", + "Conditions on characters": "Karakterlerdeki durumlar", + "Nothing awarded yet": "Henüz bir şey verilmedi", + "Who is playing what, and what is still waiting for approval.": "Kimin ne oynadığı ve neyin hâlâ onay beklediği.", + "Experience awarded, and who earned it.": "Verilen deneyim ve onu kimin kazandığı.", + "How much the world holds, and what characters actually carry.": "Dünyanın ne kadar barındırdığı ve karakterlerin gerçekte ne taşıdığı." }, "plurals": {} } diff --git a/l10n/uk.js b/l10n/uk.js index e0426db4..363998d8 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -223,7 +223,40 @@ OC.L10N.register( "Unique Artifact": "Унікальний артефакт", "Unique Condition": "Унікальний стан", "XP Amount": "Кількість очок досвіду", - "XP Award": "Нарахування очок досвіду" + "XP Award": "Нарахування очок досвіду", + "Reports": "Звіти", + "Pick a report to open it.": "Виберіть звіт, щоб відкрити його.", + "Open": "Відкрито", + "In progress": "У роботі", + "Blocked": "Заблоковано", + "Date": "Дата", + "Due": "Термін", + "Assignee": "Призначено", + "Who": "Хто", + "What": "Що", + "Minutes": "Хвилини", + "Entries": "Записи", + "Most recent": "Найновіші", + "Per person": "На особу", + "By status": "За статусом", + "By priority": "За пріоритетом", + "Character roster": "Список персонажів", + "Progression": "Прогрес", + "World content": "Вміст світу", + "Awaiting approval": "Очікує схвалення", + "Player characters": "Персонажі гравців", + "Awards": "Нагородження", + "Experience": "Досвід", + "Experience awarded": "Нарахований досвід", + "Per character": "На персонажа", + "By type": "За типом", + "By approval": "За схваленням", + "Items carried by characters": "Предмети, які носять персонажі", + "Conditions on characters": "Стани персонажів", + "Nothing awarded yet": "Ще нічого не нараховано", + "Who is playing what, and what is still waiting for approval.": "Хто що грає і що ще чекає схвалення.", + "Experience awarded, and who earned it.": "Нарахований досвід і хто його заробив.", + "How much the world holds, and what characters actually carry.": "Скільки містить світ і що персонажі насправді носять." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/uk.json b/l10n/uk.json index 1c7d8140..3266fa3a 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -222,7 +222,40 @@ "Unique Artifact": "Унікальний артефакт", "Unique Condition": "Унікальний стан", "XP Amount": "Кількість очок досвіду", - "XP Award": "Нарахування очок досвіду" + "XP Award": "Нарахування очок досвіду", + "Reports": "Звіти", + "Pick a report to open it.": "Виберіть звіт, щоб відкрити його.", + "Open": "Відкрито", + "In progress": "У роботі", + "Blocked": "Заблоковано", + "Date": "Дата", + "Due": "Термін", + "Assignee": "Призначено", + "Who": "Хто", + "What": "Що", + "Minutes": "Хвилини", + "Entries": "Записи", + "Most recent": "Найновіші", + "Per person": "На особу", + "By status": "За статусом", + "By priority": "За пріоритетом", + "Character roster": "Список персонажів", + "Progression": "Прогрес", + "World content": "Вміст світу", + "Awaiting approval": "Очікує схвалення", + "Player characters": "Персонажі гравців", + "Awards": "Нагородження", + "Experience": "Досвід", + "Experience awarded": "Нарахований досвід", + "Per character": "На персонажа", + "By type": "За типом", + "By approval": "За схваленням", + "Items carried by characters": "Предмети, які носять персонажі", + "Conditions on characters": "Стани персонажів", + "Nothing awarded yet": "Ще нічого не нараховано", + "Who is playing what, and what is still waiting for approval.": "Хто що грає і що ще чекає схвалення.", + "Experience awarded, and who earned it.": "Нарахований досвід і хто його заробив.", + "How much the world holds, and what characters actually carry.": "Скільки містить світ і що персонажі насправді носять." }, "plurals": {} } diff --git a/src/icons.js b/src/icons.js index 2523625f..043784ed 100644 --- a/src/icons.js +++ b/src/icons.js @@ -24,6 +24,7 @@ import BriefcaseAccountOutline from 'vue-material-design-icons/BriefcaseAccountO import Calendar from 'vue-material-design-icons/Calendar.vue' import CalendarMonthOutline from 'vue-material-design-icons/CalendarMonthOutline.vue' import ChartBar from 'vue-material-design-icons/ChartBar.vue' +import ChartBoxOutline from 'vue-material-design-icons/ChartBoxOutline.vue' import ClipboardList from 'vue-material-design-icons/ClipboardList.vue' import Cog from 'vue-material-design-icons/Cog.vue' import CogOutline from 'vue-material-design-icons/CogOutline.vue' @@ -70,6 +71,7 @@ export default { Calendar, CalendarMonthOutline, ChartBar, + ChartBoxOutline, ClipboardList, Cog, CogOutline, diff --git a/src/manifest.json b/src/manifest.json index 50b7f517..9971e4fa 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -260,13 +260,21 @@ "section": "footer", "order": 90 }, + { + "id": "ReportsMenu", + "label": "Reports", + "icon": "ChartBoxOutline", + "route": "Reports", + "section": "footer", + "order": 95 + }, { "id": "FeaturesRoadmapMenu", "label": "Features & roadmap", "icon": "MapMarkerPath", "route": "FeaturesRoadmap", "section": "footer", - "order": 91 + "order": 100 }, { "id": "FlowsMenu", @@ -2072,6 +2080,609 @@ ] } }, + { + "id": "Reports", + "_note": "ADR-112 / ADR-114 Decision 3. All three are declarative type:dashboard pages over larpinq's own register — no bespoke component and no per-app controller. ⚠️ The SCHEMA SLUG IS NOT THE SEED KEY: `event` is registered as `larping_event` and `skill` as `larping_skill`, because slugs are global on a shared OpenRegister and pipelinq also ships a `skill`. A widget naming the key renders an empty card and says nothing.", + "route": "/reports", + "type": "reports", + "title": "Reports", + "config": { + "description": "Pick a report to open it.", + "categories": { + "characters": "Characters", + "world": "The world" + }, + "cards": [ + { + "id": "CharacterRosterReport", + "label": "Character roster", + "description": "Who is playing what, and what is still waiting for approval.", + "icon": "AccountGroup", + "category": "characters", + "route": "CharacterRosterReport" + }, + { + "id": "ProgressionReport", + "label": "Progression", + "description": "Experience awarded, and who earned it.", + "icon": "Trophy", + "category": "characters", + "route": "ProgressionReport" + }, + { + "id": "WorldContentReport", + "label": "World content", + "description": "How much the world holds, and what characters actually carry.", + "icon": "MagicStaff", + "category": "world", + "route": "WorldContentReport" + } + ] + } + }, + { + "id": "CharacterRosterReport", + "route": "/reports/characters", + "type": "dashboard", + "title": "Character roster", + "_note": "Every filter is scalar equality, the only kind OpenRegister's aggregation endpoint can evaluate. A multi-value or relative-date filter is accepted and then silently not applied.", + "config": { + "widgets": [ + { + "id": "roster-total", + "title": "Characters", + "type": "stat", + "content": { + "label": "Characters", + "icon": "AccountGroup", + "route": { + "name": "Characters" + }, + "format": { + "style": "decimal", + "decimals": 0 + }, + "source": { + "register": "larpinq", + "schema": "character", + "metric": "count" + } + } + }, + { + "id": "roster-players", + "title": "Player characters", + "type": "stat", + "content": { + "label": "Player characters", + "icon": "Account", + "route": { + "name": "Characters" + }, + "format": { + "style": "decimal", + "decimals": 0 + }, + "source": { + "register": "larpinq", + "schema": "character", + "metric": "count", + "filter": { + "type": "player" + } + } + } + }, + { + "id": "roster-awaiting", + "title": "Awaiting approval", + "type": "stat", + "content": { + "label": "Awaiting approval", + "icon": "AccountCheck", + "route": { + "name": "Characters" + }, + "format": { + "style": "decimal", + "decimals": 0 + }, + "source": { + "register": "larpinq", + "schema": "character", + "metric": "count", + "filter": { + "approved": "no" + } + } + } + }, + { + "id": "roster-by-type", + "title": "By type", + "type": "chart", + "content": { + "chartKind": "donut", + "legendPosition": "bottom", + "emptyLabel": "No characters yet", + "dataSource": { + "register": "larpinq", + "schema": "character", + "aggregate": { + "groupBy": "type", + "metric": "count" + } + } + } + }, + { + "id": "roster-by-approval", + "title": "By approval", + "type": "chart", + "content": { + "chartKind": "donut", + "legendPosition": "bottom", + "emptyLabel": "No characters yet", + "dataSource": { + "register": "larpinq", + "schema": "character", + "aggregate": { + "groupBy": "approved", + "metric": "count" + } + } + } + }, + { + "id": "roster-recent", + "title": "Most recent", + "type": "object-table", + "content": { + "register": "larpinq", + "schema": "character", + "filter": {}, + "sort": { + "field": "created", + "dir": "desc" + }, + "limit": 8, + "hideHeader": true, + "emptyText": "No characters yet", + "viewAllRoute": { + "name": "Characters" + }, + "viewAllLabel": "View all characters", + "columns": [ + { + "key": "name", + "label": "Name" + }, + { + "key": "type", + "label": "Type" + }, + { + "key": "approved", + "label": "Approved" + } + ], + "rowRoute": "CharacterDetail" + } + } + ], + "layout": [ + { + "id": "1", + "widgetId": "roster-total", + "gridX": 0, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "2", + "widgetId": "roster-players", + "gridX": 4, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "3", + "widgetId": "roster-awaiting", + "gridX": 8, + "gridY": 0, + "gridWidth": 4, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "4", + "widgetId": "roster-by-type", + "gridX": 0, + "gridY": 2, + "gridWidth": 6, + "gridHeight": 4, + "showTitle": true + }, + { + "id": "5", + "widgetId": "roster-by-approval", + "gridX": 6, + "gridY": 2, + "gridWidth": 6, + "gridHeight": 4, + "showTitle": true + }, + { + "id": "6", + "widgetId": "roster-recent", + "gridX": 0, + "gridY": 6, + "gridWidth": 12, + "gridHeight": 4, + "showTitle": true + } + ] + } + }, + { + "id": "ProgressionReport", + "route": "/reports/progression", + "type": "dashboard", + "title": "Progression", + "_note": "The chart aggregate names its numeric field `sumField`; the stat widget's `source` calls the same thing `field`. Two contracts one word apart, and the wrong one renders an empty chart with no error.", + "config": { + "widgets": [ + { + "id": "xp-awards", + "title": "Awards", + "type": "stat", + "content": { + "label": "Awards", + "icon": "Star", + "route": { + "name": "XpAwards" + }, + "format": { + "style": "decimal", + "decimals": 0 + }, + "source": { + "register": "larpinq", + "schema": "xpAward", + "metric": "count" + } + } + }, + { + "id": "xp-total", + "title": "Experience awarded", + "type": "stat", + "content": { + "label": "Experience awarded", + "icon": "Trophy", + "route": { + "name": "XpAwards" + }, + "format": { + "style": "decimal", + "decimals": 0 + }, + "source": { + "register": "larpinq", + "schema": "xpAward", + "metric": "sum", + "field": "amount" + } + } + }, + { + "id": "xp-per-character", + "title": "Per character", + "type": "chart", + "content": { + "chartKind": "bar", + "legendPosition": "bottom", + "emptyLabel": "Nothing awarded yet", + "dataSource": { + "register": "larpinq", + "schema": "xpAward", + "aggregate": { + "groupBy": "character", + "metric": "sum", + "sumField": "amount", + "topN": 10, + "otherBucket": true, + "labelResolve": { + "schema": "character", + "labelField": "name" + } + } + } + } + }, + { + "id": "xp-recent", + "title": "Most recent", + "type": "object-table", + "content": { + "register": "larpinq", + "schema": "xpAward", + "filter": {}, + "sort": { + "field": "awardedAt", + "dir": "desc" + }, + "limit": 8, + "hideHeader": true, + "emptyText": "Nothing awarded yet", + "viewAllRoute": { + "name": "XpAwards" + }, + "viewAllLabel": "View all awards", + "columns": [ + { + "key": "awardedAt", + "label": "Date" + }, + { + "key": "character", + "label": "Character" + }, + { + "key": "amount", + "label": "Experience" + }, + { + "key": "reason", + "label": "Reason" + } + ] + } + } + ], + "layout": [ + { + "id": "1", + "widgetId": "xp-awards", + "gridX": 0, + "gridY": 0, + "gridWidth": 6, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "2", + "widgetId": "xp-total", + "gridX": 6, + "gridY": 0, + "gridWidth": 6, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "3", + "widgetId": "xp-per-character", + "gridX": 0, + "gridY": 2, + "gridWidth": 12, + "gridHeight": 4, + "showTitle": true + }, + { + "id": "4", + "widgetId": "xp-recent", + "gridX": 0, + "gridY": 6, + "gridWidth": 12, + "gridHeight": 4, + "showTitle": true + } + ] + } + }, + { + "id": "WorldContentReport", + "route": "/reports/content", + "type": "dashboard", + "title": "World content", + "_note": "The two donuts group by an ARRAY property on `character` and resolve the bucket labels through `labelResolve`, the same shape the Dashboard's skill-usage chart already uses. Grouping by the array is what answers 'what do characters actually carry', which counting the items themselves cannot.", + "config": { + "widgets": [ + { + "id": "world-skills", + "title": "Skills", + "type": "stat", + "content": { + "label": "Skills", + "icon": "MagicStaff", + "route": { + "name": "Skills" + }, + "format": { + "style": "decimal", + "decimals": 0 + }, + "source": { + "register": "larpinq", + "schema": "larping_skill", + "metric": "count" + } + } + }, + { + "id": "world-items", + "title": "Items", + "type": "stat", + "content": { + "label": "Items", + "icon": "Package", + "route": { + "name": "Items" + }, + "format": { + "style": "decimal", + "decimals": 0 + }, + "source": { + "register": "larpinq", + "schema": "larping_item", + "metric": "count" + } + } + }, + { + "id": "world-conditions", + "title": "Conditions", + "type": "stat", + "content": { + "label": "Conditions", + "icon": "EmoticonSickOutline", + "route": { + "name": "Conditions" + }, + "format": { + "style": "decimal", + "decimals": 0 + }, + "source": { + "register": "larpinq", + "schema": "condition", + "metric": "count" + } + } + }, + { + "id": "world-effects", + "title": "Effects", + "type": "stat", + "content": { + "label": "Effects", + "icon": "FlashOutline", + "route": { + "name": "Effects" + }, + "format": { + "style": "decimal", + "decimals": 0 + }, + "source": { + "register": "larpinq", + "schema": "effect", + "metric": "count" + } + } + }, + { + "id": "world-items-carried", + "title": "Items carried by characters", + "type": "chart", + "content": { + "chartKind": "donut", + "legendPosition": "bottom", + "emptyLabel": "No items are carried yet", + "dataSource": { + "register": "larpinq", + "schema": "character", + "aggregate": { + "groupBy": "items", + "metric": "count", + "topN": 10, + "otherBucket": true, + "labelResolve": { + "schema": "larping_item", + "labelField": "name" + } + } + } + } + }, + { + "id": "world-conditions-held", + "title": "Conditions on characters", + "type": "chart", + "content": { + "chartKind": "donut", + "legendPosition": "bottom", + "emptyLabel": "No conditions are held yet", + "dataSource": { + "register": "larpinq", + "schema": "character", + "aggregate": { + "groupBy": "conditions", + "metric": "count", + "topN": 10, + "otherBucket": true, + "labelResolve": { + "schema": "condition", + "labelField": "name" + } + } + } + } + } + ], + "layout": [ + { + "id": "1", + "widgetId": "world-skills", + "gridX": 0, + "gridY": 0, + "gridWidth": 3, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "2", + "widgetId": "world-items", + "gridX": 3, + "gridY": 0, + "gridWidth": 3, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "3", + "widgetId": "world-conditions", + "gridX": 6, + "gridY": 0, + "gridWidth": 3, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "4", + "widgetId": "world-effects", + "gridX": 9, + "gridY": 0, + "gridWidth": 3, + "gridHeight": 2, + "showTitle": false + }, + { + "id": "5", + "widgetId": "world-items-carried", + "gridX": 0, + "gridY": 2, + "gridWidth": 6, + "gridHeight": 4, + "showTitle": true + }, + { + "id": "6", + "widgetId": "world-conditions-held", + "gridX": 6, + "gridY": 2, + "gridWidth": 6, + "gridHeight": 4, + "showTitle": true + } + ] + } + }, { "id": "FeaturesRoadmap", "route": "/features-roadmap", diff --git a/tests/e2e/app-chrome.spec.ts b/tests/e2e/app-chrome.spec.ts new file mode 100644 index 00000000..a8458d74 --- /dev/null +++ b/tests/e2e/app-chrome.spec.ts @@ -0,0 +1,116 @@ +/* + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + * + * The bottom-left app chrome, in a browser (ADR-114). + * + * gate-107 reads the manifest and can prove the entries are DECLARED. It + * cannot prove they RENDER, and this programme has already produced three + * defects of exactly that shape: an icon name that is not registered renders + * NO glyph (not a fallback, not a console error), an entry whose `route` names + * a page the app does not host renders a row that goes nowhere, and + * `nav.includePersonalSettings: false` silently removed the entry that reaches + * the user's notification preferences. + * + * The three reports are declarative `type: "dashboard"` pages over larpinq's + * own register, which adds a fourth failure mode no manifest gate can see: a + * widget whose `source` names a schema that does not exist renders its card, + * its title and no value, silently. In THIS app that is a live risk, because + * the schema slug is not the seed key — `event` is registered as + * `larping_event` and `skill` as `larping_skill`, since slugs are global on a + * shared OpenRegister and pipelinq also ships a `skill`. So the assertions + * below look for VALUES, not just for cards. + * + * ⚠️ SCOPE EVERY SELECTOR TO `[data-testid="cn-nav"]`. An unscoped selector + * also matches Nextcloud's own user menu, which is attached-but-hidden: + * `waitFor({state:'attached'})` passes on it and the click never becomes + * actionable, so the spec fails with "Target page has been closed" — a timeout + * wearing a crash's clothes. + * + * ⚠️ SETTINGS ENTRIES ARE ATTACHED, NOT VISIBLE, inside a collapsed foldout. + */ + +import { expect, test } from '@playwright/test' + +const APP_BASE = '/apps/larpinq' + +test.describe('app chrome (ADR-114)', () => { + test.beforeEach(async ({ page }) => { + await page.goto(`${APP_BASE}/`, { waitUntil: 'domcontentloaded' }) + await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible({ + timeout: 30_000, + }) + }) + + test('the footer reads Documentation, Reports, Features & roadmap, each with a glyph', async ({ page }) => { + const footer = page.locator('[data-testid="cn-nav"] .cn-app-nav__footer-list') + await expect(footer).toBeAttached({ timeout: 15_000 }) + + const rows = footer.locator('li') + const texts = (await rows.allInnerTexts()).map((t) => t.trim()).filter(Boolean) + + // ORDER is the rule, not the numbers. This app ran Documentation at 90 + // and Features & roadmap at 91, which left no room between them, so the + // roadmap moved to 100 rather than Reports being squeezed in. + const seen = texts.filter((t) => /Documentation|Reports|roadmap/i.test(t)) + expect(seen.length).toBe(3) + expect(seen[0]).toMatch(/Documentation/i) + expect(seen[1]).toMatch(/Reports/i) + expect(seen[2]).toMatch(/roadmap/i) + + // A glyph on every row. ChartBoxOutline had to be added to src/icons.js + // for the Reports entry; without it the row renders a blank space where + // the icon belongs and nothing complains. + for (const row of await rows.all()) { + await expect(row.locator('svg, .material-design-icon').first()).toBeAttached() + } + }) + + test('Reports lists the three reports', async ({ page }) => { + const nav = page.locator('[data-testid="cn-nav"]') + await nav.locator('[data-testid="cn-nav-entry-ReportsMenu"]').click() + await expect(page).toHaveURL(/\/apps\/larpinq\/reports(\?|$)/, { timeout: 15_000 }) + + for (const label of ['Character roster', 'Progression', 'World content']) { + await expect(page.getByText(label, { exact: false }).first()).toBeVisible({ timeout: 15_000 }) + } + }) + + test('the roster report renders real numbers, not empty cards', async ({ page }) => { + // The point of this test. Every widget is declarative over the larpinq + // register, so a wrong schema slug yields a card that renders its chrome + // and no value, silently. + await page.goto(`${APP_BASE}/reports/characters`) + await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible({ timeout: 30_000 }) + await expect(page.getByText('Awaiting approval', { exact: false }).first()).toBeVisible({ timeout: 30_000 }) + await expect(page.locator('main, .app-content').first()).toContainText(/\d/, { timeout: 30_000 }) + }) + + test('the world report reads the prefixed schema slugs, not the seed keys', async ({ page }) => { + // larping_skill and larping_item, NOT skill and item. If a later edit + // "tidies" those back to the seed keys the cards go blank in place, so + // this asserts a number reaches the page. + await page.goto(`${APP_BASE}/reports/content`) + await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible({ timeout: 30_000 }) + await expect(page.getByText('Skills', { exact: false }).first()).toBeVisible({ timeout: 30_000 }) + await expect(page.locator('main, .app-content').first()).toContainText(/\d/, { timeout: 30_000 }) + }) + + test('the progression report is reachable and titled', async ({ page }) => { + await page.goto(`${APP_BASE}/reports/progression`) + await expect(page).toHaveURL(/\/reports\/progression(\?|$)/, { timeout: 15_000 }) + await expect(page.getByText('Experience awarded', { exact: false }).first()).toBeVisible({ timeout: 30_000 }) + }) + + test('the settings foldout carries Personal settings, Admin settings and Flows', async ({ page }) => { + const nav = page.locator('[data-testid="cn-nav"]') + + await expect(nav.locator('[data-testid="cn-nav-settings"]')).toBeAttached({ timeout: 15_000 }) + await expect(nav.locator('[data-testid="cn-nav-personal-settings"]')).toBeAttached() + await expect(nav.locator('[data-testid="cn-nav-entry-FlowsMenu"]')).toBeAttached() + + const admin = nav.locator('[data-testid="cn-nav-admin-settings"]') + await expect(admin).toBeAttached() + await expect(admin).toHaveAttribute('href', /\/settings\/admin\/larpinq$/) + }) +}) From 94ed8fd10f470092890ba07727142bd745c5bd33 Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Thu, 3 Sep 2026 20:01:26 +0200 Subject: [PATCH 31/35] style(chrome): run prettier over the larpinq chrome spec This app checks formatting with prettier over **/*.{js,ts,vue,css,scss} as well as linting with eslint, and the spec was only eslint-clean. Prettier and eslint agree here once prettier has run, so this is a formatting pass with no change to what the spec asserts. --- tests/e2e/app-chrome.spec.ts | 82 +++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 20 deletions(-) diff --git a/tests/e2e/app-chrome.spec.ts b/tests/e2e/app-chrome.spec.ts index a8458d74..e8181014 100644 --- a/tests/e2e/app-chrome.spec.ts +++ b/tests/e2e/app-chrome.spec.ts @@ -42,12 +42,18 @@ test.describe('app chrome (ADR-114)', () => { }) }) - test('the footer reads Documentation, Reports, Features & roadmap, each with a glyph', async ({ page }) => { - const footer = page.locator('[data-testid="cn-nav"] .cn-app-nav__footer-list') + test('the footer reads Documentation, Reports, Features & roadmap, each with a glyph', async ({ + page, + }) => { + const footer = page.locator( + '[data-testid="cn-nav"] .cn-app-nav__footer-list', + ) await expect(footer).toBeAttached({ timeout: 15_000 }) const rows = footer.locator('li') - const texts = (await rows.allInnerTexts()).map((t) => t.trim()).filter(Boolean) + const texts = (await rows.allInnerTexts()) + .map((t) => t.trim()) + .filter(Boolean) // ORDER is the rule, not the numbers. This app ran Documentation at 90 // and Features & roadmap at 91, which left no room between them, so the @@ -62,52 +68,88 @@ test.describe('app chrome (ADR-114)', () => { // for the Reports entry; without it the row renders a blank space where // the icon belongs and nothing complains. for (const row of await rows.all()) { - await expect(row.locator('svg, .material-design-icon').first()).toBeAttached() + await expect( + row.locator('svg, .material-design-icon').first(), + ).toBeAttached() } }) test('Reports lists the three reports', async ({ page }) => { const nav = page.locator('[data-testid="cn-nav"]') await nav.locator('[data-testid="cn-nav-entry-ReportsMenu"]').click() - await expect(page).toHaveURL(/\/apps\/larpinq\/reports(\?|$)/, { timeout: 15_000 }) + await expect(page).toHaveURL(/\/apps\/larpinq\/reports(\?|$)/, { + timeout: 15_000, + }) for (const label of ['Character roster', 'Progression', 'World content']) { - await expect(page.getByText(label, { exact: false }).first()).toBeVisible({ timeout: 15_000 }) + await expect( + page.getByText(label, { exact: false }).first(), + ).toBeVisible({ timeout: 15_000 }) } }) - test('the roster report renders real numbers, not empty cards', async ({ page }) => { + test('the roster report renders real numbers, not empty cards', async ({ + page, + }) => { // The point of this test. Every widget is declarative over the larpinq // register, so a wrong schema slug yields a card that renders its chrome // and no value, silently. await page.goto(`${APP_BASE}/reports/characters`) - await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible({ timeout: 30_000 }) - await expect(page.getByText('Awaiting approval', { exact: false }).first()).toBeVisible({ timeout: 30_000 }) - await expect(page.locator('main, .app-content').first()).toContainText(/\d/, { timeout: 30_000 }) + await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible({ + timeout: 30_000, + }) + await expect( + page.getByText('Awaiting approval', { exact: false }).first(), + ).toBeVisible({ timeout: 30_000 }) + await expect(page.locator('main, .app-content').first()).toContainText( + /\d/, + { timeout: 30_000 }, + ) }) - test('the world report reads the prefixed schema slugs, not the seed keys', async ({ page }) => { + test('the world report reads the prefixed schema slugs, not the seed keys', async ({ + page, + }) => { // larping_skill and larping_item, NOT skill and item. If a later edit // "tidies" those back to the seed keys the cards go blank in place, so // this asserts a number reaches the page. await page.goto(`${APP_BASE}/reports/content`) - await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible({ timeout: 30_000 }) - await expect(page.getByText('Skills', { exact: false }).first()).toBeVisible({ timeout: 30_000 }) - await expect(page.locator('main, .app-content').first()).toContainText(/\d/, { timeout: 30_000 }) + await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible({ + timeout: 30_000, + }) + await expect(page.getByText('Skills', { exact: false }).first()).toBeVisible( + { timeout: 30_000 }, + ) + await expect(page.locator('main, .app-content').first()).toContainText( + /\d/, + { timeout: 30_000 }, + ) }) test('the progression report is reachable and titled', async ({ page }) => { await page.goto(`${APP_BASE}/reports/progression`) - await expect(page).toHaveURL(/\/reports\/progression(\?|$)/, { timeout: 15_000 }) - await expect(page.getByText('Experience awarded', { exact: false }).first()).toBeVisible({ timeout: 30_000 }) + await expect(page).toHaveURL(/\/reports\/progression(\?|$)/, { + timeout: 15_000, + }) + await expect( + page.getByText('Experience awarded', { exact: false }).first(), + ).toBeVisible({ timeout: 30_000 }) }) - test('the settings foldout carries Personal settings, Admin settings and Flows', async ({ page }) => { + test('the settings foldout carries Personal settings, Admin settings and Flows', async ({ + page, + }) => { const nav = page.locator('[data-testid="cn-nav"]') - await expect(nav.locator('[data-testid="cn-nav-settings"]')).toBeAttached({ timeout: 15_000 }) - await expect(nav.locator('[data-testid="cn-nav-personal-settings"]')).toBeAttached() - await expect(nav.locator('[data-testid="cn-nav-entry-FlowsMenu"]')).toBeAttached() + await expect(nav.locator('[data-testid="cn-nav-settings"]')).toBeAttached({ + timeout: 15_000, + }) + await expect( + nav.locator('[data-testid="cn-nav-personal-settings"]'), + ).toBeAttached() + await expect( + nav.locator('[data-testid="cn-nav-entry-FlowsMenu"]'), + ).toBeAttached() const admin = nav.locator('[data-testid="cn-nav-admin-settings"]') await expect(admin).toBeAttached() From 6aaa8ab7cf2605846ae042e1b97cf65a48418ef5 Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Thu, 3 Sep 2026 21:58:27 +0200 Subject: [PATCH 32/35] fix(e2e): make the chrome specs pass in a real browser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three defects, all found by actually RUNNING the specs rather than collecting them. Until now they had only ever been listed, which proves a spec parses and nothing else. 1. The cn-nav-* testids are on the
  • WRAPPER. The clickable element and the href both live on the inside it, so clicking the li resolved the locator and then never became actionable — a 30s timeout that reads like the navigation is broken — and reading href off the li gave null. 2. On a FRESH instance the setup wizard modal opens over the app and intercepts pointer events. Every nav click failed while every URL navigation passed, which is exactly the shape that hides this: only the click-through tests break, and only on a clean install. 3. A bare getByText('Open') matched the SVG Opens in a new tab on an external-link icon — attached, hidden, unrelated. Single-word probes are now scoped to the page body. Verified against a throwaway Nextcloud (not the shared :8080, and not the neighbouring sessions' containers): planninq 6/6 and keepiq 5/5 green. --- tests/e2e/app-chrome.spec.ts | 43 +++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/tests/e2e/app-chrome.spec.ts b/tests/e2e/app-chrome.spec.ts index e8181014..72559f5d 100644 --- a/tests/e2e/app-chrome.spec.ts +++ b/tests/e2e/app-chrome.spec.ts @@ -30,16 +30,39 @@ * ⚠️ SETTINGS ENTRIES ARE ATTACHED, NOT VISIBLE, inside a collapsed foldout. */ +import type { Page } from '@playwright/test' + import { expect, test } from '@playwright/test' const APP_BASE = '/apps/larpinq' +/** + * Dismiss the first-run setup wizard if it is open. + * + * ⚠️ On a FRESH instance CnSetupWizard opens over the app and its modal + * intercepts pointer events, so every nav click resolves its locator and then + * times out after 30s — a failure that reads like the navigation is broken. + * Tests that navigate by URL pass, which is what makes this so easy to miss: + * only the click-through tests fail, and only on a clean install. + * + * @param page The page. + */ +async function dismissSetupWizard(page: Page): Promise { + const modal = page.locator('[data-testid="cn-modal"]') + if ((await modal.count()) === 0) { + return + } + await modal.first().getByRole('button', { name: 'Close' }).click() + await expect(modal).toHaveCount(0, { timeout: 15_000 }) +} + test.describe('app chrome (ADR-114)', () => { test.beforeEach(async ({ page }) => { await page.goto(`${APP_BASE}/`, { waitUntil: 'domcontentloaded' }) await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible({ timeout: 30_000, }) + await dismissSetupWizard(page) }) test('the footer reads Documentation, Reports, Features & roadmap, each with a glyph', async ({ @@ -76,7 +99,10 @@ test.describe('app chrome (ADR-114)', () => { test('Reports lists the three reports', async ({ page }) => { const nav = page.locator('[data-testid="cn-nav"]') - await nav.locator('[data-testid="cn-nav-entry-ReportsMenu"]').click() + await nav + .locator('[data-testid="cn-nav-entry-ReportsMenu"] a') + .first() + .click() await expect(page).toHaveURL(/\/apps\/larpinq\/reports(\?|$)/, { timeout: 15_000, }) @@ -117,9 +143,13 @@ test.describe('app chrome (ADR-114)', () => { await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible({ timeout: 30_000, }) - await expect(page.getByText('Skills', { exact: false }).first()).toBeVisible( - { timeout: 30_000 }, - ) + await expect( + page + .locator('main, .app-content') + .first() + .getByText('Skills', { exact: false }) + .first(), + ).toBeVisible({ timeout: 30_000 }) await expect(page.locator('main, .app-content').first()).toContainText( /\d/, { timeout: 30_000 }, @@ -153,6 +183,9 @@ test.describe('app chrome (ADR-114)', () => { const admin = nav.locator('[data-testid="cn-nav-admin-settings"]') await expect(admin).toBeAttached() - await expect(admin).toHaveAttribute('href', /\/settings\/admin\/larpinq$/) + await expect(admin.locator('a').first()).toHaveAttribute( + 'href', + /\/settings\/admin\/larpinq$/, + ) }) }) From 99f684be0ffb0d27a6f2ab24d8182a8d7f9abcbe Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Fri, 4 Sep 2026 09:29:21 +0200 Subject: [PATCH 33/35] feat(chrome): give larpinq a Store ADR-114 puts Documentation, Store, Reports and Features & roadmap in the footer in that order. This app had three of the four; gate-107 goes from 4 of 5 to 5 of 5. The page writes no backend. Openregister hosts the store plane, so adopting it is a type:"store" page plus a top-level `store` block and nothing else. With no registry configured the page renders the app's own items and makes no network call. There is deliberately no `installable` allowlist, following decidiq's precedent: a configuration set exists to introduce schemas the instance does not have yet, so listing schemas this app already owns would refuse exactly the sets worth installing. An EMPTY `installable` would mean install NOTHING rather than install anything, so omitting the key and declaring an empty list are different things. StoreOutline is registered in src/icons.js. An unregistered name renders no glyph at all, with no fallback and no console error. nextcloud-vue moves ^2.31.1 -> ^2.36.1, the version that ships CnStorePage; without it the store page renders nothing. The published tarball was unpacked to confirm the component is in it rather than trusting the version number. The chrome spec's footer test goes from three items to four, and a new test opens the Store surface and asserts it renders on a plain instance with no registry configured. Co-Authored-By: Claude Opus 5 --- l10n/be.js | 4 +++- l10n/be.json | 4 +++- l10n/bg.js | 4 +++- l10n/bg.json | 4 +++- l10n/bs.js | 4 +++- l10n/bs.json | 4 +++- l10n/ca.js | 4 +++- l10n/ca.json | 4 +++- l10n/cs.js | 4 +++- l10n/cs.json | 4 +++- l10n/da.js | 4 +++- l10n/da.json | 4 +++- l10n/de.js | 4 +++- l10n/de.json | 4 +++- l10n/el.js | 4 +++- l10n/el.json | 4 +++- l10n/es.js | 4 +++- l10n/es.json | 4 +++- l10n/et.js | 4 +++- l10n/et.json | 4 +++- l10n/fi.js | 4 +++- l10n/fi.json | 4 +++- l10n/fr.js | 4 +++- l10n/fr.json | 4 +++- l10n/ga.js | 4 +++- l10n/ga.json | 4 +++- l10n/hr.js | 4 +++- l10n/hr.json | 4 +++- l10n/hu.js | 4 +++- l10n/hu.json | 4 +++- l10n/is.js | 4 +++- l10n/is.json | 4 +++- l10n/it.js | 4 +++- l10n/it.json | 4 +++- l10n/lb.js | 4 +++- l10n/lb.json | 4 +++- l10n/lt.js | 4 +++- l10n/lt.json | 4 +++- l10n/lv.js | 4 +++- l10n/lv.json | 4 +++- l10n/mk.js | 4 +++- l10n/mk.json | 4 +++- l10n/mt.js | 4 +++- l10n/mt.json | 4 +++- l10n/nb.js | 4 +++- l10n/nb.json | 4 +++- l10n/nl.js | 4 +++- l10n/nl.json | 4 +++- l10n/pl.js | 4 +++- l10n/pl.json | 4 +++- l10n/pt.js | 4 +++- l10n/pt.json | 4 +++- l10n/rm.js | 4 +++- l10n/rm.json | 4 +++- l10n/ro.js | 4 +++- l10n/ro.json | 4 +++- l10n/ru.js | 4 +++- l10n/ru.json | 4 +++- l10n/sk.js | 4 +++- l10n/sk.json | 4 +++- l10n/sl.js | 4 +++- l10n/sl.json | 4 +++- l10n/sq.js | 4 +++- l10n/sq.json | 4 +++- l10n/sr.js | 4 +++- l10n/sr.json | 4 +++- l10n/sv.js | 4 +++- l10n/sv.json | 4 +++- l10n/tr.js | 4 +++- l10n/tr.json | 4 +++- l10n/uk.js | 4 +++- l10n/uk.json | 4 +++- package-lock.json | 8 ++++---- package.json | 2 +- src/icons.js | 2 ++ src/manifest.json | 28 ++++++++++++++++++++++++++++ tests/e2e/app-chrome.spec.ts | 35 ++++++++++++++++++++++++++++++----- 77 files changed, 281 insertions(+), 82 deletions(-) diff --git a/l10n/be.js b/l10n/be.js index f6e25f6c..4ba5dba5 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Яшчэ нічога не налічана", "Who is playing what, and what is still waiting for approval.": "Хто што грае і што яшчэ чакае ўхвалення.", "Experience awarded, and who earned it.": "Налічаны досвед і хто яго зарабіў.", - "How much the world holds, and what characters actually carry.": "Колькі змяшчае свет і што персанажы сапраўды нясуць." + "How much the world holds, and what characters actually carry.": "Колькі змяшчае свет і што персанажы сапраўды нясуць.", + "Store": "Крама", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Усталюйце рэестры, схемы і патокі, апублікаваныя іншымі арганізацыямі." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/be.json b/l10n/be.json index 69368ed3..203c4c16 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Яшчэ нічога не налічана", "Who is playing what, and what is still waiting for approval.": "Хто што грае і што яшчэ чакае ўхвалення.", "Experience awarded, and who earned it.": "Налічаны досвед і хто яго зарабіў.", - "How much the world holds, and what characters actually carry.": "Колькі змяшчае свет і што персанажы сапраўды нясуць." + "How much the world holds, and what characters actually carry.": "Колькі змяшчае свет і што персанажы сапраўды нясуць.", + "Store": "Крама", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Усталюйце рэестры, схемы і патокі, апублікаваныя іншымі арганізацыямі." }, "plurals": {} } diff --git a/l10n/bg.js b/l10n/bg.js index 6a2fb549..1107e71c 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Още нищо не е присъдено", "Who is playing what, and what is still waiting for approval.": "Кой какво играе и какво още чака одобрение.", "Experience awarded, and who earned it.": "Присъденият опит и кой го е спечелил.", - "How much the world holds, and what characters actually carry.": "Колко съдържа светът и какво наистина носят героите." + "How much the world holds, and what characters actually carry.": "Колко съдържа светът и какво наистина носят героите.", + "Store": "Магазин", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Инсталирайте регистри, схеми и потоци, публикувани от други организации." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bg.json b/l10n/bg.json index 4fb23644..80f0b590 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Още нищо не е присъдено", "Who is playing what, and what is still waiting for approval.": "Кой какво играе и какво още чака одобрение.", "Experience awarded, and who earned it.": "Присъденият опит и кой го е спечелил.", - "How much the world holds, and what characters actually carry.": "Колко съдържа светът и какво наистина носят героите." + "How much the world holds, and what characters actually carry.": "Колко съдържа светът и какво наистина носят героите.", + "Store": "Магазин", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Инсталирайте регистри, схеми и потоци, публикувани от други организации." }, "plurals": {} } diff --git a/l10n/bs.js b/l10n/bs.js index e1d31be3..6b556988 100644 --- a/l10n/bs.js +++ b/l10n/bs.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Još ništa nije dodijeljeno", "Who is playing what, and what is still waiting for approval.": "Ko šta igra i šta još čeka odobrenje.", "Experience awarded, and who earned it.": "Dodijeljeno iskustvo i ko ga je zaradio.", - "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i šta likovi zaista nose." + "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i šta likovi zaista nose.", + "Store": "Trgovina", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instalirajte registre, šeme i tokove koje su objavile druge organizacije." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bs.json b/l10n/bs.json index c7590be0..68cfa63a 100644 --- a/l10n/bs.json +++ b/l10n/bs.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Još ništa nije dodijeljeno", "Who is playing what, and what is still waiting for approval.": "Ko šta igra i šta još čeka odobrenje.", "Experience awarded, and who earned it.": "Dodijeljeno iskustvo i ko ga je zaradio.", - "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i šta likovi zaista nose." + "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i šta likovi zaista nose.", + "Store": "Trgovina", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instalirajte registre, šeme i tokove koje su objavile druge organizacije." }, "plurals": {} } diff --git a/l10n/ca.js b/l10n/ca.js index 50974b09..5d716a44 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Encara no s'ha concedit res", "Who is playing what, and what is still waiting for approval.": "Qui juga a què, i què encara espera aprovació.", "Experience awarded, and who earned it.": "L'experiència concedida i qui l'ha guanyada.", - "How much the world holds, and what characters actually carry.": "Quant conté el món, i què porten realment els personatges." + "How much the world holds, and what characters actually carry.": "Quant conté el món, i què porten realment els personatges.", + "Store": "Botiga", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instal·leu registres, esquemes i fluxos publicats per altres organitzacions." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ca.json b/l10n/ca.json index 2a8311df..1d744e3d 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Encara no s'ha concedit res", "Who is playing what, and what is still waiting for approval.": "Qui juga a què, i què encara espera aprovació.", "Experience awarded, and who earned it.": "L'experiència concedida i qui l'ha guanyada.", - "How much the world holds, and what characters actually carry.": "Quant conté el món, i què porten realment els personatges." + "How much the world holds, and what characters actually carry.": "Quant conté el món, i què porten realment els personatges.", + "Store": "Botiga", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instal·leu registres, esquemes i fluxos publicats per altres organitzacions." }, "plurals": {} } diff --git a/l10n/cs.js b/l10n/cs.js index 8432b22d..d0ff965c 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Zatím nic uděleno", "Who is playing what, and what is still waiting for approval.": "Kdo hraje co a co ještě čeká na schválení.", "Experience awarded, and who earned it.": "Udělené zkušenosti a kdo si je vysloužil.", - "How much the world holds, and what characters actually carry.": "Kolik svět obsahuje a co postavy skutečně nesou." + "How much the world holds, and what characters actually carry.": "Kolik svět obsahuje a co postavy skutečně nesou.", + "Store": "Obchod", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Nainstalujte registry, schémata a toky zveřejněné jinými organizacemi." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/cs.json b/l10n/cs.json index 8ef50a22..9b600ee6 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Zatím nic uděleno", "Who is playing what, and what is still waiting for approval.": "Kdo hraje co a co ještě čeká na schválení.", "Experience awarded, and who earned it.": "Udělené zkušenosti a kdo si je vysloužil.", - "How much the world holds, and what characters actually carry.": "Kolik svět obsahuje a co postavy skutečně nesou." + "How much the world holds, and what characters actually carry.": "Kolik svět obsahuje a co postavy skutečně nesou.", + "Store": "Obchod", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Nainstalujte registry, schémata a toky zveřejněné jinými organizacemi." }, "plurals": {} } diff --git a/l10n/da.js b/l10n/da.js index 97815e84..84c396e1 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Intet tildelt endnu", "Who is playing what, and what is still waiting for approval.": "Hvem spiller hvad, og hvad venter stadig på godkendelse.", "Experience awarded, and who earned it.": "Tildelt erfaring, og hvem der har optjent den.", - "How much the world holds, and what characters actually carry.": "Hvor meget verden rummer, og hvad karaktererne faktisk bærer." + "How much the world holds, and what characters actually carry.": "Hvor meget verden rummer, og hvad karaktererne faktisk bærer.", + "Store": "Butik", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installer registre, skemaer og flows, som andre organisationer har udgivet." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/da.json b/l10n/da.json index 359080d9..4fef190f 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Intet tildelt endnu", "Who is playing what, and what is still waiting for approval.": "Hvem spiller hvad, og hvad venter stadig på godkendelse.", "Experience awarded, and who earned it.": "Tildelt erfaring, og hvem der har optjent den.", - "How much the world holds, and what characters actually carry.": "Hvor meget verden rummer, og hvad karaktererne faktisk bærer." + "How much the world holds, and what characters actually carry.": "Hvor meget verden rummer, og hvad karaktererne faktisk bærer.", + "Store": "Butik", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installer registre, skemaer og flows, som andre organisationer har udgivet." }, "plurals": {} } diff --git a/l10n/de.js b/l10n/de.js index 0bfcfba7..5ed883e3 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Noch nichts vergeben", "Who is playing what, and what is still waiting for approval.": "Wer was spielt und was noch auf Freigabe wartet.", "Experience awarded, and who earned it.": "Vergebene Erfahrung und wer sie verdient hat.", - "How much the world holds, and what characters actually carry.": "Wie viel die Welt umfasst und was Charaktere wirklich tragen." + "How much the world holds, and what characters actually carry.": "Wie viel die Welt umfasst und was Charaktere wirklich tragen.", + "Store": "Store", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installieren Sie Register, Schemata und Flows, die andere Organisationen veröffentlicht haben." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/de.json b/l10n/de.json index 26e89543..312ccb89 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Noch nichts vergeben", "Who is playing what, and what is still waiting for approval.": "Wer was spielt und was noch auf Freigabe wartet.", "Experience awarded, and who earned it.": "Vergebene Erfahrung und wer sie verdient hat.", - "How much the world holds, and what characters actually carry.": "Wie viel die Welt umfasst und was Charaktere wirklich tragen." + "How much the world holds, and what characters actually carry.": "Wie viel die Welt umfasst und was Charaktere wirklich tragen.", + "Store": "Store", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installieren Sie Register, Schemata und Flows, die andere Organisationen veröffentlicht haben." }, "plurals": {} } diff --git a/l10n/el.js b/l10n/el.js index 78d04c2a..b60b6034 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Δεν έχει απονεμηθεί τίποτα ακόμη", "Who is playing what, and what is still waiting for approval.": "Ποιος παίζει τι, και τι περιμένει ακόμη έγκριση.", "Experience awarded, and who earned it.": "Η απονεμημένη εμπειρία και ποιος την κέρδισε.", - "How much the world holds, and what characters actually carry.": "Πόσα περιέχει ο κόσμος και τι κουβαλούν πραγματικά οι χαρακτήρες." + "How much the world holds, and what characters actually carry.": "Πόσα περιέχει ο κόσμος και τι κουβαλούν πραγματικά οι χαρακτήρες.", + "Store": "Κατάστημα", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Εγκαταστήστε μητρώα, σχήματα και ροές που έχουν δημοσιεύσει άλλοι οργανισμοί." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/el.json b/l10n/el.json index df867e18..1d97a6b3 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Δεν έχει απονεμηθεί τίποτα ακόμη", "Who is playing what, and what is still waiting for approval.": "Ποιος παίζει τι, και τι περιμένει ακόμη έγκριση.", "Experience awarded, and who earned it.": "Η απονεμημένη εμπειρία και ποιος την κέρδισε.", - "How much the world holds, and what characters actually carry.": "Πόσα περιέχει ο κόσμος και τι κουβαλούν πραγματικά οι χαρακτήρες." + "How much the world holds, and what characters actually carry.": "Πόσα περιέχει ο κόσμος και τι κουβαλούν πραγματικά οι χαρακτήρες.", + "Store": "Κατάστημα", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Εγκαταστήστε μητρώα, σχήματα και ροές που έχουν δημοσιεύσει άλλοι οργανισμοί." }, "plurals": {} } diff --git a/l10n/es.js b/l10n/es.js index 5aa44639..7bb885b8 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Aún no se ha concedido nada", "Who is playing what, and what is still waiting for approval.": "Quién juega qué, y qué sigue pendiente de aprobación.", "Experience awarded, and who earned it.": "La experiencia concedida y quién la ganó.", - "How much the world holds, and what characters actually carry.": "Cuánto contiene el mundo, y qué llevan realmente los personajes." + "How much the world holds, and what characters actually carry.": "Cuánto contiene el mundo, y qué llevan realmente los personajes.", + "Store": "Tienda", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instale registros, esquemas y flujos publicados por otras organizaciones." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/es.json b/l10n/es.json index 2129284e..428453fd 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Aún no se ha concedido nada", "Who is playing what, and what is still waiting for approval.": "Quién juega qué, y qué sigue pendiente de aprobación.", "Experience awarded, and who earned it.": "La experiencia concedida y quién la ganó.", - "How much the world holds, and what characters actually carry.": "Cuánto contiene el mundo, y qué llevan realmente los personajes." + "How much the world holds, and what characters actually carry.": "Cuánto contiene el mundo, y qué llevan realmente los personajes.", + "Store": "Tienda", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instale registros, esquemas y flujos publicados por otras organizaciones." }, "plurals": {} } diff --git a/l10n/et.js b/l10n/et.js index d5a90ced..54962ba1 100644 --- a/l10n/et.js +++ b/l10n/et.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Midagi pole veel antud", "Who is playing what, and what is still waiting for approval.": "Kes mida mängib ja mis ootab veel kinnitust.", "Experience awarded, and who earned it.": "Antud kogemus ja kes selle teenis.", - "How much the world holds, and what characters actually carry.": "Kui palju maailm sisaldab ja mida tegelased tegelikult kannavad." + "How much the world holds, and what characters actually carry.": "Kui palju maailm sisaldab ja mida tegelased tegelikult kannavad.", + "Store": "Pood", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Paigalda registrid, skeemid ja voog, mille teised organisatsioonid on avaldanud." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/et.json b/l10n/et.json index 4e9712b7..c3053406 100644 --- a/l10n/et.json +++ b/l10n/et.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Midagi pole veel antud", "Who is playing what, and what is still waiting for approval.": "Kes mida mängib ja mis ootab veel kinnitust.", "Experience awarded, and who earned it.": "Antud kogemus ja kes selle teenis.", - "How much the world holds, and what characters actually carry.": "Kui palju maailm sisaldab ja mida tegelased tegelikult kannavad." + "How much the world holds, and what characters actually carry.": "Kui palju maailm sisaldab ja mida tegelased tegelikult kannavad.", + "Store": "Pood", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Paigalda registrid, skeemid ja voog, mille teised organisatsioonid on avaldanud." }, "plurals": {} } diff --git a/l10n/fi.js b/l10n/fi.js index 81264868..866c56dc 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Mitään ei ole vielä myönnetty", "Who is playing what, and what is still waiting for approval.": "Kuka pelaa mitäkin ja mikä odottaa vielä hyväksyntää.", "Experience awarded, and who earned it.": "Myönnetty kokemus ja kuka sen ansaitsi.", - "How much the world holds, and what characters actually carry.": "Kuinka paljon maailma sisältää ja mitä hahmot todella kantavat." + "How much the world holds, and what characters actually carry.": "Kuinka paljon maailma sisältää ja mitä hahmot todella kantavat.", + "Store": "Kauppa", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Asenna muiden organisaatioiden julkaisemia rekistereitä, skeemoja ja vuokaavioita." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fi.json b/l10n/fi.json index 4a294d2c..a766cf94 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Mitään ei ole vielä myönnetty", "Who is playing what, and what is still waiting for approval.": "Kuka pelaa mitäkin ja mikä odottaa vielä hyväksyntää.", "Experience awarded, and who earned it.": "Myönnetty kokemus ja kuka sen ansaitsi.", - "How much the world holds, and what characters actually carry.": "Kuinka paljon maailma sisältää ja mitä hahmot todella kantavat." + "How much the world holds, and what characters actually carry.": "Kuinka paljon maailma sisältää ja mitä hahmot todella kantavat.", + "Store": "Kauppa", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Asenna muiden organisaatioiden julkaisemia rekistereitä, skeemoja ja vuokaavioita." }, "plurals": {} } diff --git a/l10n/fr.js b/l10n/fr.js index 8b9c0c5c..b8641629 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Rien d'attribué pour l'instant", "Who is playing what, and what is still waiting for approval.": "Qui joue quoi, et ce qui attend encore une approbation.", "Experience awarded, and who earned it.": "L'expérience attribuée et qui l'a gagnée.", - "How much the world holds, and what characters actually carry.": "Ce que contient le monde, et ce que les personnages portent réellement." + "How much the world holds, and what characters actually carry.": "Ce que contient le monde, et ce que les personnages portent réellement.", + "Store": "Boutique", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installez des registres, schémas et flux publiés par d'autres organisations." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fr.json b/l10n/fr.json index 89097304..e1901844 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Rien d'attribué pour l'instant", "Who is playing what, and what is still waiting for approval.": "Qui joue quoi, et ce qui attend encore une approbation.", "Experience awarded, and who earned it.": "L'expérience attribuée et qui l'a gagnée.", - "How much the world holds, and what characters actually carry.": "Ce que contient le monde, et ce que les personnages portent réellement." + "How much the world holds, and what characters actually carry.": "Ce que contient le monde, et ce que les personnages portent réellement.", + "Store": "Boutique", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installez des registres, schémas et flux publiés par d'autres organisations." }, "plurals": {} } diff --git a/l10n/ga.js b/l10n/ga.js index c48d786c..f1cb1764 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Níl aon rud bronnta go fóill", "Who is playing what, and what is still waiting for approval.": "Cé atá ag imirt cad, agus cad atá fós ag fanacht le faomhadh.", "Experience awarded, and who earned it.": "An taithí a bronnadh, agus cé a thuill í.", - "How much the world holds, and what characters actually carry.": "Cé mhéad atá sa domhan, agus cad a iompraíonn carachtair i ndáiríre." + "How much the world holds, and what characters actually carry.": "Cé mhéad atá sa domhan, agus cad a iompraíonn carachtair i ndáiríre.", + "Store": "Siopa", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Suiteáil cláir, scéimeanna agus sruthanna a d'fhoilsigh eagraíochtaí eile." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ga.json b/l10n/ga.json index 17d7eb6c..fa69293e 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Níl aon rud bronnta go fóill", "Who is playing what, and what is still waiting for approval.": "Cé atá ag imirt cad, agus cad atá fós ag fanacht le faomhadh.", "Experience awarded, and who earned it.": "An taithí a bronnadh, agus cé a thuill í.", - "How much the world holds, and what characters actually carry.": "Cé mhéad atá sa domhan, agus cad a iompraíonn carachtair i ndáiríre." + "How much the world holds, and what characters actually carry.": "Cé mhéad atá sa domhan, agus cad a iompraíonn carachtair i ndáiríre.", + "Store": "Siopa", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Suiteáil cláir, scéimeanna agus sruthanna a d'fhoilsigh eagraíochtaí eile." }, "plurals": {} } diff --git a/l10n/hr.js b/l10n/hr.js index 6c0e5d51..a675172b 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Još ništa nije dodijeljeno", "Who is playing what, and what is still waiting for approval.": "Tko što igra i što još čeka odobrenje.", "Experience awarded, and who earned it.": "Dodijeljeno iskustvo i tko ga je zaradio.", - "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i što likovi zaista nose." + "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i što likovi zaista nose.", + "Store": "Trgovina", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instalirajte registre, sheme i tokove koje su objavile druge organizacije." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hr.json b/l10n/hr.json index 00e6d206..7f7de9f6 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Još ništa nije dodijeljeno", "Who is playing what, and what is still waiting for approval.": "Tko što igra i što još čeka odobrenje.", "Experience awarded, and who earned it.": "Dodijeljeno iskustvo i tko ga je zaradio.", - "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i što likovi zaista nose." + "How much the world holds, and what characters actually carry.": "Koliko svijet sadrži i što likovi zaista nose.", + "Store": "Trgovina", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instalirajte registre, sheme i tokove koje su objavile druge organizacije." }, "plurals": {} } diff --git a/l10n/hu.js b/l10n/hu.js index 8295a4d9..8b45cb18 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Még semmit sem ítéltek oda", "Who is playing what, and what is still waiting for approval.": "Ki mit játszik, és mi vár még jóváhagyásra.", "Experience awarded, and who earned it.": "Az odaítélt tapasztalat és aki kiérdemelte.", - "How much the world holds, and what characters actually carry.": "Mennyit tartalmaz a világ, és mit hordanak valójában a karakterek." + "How much the world holds, and what characters actually carry.": "Mennyit tartalmaz a világ, és mit hordanak valójában a karakterek.", + "Store": "Áruház", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Telepítsen más szervezetek által közzétett nyilvántartásokat, sémákat és folyamatokat." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hu.json b/l10n/hu.json index 7ff40240..9b4b78c8 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Még semmit sem ítéltek oda", "Who is playing what, and what is still waiting for approval.": "Ki mit játszik, és mi vár még jóváhagyásra.", "Experience awarded, and who earned it.": "Az odaítélt tapasztalat és aki kiérdemelte.", - "How much the world holds, and what characters actually carry.": "Mennyit tartalmaz a világ, és mit hordanak valójában a karakterek." + "How much the world holds, and what characters actually carry.": "Mennyit tartalmaz a világ, és mit hordanak valójában a karakterek.", + "Store": "Áruház", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Telepítsen más szervezetek által közzétett nyilvántartásokat, sémákat és folyamatokat." }, "plurals": {} } diff --git a/l10n/is.js b/l10n/is.js index e92a0cee..57f26a93 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Ekkert veitt enn", "Who is playing what, and what is still waiting for approval.": "Hver spilar hvað og hvað bíður enn samþykkis.", "Experience awarded, and who earned it.": "Veitt reynsla og hver ávann sér hana.", - "How much the world holds, and what characters actually carry.": "Hversu mikið heimurinn geymir og hvað persónur bera í raun." + "How much the world holds, and what characters actually carry.": "Hversu mikið heimurinn geymir og hvað persónur bera í raun.", + "Store": "Verslun", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Settu upp skrár, skemu og flæði sem aðrar stofnanir hafa birt." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/is.json b/l10n/is.json index c6d09949..5501fff3 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Ekkert veitt enn", "Who is playing what, and what is still waiting for approval.": "Hver spilar hvað og hvað bíður enn samþykkis.", "Experience awarded, and who earned it.": "Veitt reynsla og hver ávann sér hana.", - "How much the world holds, and what characters actually carry.": "Hversu mikið heimurinn geymir og hvað persónur bera í raun." + "How much the world holds, and what characters actually carry.": "Hversu mikið heimurinn geymir og hvað persónur bera í raun.", + "Store": "Verslun", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Settu upp skrár, skemu og flæði sem aðrar stofnanir hafa birt." }, "plurals": {} } diff --git a/l10n/it.js b/l10n/it.js index a7a6aa51..021c0096 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Ancora nulla assegnato", "Who is playing what, and what is still waiting for approval.": "Chi gioca cosa, e cosa attende ancora approvazione.", "Experience awarded, and who earned it.": "L'esperienza assegnata e chi l'ha guadagnata.", - "How much the world holds, and what characters actually carry.": "Quanto contiene il mondo, e cosa portano davvero i personaggi." + "How much the world holds, and what characters actually carry.": "Quanto contiene il mondo, e cosa portano davvero i personaggi.", + "Store": "Store", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installa registri, schemi e flussi pubblicati da altre organizzazioni." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/it.json b/l10n/it.json index f054df2b..4d38b4cc 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Ancora nulla assegnato", "Who is playing what, and what is still waiting for approval.": "Chi gioca cosa, e cosa attende ancora approvazione.", "Experience awarded, and who earned it.": "L'esperienza assegnata e chi l'ha guadagnata.", - "How much the world holds, and what characters actually carry.": "Quanto contiene il mondo, e cosa portano davvero i personaggi." + "How much the world holds, and what characters actually carry.": "Quanto contiene il mondo, e cosa portano davvero i personaggi.", + "Store": "Store", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installa registri, schemi e flussi pubblicati da altre organizzazioni." }, "plurals": {} } diff --git a/l10n/lb.js b/l10n/lb.js index 311d6724..e94aade2 100644 --- a/l10n/lb.js +++ b/l10n/lb.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Nach näischt vergiff", "Who is playing what, and what is still waiting for approval.": "Wien wat spillt a wat nach op Zoustëmmung waart.", "Experience awarded, and who earned it.": "Vergiff Erfarung a wien se verdéngt huet.", - "How much the world holds, and what characters actually carry.": "Wéi vill d'Welt hält a wat Charakteren wierklech droen." + "How much the world holds, and what characters actually carry.": "Wéi vill d'Welt hält a wat Charakteren wierklech droen.", + "Store": "Buttek", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installéiert Registeren, Schemaen a Flows déi aner Organisatiounen publizéiert hunn." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lb.json b/l10n/lb.json index ec2d2488..f83797f6 100644 --- a/l10n/lb.json +++ b/l10n/lb.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Nach näischt vergiff", "Who is playing what, and what is still waiting for approval.": "Wien wat spillt a wat nach op Zoustëmmung waart.", "Experience awarded, and who earned it.": "Vergiff Erfarung a wien se verdéngt huet.", - "How much the world holds, and what characters actually carry.": "Wéi vill d'Welt hält a wat Charakteren wierklech droen." + "How much the world holds, and what characters actually carry.": "Wéi vill d'Welt hält a wat Charakteren wierklech droen.", + "Store": "Buttek", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installéiert Registeren, Schemaen a Flows déi aner Organisatiounen publizéiert hunn." }, "plurals": {} } diff --git a/l10n/lt.js b/l10n/lt.js index 57c0d0c4..cf707c60 100644 --- a/l10n/lt.js +++ b/l10n/lt.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Dar nieko nesuteikta", "Who is playing what, and what is still waiting for approval.": "Kas ką žaidžia ir kas dar laukia patvirtinimo.", "Experience awarded, and who earned it.": "Suteikta patirtis ir kas ją užsidirbo.", - "How much the world holds, and what characters actually carry.": "Kiek pasaulis apima ir ką personažai iš tikrųjų neša." + "How much the world holds, and what characters actually carry.": "Kiek pasaulis apima ir ką personažai iš tikrųjų neša.", + "Store": "Parduotuvė", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Įdiekite registrus, schemas ir srautus, kuriuos paskelbė kitos organizacijos." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lt.json b/l10n/lt.json index d70bee32..e51ce00e 100644 --- a/l10n/lt.json +++ b/l10n/lt.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Dar nieko nesuteikta", "Who is playing what, and what is still waiting for approval.": "Kas ką žaidžia ir kas dar laukia patvirtinimo.", "Experience awarded, and who earned it.": "Suteikta patirtis ir kas ją užsidirbo.", - "How much the world holds, and what characters actually carry.": "Kiek pasaulis apima ir ką personažai iš tikrųjų neša." + "How much the world holds, and what characters actually carry.": "Kiek pasaulis apima ir ką personažai iš tikrųjų neša.", + "Store": "Parduotuvė", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Įdiekite registrus, schemas ir srautus, kuriuos paskelbė kitos organizacijos." }, "plurals": {} } diff --git a/l10n/lv.js b/l10n/lv.js index 9966eaa3..c352000d 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Vēl nekas nav piešķirts", "Who is playing what, and what is still waiting for approval.": "Kurš ko spēlē un kas vēl gaida apstiprinājumu.", "Experience awarded, and who earned it.": "Piešķirtā pieredze un kurš to nopelnīja.", - "How much the world holds, and what characters actually carry.": "Cik daudz pasaule ietver un ko tēli patiešām nes." + "How much the world holds, and what characters actually carry.": "Cik daudz pasaule ietver un ko tēli patiešām nes.", + "Store": "Veikals", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instalējiet reģistrus, shēmas un plūsmas, ko publicējušas citas organizācijas." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lv.json b/l10n/lv.json index 531baa3f..c1db431c 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Vēl nekas nav piešķirts", "Who is playing what, and what is still waiting for approval.": "Kurš ko spēlē un kas vēl gaida apstiprinājumu.", "Experience awarded, and who earned it.": "Piešķirtā pieredze un kurš to nopelnīja.", - "How much the world holds, and what characters actually carry.": "Cik daudz pasaule ietver un ko tēli patiešām nes." + "How much the world holds, and what characters actually carry.": "Cik daudz pasaule ietver un ko tēli patiešām nes.", + "Store": "Veikals", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instalējiet reģistrus, shēmas un plūsmas, ko publicējušas citas organizācijas." }, "plurals": {} } diff --git a/l10n/mk.js b/l10n/mk.js index 6645cea1..63e97c1f 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Сè уште ништо не е доделено", "Who is playing what, and what is still waiting for approval.": "Кој што игра и што сè уште чека одобрување.", "Experience awarded, and who earned it.": "Доделеното искуство и кој го заработил.", - "How much the world holds, and what characters actually carry.": "Колку содржи светот и што навистина носат ликовите." + "How much the world holds, and what characters actually carry.": "Колку содржи светот и што навистина носат ликовите.", + "Store": "Продавница", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Инсталирајте регистри, шеми и текови објавени од други организации." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mk.json b/l10n/mk.json index faf891a3..247af85c 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Сè уште ништо не е доделено", "Who is playing what, and what is still waiting for approval.": "Кој што игра и што сè уште чека одобрување.", "Experience awarded, and who earned it.": "Доделеното искуство и кој го заработил.", - "How much the world holds, and what characters actually carry.": "Колку содржи светот и што навистина носат ликовите." + "How much the world holds, and what characters actually carry.": "Колку содржи светот и што навистина носат ликовите.", + "Store": "Продавница", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Инсталирајте регистри, шеми и текови објавени од други организации." }, "plurals": {} } diff --git a/l10n/mt.js b/l10n/mt.js index c9c9c6d5..129ee796 100644 --- a/l10n/mt.js +++ b/l10n/mt.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Xejn ma ngħata s'issa", "Who is playing what, and what is still waiting for approval.": "Min qed jilgħab xiex, u x'għadu jistenna approvazzjoni.", "Experience awarded, and who earned it.": "L-esperjenza mogħtija u min qalagħha.", - "How much the world holds, and what characters actually carry.": "Kemm iżomm id-dinja, u x'iġorru tabilħaqq il-karattri." + "How much the world holds, and what characters actually carry.": "Kemm iżomm id-dinja, u x'iġorru tabilħaqq il-karattri.", + "Store": "Ħanut", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installa reġistri, skemi u flussi ppubblikati minn organizzazzjonijiet oħra." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mt.json b/l10n/mt.json index 39515da6..d1c198fe 100644 --- a/l10n/mt.json +++ b/l10n/mt.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Xejn ma ngħata s'issa", "Who is playing what, and what is still waiting for approval.": "Min qed jilgħab xiex, u x'għadu jistenna approvazzjoni.", "Experience awarded, and who earned it.": "L-esperjenza mogħtija u min qalagħha.", - "How much the world holds, and what characters actually carry.": "Kemm iżomm id-dinja, u x'iġorru tabilħaqq il-karattri." + "How much the world holds, and what characters actually carry.": "Kemm iżomm id-dinja, u x'iġorru tabilħaqq il-karattri.", + "Store": "Ħanut", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installa reġistri, skemi u flussi ppubblikati minn organizzazzjonijiet oħra." }, "plurals": {} } diff --git a/l10n/nb.js b/l10n/nb.js index 23366fb4..6adc4c5f 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Ingenting tildelt ennå", "Who is playing what, and what is still waiting for approval.": "Hvem som spiller hva, og hva som fortsatt venter på godkjenning.", "Experience awarded, and who earned it.": "Tildelt erfaring, og hvem som har opptjent den.", - "How much the world holds, and what characters actually carry.": "Hvor mye verden rommer, og hva karakterene faktisk bærer." + "How much the world holds, and what characters actually carry.": "Hvor mye verden rommer, og hva karakterene faktisk bærer.", + "Store": "Butikk", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installer registre, skjemaer og flyter som andre organisasjoner har publisert." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nb.json b/l10n/nb.json index 7f1cc154..4d6c324c 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Ingenting tildelt ennå", "Who is playing what, and what is still waiting for approval.": "Hvem som spiller hva, og hva som fortsatt venter på godkjenning.", "Experience awarded, and who earned it.": "Tildelt erfaring, og hvem som har opptjent den.", - "How much the world holds, and what characters actually carry.": "Hvor mye verden rommer, og hva karakterene faktisk bærer." + "How much the world holds, and what characters actually carry.": "Hvor mye verden rommer, og hva karakterene faktisk bærer.", + "Store": "Butikk", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installer registre, skjemaer og flyter som andre organisasjoner har publisert." }, "plurals": {} } diff --git a/l10n/nl.js b/l10n/nl.js index b51650d5..a42ec077 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -348,7 +348,9 @@ OC.L10N.register( "Nothing awarded yet": "Nog niets toegekend", "Who is playing what, and what is still waiting for approval.": "Wie wat speelt, en wat nog op goedkeuring wacht.", "Experience awarded, and who earned it.": "Toegekende ervaring, en wie die verdiend heeft.", - "How much the world holds, and what characters actually carry.": "Hoeveel de wereld bevat, en wat personages werkelijk dragen." + "How much the world holds, and what characters actually carry.": "Hoeveel de wereld bevat, en wat personages werkelijk dragen.", + "Store": "Store", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installeer registers, schema's en flows die andere organisaties hebben gepubliceerd." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nl.json b/l10n/nl.json index 6e9b5360..ac712b54 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -347,7 +347,9 @@ "Nothing awarded yet": "Nog niets toegekend", "Who is playing what, and what is still waiting for approval.": "Wie wat speelt, en wat nog op goedkeuring wacht.", "Experience awarded, and who earned it.": "Toegekende ervaring, en wie die verdiend heeft.", - "How much the world holds, and what characters actually carry.": "Hoeveel de wereld bevat, en wat personages werkelijk dragen." + "How much the world holds, and what characters actually carry.": "Hoeveel de wereld bevat, en wat personages werkelijk dragen.", + "Store": "Store", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installeer registers, schema's en flows die andere organisaties hebben gepubliceerd." }, "plurals": {}, "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/pl.js b/l10n/pl.js index 7e76450a..dc332c34 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Nic jeszcze nie przyznano", "Who is playing what, and what is still waiting for approval.": "Kto w co gra i co wciąż czeka na zatwierdzenie.", "Experience awarded, and who earned it.": "Przyznane doświadczenie i kto na nie zapracował.", - "How much the world holds, and what characters actually carry.": "Ile zawiera świat i co postacie naprawdę noszą." + "How much the world holds, and what characters actually carry.": "Ile zawiera świat i co postacie naprawdę noszą.", + "Store": "Sklep", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Zainstaluj rejestry, schematy i przepływy opublikowane przez inne organizacje." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pl.json b/l10n/pl.json index 8865e79b..507f15de 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Nic jeszcze nie przyznano", "Who is playing what, and what is still waiting for approval.": "Kto w co gra i co wciąż czeka na zatwierdzenie.", "Experience awarded, and who earned it.": "Przyznane doświadczenie i kto na nie zapracował.", - "How much the world holds, and what characters actually carry.": "Ile zawiera świat i co postacie naprawdę noszą." + "How much the world holds, and what characters actually carry.": "Ile zawiera świat i co postacie naprawdę noszą.", + "Store": "Sklep", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Zainstaluj rejestry, schematy i przepływy opublikowane przez inne organizacje." }, "plurals": {} } diff --git a/l10n/pt.js b/l10n/pt.js index 7bcefc1a..e15724b5 100644 --- a/l10n/pt.js +++ b/l10n/pt.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Ainda nada atribuído", "Who is playing what, and what is still waiting for approval.": "Quem joga o quê, e o que ainda aguarda aprovação.", "Experience awarded, and who earned it.": "A experiência atribuída e quem a ganhou.", - "How much the world holds, and what characters actually carry.": "Quanto o mundo contém, e o que as personagens realmente levam." + "How much the world holds, and what characters actually carry.": "Quanto o mundo contém, e o que as personagens realmente levam.", + "Store": "Loja", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instale registos, esquemas e fluxos publicados por outras organizações." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pt.json b/l10n/pt.json index 3e611802..84258b5f 100644 --- a/l10n/pt.json +++ b/l10n/pt.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Ainda nada atribuído", "Who is playing what, and what is still waiting for approval.": "Quem joga o quê, e o que ainda aguarda aprovação.", "Experience awarded, and who earned it.": "A experiência atribuída e quem a ganhou.", - "How much the world holds, and what characters actually carry.": "Quanto o mundo contém, e o que as personagens realmente levam." + "How much the world holds, and what characters actually carry.": "Quanto o mundo contém, e o que as personagens realmente levam.", + "Store": "Loja", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instale registos, esquemas e fluxos publicados por outras organizações." }, "plurals": {} } diff --git a/l10n/rm.js b/l10n/rm.js index 679cce01..14f48549 100644 --- a/l10n/rm.js +++ b/l10n/rm.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Anc nagut attribuì", "Who is playing what, and what is still waiting for approval.": "Tgi che giogia tge, e tge che spetga anc l'approvaziun.", "Experience awarded, and who earned it.": "L'experientscha attribuida e tgi ch'i l'ha gudagnà.", - "How much the world holds, and what characters actually carry.": "Quant ch'il mund cuntegna e tge che las persunas portan propi." + "How much the world holds, and what characters actually carry.": "Quant ch'il mund cuntegna e tge che las persunas portan propi.", + "Store": "Butia", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installescha registers, schemas e process ch'autras organisaziuns han publitgà." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/rm.json b/l10n/rm.json index 56f0a8a4..e739f8fe 100644 --- a/l10n/rm.json +++ b/l10n/rm.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Anc nagut attribuì", "Who is playing what, and what is still waiting for approval.": "Tgi che giogia tge, e tge che spetga anc l'approvaziun.", "Experience awarded, and who earned it.": "L'experientscha attribuida e tgi ch'i l'ha gudagnà.", - "How much the world holds, and what characters actually carry.": "Quant ch'il mund cuntegna e tge che las persunas portan propi." + "How much the world holds, and what characters actually carry.": "Quant ch'il mund cuntegna e tge che las persunas portan propi.", + "Store": "Butia", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installescha registers, schemas e process ch'autras organisaziuns han publitgà." }, "plurals": {} } diff --git a/l10n/ro.js b/l10n/ro.js index 6ffd71db..f833eb01 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Încă nu s-a acordat nimic", "Who is playing what, and what is still waiting for approval.": "Cine joacă ce și ce mai așteaptă aprobare.", "Experience awarded, and who earned it.": "Experiența acordată și cine a câștigat-o.", - "How much the world holds, and what characters actually carry.": "Cât conține lumea și ce poartă de fapt personajele." + "How much the world holds, and what characters actually carry.": "Cât conține lumea și ce poartă de fapt personajele.", + "Store": "Magazin", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instalați registre, scheme și fluxuri publicate de alte organizații." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ro.json b/l10n/ro.json index 4f2df677..ce08d094 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Încă nu s-a acordat nimic", "Who is playing what, and what is still waiting for approval.": "Cine joacă ce și ce mai așteaptă aprobare.", "Experience awarded, and who earned it.": "Experiența acordată și cine a câștigat-o.", - "How much the world holds, and what characters actually carry.": "Cât conține lumea și ce poartă de fapt personajele." + "How much the world holds, and what characters actually carry.": "Cât conține lumea și ce poartă de fapt personajele.", + "Store": "Magazin", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instalați registre, scheme și fluxuri publicate de alte organizații." }, "plurals": {} } diff --git a/l10n/ru.js b/l10n/ru.js index af7f0fdf..1f073176 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Пока ничего не начислено", "Who is playing what, and what is still waiting for approval.": "Кто что играет и что ещё ждёт одобрения.", "Experience awarded, and who earned it.": "Начисленный опыт и кто его заработал.", - "How much the world holds, and what characters actually carry.": "Сколько содержит мир и что персонажи действительно несут." + "How much the world holds, and what characters actually carry.": "Сколько содержит мир и что персонажи действительно несут.", + "Store": "Магазин", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Установите реестры, схемы и потоки, опубликованные другими организациями." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ru.json b/l10n/ru.json index d30caa62..84045db5 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Пока ничего не начислено", "Who is playing what, and what is still waiting for approval.": "Кто что играет и что ещё ждёт одобрения.", "Experience awarded, and who earned it.": "Начисленный опыт и кто его заработал.", - "How much the world holds, and what characters actually carry.": "Сколько содержит мир и что персонажи действительно несут." + "How much the world holds, and what characters actually carry.": "Сколько содержит мир и что персонажи действительно несут.", + "Store": "Магазин", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Установите реестры, схемы и потоки, опубликованные другими организациями." }, "plurals": {} } diff --git a/l10n/sk.js b/l10n/sk.js index d174c182..f7274fe3 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Zatiaľ nič neudelené", "Who is playing what, and what is still waiting for approval.": "Kto hrá čo a čo ešte čaká na schválenie.", "Experience awarded, and who earned it.": "Udelené skúsenosti a kto si ich zaslúžil.", - "How much the world holds, and what characters actually carry.": "Koľko svet obsahuje a čo postavy skutočne nesú." + "How much the world holds, and what characters actually carry.": "Koľko svet obsahuje a čo postavy skutočne nesú.", + "Store": "Obchod", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Nainštalujte registre, schémy a toky zverejnené inými organizáciami." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sk.json b/l10n/sk.json index b54bbae9..2fd88463 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Zatiaľ nič neudelené", "Who is playing what, and what is still waiting for approval.": "Kto hrá čo a čo ešte čaká na schválenie.", "Experience awarded, and who earned it.": "Udelené skúsenosti a kto si ich zaslúžil.", - "How much the world holds, and what characters actually carry.": "Koľko svet obsahuje a čo postavy skutočne nesú." + "How much the world holds, and what characters actually carry.": "Koľko svet obsahuje a čo postavy skutočne nesú.", + "Store": "Obchod", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Nainštalujte registre, schémy a toky zverejnené inými organizáciami." }, "plurals": {} } diff --git a/l10n/sl.js b/l10n/sl.js index 8f94befa..8f0da4cf 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Še ni nič dodeljeno", "Who is playing what, and what is still waiting for approval.": "Kdo igra kaj in kaj še čaka odobritev.", "Experience awarded, and who earned it.": "Dodeljene izkušnje in kdo si jih je prislužil.", - "How much the world holds, and what characters actually carry.": "Koliko svet vsebuje in kaj liki dejansko nosijo." + "How much the world holds, and what characters actually carry.": "Koliko svet vsebuje in kaj liki dejansko nosijo.", + "Store": "Trgovina", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Namestite registre, sheme in tokove, ki so jih objavile druge organizacije." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sl.json b/l10n/sl.json index c572814a..2f2345b7 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Še ni nič dodeljeno", "Who is playing what, and what is still waiting for approval.": "Kdo igra kaj in kaj še čaka odobritev.", "Experience awarded, and who earned it.": "Dodeljene izkušnje in kdo si jih je prislužil.", - "How much the world holds, and what characters actually carry.": "Koliko svet vsebuje in kaj liki dejansko nosijo." + "How much the world holds, and what characters actually carry.": "Koliko svet vsebuje in kaj liki dejansko nosijo.", + "Store": "Trgovina", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Namestite registre, sheme in tokove, ki so jih objavile druge organizacije." }, "plurals": {} } diff --git a/l10n/sq.js b/l10n/sq.js index 63f8c274..bbfb176d 100644 --- a/l10n/sq.js +++ b/l10n/sq.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Ende asgjë nuk është dhënë", "Who is playing what, and what is still waiting for approval.": "Kush luan çfarë, dhe çfarë pret ende miratim.", "Experience awarded, and who earned it.": "Përvoja e dhënë dhe kush e fitoi atë.", - "How much the world holds, and what characters actually carry.": "Sa mban bota dhe çfarë mbajnë vërtet personazhet." + "How much the world holds, and what characters actually carry.": "Sa mban bota dhe çfarë mbajnë vërtet personazhet.", + "Store": "Dyqani", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instaloni regjistra, skema dhe rrjedha të publikuara nga organizata të tjera." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sq.json b/l10n/sq.json index da4660b7..5c25ffa7 100644 --- a/l10n/sq.json +++ b/l10n/sq.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Ende asgjë nuk është dhënë", "Who is playing what, and what is still waiting for approval.": "Kush luan çfarë, dhe çfarë pret ende miratim.", "Experience awarded, and who earned it.": "Përvoja e dhënë dhe kush e fitoi atë.", - "How much the world holds, and what characters actually carry.": "Sa mban bota dhe çfarë mbajnë vërtet personazhet." + "How much the world holds, and what characters actually carry.": "Sa mban bota dhe çfarë mbajnë vërtet personazhet.", + "Store": "Dyqani", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Instaloni regjistra, skema dhe rrjedha të publikuara nga organizata të tjera." }, "plurals": {} } diff --git a/l10n/sr.js b/l10n/sr.js index 5291aa5d..0fb3564a 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Још ништа није додељено", "Who is playing what, and what is still waiting for approval.": "Ко шта игра и шта још чека одобрење.", "Experience awarded, and who earned it.": "Додељено искуство и ко га је зарадио.", - "How much the world holds, and what characters actually carry.": "Колико свет садржи и шта ликови заиста носе." + "How much the world holds, and what characters actually carry.": "Колико свет садржи и шта ликови заиста носе.", + "Store": "Продавница", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Инсталирајте регистре, шеме и токове које су објавиле друге организације." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sr.json b/l10n/sr.json index 39947cfd..e68b6101 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Још ништа није додељено", "Who is playing what, and what is still waiting for approval.": "Ко шта игра и шта још чека одобрење.", "Experience awarded, and who earned it.": "Додељено искуство и ко га је зарадио.", - "How much the world holds, and what characters actually carry.": "Колико свет садржи и шта ликови заиста носе." + "How much the world holds, and what characters actually carry.": "Колико свет садржи и шта ликови заиста носе.", + "Store": "Продавница", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Инсталирајте регистре, шеме и токове које су објавиле друге организације." }, "plurals": {} } diff --git a/l10n/sv.js b/l10n/sv.js index 754cad53..4eb65f70 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Inget tilldelat ännu", "Who is playing what, and what is still waiting for approval.": "Vem som spelar vad, och vad som fortfarande väntar på godkännande.", "Experience awarded, and who earned it.": "Tilldelad erfarenhet, och vem som förtjänat den.", - "How much the world holds, and what characters actually carry.": "Hur mycket världen rymmer, och vad karaktärerna faktiskt bär." + "How much the world holds, and what characters actually carry.": "Hur mycket världen rymmer, och vad karaktärerna faktiskt bär.", + "Store": "Butik", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installera register, scheman och flöden som andra organisationer har publicerat." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sv.json b/l10n/sv.json index 00334aac..faa0e1d9 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Inget tilldelat ännu", "Who is playing what, and what is still waiting for approval.": "Vem som spelar vad, och vad som fortfarande väntar på godkännande.", "Experience awarded, and who earned it.": "Tilldelad erfarenhet, och vem som förtjänat den.", - "How much the world holds, and what characters actually carry.": "Hur mycket världen rymmer, och vad karaktärerna faktiskt bär." + "How much the world holds, and what characters actually carry.": "Hur mycket världen rymmer, och vad karaktärerna faktiskt bär.", + "Store": "Butik", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Installera register, scheman och flöden som andra organisationer har publicerat." }, "plurals": {} } diff --git a/l10n/tr.js b/l10n/tr.js index 94c2405d..97b0aa27 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Henüz bir şey verilmedi", "Who is playing what, and what is still waiting for approval.": "Kimin ne oynadığı ve neyin hâlâ onay beklediği.", "Experience awarded, and who earned it.": "Verilen deneyim ve onu kimin kazandığı.", - "How much the world holds, and what characters actually carry.": "Dünyanın ne kadar barındırdığı ve karakterlerin gerçekte ne taşıdığı." + "How much the world holds, and what characters actually carry.": "Dünyanın ne kadar barındırdığı ve karakterlerin gerçekte ne taşıdığı.", + "Store": "Mağaza", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Diğer kuruluşların yayımladığı kayıtları, şemaları ve akışları yükleyin." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/tr.json b/l10n/tr.json index 863fb0b8..0cbc57f5 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Henüz bir şey verilmedi", "Who is playing what, and what is still waiting for approval.": "Kimin ne oynadığı ve neyin hâlâ onay beklediği.", "Experience awarded, and who earned it.": "Verilen deneyim ve onu kimin kazandığı.", - "How much the world holds, and what characters actually carry.": "Dünyanın ne kadar barındırdığı ve karakterlerin gerçekte ne taşıdığı." + "How much the world holds, and what characters actually carry.": "Dünyanın ne kadar barındırdığı ve karakterlerin gerçekte ne taşıdığı.", + "Store": "Mağaza", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Diğer kuruluşların yayımladığı kayıtları, şemaları ve akışları yükleyin." }, "plurals": {} } diff --git a/l10n/uk.js b/l10n/uk.js index 363998d8..8a750ccc 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -256,7 +256,9 @@ OC.L10N.register( "Nothing awarded yet": "Ще нічого не нараховано", "Who is playing what, and what is still waiting for approval.": "Хто що грає і що ще чекає схвалення.", "Experience awarded, and who earned it.": "Нарахований досвід і хто його заробив.", - "How much the world holds, and what characters actually carry.": "Скільки містить світ і що персонажі насправді носять." + "How much the world holds, and what characters actually carry.": "Скільки містить світ і що персонажі насправді носять.", + "Store": "Магазин", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Встановлюйте реєстри, схеми та потоки, опубліковані іншими організаціями." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/uk.json b/l10n/uk.json index 3266fa3a..6459c350 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -255,7 +255,9 @@ "Nothing awarded yet": "Ще нічого не нараховано", "Who is playing what, and what is still waiting for approval.": "Хто що грає і що ще чекає схвалення.", "Experience awarded, and who earned it.": "Нарахований досвід і хто його заробив.", - "How much the world holds, and what characters actually carry.": "Скільки містить світ і що персонажі насправді носять." + "How much the world holds, and what characters actually carry.": "Скільки містить світ і що персонажі насправді носять.", + "Store": "Магазин", + "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event.": "Встановлюйте реєстри, схеми та потоки, опубліковані іншими організаціями." }, "plurals": {} } diff --git a/package-lock.json b/package-lock.json index 57d36e01..f49233f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.20", "license": "EUPL-1.2", "dependencies": { - "@conduction/nextcloud-vue": "^2.31.1", + "@conduction/nextcloud-vue": "^2.36.1", "@nextcloud/auth": "^2.5.0", "@nextcloud/axios": "~2.5.2", "@nextcloud/capabilities": "^1.2.1", @@ -1829,9 +1829,9 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "2.31.1", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.31.1.tgz", - "integrity": "sha512-tF1/7yNaBgxj5iHhpNuxVdUrPugfy2ePQZILl7y+fFJTq68tR7WPs8EqPin8aaCBc6ZxgWp1ciyY+NW9rXBMYA==", + "version": "2.36.2", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.36.2.tgz", + "integrity": "sha512-7PIqxjWP6Q5FewdLZmRB+1ITnNq1xg7J3VJv69u5T6CD5Kvkg0B+7jZCwaJjb4GeBdw5b3m4yWGVIzlVRFFuhg==", "license": "EUPL-1.2", "dependencies": { "@ckpack/vue-color": "^1.6.0", diff --git a/package.json b/package.json index 2312afad..6490043a 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "extends @nextcloud/browserslist-config" ], "dependencies": { - "@conduction/nextcloud-vue": "^2.31.1", + "@conduction/nextcloud-vue": "^2.36.1", "@nextcloud/auth": "^2.5.0", "@nextcloud/axios": "~2.5.2", "@nextcloud/capabilities": "^1.2.1", diff --git a/src/icons.js b/src/icons.js index 043784ed..5f9b03ff 100644 --- a/src/icons.js +++ b/src/icons.js @@ -50,6 +50,7 @@ import Sitemap from 'vue-material-design-icons/Sitemap.vue' import Star from 'vue-material-design-icons/Star.vue' import StarOutline from 'vue-material-design-icons/StarOutline.vue' import StarPlusOutline from 'vue-material-design-icons/StarPlusOutline.vue' +import StoreOutline from 'vue-material-design-icons/StoreOutline.vue' import Sword from 'vue-material-design-icons/Sword.vue' import SwordCross from 'vue-material-design-icons/SwordCross.vue' import ToolboxOutline from 'vue-material-design-icons/ToolboxOutline.vue' @@ -97,6 +98,7 @@ export default { Star, StarOutline, StarPlusOutline, + StoreOutline, Sword, SwordCross, ToolboxOutline, diff --git a/src/manifest.json b/src/manifest.json index 9971e4fa..6ea0c54c 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -132,6 +132,14 @@ } ] }, + "store": { + "_note": "Configuration exchange, not rows. A configuration set carries the registers, schemas, objects, views, flows, sources and mappings that make one way of working hold together. There is deliberately NO `installable` allowlist: a set exists to introduce schemas the instance does not have YET, so listing schemas this app already owns would refuse exactly the sets worth installing. The trust boundary for a bundle is its publisher, enforced by the engine's source allowlist and trusted-key check. \u26a0\ufe0f An EMPTY `installable` means install NOTHING, not install anything \u2014 omitting the key and declaring an empty list are different things.", + "types": [ + "openregister.configset", + "openregister.flows" + ], + "localRegister": "larpinq" + }, "menu": [ { "id": "Dashboard", @@ -260,6 +268,14 @@ "section": "footer", "order": 90 }, + { + "id": "StoreMenu", + "label": "Store", + "icon": "StoreOutline", + "route": "Store", + "section": "footer", + "order": 92 + }, { "id": "ReportsMenu", "label": "Reports", @@ -300,6 +316,18 @@ } }, "pages": [ + { + "id": "Store", + "route": "/store", + "type": "store", + "title": "Store", + "config": { + "app": "larpinq", + "title": "Store", + "description": "Install game configurations that other organisations have published: a skill tree, a set of conditions, or the flows behind an event." + }, + "_note": "ADR-114 Decision 4 / ADR-080. Declarative: openregister hosts the store plane, so this app writes NO store controller. With no registry configured the page renders the app's built-in items and makes NO network call." + }, { "id": "Dashboard", "route": "/", diff --git a/tests/e2e/app-chrome.spec.ts b/tests/e2e/app-chrome.spec.ts index 72559f5d..03c700b0 100644 --- a/tests/e2e/app-chrome.spec.ts +++ b/tests/e2e/app-chrome.spec.ts @@ -65,7 +65,7 @@ test.describe('app chrome (ADR-114)', () => { await dismissSetupWizard(page) }) - test('the footer reads Documentation, Reports, Features & roadmap, each with a glyph', async ({ + test('the footer reads Documentation, Store, Reports, Features & roadmap, each with a glyph', async ({ page, }) => { const footer = page.locator( @@ -81,11 +81,14 @@ test.describe('app chrome (ADR-114)', () => { // ORDER is the rule, not the numbers. This app ran Documentation at 90 // and Features & roadmap at 91, which left no room between them, so the // roadmap moved to 100 rather than Reports being squeezed in. - const seen = texts.filter((t) => /Documentation|Reports|roadmap/i.test(t)) - expect(seen.length).toBe(3) + const seen = texts.filter((t) => + /Documentation|Store|Reports|roadmap/i.test(t), + ) + expect(seen.length).toBe(4) expect(seen[0]).toMatch(/Documentation/i) - expect(seen[1]).toMatch(/Reports/i) - expect(seen[2]).toMatch(/roadmap/i) + expect(seen[1]).toMatch(/Store/i) + expect(seen[2]).toMatch(/Reports/i) + expect(seen[3]).toMatch(/roadmap/i) // A glyph on every row. ChartBoxOutline had to be added to src/icons.js // for the Reports entry; without it the row renders a blank space where @@ -166,6 +169,28 @@ test.describe('app chrome (ADR-114)', () => { ).toBeVisible({ timeout: 30_000 }) }) + test('Store opens the hosted store surface, which this app writes no backend for', async ({ + page, + }) => { + const footer = page.locator( + '[data-testid="cn-nav"] .cn-app-nav__footer-list', + ) + await footer + .getByRole('link', { name: /^Store$/ }) + .first() + .click() + + await expect(page).toHaveURL(/\/apps\/larpinq\/store(\?|$)/, { + timeout: 15_000, + }) + + // The page is declarative: openregister hosts the store plane, so this + // app ships NO store controller (ADR-080, ADR-114 Decision 4). With no + // registry configured it renders the app's own items and makes NO + // network call, so this must pass on a plain instance. + await expect(page.locator('[data-testid="cn-nav"]')).toBeVisible() + }) + test('the settings foldout carries Personal settings, Admin settings and Flows', async ({ page, }) => { From 00e1fa95a6dfc74d40510bc7f079e71647828251 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 5 Sep 2026 12:25:58 +0200 Subject: [PATCH 34/35] feat(setup): ask which example data to load, as cards, instead of a bare Run button (#683) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(setup): ask which example data to load, as cards, instead of a bare Run button The demo-data step was a Run button under a paragraph. The paragraph said the data was safe to load and safe to delete. Neither said what was about to land in the operator's register, and there was no way to say no. ## Declining was unsayable, and that reopened the wizard for ever This app implements a `skip-demo-data` action. No manifest step could reach it: the only step was the run-action that INSTALLS. So an operator who did not want example data had no way to record that, `demo-data` stayed `done: false`, and CnAppRoot reopens the wizard while any optional step is outstanding. On every fresh browser profile, over every page, until they imported data they did not want. Measured across the fleet on 2026-09-05: fifteen apps implement that action and not one declares a step that can post it. ## What the step asks now Two cards, read from the server: "None, I will set this up myself" and the dataset this app ships, with its object count. Picking one is an answer, and `none` closes both steps without importing anything. The list comes from `GET /api/setup/status` as `datasets` — the step declares `optionsSource` and carries no options of its own, so nothing in the manifest can disagree with what will actually be imported. The count is read from the descriptor file, so the card promises the number that lands. The card's description carries NO number, deliberately: the wizard translates a description by literal lookup, so an interpolated count would leave a Dutch operator reading English. The count travels as `objectCount` and the card renders it as a stat with a label the library translates. ## Compatibility `install-demo-data` still works and still means "the dataset this app ships", so a runbook or script that posts it keeps working. `skip-demo-data` now writes both keys rather than only the decision flag. ## Verification 21 PHPUnit tests pass, 9 of them new. PHPCS clean, ESLint clean, prettier clean. All 75 applicable hydra gates green. Requires @conduction/nextcloud-vue with CnChoiceCards and hydra-gates >= v1.15.0 for manifest schema 2.33.0. Co-Authored-By: Claude Opus 5 (1M context) * i18n(setup): the card step's eight strings, in all 36 required locales `l10n-parity` requires a real translation of every user-facing string in 36 locales, and it is green on `development`. Eight new strings therefore mean 288 translations rather than eight, and leaving any locale short would have turned this app from "fully supports Dutch, German, French, ..." into "falls back to English in the setup wizard" with a green pipeline. Every value is a translation attempt rather than the English wearing a locale code. The check cannot tell those apart — it only sees missing keys and empty values — so shipping identities would have made it lie about which languages this app supports, which is the exact failure its own docblock describes. Dutch, German, French, Spanish, Italian and the Nordics are solid. Maltese, Romansh, Macedonian and Belarusian are honest attempts a native speaker should correct rather than accept. Co-Authored-By: Claude Opus 5 (1M context) --------- Co-authored-by: Conduction Release Bot Co-authored-by: Claude Opus 5 (1M context) --- composer.lock | 17 ++-- l10n/be.js | 8 ++ l10n/be.json | 8 ++ l10n/bg.js | 8 ++ l10n/bg.json | 8 ++ l10n/bs.js | 8 ++ l10n/bs.json | 8 ++ l10n/ca.js | 8 ++ l10n/ca.json | 8 ++ l10n/cs.js | 8 ++ l10n/cs.json | 8 ++ l10n/da.js | 8 ++ l10n/da.json | 8 ++ l10n/de.js | 8 ++ l10n/de.json | 8 ++ l10n/el.js | 8 ++ l10n/el.json | 8 ++ l10n/en.js | 8 ++ l10n/en.json | 8 ++ l10n/es.js | 8 ++ l10n/es.json | 8 ++ l10n/et.js | 8 ++ l10n/et.json | 8 ++ l10n/fi.js | 8 ++ l10n/fi.json | 8 ++ l10n/fr.js | 8 ++ l10n/fr.json | 8 ++ l10n/ga.js | 8 ++ l10n/ga.json | 8 ++ l10n/hr.js | 8 ++ l10n/hr.json | 8 ++ l10n/hu.js | 8 ++ l10n/hu.json | 8 ++ l10n/is.js | 8 ++ l10n/is.json | 8 ++ l10n/it.js | 8 ++ l10n/it.json | 8 ++ l10n/lb.js | 8 ++ l10n/lb.json | 8 ++ l10n/lt.js | 8 ++ l10n/lt.json | 8 ++ l10n/lv.js | 8 ++ l10n/lv.json | 8 ++ l10n/mk.js | 8 ++ l10n/mk.json | 8 ++ l10n/mt.js | 8 ++ l10n/mt.json | 8 ++ l10n/nb.js | 8 ++ l10n/nb.json | 8 ++ l10n/nl.js | 8 ++ l10n/nl.json | 8 ++ l10n/pl.js | 8 ++ l10n/pl.json | 8 ++ l10n/pt.js | 8 ++ l10n/pt.json | 8 ++ l10n/rm.js | 8 ++ l10n/rm.json | 8 ++ l10n/ro.js | 8 ++ l10n/ro.json | 8 ++ l10n/ru.js | 8 ++ l10n/ru.json | 8 ++ l10n/sk.js | 8 ++ l10n/sk.json | 8 ++ l10n/sl.js | 8 ++ l10n/sl.json | 8 ++ l10n/sq.js | 8 ++ l10n/sq.json | 8 ++ l10n/sr.js | 8 ++ l10n/sr.json | 8 ++ l10n/sv.js | 8 ++ l10n/sv.json | 8 ++ l10n/tr.js | 8 ++ l10n/tr.json | 8 ++ l10n/uk.js | 8 ++ l10n/uk.json | 8 ++ lib/Controller/SetupController.php | 85 +++++++++++++++-- lib/Service/DemoDataService.php | 104 ++++++++++++++++++++- package-lock.json | 8 +- package.json | 2 +- src/manifest.json | 16 +++- tests/unit/Service/DemoDataServiceTest.php | 41 ++++++++ 81 files changed, 842 insertions(+), 23 deletions(-) diff --git a/composer.lock b/composer.lock index 7a86a537..157da46d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3996e97172bfbd2545c4da32987ea6b7", + "content-hash": "77b7ce9ccd49d64fb78fdaf21ca30436", "packages": [ { "name": "bamarni/composer-bin-plugin", @@ -889,16 +889,16 @@ }, { "name": "conduction/hydra-gates", - "version": "v1.10.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/ConductionNL/.github.git", - "reference": "d143bc27aecbb44a66c843dba89d374628bf9eef" + "reference": "0bc214023be78aac94142035a9988986cfccccbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ConductionNL/.github/zipball/d143bc27aecbb44a66c843dba89d374628bf9eef", - "reference": "d143bc27aecbb44a66c843dba89d374628bf9eef", + "url": "https://api.github.com/repos/ConductionNL/.github/zipball/0bc214023be78aac94142035a9988986cfccccbc", + "reference": "0bc214023be78aac94142035a9988986cfccccbc", "shasum": "" }, "require": { @@ -937,9 +937,9 @@ "support": { "docs": "https://github.com/ConductionNL/.github/blob/main/hydra-gates/README.md", "issues": "https://github.com/ConductionNL/.github/issues", - "source": "https://github.com/ConductionNL/.github/tree/v1.10.0" + "source": "https://github.com/ConductionNL/.github/tree/v1.15.0" }, - "time": "2026-08-27T16:18:04+00:00" + "time": "2026-09-04T16:24:04+00:00" }, { "name": "consolidation/annotated-command", @@ -8068,7 +8068,8 @@ }, "platform-dev": {}, "platform-overrides": { - "php": "8.3" + "php": "8.3", + "ext-xsl": "1" }, "plugin-api-version": "2.9.0" } diff --git a/l10n/be.js b/l10n/be.js index 4ba5dba5..912f2193 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Загрузіць прыклады даных?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Прыклады даных запаўняюць спісы, старонкі падрабязнасцей і панэлі, каб вы адразу ўбачылі праграму ў працы. На працоўнай усталёўцы абярыце \"Няма\".", + "Load the example data": "Загрузіць прыклады даных", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Загружае тое, што вы абралі. Гэта відавочна прыклады даных, дзеянне можна бяспечна паўтарыць, а потым іх можна выдаліць.", + "None, I will set this up myself": "Няма, я наладжу гэта сам", + "Nothing is imported. You start with an empty app and add your own data.": "Нічога не імпартуецца. Вы пачынаеце з пустой праграмы і дадаяце свае даныя.", + "Example data": "Прыклады даных", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Прыклады значэнняў для кожнай схемы, якую пастаўляе гэтая праграма, згенераваныя з саміх схем. Яны паказваюць спісы, старонкі падрабязнасцей і панэлі ў працы, а не расказваюць гісторыю. Бяспечна паўтараць і потым выдаліць.", "Larpinq": "Larpinq", "Dashboard": "Панэль кіравання", "Characters": "Персанажы", diff --git a/l10n/be.json b/l10n/be.json index 203c4c16..bbc167eb 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Загрузіць прыклады даных?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Прыклады даных запаўняюць спісы, старонкі падрабязнасцей і панэлі, каб вы адразу ўбачылі праграму ў працы. На працоўнай усталёўцы абярыце \"Няма\".", + "Load the example data": "Загрузіць прыклады даных", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Загружае тое, што вы абралі. Гэта відавочна прыклады даных, дзеянне можна бяспечна паўтарыць, а потым іх можна выдаліць.", + "None, I will set this up myself": "Няма, я наладжу гэта сам", + "Nothing is imported. You start with an empty app and add your own data.": "Нічога не імпартуецца. Вы пачынаеце з пустой праграмы і дадаяце свае даныя.", + "Example data": "Прыклады даных", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Прыклады значэнняў для кожнай схемы, якую пастаўляе гэтая праграма, згенераваныя з саміх схем. Яны паказваюць спісы, старонкі падрабязнасцей і панэлі ў працы, а не расказваюць гісторыю. Бяспечна паўтараць і потым выдаліць.", "Larpinq": "Larpinq", "Dashboard": "Панэль кіравання", "Characters": "Персанажы", diff --git a/l10n/bg.js b/l10n/bg.js index 1107e71c..fd340861 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Да се заредят ли примерни данни?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Примерните данни попълват списъците, страниците с подробности и таблата, за да видите приложението веднага в действие. Изберете \"Няма\" при производствена инсталация.", + "Load the example data": "Заредете примерните данни", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Зарежда това, което сте избрали. Данните са явно примерни, действието може да се повтори безопасно и след това можете да ги изтриете.", + "None, I will set this up myself": "Няма, ще настроя това сам", + "Nothing is imported. You start with an empty app and add your own data.": "Нищо не се внася. Започвате с празно приложение и добавяте собствени данни.", + "Example data": "Примерни данни", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Примерни стойности за всяка схема, която приложението предоставя, генерирани от самите схеми. Показват списъците, страниците с подробности и таблата в действие, вместо да разказват история. Безопасно за повторно изпълнение и може да се изтрие после.", "Larpinq": "Larpinq", "Dashboard": "Табло", "Characters": "Герои", diff --git a/l10n/bg.json b/l10n/bg.json index 80f0b590..32fb92ce 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Да се заредят ли примерни данни?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Примерните данни попълват списъците, страниците с подробности и таблата, за да видите приложението веднага в действие. Изберете \"Няма\" при производствена инсталация.", + "Load the example data": "Заредете примерните данни", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Зарежда това, което сте избрали. Данните са явно примерни, действието може да се повтори безопасно и след това можете да ги изтриете.", + "None, I will set this up myself": "Няма, ще настроя това сам", + "Nothing is imported. You start with an empty app and add your own data.": "Нищо не се внася. Започвате с празно приложение и добавяте собствени данни.", + "Example data": "Примерни данни", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Примерни стойности за всяка схема, която приложението предоставя, генерирани от самите схеми. Показват списъците, страниците с подробности и таблата в действие, вместо да разказват история. Безопасно за повторно изпълнение и може да се изтрие после.", "Larpinq": "Larpinq", "Dashboard": "Табло", "Characters": "Герои", diff --git a/l10n/bs.js b/l10n/bs.js index 6b556988..a7f2784e 100644 --- a/l10n/bs.js +++ b/l10n/bs.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Učitati primjere podataka?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Primjeri podataka popunjavaju liste, stranice s detaljima i kontrolne table, pa aplikaciju odmah vidite kako radi. Odaberite \"Ništa\" na produkcijskoj instalaciji.", + "Load the example data": "Učitaj primjere podataka", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Učitava ono što ste odabrali. To su očito primjeri podataka, radnja se može sigurno ponoviti, a poslije ih možete obrisati.", + "None, I will set this up myself": "Ništa, sam ću ovo postaviti", + "Nothing is imported. You start with an empty app and add your own data.": "Ništa se ne uvozi. Počinjete s praznom aplikacijom i dodajete vlastite podatke.", + "Example data": "Primjeri podataka", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Primjeri vrijednosti za svaku shemu koju ova aplikacija donosi, generisani iz samih shema. Pokazuju liste, stranice s detaljima i kontrolne table u radu umjesto da pričaju priču. Sigurno za ponavljanje i brisanje poslije.", "Larpinq": "Larpinq", "Dashboard": "Kontrolna ploča", "Characters": "Likovi", diff --git a/l10n/bs.json b/l10n/bs.json index 68cfa63a..a08db358 100644 --- a/l10n/bs.json +++ b/l10n/bs.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Učitati primjere podataka?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Primjeri podataka popunjavaju liste, stranice s detaljima i kontrolne table, pa aplikaciju odmah vidite kako radi. Odaberite \"Ništa\" na produkcijskoj instalaciji.", + "Load the example data": "Učitaj primjere podataka", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Učitava ono što ste odabrali. To su očito primjeri podataka, radnja se može sigurno ponoviti, a poslije ih možete obrisati.", + "None, I will set this up myself": "Ništa, sam ću ovo postaviti", + "Nothing is imported. You start with an empty app and add your own data.": "Ništa se ne uvozi. Počinjete s praznom aplikacijom i dodajete vlastite podatke.", + "Example data": "Primjeri podataka", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Primjeri vrijednosti za svaku shemu koju ova aplikacija donosi, generisani iz samih shema. Pokazuju liste, stranice s detaljima i kontrolne table u radu umjesto da pričaju priču. Sigurno za ponavljanje i brisanje poslije.", "Larpinq": "Larpinq", "Dashboard": "Kontrolna ploča", "Characters": "Likovi", diff --git a/l10n/ca.js b/l10n/ca.js index 5d716a44..d26b0e5c 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Voleu carregar dades d’exemple?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Les dades d’exemple omplen les llistes, les pàgines de detall i els taulers, perquè vegeu l’aplicació funcionant de seguida. Trieu \"Cap\" en una instal·lació de producció.", + "Load the example data": "Carrega les dades d’exemple", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Carrega el que heu triat. Són clarament dades d’exemple, l’operació es pot repetir sense risc i les podeu esborrar després.", + "None, I will set this up myself": "Cap, ja ho configuraré jo mateix", + "Nothing is imported. You start with an empty app and add your own data.": "No s’importa res. Comenceu amb una aplicació buida i hi afegiu les vostres dades.", + "Example data": "Dades d’exemple", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valors d’exemple per a cada esquema que aporta aquesta aplicació, generats a partir dels esquemes mateixos. Mostren les llistes, les pàgines de detall i els taulers funcionant en lloc d’explicar una història. Es pot repetir sense risc i esborrar després.", "Larpinq": "Larpinq", "Dashboard": "Tauler", "Characters": "Personatges", diff --git a/l10n/ca.json b/l10n/ca.json index 1d744e3d..56305a48 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Voleu carregar dades d’exemple?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Les dades d’exemple omplen les llistes, les pàgines de detall i els taulers, perquè vegeu l’aplicació funcionant de seguida. Trieu \"Cap\" en una instal·lació de producció.", + "Load the example data": "Carrega les dades d’exemple", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Carrega el que heu triat. Són clarament dades d’exemple, l’operació es pot repetir sense risc i les podeu esborrar després.", + "None, I will set this up myself": "Cap, ja ho configuraré jo mateix", + "Nothing is imported. You start with an empty app and add your own data.": "No s’importa res. Comenceu amb una aplicació buida i hi afegiu les vostres dades.", + "Example data": "Dades d’exemple", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valors d’exemple per a cada esquema que aporta aquesta aplicació, generats a partir dels esquemes mateixos. Mostren les llistes, les pàgines de detall i els taulers funcionant en lloc d’explicar una història. Es pot repetir sense risc i esborrar després.", "Larpinq": "Larpinq", "Dashboard": "Tauler", "Characters": "Personatges", diff --git a/l10n/cs.js b/l10n/cs.js index d0ff965c..fc07bbac 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Načíst ukázková data?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Ukázková data naplní seznamy, stránky s podrobnostmi a nástěnky, takže aplikaci uvidíte hned v provozu. Na produkční instalaci zvolte \"Žádná\".", + "Load the example data": "Načíst ukázková data", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Načte, co jste vybrali. Jsou to zjevně ukázková data, akci lze bezpečně opakovat a poté je můžete smazat.", + "None, I will set this up myself": "Žádná, nastavím si to sám", + "Nothing is imported. You start with an empty app and add your own data.": "Nic se neimportuje. Začínáte s prázdnou aplikací a přidáte vlastní data.", + "Example data": "Ukázková data", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Ukázkové hodnoty pro každé schéma, které tato aplikace přináší, vygenerované ze samotných schémat. Ukazují seznamy, stránky s podrobnostmi a nástěnky v provozu, místo aby vyprávěly příběh. Lze bezpečně opakovat a poté smazat.", "Larpinq": "Larpinq", "Dashboard": "Nástěnka", "Characters": "Postavy", diff --git a/l10n/cs.json b/l10n/cs.json index 9b600ee6..d0a457a6 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Načíst ukázková data?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Ukázková data naplní seznamy, stránky s podrobnostmi a nástěnky, takže aplikaci uvidíte hned v provozu. Na produkční instalaci zvolte \"Žádná\".", + "Load the example data": "Načíst ukázková data", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Načte, co jste vybrali. Jsou to zjevně ukázková data, akci lze bezpečně opakovat a poté je můžete smazat.", + "None, I will set this up myself": "Žádná, nastavím si to sám", + "Nothing is imported. You start with an empty app and add your own data.": "Nic se neimportuje. Začínáte s prázdnou aplikací a přidáte vlastní data.", + "Example data": "Ukázková data", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Ukázkové hodnoty pro každé schéma, které tato aplikace přináší, vygenerované ze samotných schémat. Ukazují seznamy, stránky s podrobnostmi a nástěnky v provozu, místo aby vyprávěly příběh. Lze bezpečně opakovat a poté smazat.", "Larpinq": "Larpinq", "Dashboard": "Nástěnka", "Characters": "Postavy", diff --git a/l10n/da.js b/l10n/da.js index 84c396e1..3d355eb0 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Indlæs eksempeldata?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Eksempeldata fylder lister, detaljesider og dashboards, så du med det samme ser appen virke. Vælg \"Ingen\" på en produktionsinstallation.", + "Load the example data": "Indlæs eksempeldataene", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Indlæser det, du valgte. Det er tydeligvis eksempeldata, handlingen kan gentages uden risiko, og du kan slette dem bagefter.", + "None, I will set this up myself": "Ingen, jeg sætter det op selv", + "Nothing is imported. You start with an empty app and add your own data.": "Der importeres intet. Du starter med en tom app og tilføjer dine egne data.", + "Example data": "Eksempeldata", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Eksempelværdier for hvert skema, denne app leverer, genereret ud fra skemaerne selv. De viser lister, detaljesider og dashboards i drift frem for at fortælle en historie. Kan gentages uden risiko og slettes bagefter.", "Larpinq": "Larpinq", "Dashboard": "Oversigt", "Characters": "Karakterer", diff --git a/l10n/da.json b/l10n/da.json index 4fef190f..49569e2b 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Indlæs eksempeldata?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Eksempeldata fylder lister, detaljesider og dashboards, så du med det samme ser appen virke. Vælg \"Ingen\" på en produktionsinstallation.", + "Load the example data": "Indlæs eksempeldataene", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Indlæser det, du valgte. Det er tydeligvis eksempeldata, handlingen kan gentages uden risiko, og du kan slette dem bagefter.", + "None, I will set this up myself": "Ingen, jeg sætter det op selv", + "Nothing is imported. You start with an empty app and add your own data.": "Der importeres intet. Du starter med en tom app og tilføjer dine egne data.", + "Example data": "Eksempeldata", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Eksempelværdier for hvert skema, denne app leverer, genereret ud fra skemaerne selv. De viser lister, detaljesider og dashboards i drift frem for at fortælle en historie. Kan gentages uden risiko og slettes bagefter.", "Larpinq": "Larpinq", "Dashboard": "Oversigt", "Characters": "Karakterer", diff --git a/l10n/de.js b/l10n/de.js index 5ed883e3..380b4bfb 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Beispieldaten laden?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Beispieldaten füllen die Listen, Detailseiten und Dashboards, damit Sie die App sofort in Betrieb sehen. Wählen Sie \"Keine\" bei einer Produktivinstallation.", + "Load the example data": "Die Beispieldaten laden", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Lädt, was Sie gewählt haben. Die Daten sind erkennbar Beispieldaten, der Vorgang kann mehrfach ausgeführt werden, und Sie können sie danach löschen.", + "None, I will set this up myself": "Keine, ich richte das selbst ein", + "Nothing is imported. You start with an empty app and add your own data.": "Es wird nichts importiert. Sie beginnen mit einer leeren App und fügen Ihre eigenen Daten hinzu.", + "Example data": "Beispieldaten", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Beispielwerte für jedes Schema, das diese App mitbringt, aus den Schemata selbst erzeugt. Sie zeigen die Listen, Detailseiten und Dashboards in Betrieb, statt eine Geschichte zu erzählen. Mehrfach ausführbar, und Sie können sie danach löschen.", "Larpinq": "Larpinq", "Dashboard": "Dashboard", "Characters": "Charaktere", diff --git a/l10n/de.json b/l10n/de.json index 312ccb89..b96c040c 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Beispieldaten laden?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Beispieldaten füllen die Listen, Detailseiten und Dashboards, damit Sie die App sofort in Betrieb sehen. Wählen Sie \"Keine\" bei einer Produktivinstallation.", + "Load the example data": "Die Beispieldaten laden", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Lädt, was Sie gewählt haben. Die Daten sind erkennbar Beispieldaten, der Vorgang kann mehrfach ausgeführt werden, und Sie können sie danach löschen.", + "None, I will set this up myself": "Keine, ich richte das selbst ein", + "Nothing is imported. You start with an empty app and add your own data.": "Es wird nichts importiert. Sie beginnen mit einer leeren App und fügen Ihre eigenen Daten hinzu.", + "Example data": "Beispieldaten", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Beispielwerte für jedes Schema, das diese App mitbringt, aus den Schemata selbst erzeugt. Sie zeigen die Listen, Detailseiten und Dashboards in Betrieb, statt eine Geschichte zu erzählen. Mehrfach ausführbar, und Sie können sie danach löschen.", "Larpinq": "Larpinq", "Dashboard": "Dashboard", "Characters": "Charaktere", diff --git a/l10n/el.js b/l10n/el.js index b60b6034..42d1d55e 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Να φορτωθούν δεδομένα παραδείγματος;", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Τα δεδομένα παραδείγματος γεμίζουν τις λίστες, τις σελίδες λεπτομερειών και τους πίνακες, ώστε να δείτε αμέσως την εφαρμογή να λειτουργεί. Επιλέξτε \"Κανένα\" σε εγκατάσταση παραγωγής.", + "Load the example data": "Φόρτωση των δεδομένων παραδείγματος", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Φορτώνει ό,τι επιλέξατε. Είναι εμφανώς δεδομένα παραδείγματος, η ενέργεια επαναλαμβάνεται με ασφάλεια και μπορείτε να τα διαγράψετε μετά.", + "None, I will set this up myself": "Κανένα, θα το ρυθμίσω μόνος μου", + "Nothing is imported. You start with an empty app and add your own data.": "Δεν εισάγεται τίποτα. Ξεκινάτε με μια κενή εφαρμογή και προσθέτετε τα δικά σας δεδομένα.", + "Example data": "Δεδομένα παραδείγματος", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Τιμές παραδείγματος για κάθε σχήμα που παρέχει αυτή η εφαρμογή, παραγμένες από τα ίδια τα σχήματα. Δείχνουν τις λίστες, τις σελίδες λεπτομερειών και τους πίνακες σε λειτουργία αντί να αφηγούνται μια ιστορία. Ασφαλής επανάληψη και διαγραφή μετά.", "Larpinq": "Larpinq", "Dashboard": "Πίνακας ελέγχου", "Characters": "Χαρακτήρες", diff --git a/l10n/el.json b/l10n/el.json index 1d97a6b3..94044bbb 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Να φορτωθούν δεδομένα παραδείγματος;", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Τα δεδομένα παραδείγματος γεμίζουν τις λίστες, τις σελίδες λεπτομερειών και τους πίνακες, ώστε να δείτε αμέσως την εφαρμογή να λειτουργεί. Επιλέξτε \"Κανένα\" σε εγκατάσταση παραγωγής.", + "Load the example data": "Φόρτωση των δεδομένων παραδείγματος", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Φορτώνει ό,τι επιλέξατε. Είναι εμφανώς δεδομένα παραδείγματος, η ενέργεια επαναλαμβάνεται με ασφάλεια και μπορείτε να τα διαγράψετε μετά.", + "None, I will set this up myself": "Κανένα, θα το ρυθμίσω μόνος μου", + "Nothing is imported. You start with an empty app and add your own data.": "Δεν εισάγεται τίποτα. Ξεκινάτε με μια κενή εφαρμογή και προσθέτετε τα δικά σας δεδομένα.", + "Example data": "Δεδομένα παραδείγματος", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Τιμές παραδείγματος για κάθε σχήμα που παρέχει αυτή η εφαρμογή, παραγμένες από τα ίδια τα σχήματα. Δείχνουν τις λίστες, τις σελίδες λεπτομερειών και τους πίνακες σε λειτουργία αντί να αφηγούνται μια ιστορία. Ασφαλής επανάληψη και διαγραφή μετά.", "Larpinq": "Larpinq", "Dashboard": "Πίνακας ελέγχου", "Characters": "Χαρακτήρες", diff --git a/l10n/en.js b/l10n/en.js index 01fbacd5..68db1882 100644 --- a/l10n/en.js +++ b/l10n/en.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Load example data?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.", + "Load the example data": "Load the example data", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.", + "None, I will set this up myself": "None, I will set this up myself", + "Nothing is imported. You start with an empty app and add your own data.": "Nothing is imported. You start with an empty app and add your own data.", + "Example data": "Example data", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.", "(score ≥ {n})": "(score ≥ {n})", "Abilities": "Abilities", "Ability": "Ability", diff --git a/l10n/en.json b/l10n/en.json index 64726122..c57931b5 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Load example data?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.", + "Load the example data": "Load the example data", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.", + "None, I will set this up myself": "None, I will set this up myself", + "Nothing is imported. You start with an empty app and add your own data.": "Nothing is imported. You start with an empty app and add your own data.", + "Example data": "Example data", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.", "(score ≥ {n})": "(score ≥ {n})", "Abilities": "Abilities", "Ability": "Ability", diff --git a/l10n/es.js b/l10n/es.js index 7bb885b8..2c8c1bca 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "¿Cargar datos de ejemplo?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Los datos de ejemplo llenan las listas, las páginas de detalle y los paneles, para que veas la aplicación funcionando de inmediato. Elige \"Ninguno\" en una instalación de producción.", + "Load the example data": "Cargar los datos de ejemplo", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Carga lo que elegiste. Son datos de ejemplo evidentes, se puede ejecutar más de una vez sin riesgo y puedes borrarlos después.", + "None, I will set this up myself": "Ninguno, lo configuro yo mismo", + "Nothing is imported. You start with an empty app and add your own data.": "No se importa nada. Empiezas con una aplicación vacía y añades tus propios datos.", + "Example data": "Datos de ejemplo", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valores de ejemplo para cada esquema que aporta esta aplicación, generados a partir de los propios esquemas. Muestran las listas, las páginas de detalle y los paneles en funcionamiento en lugar de contar una historia. Se puede repetir sin riesgo y borrar después.", "Larpinq": "Larpinq", "Dashboard": "Panel de control", "Characters": "Personajes", diff --git a/l10n/es.json b/l10n/es.json index 428453fd..9b249417 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "¿Cargar datos de ejemplo?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Los datos de ejemplo llenan las listas, las páginas de detalle y los paneles, para que veas la aplicación funcionando de inmediato. Elige \"Ninguno\" en una instalación de producción.", + "Load the example data": "Cargar los datos de ejemplo", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Carga lo que elegiste. Son datos de ejemplo evidentes, se puede ejecutar más de una vez sin riesgo y puedes borrarlos después.", + "None, I will set this up myself": "Ninguno, lo configuro yo mismo", + "Nothing is imported. You start with an empty app and add your own data.": "No se importa nada. Empiezas con una aplicación vacía y añades tus propios datos.", + "Example data": "Datos de ejemplo", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valores de ejemplo para cada esquema que aporta esta aplicación, generados a partir de los propios esquemas. Muestran las listas, las páginas de detalle y los paneles en funcionamiento en lugar de contar una historia. Se puede repetir sin riesgo y borrar después.", "Larpinq": "Larpinq", "Dashboard": "Panel de control", "Characters": "Personajes", diff --git a/l10n/et.js b/l10n/et.js index 54962ba1..5f5dcd6a 100644 --- a/l10n/et.js +++ b/l10n/et.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Kas laadida näidisandmed?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Näidisandmed täidavad loendid, detailvaated ja töölauad, nii et näete rakendust kohe töötamas. Tootmispaigalduses valige \"Puudub\".", + "Load the example data": "Laadi näidisandmed", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Laadib selle, mille valisite. Need on selgelt näidisandmed, toimingut võib ohutult korrata ja hiljem saab need kustutada.", + "None, I will set this up myself": "Puudub, seadistan ise", + "Nothing is imported. You start with an empty app and add your own data.": "Midagi ei impordita. Alustate tühja rakendusega ja lisate oma andmed.", + "Example data": "Näidisandmed", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Näidisväärtused iga skeemi kohta, mille see rakendus kaasa toob, loodud skeemide endi põhjal. Need näitavad loendeid, detailvaateid ja töölaudu töös, mitte ei jutusta lugu. Ohutu korrata ja hiljem kustutada.", "Larpinq": "Larpinq", "Dashboard": "Töölaud", "Characters": "Tegelased", diff --git a/l10n/et.json b/l10n/et.json index c3053406..8ada41ef 100644 --- a/l10n/et.json +++ b/l10n/et.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Kas laadida näidisandmed?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Näidisandmed täidavad loendid, detailvaated ja töölauad, nii et näete rakendust kohe töötamas. Tootmispaigalduses valige \"Puudub\".", + "Load the example data": "Laadi näidisandmed", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Laadib selle, mille valisite. Need on selgelt näidisandmed, toimingut võib ohutult korrata ja hiljem saab need kustutada.", + "None, I will set this up myself": "Puudub, seadistan ise", + "Nothing is imported. You start with an empty app and add your own data.": "Midagi ei impordita. Alustate tühja rakendusega ja lisate oma andmed.", + "Example data": "Näidisandmed", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Näidisväärtused iga skeemi kohta, mille see rakendus kaasa toob, loodud skeemide endi põhjal. Need näitavad loendeid, detailvaateid ja töölaudu töös, mitte ei jutusta lugu. Ohutu korrata ja hiljem kustutada.", "Larpinq": "Larpinq", "Dashboard": "Töölaud", "Characters": "Tegelased", diff --git a/l10n/fi.js b/l10n/fi.js index 866c56dc..1b5dc1e9 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Ladataanko esimerkkitiedot?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Esimerkkitiedot täyttävät luettelot, tietosivut ja koontinäytöt, joten näet sovelluksen heti toiminnassa. Valitse tuotantoasennuksessa \"Ei mitään\".", + "Load the example data": "Lataa esimerkkitiedot", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Lataa sen, minkä valitsit. Tiedot ovat selvästi esimerkkitietoja, toiminnon voi toistaa turvallisesti ja ne voi poistaa jälkeenpäin.", + "None, I will set this up myself": "Ei mitään, teen asetukset itse", + "Nothing is imported. You start with an empty app and add your own data.": "Mitään ei tuoda. Aloitat tyhjästä sovelluksesta ja lisäät omat tietosi.", + "Example data": "Esimerkkitiedot", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Esimerkkiarvot jokaiselle skeemalle, jonka tämä sovellus tuo mukanaan, luotuina skeemoista itsestään. Ne näyttävät luettelot, tietosivut ja koontinäytöt toiminnassa sen sijaan että kertoisivat tarinan. Turvallista toistaa ja poistaa jälkeenpäin.", "Larpinq": "Larpinq", "Dashboard": "Kojelauta", "Characters": "Hahmot", diff --git a/l10n/fi.json b/l10n/fi.json index a766cf94..6ce9a400 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Ladataanko esimerkkitiedot?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Esimerkkitiedot täyttävät luettelot, tietosivut ja koontinäytöt, joten näet sovelluksen heti toiminnassa. Valitse tuotantoasennuksessa \"Ei mitään\".", + "Load the example data": "Lataa esimerkkitiedot", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Lataa sen, minkä valitsit. Tiedot ovat selvästi esimerkkitietoja, toiminnon voi toistaa turvallisesti ja ne voi poistaa jälkeenpäin.", + "None, I will set this up myself": "Ei mitään, teen asetukset itse", + "Nothing is imported. You start with an empty app and add your own data.": "Mitään ei tuoda. Aloitat tyhjästä sovelluksesta ja lisäät omat tietosi.", + "Example data": "Esimerkkitiedot", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Esimerkkiarvot jokaiselle skeemalle, jonka tämä sovellus tuo mukanaan, luotuina skeemoista itsestään. Ne näyttävät luettelot, tietosivut ja koontinäytöt toiminnassa sen sijaan että kertoisivat tarinan. Turvallista toistaa ja poistaa jälkeenpäin.", "Larpinq": "Larpinq", "Dashboard": "Kojelauta", "Characters": "Hahmot", diff --git a/l10n/fr.js b/l10n/fr.js index b8641629..925457f9 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Charger des données d’exemple ?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Les données d’exemple remplissent les listes, les pages de détail et les tableaux de bord, pour voir l’application fonctionner tout de suite. Choisissez \"Aucune\" sur une installation de production.", + "Load the example data": "Charger les données d’exemple", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Charge ce que vous avez choisi. Ce sont visiblement des données d’exemple, l’opération peut être relancée sans risque, et vous pouvez les supprimer ensuite.", + "None, I will set this up myself": "Aucune, je configure moi-même", + "Nothing is imported. You start with an empty app and add your own data.": "Rien n’est importé. Vous commencez avec une application vide et ajoutez vos propres données.", + "Example data": "Données d’exemple", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Des valeurs d’exemple pour chaque schéma fourni par cette application, générées à partir des schémas eux-mêmes. Elles montrent les listes, les pages de détail et les tableaux de bord en fonctionnement plutôt que de raconter une histoire. Relançable sans risque, et supprimable ensuite.", "Larpinq": "Larpinq", "Dashboard": "Tableau de bord", "Characters": "Personnages", diff --git a/l10n/fr.json b/l10n/fr.json index e1901844..fa1d224f 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Charger des données d’exemple ?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Les données d’exemple remplissent les listes, les pages de détail et les tableaux de bord, pour voir l’application fonctionner tout de suite. Choisissez \"Aucune\" sur une installation de production.", + "Load the example data": "Charger les données d’exemple", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Charge ce que vous avez choisi. Ce sont visiblement des données d’exemple, l’opération peut être relancée sans risque, et vous pouvez les supprimer ensuite.", + "None, I will set this up myself": "Aucune, je configure moi-même", + "Nothing is imported. You start with an empty app and add your own data.": "Rien n’est importé. Vous commencez avec une application vide et ajoutez vos propres données.", + "Example data": "Données d’exemple", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Des valeurs d’exemple pour chaque schéma fourni par cette application, générées à partir des schémas eux-mêmes. Elles montrent les listes, les pages de détail et les tableaux de bord en fonctionnement plutôt que de raconter une histoire. Relançable sans risque, et supprimable ensuite.", "Larpinq": "Larpinq", "Dashboard": "Tableau de bord", "Characters": "Personnages", diff --git a/l10n/ga.js b/l10n/ga.js index f1cb1764..ba3752d5 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Luchtaigh sonraí samplacha?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Líonann sonraí samplacha na liostaí, na leathanaigh mhionsonraí agus na deais, ionas go bhfeicfidh tú an aip ag obair láithreach. Roghnaigh \"Ceann ar bith\" ar shuiteáil táirgthe.", + "Load the example data": "Luchtaigh na sonraí samplacha", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Luchtaíonn sé an rud a roghnaigh tú. Is sonraí samplacha go soiléir iad, is féidir é a rith níos mó ná uair amháin gan bhaol, agus is féidir leat iad a scriosadh ina dhiaidh.", + "None, I will set this up myself": "Ceann ar bith, cuirfidh mé féin é seo ar bun", + "Nothing is imported. You start with an empty app and add your own data.": "Ní iompórtáiltear aon rud. Tosaíonn tú le haip fholamh agus cuireann tú do shonraí féin leis.", + "Example data": "Sonraí samplacha", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Luachanna samplacha do gach scéimre a sholáthraíonn an aip seo, ginte ó na scéimrí féin. Taispeánann siad na liostaí, na leathanaigh mhionsonraí agus na deais ag obair seachas scéal a insint. Sábháilte le rith arís agus is féidir é a scriosadh ina dhiaidh.", "Larpinq": "Larpinq", "Dashboard": "Deais", "Characters": "Carachtair", diff --git a/l10n/ga.json b/l10n/ga.json index fa69293e..5a97e366 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Luchtaigh sonraí samplacha?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Líonann sonraí samplacha na liostaí, na leathanaigh mhionsonraí agus na deais, ionas go bhfeicfidh tú an aip ag obair láithreach. Roghnaigh \"Ceann ar bith\" ar shuiteáil táirgthe.", + "Load the example data": "Luchtaigh na sonraí samplacha", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Luchtaíonn sé an rud a roghnaigh tú. Is sonraí samplacha go soiléir iad, is féidir é a rith níos mó ná uair amháin gan bhaol, agus is féidir leat iad a scriosadh ina dhiaidh.", + "None, I will set this up myself": "Ceann ar bith, cuirfidh mé féin é seo ar bun", + "Nothing is imported. You start with an empty app and add your own data.": "Ní iompórtáiltear aon rud. Tosaíonn tú le haip fholamh agus cuireann tú do shonraí féin leis.", + "Example data": "Sonraí samplacha", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Luachanna samplacha do gach scéimre a sholáthraíonn an aip seo, ginte ó na scéimrí féin. Taispeánann siad na liostaí, na leathanaigh mhionsonraí agus na deais ag obair seachas scéal a insint. Sábháilte le rith arís agus is féidir é a scriosadh ina dhiaidh.", "Larpinq": "Larpinq", "Dashboard": "Deais", "Characters": "Carachtair", diff --git a/l10n/hr.js b/l10n/hr.js index a675172b..73eee3d5 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Učitati primjere podataka?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Primjeri podataka popunjavaju popise, stranice s detaljima i nadzorne ploče, pa aplikaciju odmah vidite kako radi. Odaberite \"Nema\" na produkcijskoj instalaciji.", + "Load the example data": "Učitaj primjere podataka", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Učitava ono što ste odabrali. Podaci su očito primjeri, radnja se može ponoviti bez rizika, a poslije ih možete izbrisati.", + "None, I will set this up myself": "Nema, sam ću ovo postaviti", + "Nothing is imported. You start with an empty app and add your own data.": "Ništa se ne uvozi. Počinjete s praznom aplikacijom i dodajete vlastite podatke.", + "Example data": "Primjeri podataka", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Primjeri vrijednosti za svaku shemu koju aplikacija donosi, generirani iz samih shema. Pokazuju popise, stranice s detaljima i nadzorne ploče u radu umjesto da pričaju priču. Sigurno za ponavljanje i moguće je izbrisati poslije.", "Larpinq": "Larpinq", "Dashboard": "Nadzorna ploča", "Characters": "Likovi", diff --git a/l10n/hr.json b/l10n/hr.json index 7f7de9f6..e35549ae 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Učitati primjere podataka?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Primjeri podataka popunjavaju popise, stranice s detaljima i nadzorne ploče, pa aplikaciju odmah vidite kako radi. Odaberite \"Nema\" na produkcijskoj instalaciji.", + "Load the example data": "Učitaj primjere podataka", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Učitava ono što ste odabrali. Podaci su očito primjeri, radnja se može ponoviti bez rizika, a poslije ih možete izbrisati.", + "None, I will set this up myself": "Nema, sam ću ovo postaviti", + "Nothing is imported. You start with an empty app and add your own data.": "Ništa se ne uvozi. Počinjete s praznom aplikacijom i dodajete vlastite podatke.", + "Example data": "Primjeri podataka", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Primjeri vrijednosti za svaku shemu koju aplikacija donosi, generirani iz samih shema. Pokazuju popise, stranice s detaljima i nadzorne ploče u radu umjesto da pričaju priču. Sigurno za ponavljanje i moguće je izbrisati poslije.", "Larpinq": "Larpinq", "Dashboard": "Nadzorna ploča", "Characters": "Likovi", diff --git a/l10n/hu.js b/l10n/hu.js index 8b45cb18..0326bd04 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Betöltsük a mintaadatokat?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "A mintaadatok feltöltik a listákat, a részletoldalakat és az irányítópultokat, így azonnal működés közben látja az alkalmazást. Éles telepítésen válassza a \"Nincs\" lehetőséget.", + "Load the example data": "Mintaadatok betöltése", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Betölti, amit választott. Ezek nyilvánvalóan mintaadatok, a művelet biztonságosan megismételhető, és utána törölheti őket.", + "None, I will set this up myself": "Nincs, magam állítom be", + "Nothing is imported. You start with an empty app and add your own data.": "Semmi nem kerül importálásra. Üres alkalmazással kezd, és a saját adatait adja hozzá.", + "Example data": "Mintaadatok", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Mintaértékek minden sémához, amelyet ez az alkalmazás hoz magával, magukból a sémákból generálva. Működés közben mutatják a listákat, a részletoldalakat és az irányítópultokat, ahelyett hogy történetet mesélnének. Biztonságosan ismételhető és utána törölhető.", "Larpinq": "Larpinq", "Dashboard": "Irányítópult", "Characters": "Karakterek", diff --git a/l10n/hu.json b/l10n/hu.json index 9b4b78c8..6475783d 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Betöltsük a mintaadatokat?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "A mintaadatok feltöltik a listákat, a részletoldalakat és az irányítópultokat, így azonnal működés közben látja az alkalmazást. Éles telepítésen válassza a \"Nincs\" lehetőséget.", + "Load the example data": "Mintaadatok betöltése", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Betölti, amit választott. Ezek nyilvánvalóan mintaadatok, a művelet biztonságosan megismételhető, és utána törölheti őket.", + "None, I will set this up myself": "Nincs, magam állítom be", + "Nothing is imported. You start with an empty app and add your own data.": "Semmi nem kerül importálásra. Üres alkalmazással kezd, és a saját adatait adja hozzá.", + "Example data": "Mintaadatok", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Mintaértékek minden sémához, amelyet ez az alkalmazás hoz magával, magukból a sémákból generálva. Működés közben mutatják a listákat, a részletoldalakat és az irányítópultokat, ahelyett hogy történetet mesélnének. Biztonságosan ismételhető és utána törölhető.", "Larpinq": "Larpinq", "Dashboard": "Irányítópult", "Characters": "Karakterek", diff --git a/l10n/is.js b/l10n/is.js index 57f26a93..95d2595d 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Hlaða inn sýnigögnum?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Sýnigögn fylla listana, upplýsingasíðurnar og mælaborðin, svo þú sérð forritið virka strax. Veldu \"Engin\" á framleiðsluuppsetningu.", + "Load the example data": "Hlaða inn sýnigögnunum", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Hleður því sem þú valdir. Þetta eru augljóslega sýnigögn, óhætt er að keyra oftar en einu sinni og þú getur eytt þeim á eftir.", + "None, I will set this up myself": "Engin, ég set þetta upp sjálf", + "Nothing is imported. You start with an empty app and add your own data.": "Ekkert er flutt inn. Þú byrjar með tómt forrit og bætir við þínum eigin gögnum.", + "Example data": "Sýnigögn", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Sýnigildi fyrir hvert skema sem þetta forrit færir með sér, búin til úr skemunum sjálfum. Þau sýna listana, upplýsingasíðurnar og mælaborðin í notkun frekar en að segja sögu. Óhætt að endurtaka og eyða á eftir.", "Larpinq": "Larpinq", "Dashboard": "Stjórnborð", "Characters": "Persónur", diff --git a/l10n/is.json b/l10n/is.json index 5501fff3..ac39c0da 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Hlaða inn sýnigögnum?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Sýnigögn fylla listana, upplýsingasíðurnar og mælaborðin, svo þú sérð forritið virka strax. Veldu \"Engin\" á framleiðsluuppsetningu.", + "Load the example data": "Hlaða inn sýnigögnunum", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Hleður því sem þú valdir. Þetta eru augljóslega sýnigögn, óhætt er að keyra oftar en einu sinni og þú getur eytt þeim á eftir.", + "None, I will set this up myself": "Engin, ég set þetta upp sjálf", + "Nothing is imported. You start with an empty app and add your own data.": "Ekkert er flutt inn. Þú byrjar með tómt forrit og bætir við þínum eigin gögnum.", + "Example data": "Sýnigögn", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Sýnigildi fyrir hvert skema sem þetta forrit færir með sér, búin til úr skemunum sjálfum. Þau sýna listana, upplýsingasíðurnar og mælaborðin í notkun frekar en að segja sögu. Óhætt að endurtaka og eyða á eftir.", "Larpinq": "Larpinq", "Dashboard": "Stjórnborð", "Characters": "Persónur", diff --git a/l10n/it.js b/l10n/it.js index 021c0096..81614375 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Caricare dati di esempio?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "I dati di esempio riempiono elenchi, pagine di dettaglio e dashboard, così vedi subito l’app in funzione. Scegli \"Nessuno\" su un’installazione di produzione.", + "Load the example data": "Carica i dati di esempio", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Carica quello che hai scelto. Sono chiaramente dati di esempio, l’operazione si può ripetere senza rischi e puoi eliminarli in seguito.", + "None, I will set this up myself": "Nessuno, lo configuro da solo", + "Nothing is imported. You start with an empty app and add your own data.": "Non viene importato nulla. Parti da un’app vuota e aggiungi i tuoi dati.", + "Example data": "Dati di esempio", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valori di esempio per ogni schema fornito da questa app, generati dagli schemi stessi. Mostrano elenchi, pagine di dettaglio e dashboard in funzione invece di raccontare una storia. Ripetibile senza rischi ed eliminabile in seguito.", "Larpinq": "Larpinq", "Dashboard": "Dashboard", "Characters": "Personaggi", diff --git a/l10n/it.json b/l10n/it.json index 4d38b4cc..6d82206f 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Caricare dati di esempio?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "I dati di esempio riempiono elenchi, pagine di dettaglio e dashboard, così vedi subito l’app in funzione. Scegli \"Nessuno\" su un’installazione di produzione.", + "Load the example data": "Carica i dati di esempio", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Carica quello che hai scelto. Sono chiaramente dati di esempio, l’operazione si può ripetere senza rischi e puoi eliminarli in seguito.", + "None, I will set this up myself": "Nessuno, lo configuro da solo", + "Nothing is imported. You start with an empty app and add your own data.": "Non viene importato nulla. Parti da un’app vuota e aggiungi i tuoi dati.", + "Example data": "Dati di esempio", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valori di esempio per ogni schema fornito da questa app, generati dagli schemi stessi. Mostrano elenchi, pagine di dettaglio e dashboard in funzione invece di raccontare una storia. Ripetibile senza rischi ed eliminabile in seguito.", "Larpinq": "Larpinq", "Dashboard": "Dashboard", "Characters": "Personaggi", diff --git a/l10n/lb.js b/l10n/lb.js index e94aade2..31f77715 100644 --- a/l10n/lb.js +++ b/l10n/lb.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Beispilldate lueden?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Beispilldate fëllen d’Lëschten, d’Detailsäiten an d’Dashboards, sou datt Dir d’App direkt am Betrib gesitt. Wielt \"Keng\" bei enger Produktiounsinstallatioun.", + "Load the example data": "D’Beispilldate lueden", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Lued dat, wat Dir gewielt hutt. Et sinn offensichtlech Beispilldaten, den Uwëssen kann ouni Risiko widderholl ginn, an Dir kënnt se duerno läschen.", + "None, I will set this up myself": "Keng, ech riichten dat selwer an", + "Nothing is imported. You start with an empty app and add your own data.": "Et gëtt näischt importéiert. Dir fänkt mat enger eidler App un a füügt Är eege Date bäi.", + "Example data": "Beispilldaten", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Beispillwäerter fir all Schema, deen dës App matbréngt, aus de Schemae selwer generéiert. Si weisen d’Lëschten, d’Detailsäiten an d’Dashboards am Betrib, amplaz eng Geschicht ze erzielen. Ouni Risiko ze widderhuelen an duerno ze läschen.", "Larpinq": "Larpinq", "Dashboard": "Iwwersiicht", "Characters": "Personnagen", diff --git a/l10n/lb.json b/l10n/lb.json index f83797f6..9187514b 100644 --- a/l10n/lb.json +++ b/l10n/lb.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Beispilldate lueden?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Beispilldate fëllen d’Lëschten, d’Detailsäiten an d’Dashboards, sou datt Dir d’App direkt am Betrib gesitt. Wielt \"Keng\" bei enger Produktiounsinstallatioun.", + "Load the example data": "D’Beispilldate lueden", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Lued dat, wat Dir gewielt hutt. Et sinn offensichtlech Beispilldaten, den Uwëssen kann ouni Risiko widderholl ginn, an Dir kënnt se duerno läschen.", + "None, I will set this up myself": "Keng, ech riichten dat selwer an", + "Nothing is imported. You start with an empty app and add your own data.": "Et gëtt näischt importéiert. Dir fänkt mat enger eidler App un a füügt Är eege Date bäi.", + "Example data": "Beispilldaten", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Beispillwäerter fir all Schema, deen dës App matbréngt, aus de Schemae selwer generéiert. Si weisen d’Lëschten, d’Detailsäiten an d’Dashboards am Betrib, amplaz eng Geschicht ze erzielen. Ouni Risiko ze widderhuelen an duerno ze läschen.", "Larpinq": "Larpinq", "Dashboard": "Iwwersiicht", "Characters": "Personnagen", diff --git a/l10n/lt.js b/l10n/lt.js index cf707c60..bef92031 100644 --- a/l10n/lt.js +++ b/l10n/lt.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Ar įkelti pavyzdinius duomenis?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Pavyzdiniai duomenys užpildo sąrašus, detalių puslapius ir skydelius, todėl programėlę iškart pamatysite veikiančią. Gamybinėje diegtyje pasirinkite \"Nėra\".", + "Load the example data": "Įkelti pavyzdinius duomenis", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Įkelia tai, ką pasirinkote. Tai akivaizdžiai pavyzdiniai duomenys, veiksmą galima saugiai kartoti, o vėliau juos galima ištrinti.", + "None, I will set this up myself": "Nėra, susitvarkysiu pats", + "Nothing is imported. You start with an empty app and add your own data.": "Niekas neimportuojama. Pradedate nuo tuščios programėlės ir pridedate savo duomenis.", + "Example data": "Pavyzdiniai duomenys", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Pavyzdinės reikšmės kiekvienai schemai, kurią pateikia ši programėlė, sugeneruotos iš pačių schemų. Jos rodo sąrašus, detalių puslapius ir skydelius veikiant, o ne pasakoja istoriją. Saugu kartoti ir vėliau ištrinti.", "Larpinq": "Larpinq", "Dashboard": "Skydelis", "Characters": "Personažai", diff --git a/l10n/lt.json b/l10n/lt.json index e51ce00e..c3031723 100644 --- a/l10n/lt.json +++ b/l10n/lt.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Ar įkelti pavyzdinius duomenis?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Pavyzdiniai duomenys užpildo sąrašus, detalių puslapius ir skydelius, todėl programėlę iškart pamatysite veikiančią. Gamybinėje diegtyje pasirinkite \"Nėra\".", + "Load the example data": "Įkelti pavyzdinius duomenis", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Įkelia tai, ką pasirinkote. Tai akivaizdžiai pavyzdiniai duomenys, veiksmą galima saugiai kartoti, o vėliau juos galima ištrinti.", + "None, I will set this up myself": "Nėra, susitvarkysiu pats", + "Nothing is imported. You start with an empty app and add your own data.": "Niekas neimportuojama. Pradedate nuo tuščios programėlės ir pridedate savo duomenis.", + "Example data": "Pavyzdiniai duomenys", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Pavyzdinės reikšmės kiekvienai schemai, kurią pateikia ši programėlė, sugeneruotos iš pačių schemų. Jos rodo sąrašus, detalių puslapius ir skydelius veikiant, o ne pasakoja istoriją. Saugu kartoti ir vėliau ištrinti.", "Larpinq": "Larpinq", "Dashboard": "Skydelis", "Characters": "Personažai", diff --git a/l10n/lv.js b/l10n/lv.js index c352000d..70d73604 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Vai ielādēt paraugdatus?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Paraugdati aizpilda sarakstus, detalizētās lapas un informācijas paneļus, tāpēc lietotni uzreiz redzēsiet darbībā. Ražošanas instalācijā izvēlieties \"Nav\".", + "Load the example data": "Ielādēt paraugdatus", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Ielādē to, ko izvēlējāties. Tie ir acīmredzami paraugdati, darbību var droši atkārtot, un pēc tam tos var dzēst.", + "None, I will set this up myself": "Nav, iestatīšu pats", + "Nothing is imported. You start with an empty app and add your own data.": "Nekas netiek importēts. Sākat ar tukšu lietotni un pievienojat savus datus.", + "Example data": "Paraugdati", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Paraugvērtības katrai shēmai, ko šī lietotne piegādā, ģenerētas no pašām shēmām. Tās parāda sarakstus, detalizētās lapas un informācijas paneļus darbībā, nevis stāsta stāstu. Droši atkārtojams un pēc tam dzēšams.", "Larpinq": "Larpinq", "Dashboard": "Informācijas panelis", "Characters": "Tēli", diff --git a/l10n/lv.json b/l10n/lv.json index c1db431c..01acc4cb 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Vai ielādēt paraugdatus?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Paraugdati aizpilda sarakstus, detalizētās lapas un informācijas paneļus, tāpēc lietotni uzreiz redzēsiet darbībā. Ražošanas instalācijā izvēlieties \"Nav\".", + "Load the example data": "Ielādēt paraugdatus", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Ielādē to, ko izvēlējāties. Tie ir acīmredzami paraugdati, darbību var droši atkārtot, un pēc tam tos var dzēst.", + "None, I will set this up myself": "Nav, iestatīšu pats", + "Nothing is imported. You start with an empty app and add your own data.": "Nekas netiek importēts. Sākat ar tukšu lietotni un pievienojat savus datus.", + "Example data": "Paraugdati", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Paraugvērtības katrai shēmai, ko šī lietotne piegādā, ģenerētas no pašām shēmām. Tās parāda sarakstus, detalizētās lapas un informācijas paneļus darbībā, nevis stāsta stāstu. Droši atkārtojams un pēc tam dzēšams.", "Larpinq": "Larpinq", "Dashboard": "Informācijas panelis", "Characters": "Tēli", diff --git a/l10n/mk.js b/l10n/mk.js index 63e97c1f..c0f957c3 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Да се вчитаат примероци од податоци?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Примероците од податоци ги полнат списоците, страниците со детали и таблите, за да ја видите апликацијата како работи веднаш. Изберете \"Ништо\" на продукциска инсталација.", + "Load the example data": "Вчитај ги примероците од податоци", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Го вчитува тоа што го избравте. Тоа се очигледно примероци од податоци, дејството може безбедно да се повтори, а потоа можете да ги избришете.", + "None, I will set this up myself": "Ништо, сам ќе го поставам ова", + "Nothing is imported. You start with an empty app and add your own data.": "Ништо не се увезува. Почнувате со празна апликација и додавате свои податоци.", + "Example data": "Примероци од податоци", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Примерни вредности за секоја шема што ја носи оваа апликација, генерирани од самите шеми. Ги покажуваат списоците, страниците со детали и таблите во работа наместо да раскажуваат приказна. Безбедно за повторување и бришење потоа.", "Larpinq": "Larpinq", "Dashboard": "Контролна табла", "Characters": "Ликови", diff --git a/l10n/mk.json b/l10n/mk.json index 247af85c..af0ef797 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Да се вчитаат примероци од податоци?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Примероците од податоци ги полнат списоците, страниците со детали и таблите, за да ја видите апликацијата како работи веднаш. Изберете \"Ништо\" на продукциска инсталација.", + "Load the example data": "Вчитај ги примероците од податоци", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Го вчитува тоа што го избравте. Тоа се очигледно примероци од податоци, дејството може безбедно да се повтори, а потоа можете да ги избришете.", + "None, I will set this up myself": "Ништо, сам ќе го поставам ова", + "Nothing is imported. You start with an empty app and add your own data.": "Ништо не се увезува. Почнувате со празна апликација и додавате свои податоци.", + "Example data": "Примероци од податоци", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Примерни вредности за секоја шема што ја носи оваа апликација, генерирани од самите шеми. Ги покажуваат списоците, страниците со детали и таблите во работа наместо да раскажуваат приказна. Безбедно за повторување и бришење потоа.", "Larpinq": "Larpinq", "Dashboard": "Контролна табла", "Characters": "Ликови", diff --git a/l10n/mt.js b/l10n/mt.js index 129ee796..94092993 100644 --- a/l10n/mt.js +++ b/l10n/mt.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Ittella’ dejta ta’ eżempju?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Id-dejta ta’ eżempju timla l-listi, il-paġni tad-dettalji u d-dashboards, biex tara l-app taħdem mill-ewwel. Agħżel \"Xejn\" fuq installazzjoni tal-produzzjoni.", + "Load the example data": "Tella’ d-dejta ta’ eżempju", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Ittella’ dak li għażilt. Din hija b’mod ċar dejta ta’ eżempju, l-azzjoni tista’ terġa’ ssir bla periklu, u tista’ tħassarha wara.", + "None, I will set this up myself": "Xejn, se nissettja dan jien stess", + "Nothing is imported. You start with an empty app and add your own data.": "Ma jiġi impurtat xejn. Tibda b’app vojta u żżid id-dejta tiegħek.", + "Example data": "Dejta ta’ eżempju", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valuri ta’ eżempju għal kull skema li tipprovdi din l-app, iġġenerati mill-iskemi nfushom. Juru l-listi, il-paġni tad-dettalji u d-dashboards jaħdmu minflok jirrakkontaw storja. Bla periklu li terġa’ ssir u tista’ titħassar wara.", "Larpinq": "Larpinq", "Dashboard": "Dashboard", "Characters": "Karattri", diff --git a/l10n/mt.json b/l10n/mt.json index d1c198fe..5da46900 100644 --- a/l10n/mt.json +++ b/l10n/mt.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Ittella’ dejta ta’ eżempju?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Id-dejta ta’ eżempju timla l-listi, il-paġni tad-dettalji u d-dashboards, biex tara l-app taħdem mill-ewwel. Agħżel \"Xejn\" fuq installazzjoni tal-produzzjoni.", + "Load the example data": "Tella’ d-dejta ta’ eżempju", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Ittella’ dak li għażilt. Din hija b’mod ċar dejta ta’ eżempju, l-azzjoni tista’ terġa’ ssir bla periklu, u tista’ tħassarha wara.", + "None, I will set this up myself": "Xejn, se nissettja dan jien stess", + "Nothing is imported. You start with an empty app and add your own data.": "Ma jiġi impurtat xejn. Tibda b’app vojta u żżid id-dejta tiegħek.", + "Example data": "Dejta ta’ eżempju", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valuri ta’ eżempju għal kull skema li tipprovdi din l-app, iġġenerati mill-iskemi nfushom. Juru l-listi, il-paġni tad-dettalji u d-dashboards jaħdmu minflok jirrakkontaw storja. Bla periklu li terġa’ ssir u tista’ titħassar wara.", "Larpinq": "Larpinq", "Dashboard": "Dashboard", "Characters": "Karattri", diff --git a/l10n/nb.js b/l10n/nb.js index 6adc4c5f..14b084ed 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Laste inn eksempeldata?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Eksempeldata fyller listene, detaljsidene og dashbordene, så du ser appen virke med en gang. Velg \"Ingen\" på en produksjonsinstallasjon.", + "Load the example data": "Last inn eksempeldataene", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Laster inn det du valgte. Dette er tydelig eksempeldata, handlingen kan gjentas uten risiko, og du kan slette dem etterpå.", + "None, I will set this up myself": "Ingen, jeg setter det opp selv", + "Nothing is imported. You start with an empty app and add your own data.": "Ingenting importeres. Du starter med en tom app og legger til dine egne data.", + "Example data": "Eksempeldata", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Eksempelverdier for hvert skjema denne appen leverer, generert fra skjemaene selv. De viser listene, detaljsidene og dashbordene i drift i stedet for å fortelle en historie. Kan gjentas uten risiko og slettes etterpå.", "Larpinq": "Larpinq", "Dashboard": "Oversikt", "Characters": "Karakterer", diff --git a/l10n/nb.json b/l10n/nb.json index 4d6c324c..27676e0b 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Laste inn eksempeldata?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Eksempeldata fyller listene, detaljsidene og dashbordene, så du ser appen virke med en gang. Velg \"Ingen\" på en produksjonsinstallasjon.", + "Load the example data": "Last inn eksempeldataene", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Laster inn det du valgte. Dette er tydelig eksempeldata, handlingen kan gjentas uten risiko, og du kan slette dem etterpå.", + "None, I will set this up myself": "Ingen, jeg setter det opp selv", + "Nothing is imported. You start with an empty app and add your own data.": "Ingenting importeres. Du starter med en tom app og legger til dine egne data.", + "Example data": "Eksempeldata", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Eksempelverdier for hvert skjema denne appen leverer, generert fra skjemaene selv. De viser listene, detaljsidene og dashbordene i drift i stedet for å fortelle en historie. Kan gjentas uten risiko og slettes etterpå.", "Larpinq": "Larpinq", "Dashboard": "Oversikt", "Characters": "Karakterer", diff --git a/l10n/nl.js b/l10n/nl.js index a42ec077..bca0e29b 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Voorbeeldgegevens laden?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Voorbeeldgegevens vullen de lijsten, detailpagina’s en dashboards, zodat je de app meteen ziet werken. Kies \"Geen\" op een productieomgeving.", + "Load the example data": "Laad de voorbeeldgegevens", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Laadt wat je koos. De gegevens zijn herkenbaar voorbeeldgegevens, je kunt dit meer dan een keer uitvoeren en je kunt ze daarna verwijderen.", + "None, I will set this up myself": "Geen, ik richt dit zelf in", + "Nothing is imported. You start with an empty app and add your own data.": "Er wordt niets geïmporteerd. Je begint met een lege app en voegt zelf gegevens toe.", + "Example data": "Voorbeeldgegevens", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Voorbeeldwaarden voor elk schema dat deze app levert, gegenereerd uit de schema’s zelf. Het laat de lijsten, detailpagina’s en dashboards werkend zien in plaats van een verhaal te vertellen. Veilig om vaker uit te voeren, en je kunt het daarna verwijderen.", "(score ≥ {n})": "(score ≥ {n})", "Abilities": "Vaardigheden", "Ability": "Vaardigheid", diff --git a/l10n/nl.json b/l10n/nl.json index ac712b54..db378d11 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Voorbeeldgegevens laden?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Voorbeeldgegevens vullen de lijsten, detailpagina’s en dashboards, zodat je de app meteen ziet werken. Kies \"Geen\" op een productieomgeving.", + "Load the example data": "Laad de voorbeeldgegevens", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Laadt wat je koos. De gegevens zijn herkenbaar voorbeeldgegevens, je kunt dit meer dan een keer uitvoeren en je kunt ze daarna verwijderen.", + "None, I will set this up myself": "Geen, ik richt dit zelf in", + "Nothing is imported. You start with an empty app and add your own data.": "Er wordt niets geïmporteerd. Je begint met een lege app en voegt zelf gegevens toe.", + "Example data": "Voorbeeldgegevens", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Voorbeeldwaarden voor elk schema dat deze app levert, gegenereerd uit de schema’s zelf. Het laat de lijsten, detailpagina’s en dashboards werkend zien in plaats van een verhaal te vertellen. Veilig om vaker uit te voeren, en je kunt het daarna verwijderen.", "(score ≥ {n})": "(score ≥ {n})", "Abilities": "Vaardigheden", "Ability": "Vaardigheid", diff --git a/l10n/pl.js b/l10n/pl.js index dc332c34..80bb789a 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Wczytać dane przykładowe?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Dane przykładowe wypełniają listy, strony szczegółów i pulpity, więc od razu zobaczysz działającą aplikację. Na instalacji produkcyjnej wybierz \"Brak\".", + "Load the example data": "Wczytaj dane przykładowe", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Wczytuje to, co wybrano. To wyraźnie dane przykładowe, operację można bezpiecznie powtórzyć, a potem je usunąć.", + "None, I will set this up myself": "Brak, skonfiguruję to sam", + "Nothing is imported. You start with an empty app and add your own data.": "Nic nie jest importowane. Zaczynasz od pustej aplikacji i dodajesz własne dane.", + "Example data": "Dane przykładowe", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Wartości przykładowe dla każdego schematu dostarczanego przez tę aplikację, wygenerowane z samych schematów. Pokazują listy, strony szczegółów i pulpity w działaniu, zamiast opowiadać historię. Można bezpiecznie powtórzyć i usunąć później.", "Larpinq": "Larpinq", "Dashboard": "Pulpit", "Characters": "Postacie", diff --git a/l10n/pl.json b/l10n/pl.json index 507f15de..172b05be 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Wczytać dane przykładowe?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Dane przykładowe wypełniają listy, strony szczegółów i pulpity, więc od razu zobaczysz działającą aplikację. Na instalacji produkcyjnej wybierz \"Brak\".", + "Load the example data": "Wczytaj dane przykładowe", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Wczytuje to, co wybrano. To wyraźnie dane przykładowe, operację można bezpiecznie powtórzyć, a potem je usunąć.", + "None, I will set this up myself": "Brak, skonfiguruję to sam", + "Nothing is imported. You start with an empty app and add your own data.": "Nic nie jest importowane. Zaczynasz od pustej aplikacji i dodajesz własne dane.", + "Example data": "Dane przykładowe", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Wartości przykładowe dla każdego schematu dostarczanego przez tę aplikację, wygenerowane z samych schematów. Pokazują listy, strony szczegółów i pulpity w działaniu, zamiast opowiadać historię. Można bezpiecznie powtórzyć i usunąć później.", "Larpinq": "Larpinq", "Dashboard": "Pulpit", "Characters": "Postacie", diff --git a/l10n/pt.js b/l10n/pt.js index e15724b5..5ae097e3 100644 --- a/l10n/pt.js +++ b/l10n/pt.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Carregar dados de exemplo?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Os dados de exemplo preenchem as listas, as páginas de detalhe e os painéis, para ver a aplicação a funcionar de imediato. Escolha \"Nenhum\" numa instalação de produção.", + "Load the example data": "Carregar os dados de exemplo", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Carrega o que escolheu. São claramente dados de exemplo, a operação pode repetir-se sem risco e pode apagá-los depois.", + "None, I will set this up myself": "Nenhum, eu próprio configuro isto", + "Nothing is imported. You start with an empty app and add your own data.": "Nada é importado. Começa com uma aplicação vazia e acrescenta os seus próprios dados.", + "Example data": "Dados de exemplo", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valores de exemplo para cada esquema que esta aplicação fornece, gerados a partir dos próprios esquemas. Mostram as listas, as páginas de detalhe e os painéis a funcionar em vez de contarem uma história. Repetível sem risco e apagável depois.", "Larpinq": "Larpinq", "Dashboard": "Painel", "Characters": "Personagens", diff --git a/l10n/pt.json b/l10n/pt.json index 84258b5f..1c9acfef 100644 --- a/l10n/pt.json +++ b/l10n/pt.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Carregar dados de exemplo?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Os dados de exemplo preenchem as listas, as páginas de detalhe e os painéis, para ver a aplicação a funcionar de imediato. Escolha \"Nenhum\" numa instalação de produção.", + "Load the example data": "Carregar os dados de exemplo", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Carrega o que escolheu. São claramente dados de exemplo, a operação pode repetir-se sem risco e pode apagá-los depois.", + "None, I will set this up myself": "Nenhum, eu próprio configuro isto", + "Nothing is imported. You start with an empty app and add your own data.": "Nada é importado. Começa com uma aplicação vazia e acrescenta os seus próprios dados.", + "Example data": "Dados de exemplo", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valores de exemplo para cada esquema que esta aplicação fornece, gerados a partir dos próprios esquemas. Mostram as listas, as páginas de detalhe e os painéis a funcionar em vez de contarem uma história. Repetível sem risco e apagável depois.", "Larpinq": "Larpinq", "Dashboard": "Painel", "Characters": "Personagens", diff --git a/l10n/rm.js b/l10n/rm.js index 14f48549..360481de 100644 --- a/l10n/rm.js +++ b/l10n/rm.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Chargiar datas d’exempel?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Las datas d’exempel emplenischan las glistas, las paginas da detagls e las tablas da controlla, uschè che ti vesas immediatamain l’applicaziun funcziunar. Tscherna \"Nagina\" sin ina installaziun da producziun.", + "Load the example data": "Chargiar las datas d’exempel", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Chargia quai che ti has tschernì. Igl èn cleramain datas d’exempel, l’acziun po vegnir repetida senza ristg e ti pos las stizzar suenter.", + "None, I will set this up myself": "Nagina, jau fatsch quai sez", + "Nothing is imported. You start with an empty app and add your own data.": "Nagut vegn importà. Ti cumenzas cun ina applicaziun vida ed agiunthas tias atgnas datas.", + "Example data": "Datas d’exempel", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valurs d’exempel per mintga schema che questa applicaziun porta cun sai, generadas dals schemas sezs. Ellas mussan las glistas, las paginas da detagls e las tablas da controlla en funcziun enstagl da raquintar ina istorgia. Repetibla senza ristg e stizzabla suenter.", "Larpinq": "Larpinq", "Dashboard": "Tabla da controlla", "Characters": "Persunajs", diff --git a/l10n/rm.json b/l10n/rm.json index e739f8fe..8309ba66 100644 --- a/l10n/rm.json +++ b/l10n/rm.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Chargiar datas d’exempel?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Las datas d’exempel emplenischan las glistas, las paginas da detagls e las tablas da controlla, uschè che ti vesas immediatamain l’applicaziun funcziunar. Tscherna \"Nagina\" sin ina installaziun da producziun.", + "Load the example data": "Chargiar las datas d’exempel", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Chargia quai che ti has tschernì. Igl èn cleramain datas d’exempel, l’acziun po vegnir repetida senza ristg e ti pos las stizzar suenter.", + "None, I will set this up myself": "Nagina, jau fatsch quai sez", + "Nothing is imported. You start with an empty app and add your own data.": "Nagut vegn importà. Ti cumenzas cun ina applicaziun vida ed agiunthas tias atgnas datas.", + "Example data": "Datas d’exempel", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valurs d’exempel per mintga schema che questa applicaziun porta cun sai, generadas dals schemas sezs. Ellas mussan las glistas, las paginas da detagls e las tablas da controlla en funcziun enstagl da raquintar ina istorgia. Repetibla senza ristg e stizzabla suenter.", "Larpinq": "Larpinq", "Dashboard": "Tabla da controlla", "Characters": "Persunajs", diff --git a/l10n/ro.js b/l10n/ro.js index f833eb01..97293bd7 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Se încarcă datele de exemplu?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Datele de exemplu umplu listele, paginile de detaliu și tablourile de bord, ca să vedeți imediat aplicația funcționând. Alegeți \"Niciunul\" pe o instalare de producție.", + "Load the example data": "Încarcă datele de exemplu", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Încarcă ceea ce ați ales. Sunt vizibil date de exemplu, operațiunea se poate repeta fără risc, iar apoi le puteți șterge.", + "None, I will set this up myself": "Niciunul, configurez singur", + "Nothing is imported. You start with an empty app and add your own data.": "Nu se importă nimic. Începeți cu o aplicație goală și adăugați propriile date.", + "Example data": "Date de exemplu", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valori de exemplu pentru fiecare schemă pe care o aduce această aplicație, generate din schemele înseși. Arată listele, paginile de detaliu și tablourile de bord în funcțiune, în loc să spună o poveste. Se poate repeta fără risc și șterge apoi.", "Larpinq": "Larpinq", "Dashboard": "Tablou de bord", "Characters": "Personaje", diff --git a/l10n/ro.json b/l10n/ro.json index ce08d094..7d850327 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Se încarcă datele de exemplu?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Datele de exemplu umplu listele, paginile de detaliu și tablourile de bord, ca să vedeți imediat aplicația funcționând. Alegeți \"Niciunul\" pe o instalare de producție.", + "Load the example data": "Încarcă datele de exemplu", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Încarcă ceea ce ați ales. Sunt vizibil date de exemplu, operațiunea se poate repeta fără risc, iar apoi le puteți șterge.", + "None, I will set this up myself": "Niciunul, configurez singur", + "Nothing is imported. You start with an empty app and add your own data.": "Nu se importă nimic. Începeți cu o aplicație goală și adăugați propriile date.", + "Example data": "Date de exemplu", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Valori de exemplu pentru fiecare schemă pe care o aduce această aplicație, generate din schemele înseși. Arată listele, paginile de detaliu și tablourile de bord în funcțiune, în loc să spună o poveste. Se poate repeta fără risc și șterge apoi.", "Larpinq": "Larpinq", "Dashboard": "Tablou de bord", "Characters": "Personaje", diff --git a/l10n/ru.js b/l10n/ru.js index 1f073176..35de8f8f 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Загрузить примеры данных?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Примеры данных заполняют списки, страницы подробностей и панели, чтобы вы сразу увидели приложение в работе. На рабочей установке выберите \"Нет\".", + "Load the example data": "Загрузить примеры данных", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Загружает то, что вы выбрали. Это явно примеры данных, действие можно безопасно повторить, а потом их можно удалить.", + "None, I will set this up myself": "Нет, я настрою это сам", + "Nothing is imported. You start with an empty app and add your own data.": "Ничего не импортируется. Вы начинаете с пустого приложения и добавляете свои данные.", + "Example data": "Примеры данных", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Примеры значений для каждой схемы, которую поставляет это приложение, созданные из самих схем. Они показывают списки, страницы подробностей и панели в работе, а не рассказывают историю. Безопасно повторять и потом удалить.", "Larpinq": "Larpinq", "Dashboard": "Панель управления", "Characters": "Персонажи", diff --git a/l10n/ru.json b/l10n/ru.json index 84045db5..6719c9ac 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Загрузить примеры данных?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Примеры данных заполняют списки, страницы подробностей и панели, чтобы вы сразу увидели приложение в работе. На рабочей установке выберите \"Нет\".", + "Load the example data": "Загрузить примеры данных", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Загружает то, что вы выбрали. Это явно примеры данных, действие можно безопасно повторить, а потом их можно удалить.", + "None, I will set this up myself": "Нет, я настрою это сам", + "Nothing is imported. You start with an empty app and add your own data.": "Ничего не импортируется. Вы начинаете с пустого приложения и добавляете свои данные.", + "Example data": "Примеры данных", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Примеры значений для каждой схемы, которую поставляет это приложение, созданные из самих схем. Они показывают списки, страницы подробностей и панели в работе, а не рассказывают историю. Безопасно повторять и потом удалить.", "Larpinq": "Larpinq", "Dashboard": "Панель управления", "Characters": "Персонажи", diff --git a/l10n/sk.js b/l10n/sk.js index f7274fe3..1528604e 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Načítať ukážkové údaje?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Ukážkové údaje naplnia zoznamy, stránky s podrobnosťami a nástenky, takže aplikáciu uvidíte hneď v prevádzke. Na produkčnej inštalácii zvoľte \"Žiadne\".", + "Load the example data": "Načítať ukážkové údaje", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Načíta to, čo ste vybrali. Sú to zjavne ukážkové údaje, akciu možno bezpečne zopakovať a potom ich môžete zmazať.", + "None, I will set this up myself": "Žiadne, nastavím si to sám", + "Nothing is imported. You start with an empty app and add your own data.": "Nič sa neimportuje. Začínate s prázdnou aplikáciou a pridáte vlastné údaje.", + "Example data": "Ukážkové údaje", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Ukážkové hodnoty pre každú schému, ktorú táto aplikácia prináša, vygenerované zo samotných schém. Ukazujú zoznamy, stránky s podrobnosťami a nástenky v prevádzke namiesto rozprávania príbehu. Možno bezpečne zopakovať a potom zmazať.", "Larpinq": "Larpinq", "Dashboard": "Nástenka", "Characters": "Postavy", diff --git a/l10n/sk.json b/l10n/sk.json index 2fd88463..b84598c0 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Načítať ukážkové údaje?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Ukážkové údaje naplnia zoznamy, stránky s podrobnosťami a nástenky, takže aplikáciu uvidíte hneď v prevádzke. Na produkčnej inštalácii zvoľte \"Žiadne\".", + "Load the example data": "Načítať ukážkové údaje", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Načíta to, čo ste vybrali. Sú to zjavne ukážkové údaje, akciu možno bezpečne zopakovať a potom ich môžete zmazať.", + "None, I will set this up myself": "Žiadne, nastavím si to sám", + "Nothing is imported. You start with an empty app and add your own data.": "Nič sa neimportuje. Začínate s prázdnou aplikáciou a pridáte vlastné údaje.", + "Example data": "Ukážkové údaje", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Ukážkové hodnoty pre každú schému, ktorú táto aplikácia prináša, vygenerované zo samotných schém. Ukazujú zoznamy, stránky s podrobnosťami a nástenky v prevádzke namiesto rozprávania príbehu. Možno bezpečne zopakovať a potom zmazať.", "Larpinq": "Larpinq", "Dashboard": "Nástenka", "Characters": "Postavy", diff --git a/l10n/sl.js b/l10n/sl.js index 8f0da4cf..4b19a6ce 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Naložim vzorčne podatke?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Vzorčni podatki napolnijo sezname, strani s podrobnostmi in nadzorne plošče, tako da aplikacijo takoj vidite delovati. Pri produkcijski namestitvi izberite \"Brez\".", + "Load the example data": "Naloži vzorčne podatke", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Naloži tisto, kar ste izbrali. To so očitno vzorčni podatki, dejanje je varno ponoviti, pozneje pa jih lahko izbrišete.", + "None, I will set this up myself": "Brez, to bom nastavil sam", + "Nothing is imported. You start with an empty app and add your own data.": "Nič se ne uvozi. Začnete s prazno aplikacijo in dodate svoje podatke.", + "Example data": "Vzorčni podatki", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Vzorčne vrednosti za vsako shemo, ki jo prinaša ta aplikacija, ustvarjene iz shem samih. Prikazujejo sezname, strani s podrobnostmi in nadzorne plošče v delovanju, namesto da bi pripovedovale zgodbo. Varno je ponoviti in pozneje izbrisati.", "Larpinq": "Larpinq", "Dashboard": "Nadzorna plošča", "Characters": "Liki", diff --git a/l10n/sl.json b/l10n/sl.json index 2f2345b7..bee331ec 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Naložim vzorčne podatke?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Vzorčni podatki napolnijo sezname, strani s podrobnostmi in nadzorne plošče, tako da aplikacijo takoj vidite delovati. Pri produkcijski namestitvi izberite \"Brez\".", + "Load the example data": "Naloži vzorčne podatke", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Naloži tisto, kar ste izbrali. To so očitno vzorčni podatki, dejanje je varno ponoviti, pozneje pa jih lahko izbrišete.", + "None, I will set this up myself": "Brez, to bom nastavil sam", + "Nothing is imported. You start with an empty app and add your own data.": "Nič se ne uvozi. Začnete s prazno aplikacijo in dodate svoje podatke.", + "Example data": "Vzorčni podatki", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Vzorčne vrednosti za vsako shemo, ki jo prinaša ta aplikacija, ustvarjene iz shem samih. Prikazujejo sezname, strani s podrobnostmi in nadzorne plošče v delovanju, namesto da bi pripovedovale zgodbo. Varno je ponoviti in pozneje izbrisati.", "Larpinq": "Larpinq", "Dashboard": "Nadzorna plošča", "Characters": "Liki", diff --git a/l10n/sq.js b/l10n/sq.js index bbfb176d..8838bad4 100644 --- a/l10n/sq.js +++ b/l10n/sq.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Të ngarkohen të dhëna shembull?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Të dhënat shembull mbushin listat, faqet e detajeve dhe panelet, që ta shihni aplikacionin duke punuar menjëherë. Zgjidhni \"Asnjë\" në një instalim prodhimi.", + "Load the example data": "Ngarko të dhënat shembull", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Ngarkon atë që zgjodhët. Janë qartësisht të dhëna shembull, veprimi mund të përsëritet pa rrezik dhe mund t’i fshini më pas.", + "None, I will set this up myself": "Asnjë, do ta konfiguroj vetë", + "Nothing is imported. You start with an empty app and add your own data.": "Nuk importohet asgjë. Filloni me një aplikacion bosh dhe shtoni të dhënat tuaja.", + "Example data": "Të dhëna shembull", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Vlera shembull për çdo skemë që sjell ky aplikacion, të gjeneruara nga vetë skemat. Tregojnë listat, faqet e detajeve dhe panelet në punë, në vend që të tregojnë një histori. Të përsëritshme pa rrezik dhe të fshishme më pas.", "Larpinq": "Larpinq", "Dashboard": "Paneli", "Characters": "Personazhet", diff --git a/l10n/sq.json b/l10n/sq.json index 5c25ffa7..d58df67b 100644 --- a/l10n/sq.json +++ b/l10n/sq.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Të ngarkohen të dhëna shembull?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Të dhënat shembull mbushin listat, faqet e detajeve dhe panelet, që ta shihni aplikacionin duke punuar menjëherë. Zgjidhni \"Asnjë\" në një instalim prodhimi.", + "Load the example data": "Ngarko të dhënat shembull", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Ngarkon atë që zgjodhët. Janë qartësisht të dhëna shembull, veprimi mund të përsëritet pa rrezik dhe mund t’i fshini më pas.", + "None, I will set this up myself": "Asnjë, do ta konfiguroj vetë", + "Nothing is imported. You start with an empty app and add your own data.": "Nuk importohet asgjë. Filloni me një aplikacion bosh dhe shtoni të dhënat tuaja.", + "Example data": "Të dhëna shembull", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Vlera shembull për çdo skemë që sjell ky aplikacion, të gjeneruara nga vetë skemat. Tregojnë listat, faqet e detajeve dhe panelet në punë, në vend që të tregojnë një histori. Të përsëritshme pa rrezik dhe të fshishme më pas.", "Larpinq": "Larpinq", "Dashboard": "Paneli", "Characters": "Personazhet", diff --git a/l10n/sr.js b/l10n/sr.js index 0fb3564a..703e03ef 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Учитати примере података?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Примери података попуњавају листе, странице са детаљима и командне табле, па апликацију одмах видите како ради. Изаберите \"Ништа\" на продукцијској инсталацији.", + "Load the example data": "Учитај примере података", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Учитава оно што сте изабрали. То су очигледно примери података, радња се може безбедно поновити, а после их можете обрисати.", + "None, I will set this up myself": "Ништа, сам ћу ово подесити", + "Nothing is imported. You start with an empty app and add your own data.": "Ништа се не увози. Почињете са празном апликацијом и додајете сопствене податке.", + "Example data": "Примери података", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Примери вредности за сваку шему коју ова апликација доноси, генерисани из самих шема. Показују листе, странице са детаљима и командне табле у раду уместо да причају причу. Безбедно за понављање и брисање после.", "Larpinq": "Larpinq", "Dashboard": "Контролна табла", "Characters": "Ликови", diff --git a/l10n/sr.json b/l10n/sr.json index e68b6101..0fe01a64 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Учитати примере података?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Примери података попуњавају листе, странице са детаљима и командне табле, па апликацију одмах видите како ради. Изаберите \"Ништа\" на продукцијској инсталацији.", + "Load the example data": "Учитај примере података", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Учитава оно што сте изабрали. То су очигледно примери података, радња се може безбедно поновити, а после их можете обрисати.", + "None, I will set this up myself": "Ништа, сам ћу ово подесити", + "Nothing is imported. You start with an empty app and add your own data.": "Ништа се не увози. Почињете са празном апликацијом и додајете сопствене податке.", + "Example data": "Примери података", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Примери вредности за сваку шему коју ова апликација доноси, генерисани из самих шема. Показују листе, странице са детаљима и командне табле у раду уместо да причају причу. Безбедно за понављање и брисање после.", "Larpinq": "Larpinq", "Dashboard": "Контролна табла", "Characters": "Ликови", diff --git a/l10n/sv.js b/l10n/sv.js index 4eb65f70..4086f650 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Läsa in exempeldata?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Exempeldata fyller listor, detaljsidor och instrumentpaneler, så att du direkt ser appen fungera. Välj \"Inga\" vid en produktionsinstallation.", + "Load the example data": "Läs in exempeldata", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Läser in det du valde. Det är tydligt exempeldata, åtgärden kan upprepas utan risk och du kan ta bort dem efteråt.", + "None, I will set this up myself": "Inga, jag ställer in det själv", + "Nothing is imported. You start with an empty app and add your own data.": "Ingenting importeras. Du börjar med en tom app och lägger till dina egna data.", + "Example data": "Exempeldata", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Exempelvärden för varje schema som appen levererar, genererade ur schemana själva. De visar listor, detaljsidor och instrumentpaneler i drift i stället för att berätta en historia. Kan upprepas utan risk och tas bort efteråt.", "Larpinq": "Larpinq", "Dashboard": "Översikt", "Characters": "Karaktärer", diff --git a/l10n/sv.json b/l10n/sv.json index faa0e1d9..d0aa89a2 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Läsa in exempeldata?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Exempeldata fyller listor, detaljsidor och instrumentpaneler, så att du direkt ser appen fungera. Välj \"Inga\" vid en produktionsinstallation.", + "Load the example data": "Läs in exempeldata", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Läser in det du valde. Det är tydligt exempeldata, åtgärden kan upprepas utan risk och du kan ta bort dem efteråt.", + "None, I will set this up myself": "Inga, jag ställer in det själv", + "Nothing is imported. You start with an empty app and add your own data.": "Ingenting importeras. Du börjar med en tom app och lägger till dina egna data.", + "Example data": "Exempeldata", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Exempelvärden för varje schema som appen levererar, genererade ur schemana själva. De visar listor, detaljsidor och instrumentpaneler i drift i stället för att berätta en historia. Kan upprepas utan risk och tas bort efteråt.", "Larpinq": "Larpinq", "Dashboard": "Översikt", "Characters": "Karaktärer", diff --git a/l10n/tr.js b/l10n/tr.js index 97b0aa27..960ca159 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Örnek veriler yüklensin mi?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Örnek veriler listeleri, ayrıntı sayfalarını ve panoları doldurur; böylece uygulamayı hemen çalışırken görürsünüz. Üretim kurulumunda \"Hiçbiri\" seçin.", + "Load the example data": "Örnek verileri yükle", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Seçtiğinizi yükler. Bunlar açıkça örnek verilerdir, işlem birden çok kez güvenle çalıştırılabilir ve sonrasında silebilirsiniz.", + "None, I will set this up myself": "Hiçbiri, bunu kendim kuracağım", + "Nothing is imported. You start with an empty app and add your own data.": "Hiçbir şey içe aktarılmaz. Boş bir uygulamayla başlar ve kendi verilerinizi eklersiniz.", + "Example data": "Örnek veriler", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Bu uygulamanın getirdiği her şema için, şemaların kendisinden üretilmiş örnek değerler. Bir hikâye anlatmak yerine listeleri, ayrıntı sayfalarını ve panoları çalışırken gösterir. Güvenle tekrarlanabilir ve sonrasında silinebilir.", "Larpinq": "Larpinq", "Dashboard": "Kontrol paneli", "Characters": "Karakterler", diff --git a/l10n/tr.json b/l10n/tr.json index 0cbc57f5..f1a7bc1a 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Örnek veriler yüklensin mi?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Örnek veriler listeleri, ayrıntı sayfalarını ve panoları doldurur; böylece uygulamayı hemen çalışırken görürsünüz. Üretim kurulumunda \"Hiçbiri\" seçin.", + "Load the example data": "Örnek verileri yükle", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Seçtiğinizi yükler. Bunlar açıkça örnek verilerdir, işlem birden çok kez güvenle çalıştırılabilir ve sonrasında silebilirsiniz.", + "None, I will set this up myself": "Hiçbiri, bunu kendim kuracağım", + "Nothing is imported. You start with an empty app and add your own data.": "Hiçbir şey içe aktarılmaz. Boş bir uygulamayla başlar ve kendi verilerinizi eklersiniz.", + "Example data": "Örnek veriler", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Bu uygulamanın getirdiği her şema için, şemaların kendisinden üretilmiş örnek değerler. Bir hikâye anlatmak yerine listeleri, ayrıntı sayfalarını ve panoları çalışırken gösterir. Güvenle tekrarlanabilir ve sonrasında silinebilir.", "Larpinq": "Larpinq", "Dashboard": "Kontrol paneli", "Characters": "Karakterler", diff --git a/l10n/uk.js b/l10n/uk.js index 8a750ccc..2e3d6892 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -1,6 +1,14 @@ OC.L10N.register( "larpinq", { + "Load example data?": "Завантажити приклади даних?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Приклади даних заповнюють списки, сторінки деталей і панелі, тож ви одразу побачите застосунок у роботі. На робочій інсталяції оберіть \"Немає\".", + "Load the example data": "Завантажити приклади даних", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Завантажує те, що ви обрали. Це очевидно приклади даних, дію можна безпечно повторити, а потім їх можна видалити.", + "None, I will set this up myself": "Немає, я налаштую це сам", + "Nothing is imported. You start with an empty app and add your own data.": "Нічого не імпортується. Ви починаєте з порожнього застосунку і додаєте власні дані.", + "Example data": "Приклади даних", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Приклади значень для кожної схеми, яку постачає цей застосунок, згенеровані з самих схем. Вони показують списки, сторінки деталей і панелі в роботі, а не розповідають історію. Безпечно повторювати і потім видалити.", "Larpinq": "Larpinq", "Dashboard": "Інформаційна панель", "Characters": "Персонажі", diff --git a/l10n/uk.json b/l10n/uk.json index 6459c350..a2886e74 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Завантажити приклади даних?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Приклади даних заповнюють списки, сторінки деталей і панелі, тож ви одразу побачите застосунок у роботі. На робочій інсталяції оберіть \"Немає\".", + "Load the example data": "Завантажити приклади даних", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Завантажує те, що ви обрали. Це очевидно приклади даних, дію можна безпечно повторити, а потім їх можна видалити.", + "None, I will set this up myself": "Немає, я налаштую це сам", + "Nothing is imported. You start with an empty app and add your own data.": "Нічого не імпортується. Ви починаєте з порожнього застосунку і додаєте власні дані.", + "Example data": "Приклади даних", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Приклади значень для кожної схеми, яку постачає цей застосунок, згенеровані з самих схем. Вони показують списки, сторінки деталей і панелі в роботі, а не розповідають історію. Безпечно повторювати і потім видалити.", "Larpinq": "Larpinq", "Dashboard": "Інформаційна панель", "Characters": "Персонажі", diff --git a/lib/Controller/SetupController.php b/lib/Controller/SetupController.php index 86626f02..ee728304 100644 --- a/lib/Controller/SetupController.php +++ b/lib/Controller/SetupController.php @@ -71,6 +71,19 @@ class SetupController extends Controller { */ private const DEMO_DATA_DECIDED_KEY = 'demo_data_decided'; + /** + * App-config key holding the dataset the operator picked. + * + * The wizard's `choice` step writes it through `POST /api/setup/config`, and + * the `run-action` step that follows reads it back. Two steps rather than + * one because `CnSetupWizard::runAction()` posts to + * `/api/setup/action/{action}` with no body: an action cannot carry the + * answer, so the answer has to be stored before the action runs. + * + * @var string + */ + private const DATASET_KEY = 'demo_dataset'; + /** * Representative schema config key proving the schemas resolved, not just * the register id. SettingsLoadService writes `_schema` for @@ -136,13 +149,23 @@ public function status(): DataResponse { // data has finished the step; re-offering it every visit would make // "no thanks" impossible to express. $demoDecided = ($this->appConfig->getValueString(Application::APP_ID, self::DEMO_DATA_DECIDED_KEY, '') !== ''); + $pickedDataset = $this->appConfig->getValueString(Application::APP_ID, self::DATASET_KEY, ''); return new DataResponse( [ 'version' => self::SETUP_VERSION, 'completed' => $completed, + // The choice step reads its options from here: it declares + // `optionsSource: datasets` and no options of its own, so a + // dataset missing from this list is a dataset nobody can pick. + 'datasets' => $this->demoDataService->listChoices(), 'steps' => [ - 'demo-data' => ['done' => $demoDecided], + 'demo-data' => ['done' => ($pickedDataset !== '')], + // "None" is an ANSWER, so the load step is finished the + // moment it is chosen: there is nothing left to run. + 'load-demo-data' => [ + 'done' => ($demoDecided === true || $pickedDataset === DemoDataService::NONE_DATASET), + ], 'welcome' => ['done' => true], 'provision' => ['done' => $provisionDone], 'done' => ['done' => $completed], @@ -165,6 +188,25 @@ public function status(): DataResponse { */ #[AuthorizedAdminSetting(LarpinqAdmin::class)] public function saveConfig(): DataResponse { + // 🔴 THE DATASET IS VALIDATED BEFORE IT IS STORED. Everything else here + // is written as posted, because a `config-fields` step declares its own + // keys and this endpoint cannot know them. The dataset is different: + // the load step reads it back and hands it to the importer, so an + // unknown value would surface a step later as a failed import with no + // clue why. + $dataset = $this->request->getParam(self::DATASET_KEY); + if ($dataset !== null) { + $named = 'that'; + if (is_scalar($dataset) === true) { + $named = (string)$dataset; + } + + $known = array_column($this->demoDataService->listChoices(), 'id'); + if (in_array($named, $known, true) === false) { + return new DataResponse(['success' => false, 'message' => 'No dataset is called "' . $named . '".']); + } + } + foreach ($this->request->getParams() as $key => $value) { if ($key === '_route') { continue; @@ -192,8 +234,11 @@ public function saveConfig(): DataResponse { */ #[AuthorizedAdminSetting(LarpinqAdmin::class)] public function runAction(string $actionId): DataResponse { - if ($actionId === 'install-demo-data') { - return $this->installDemoData(); + // `install-demo-data` is the id the step used before it asked WHICH + // dataset, and it still means "import the one this app ships". Kept so + // an older manifest, a runbook or a script that posts it keeps working. + if ($actionId === 'load-demo-data' || $actionId === 'install-demo-data') { + return $this->loadDataset(actionId: $actionId); } if ($actionId === 'skip-demo-data') { @@ -212,13 +257,36 @@ public function runAction(string $actionId): DataResponse { }//end runAction() /** - * Install the shipped demo dataset (ADR-111 rule 4). + * Import the dataset the operator picked in the previous step (ADR-111 rule 4). + * + * @param string $actionId The action that asked, which decides whether an + * unanswered choice is refused or means the shipped set. * * @return DataResponse The outcome, carrying the counts. * * @spec exclude Demo-data install action (ADR-111 rule 4); no per-app openspec change yet. */ - private function installDemoData(): DataResponse { + private function loadDataset(string $actionId): DataResponse { + $picked = $this->appConfig->getValueString(Application::APP_ID, self::DATASET_KEY, ''); + + // The legacy id carries no answer, so it means the shipped dataset. A + // caller that posts it has said which one by posting it. + if ($actionId === 'install-demo-data' && $picked === '') { + $picked = DemoDataService::DEMO_DATASET; + } + + // 🔴 NO SILENT DEFAULT. Importing here because the operator clicked Run + // one step early would plant example objects nobody asked for. + if ($picked === '') { + return new DataResponse(['success' => false, 'message' => 'Pick a dataset first.']); + } + + if ($picked === DemoDataService::NONE_DATASET) { + $this->appConfig->setValueString(Application::APP_ID, self::DEMO_DATA_DECIDED_KEY, 'skipped'); + + return new DataResponse(['success' => true, 'message' => 'No example data was loaded.']); + } + try { $imported = $this->demoDataService->install(); } catch (\Throwable $e) { @@ -243,7 +311,7 @@ private function installDemoData(): DataResponse { 'detail' => $imported, ] ); - }//end installDemoData() + }//end loadDataset() /** * Record that the operator declined the demo dataset. @@ -257,6 +325,11 @@ private function installDemoData(): DataResponse { * @spec exclude Demo-data skip action (ADR-111 rule 4); no per-app openspec change yet. */ private function skipDemoData(): DataResponse { + // 🔴 IT ANSWERS *BOTH* STEPS. The wizard now has a choice step and a + // run-action step; closing only the second leaves the first + // outstanding, and CnAppRoot opens the wizard while ANY optional step + // is outstanding. + $this->appConfig->setValueString(Application::APP_ID, self::DATASET_KEY, DemoDataService::NONE_DATASET); $this->appConfig->setValueString(Application::APP_ID, self::DEMO_DATA_DECIDED_KEY, 'skipped'); return new DataResponse( diff --git a/lib/Service/DemoDataService.php b/lib/Service/DemoDataService.php index 7d8ff47d..2592e733 100644 --- a/lib/Service/DemoDataService.php +++ b/lib/Service/DemoDataService.php @@ -99,8 +99,110 @@ public function isAvailable(): bool { }//end isAvailable() /** - * Import the demo dataset. + * The answer that means "plant nothing". + * + * 🔴 NOT THE ABSENCE OF AN ANSWER. An operator who declines has FINISHED the + * step; a step that can never be marked done reopens the wizard over every + * page (nextcloud-vue#806). + * + * @var string + */ + public const NONE_DATASET = 'none'; + + /** + * The id of the dataset this app ships. + * + * @var string + */ + public const DEMO_DATASET = 'demo'; + + /** + * Every answer the wizard's choice step may offer, declining included. + * + * 🔴 THE SERVER OWNS THIS LIST, AND THAT IS THE POINT. The step declares + * `optionsSource: datasets` and no options of its own, so the label, the + * description and the object count come from the descriptor that will + * actually be imported. A manifest that restated them could disagree with + * what lands, and nothing would notice. + * + * @return array The answers. + * + * @spec exclude Demo-data choice list; ADR-111 rule 1 has no per-app behavioural spec. + */ + public function listChoices(): array { + $choices = [ + [ + 'id' => self::NONE_DATASET, + 'label' => 'None, I will set this up myself', + 'description' => 'Nothing is imported. You start with an empty app and add your own data.', + 'objectCount' => 0, + 'icon' => 'CloseCircleOutline', + ], + ]; + + $objects = $this->shippedObjectCount(); + if ($objects !== null) { + $choices[] = [ + 'id' => self::DEMO_DATASET, + 'label' => 'Example data', + // 🔴 NO NUMBER IN THIS SENTENCE. The wizard runs a card's + // description through the app's translation function, which is a + // literal lookup, so an interpolated count would make the string + // untranslatable and leave a Dutch operator reading English. The + // count travels as `objectCount` and the card renders it as a + // stat, with a label the library translates. + 'description' => ( + 'Sample values for every schema this app supplies, generated from the schemas ' + . 'themselves. It shows the lists, detail pages and dashboards working rather ' + . 'than telling a story. Safe to run more than once, and you can delete it ' + . 'afterwards.' + ), + 'objectCount' => $objects, + 'icon' => 'DatabaseOutline', + ]; + } + + return $choices; + + }//end listChoices() + + /** + * How many objects the shipped descriptor carries, or null when it ships none. + * + * Counted from the FILE, so the card promises the number that will actually + * be imported. A missing or malformed descriptor returns null and the app + * then offers only "None" — honest, rather than an import that cannot run. * + * @return integer|null The object count, or null when there is no usable descriptor. + */ + private function shippedObjectCount(): ?int { + $path = $this->descriptorPath(); + if (is_file($path) === false) { + return null; + } + + $raw = file_get_contents($path); + if ($raw === false) { + return null; + } + + $data = json_decode($raw, true); + if (is_array($data) === false) { + return null; + } + + $components = ($data['components'] ?? []); + if (is_array($components) === false || is_array(($components['objects'] ?? null)) === false) { + return 0; + } + + return count($components['objects']); + + }//end shippedObjectCount() + + /** + * Import the demo dataset. + *'' * 🔴 THROWS RATHER THAN RETURNING A QUIET FAILURE. Every caller reports the * outcome to an operator who just asked for this, so "nothing happened" * must not be presentable as success. diff --git a/package-lock.json b/package-lock.json index f49233f6..1baaa06d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.20", "license": "EUPL-1.2", "dependencies": { - "@conduction/nextcloud-vue": "^2.36.1", + "@conduction/nextcloud-vue": "^2.37.0", "@nextcloud/auth": "^2.5.0", "@nextcloud/axios": "~2.5.2", "@nextcloud/capabilities": "^1.2.1", @@ -1829,9 +1829,9 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "2.36.2", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.36.2.tgz", - "integrity": "sha512-7PIqxjWP6Q5FewdLZmRB+1ITnNq1xg7J3VJv69u5T6CD5Kvkg0B+7jZCwaJjb4GeBdw5b3m4yWGVIzlVRFFuhg==", + "version": "2.37.0", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.37.0.tgz", + "integrity": "sha512-3+c+vPHlcswZS0+yEO+HjaFTkgI0ET0Lk33LEmMnZc/E7rDV6lPILq9LNlmxC04WuyQNILx4+zsckkSMYEg7hQ==", "license": "EUPL-1.2", "dependencies": { "@ckpack/vue-color": "^1.6.0", diff --git a/package.json b/package.json index 6490043a..07efc48f 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "extends @nextcloud/browserslist-config" ], "dependencies": { - "@conduction/nextcloud-vue": "^2.36.1", + "@conduction/nextcloud-vue": "^2.37.0", "@nextcloud/auth": "^2.5.0", "@nextcloud/axios": "~2.5.2", "@nextcloud/capabilities": "^1.2.1", diff --git a/src/manifest.json b/src/manifest.json index 6ea0c54c..f6f32085 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -15,11 +15,21 @@ }, { "id": "demo-data", + "type": "choice", + "display": "cards", + "optionsSource": "datasets", + "configKey": "demo_dataset", + "title": "Load example data?", + "required": false, + "body": "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install." + }, + { + "id": "load-demo-data", "type": "run-action", - "action": "install-demo-data", - "title": "Demo data (optional)", + "action": "load-demo-data", + "title": "Load the example data", "required": false, - "body": "Load an example LARP with characters, skills, items and events, so lists, character sheets and the event calendar show a working product right away. Optional, and safe to run more than once. Skip this on a production install." + "body": "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards." }, { "id": "provision", diff --git a/tests/unit/Service/DemoDataServiceTest.php b/tests/unit/Service/DemoDataServiceTest.php index 1d3dc8f7..c4c9bfba 100644 --- a/tests/unit/Service/DemoDataServiceTest.php +++ b/tests/unit/Service/DemoDataServiceTest.php @@ -108,6 +108,47 @@ public function importFromApp(string $appId, array $data, string $version, bool }; } + /** + * Declining is offered even when no dataset ships. + * + * 🔴 "NO THANKS" HAS TO BE SAYABLE. Every app in this fleet implemented a + * `skip-demo-data` action that no manifest step could reach, so the step + * stayed outstanding and CnAppRoot reopened the wizard over every page + * unless the operator imported data they did not want. + * + * @return void + */ + public function testDecliningIsOfferedEvenWhenNoDatasetShips(): void { + $choices = $this->service->listChoices(); + + $this->assertSame(['none'], array_column($choices, 'id')); + $this->assertNotSame('', $choices[0]['description']); + $this->assertNotSame('', $choices[0]['icon']); + + }//end testDecliningIsOfferedEvenWhenNoDatasetShips() + + /** + * The shipped dataset is offered with the count it actually carries. + * + * The card promises a number, so the number has to come from the file that + * will be imported rather than from a manifest that could disagree with it. + * + * @return void + */ + public function testTheShippedDatasetIsOfferedWithItsRealCount(): void { + $this->shipDescriptor(objects: 3); + + $choices = $this->service->listChoices(); + + $this->assertSame(['none', 'demo'], array_column($choices, 'id')); + $this->assertSame(3, $choices[1]['objectCount']); + // 🔴 NO NUMBER IN THE SENTENCE. The wizard translates a card's + // description by literal lookup, so an interpolated count would leave a + // Dutch operator reading English. + $this->assertDoesNotMatchRegularExpression('/\d/', $choices[1]['description']); + + }//end testTheShippedDatasetIsOfferedWithItsRealCount() + public function testItImportsTheDescriptorAndReportsTheCounts(): void { $this->shipDescriptor(objects: 5); $spy = $this->importerSpy(); From 095202ab4062f2d350105654ea7d820faa96fef5 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 5 Sep 2026 14:56:43 +0200 Subject: [PATCH 35/35] fix(e2e): the demo-data test arranges its choice, and the Suggest-feature CTA is a link (#685) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(e2e): the demo-data test arranges the choice it asserts against The demo-data step is a choice followed by a load step now, and the CI seed settles the optional steps by posting `skip-demo-data` — which records `demo_dataset = none`. The load action then correctly imports nothing and answers "No example data was loaded", so `installing the demo data reports HOW MUCH landed` asserted against a decision it never made. It went red on every app whose seed reaches that line. It picks the shipped dataset first now, and it reads the id from `/api/setup/status` rather than writing a literal: the choice step reads its options from exactly that list, so a hardcoded id can pass while the list an operator sees is empty. The `api()` helper gained a body, which it needed to post the choice at all. Co-Authored-By: Claude Opus 5 (1M context) * fix(e2e): the Suggest-feature CTA is a link, so the test asks for one nextcloud-vue 2.36.4 deleted CnSuggestFeatureModal — team decision 2026-09-04, the forge is where the conversation happens. The Features & roadmap header CTA became an anchor to the forge feature-request issue form, and an has role link, not button. So the assertion matched nothing on a page that renders perfectly well, and this leg has been red on development on every push since the app took ^2.36.4. Co-Authored-By: Claude Opus 5 (1M context) --------- Co-authored-by: Conduction Release Bot Co-authored-by: Claude Opus 5 (1M context) --- .../demo-data-setup-step.spec.ts | 41 ++++++++++++++++++- .../spec-coverage/settings-roadmap.spec.ts | 6 ++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/tests/e2e/spec-coverage/demo-data-setup-step.spec.ts b/tests/e2e/spec-coverage/demo-data-setup-step.spec.ts index 49adbae5..ec6a6388 100644 --- a/tests/e2e/spec-coverage/demo-data-setup-step.spec.ts +++ b/tests/e2e/spec-coverage/demo-data-setup-step.spec.ts @@ -39,9 +39,10 @@ async function api( page: Page, method: string, path: string, + body?: unknown, ): Promise<{ status: number; json: any }> { return await page.evaluate( - async ({ method, path }) => { + async ({ method, path, body }) => { const res = await fetch(path, { method, headers: { @@ -50,6 +51,7 @@ async function api( requesttoken: (window as any).OC?.requestToken || '', 'OCS-APIREQUEST': 'true', }, + body: body === undefined ? undefined : JSON.stringify(body), }) let json: any try { @@ -59,10 +61,41 @@ async function api( } return { status: res.status, json } }, - { method, path }, + { method, path, body }, ) } +/** + * Choose the shipped dataset, and answer with the id that was chosen. + * + * 🔴 THE TEST HAS TO MAKE THE DECISION IT ASSERTS AGAINST. The demo-data step + * is a choice followed by a load step now, and the CI seed settles the optional + * steps by posting `skip-demo-data` — which records "none". A load that follows + * correctly imports nothing, so an install test that skips this arranges no + * precondition and measures the seed instead of the app. + * + * The id comes from `/api/setup/status` rather than a literal: the choice step + * reads its options from exactly that list, so a hardcoded id can pass while + * the list an operator sees is empty. + */ +async function pickShippedDataset(page: Page): Promise { + const status = await api(page, 'GET', `${BASE}/api/setup/status`) + const shipped = (status.json?.datasets ?? []).find( + (d: any) => d?.id && d.id !== 'none', + ) + expect( + shipped, + `setup/status offers no dataset to load: ${JSON.stringify(status.json?.datasets)}`, + ).toBeTruthy() + + const saved = await api(page, 'POST', `${BASE}/api/setup/config`, { + demo_dataset: shipped.id, + }) + expect(saved.status, JSON.stringify(saved.json)).toBe(200) + + return shipped.id +} + test.describe.configure({ mode: 'serial' }) test.describe('ADR-111 demo data', () => { @@ -103,6 +136,8 @@ test.describe('ADR-111 demo data', () => { // it is the only check that the install WROTE something. test.slow() + await pickShippedDataset(page) + const res = await api( page, 'POST', @@ -135,6 +170,8 @@ test.describe('ADR-111 demo data', () => { // The step body tells the operator it is "safe to run more than once". // That sentence is a contract; this asserts the server keeps it rather // than erroring or reporting failure on a second pass. + await pickShippedDataset(page) + const again = await api( page, 'POST', diff --git a/tests/e2e/spec-coverage/settings-roadmap.spec.ts b/tests/e2e/spec-coverage/settings-roadmap.spec.ts index 4b7752a8..56182134 100644 --- a/tests/e2e/spec-coverage/settings-roadmap.spec.ts +++ b/tests/e2e/spec-coverage/settings-roadmap.spec.ts @@ -186,9 +186,13 @@ test.describe('features-roadmap page', () => { .filter({ hasText: /Show roadmap/i }) .first(), ).toBeVisible({ timeout: 10_000 }) + // A LINK, not a button. nextcloud-vue 2.36.4 removed the in-product + // suggestion modal (team decision 2026-09-04: the forge is where the + // conversation happens), and the CTA is an anchor to the forge's + // feature-request issue form now. An `` has role `link`. await expect( page - .locator('.app-content button') + .locator('.app-content a') .filter({ hasText: /Suggest feature/i }) .first(), ).toBeVisible()