Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
23a12eb
chore(release): sync beta back into development
github-actions[bot] Aug 31, 2026
5e1ce36
fix(composer): declare ext-xsl so dependabot can resolve (#1315)
rubenvdlinde Aug 31, 2026
80c0712
chore(release): sync beta back into development
github-actions[bot] Aug 31, 2026
4ea1487
chore(release): sync main back into development
github-actions[bot] Aug 31, 2026
603258d
Merge pull request #1323 from ConductionNL/sync/main-to-development-2…
rubenvdlinde Aug 31, 2026
26c15f1
Merge pull request #1321 from ConductionNL/sync/beta-to-development-2…
rubenvdlinde Aug 31, 2026
6fab62b
Merge pull request #1317 from ConductionNL/sync/beta-to-development-2…
rubenvdlinde Aug 31, 2026
b71bec6
chore(deps): take @conduction/nextcloud-vue 2.27.2 (#1324)
rubenvdlinde Aug 31, 2026
5aa2bc6
chore(sync): carry beta back into development
github-actions[bot] Aug 31, 2026
05a414c
Merge pull request #1330 from ConductionNL/sync/beta-to-development-2…
rubenvdlinde Aug 31, 2026
5ad1ad4
chore(release): 2.0.9-unstable.20260831125110 (#1331)
github-actions[bot] Aug 31, 2026
8185a33
fix(deps): make the npm overrides follow their direct dependency (#1333)
rubenvdlinde Aug 31, 2026
13a11dc
chore(release): 2.0.10-unstable.20260831161112 (#1334)
github-actions[bot] Aug 31, 2026
4f664b7
chore(sync): carry beta back into development
github-actions[bot] Sep 1, 2026
ca74e64
Merge pull request #1337 from ConductionNL/sync/beta-to-development-2…
rubenvdlinde Sep 1, 2026
30fa15d
chore(release): 2.0.11-unstable.20260901034809 (#1339)
github-actions[bot] Sep 1, 2026
6c05308
fix(dashboard): drop the second Refresh, and make l10n edits reviewab…
rubenvdlinde Sep 1, 2026
086c7eb
feat(router): move opencatalogi off hash routing to clean path URLs (…
rubenvdlinde Sep 1, 2026
b77e6b2
fix(e2e): assert the deep link as a path, not a hash (#1344)
rubenvdlinde Sep 1, 2026
f156675
chore(lint): let the linter see tests/ and scripts/ (#1343)
rubenvdlinde Sep 1, 2026
603dfc5
chore(sync): carry beta back into development
github-actions[bot] Sep 1, 2026
c402608
Merge pull request #1358 from ConductionNL/sync/beta-to-development-2…
rubenvdlinde Sep 1, 2026
6012ff5
fix(repair): register WOO536RepairReadRules, which had never run (#1363)
rubenvdlinde Sep 1, 2026
d54cd39
fix(e2e): give text extraction a realistic poll before declaring the …
rubenvdlinde Sep 1, 2026
6dd43d8
fix(search): resolve a document that names its publication by slug al…
rubenvdlinde Sep 1, 2026
702cd59
experiment: pin openregister to the version the last green run used (…
rubenvdlinde Sep 2, 2026
15d0302
chore(sync): carry beta back into development
github-actions[bot] Sep 2, 2026
7dd5ef4
Merge pull request #1374 from ConductionNL/sync/beta-to-development-2…
rubenvdlinde Sep 2, 2026
047a880
experiment: pin openregister by TAG, not by bare SHA (#1377)
rubenvdlinde Sep 2, 2026
2a9c1ef
revert: unpin openregister, the experiment has answered (#1379)
rubenvdlinde Sep 2, 2026
6581600
test(e2e): assert the anonymous caller can see the publication at all…
rubenvdlinde Sep 2, 2026
874edf8
test(e2e): assert the document is visible to the anonymous caller too…
rubenvdlinde Sep 2, 2026
d533430
fix(e2e): put documents in the catalog scope, which is why WOO-517 fa…
rubenvdlinde Sep 2, 2026
6442182
fix(e2e): a fixture catalog must be PUBLISHED to be in the search sco…
rubenvdlinde Sep 2, 2026
9f668ea
fix: wire the orphaned WOO approval gate, retention defaults and broa…
rubenvdlinde Sep 2, 2026
36c96a2
fix(search): admit the document schema when content search is asked f…
rubenvdlinde Sep 2, 2026
1846dbd
feat(one-engine): retention matrices onto OR decision tables + harves…
rubenvdlinde Sep 2, 2026
0e7ad17
Takes nextcloud-vue 2.31.1 so a hovered KPI tile stops drawing a card…
rubenvdlinde Sep 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@

This project ships dedicated scripts for every l10n / i18n operation. **Use them.** Do not read or edit `l10n/*.js` files by hand, do not grep them for keys, and do not invent new translation entries with `Edit`/`Write`. Manual edits skip the tools' validation, formatting, and ESLint pass and produce inconsistent files across locales.

`l10n/*.json` is the **backend** (PHP) translation set, maintained through a separate workflow. Never read or modify it. All scripts below operate on `l10n/*.js` only.
`l10n/*.json` is the **source of truth for both formats**, and `l10n/*.js` is **generated from it** by `scripts/build-l10n-js.js` (`npm run l10n:build`). `check:l10n-js` is that derivation asserted: it regenerates and fails when the committed `.js` differs.

This corrects what this file used to say. It called the two sets independent and told you never to touch the `.json`. They are not independent, and the rule was unfollowable: removing a string from source leaves a key that `check:l10n` reports as UNUSED, and deleting it from the `.js` alone makes `check:l10n-js` report the catalogue stale. Both legs run in Code Quality, so obeying the old rule turned one of them red whatever you did.

**So: edit the `.json`, then run `npm run l10n:build` and commit the regenerated `.js`.** Never hand-edit a `.js` catalogue; the next build overwrites it.

The wrap pattern in source code is always:

Expand Down Expand Up @@ -144,7 +148,8 @@ node scripts/clean-l10n.js --apply # actually remove (this is what `npm run cle
Important constraints:

- **Does NOT add missing keys.** Adding a key without a translation would let `t()` return English-as-Dutch silently instead of falling back to the source string. Add missing keys via `l10n-ai.js add`, never by editing files.
- Safe **only** because frontend `l10n/*.js` is independent of backend `l10n/*.json`. Do not adapt this script for projects that keep `.js` and `.json` in sync.
- 🔴 **Read the dry-run before applying, and do not trust the count.** Measured 2026-08-31: `check:l10n` reported 1 unused key while `clean-l10n.js` proposed removing **87**. It scans only `t('opencatalogi', '...')` calls in `src/`, so every key reached another way (server-side `$l->t()`, manifest copy the renderer walks) looks unused to it. The other 86 were false positives. If the count surprises you, stop.
- It writes `.js` only, which the next `npm run l10n:build` overwrites from the `.json`. To drop a key for good, remove it from `l10n/*.json` and rebuild.
- After running, `npm run check:l10n` should report zero UNUSED.

---
Expand Down
37 changes: 28 additions & 9 deletions appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Doe een [featureverzoek](https://github.com/OpenCatalogi/.github/issues/new/choo

**Ondersteuning:** Voor ondersteuning, neem contact op via support@conduction.nl. Voor een Service Level Agreement (SLA), neem contact op via sales@conduction.nl.
]]></description>
<version>2.0.13</version>
<version>2.0.11-unstable.20260901034809</version>
<licence>EUPL-1.2</licence>
<author mail="info@conduction.nl" homepage="https://www.conduction.nl/">Conduction</author>
<author mail="info@acato.nl" homepage="https://acato.nl/">Acato</author>
Expand Down Expand Up @@ -136,6 +136,16 @@ Doe een [featureverzoek](https://github.com/OpenCatalogi/.github/issues/new/choo
<background-jobs>
<job>OCA\OpenCatalogi\BackgroundJob\DirectorySync</job>
<job>OCA\OpenCatalogi\BackgroundJob\RetentionEvaluation</job>
<!--
Broadcast was written but never registered here, so the 4-hourly
directory broadcast required by dashboard/spec.md DIR-007 silently
never ran. The delivery mechanics inside BroadcastService are due to
move onto OpenRegister's webhook pipeline (change
opencatalogi-delegate-broadcast-to-or-webhooks); that change replaces
HOW a broadcast is delivered, not WHETHER a schedule exists, so the
job registration stays correct across it.
-->
<job>OCA\OpenCatalogi\BackgroundJob\Broadcast</job>
</background-jobs>

<repair-steps>
Expand All @@ -147,14 +157,6 @@ Doe een [featureverzoek](https://github.com/OpenCatalogi/.github/issues/new/choo
non-destructive; safe to re-run.
-->
<step>OCA\OpenCatalogi\Repair\RenameDutchPublicationColumns</step>
<!--
WOO-536 Fase 4: backfill the two-rule read-block on publication +
document schemas (adds the `depublicationDate` clause required by
Robert's DoD). Runs AFTER RenameDutchPublicationColumns so the guard
sees English field names. Idempotent: skips schemas that already
carry a two-rule shape or admin-customised rules.
-->
<step>OCA\OpenCatalogi\Repair\WOO536RepairReadRules</step>
<!--
The background jobs moved from OCA\OpenCatalogi\Cron to
OCA\OpenCatalogi\BackgroundJob in #1119. The <job> entries above
Expand Down Expand Up @@ -195,6 +197,23 @@ Doe een [featureverzoek](https://github.com/OpenCatalogi/.github/issues/new/choo
cleanup rather than fail. -->
<step>OCA\OpenCatalogi\Repair\CleanupOrphanDirectoryListings</step>
<step>OCA\OpenCatalogi\Repair\RemoveRetiredCronJobs</step>
<!--
Written but never registered — gate-98 (repair-step-registration) has been
failing on development since the WOO-536 merge for exactly this: a class
that exists is not a class that runs.

It backfills the two-rule `depublicatiedatum` read-shape onto the
`publication` and `document` schemas. A FRESH install does not need it —
`lib/Settings/publication_register.json` already seeds that shape, and
InitializeSettings imports the seed from <install> — so this is
post-migration only, which is also where the change that introduced it
(2026-08-28-fix-fts-catalog-model-alignment) says it belongs: a repair for
EXISTING installations.

It must run after InitializeSettings, which syncs the register and schemas
this step then edits. Idempotent and safe to re-run.
-->
<step>OCA\OpenCatalogi\Repair\WOO536RepairReadRules</step>
<!--
Written but never registered, so it had never run once: a class that
exists is not a class that runs. gate-98 found it.
Expand Down
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@
"optimize-autoloader": true,
"sort-packages": true,
"platform": {
"php": "8.3"
"php": "8.3",
"ext-xsl": "1"
}
},
"extra": {
Expand Down
109 changes: 101 additions & 8 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,32 @@ export default [
'no-console': 'off',
'n/no-process-exit': 'off',
'n/hashbang': 'off',
// `_` / `__` as a deliberate throwaway binding — `catch (_)`, a
// discarded destructuring slot. Narrow on purpose: the pattern matches
// UNDERSCORES ONLY, so a real name that happens to start with `_` is
// still reported. v9 drives plain `.js` through the CORE rule (the
// `@typescript-eslint` swap is per-file-type), so it is set here.
// Tests import devDependencies by definition; this rule is about what
// ships in the published package, which tests/ never does.
'n/no-unpublished-import': 'off',
},
},

{
// `_` / `__` as a deliberate throwaway binding — `catch (_)`, a discarded
// destructuring slot. Narrow on purpose: the pattern matches UNDERSCORES
// ONLY, so a real name that happens to start with `_` is still reported.
//
// 🔴 `.js` / `.mjs` ONLY, NOT `.ts`. The CORE rule is not TypeScript-aware:
// applied to a `.ts` file it reads the parameter NAMES inside a function
// TYPE as bindings and reports them unused. Measured on humaniq —
//
// t?: (app: string, key: string) => string
//
// produced four `no-unused-vars` errors for `app` and `key`, which are
// documentation, not variables. The same mis-scoping made every unused
// `catch (e)` in a `.ts` spec report TWICE, once per rule.
//
// v9 already turns the core rule off for `.ts` and drives
// `@typescript-eslint/no-unused-vars` instead; naming `.ts` here switched
// it back on. TypeScript files are handled by the block below.
files: ['tests/**/*.js', 'tests/**/*.mjs'],
rules: {
'no-unused-vars': [
'error',
{
Expand All @@ -166,9 +187,81 @@ export default [
ignoreRestSiblings: true,
},
],
// Tests import devDependencies by definition; this rule is about what
// ships in the published package, which tests/ never does.
'n/no-unpublished-import': 'off',
},
},

{
// The TypeScript half of the block above. Same intent, same patterns, on
// the rule that actually understands the language: it knows a name inside
// a function type is not a binding, so type annotations stay quiet while a
// genuinely dead local is still reported.
files: ['tests/**/*.ts', 'tests/**/*.tsx'],
rules: {
'@typescript-eslint/no-unused-vars': [
'error',
{
varsIgnorePattern: '^_+$',
caughtErrors: 'all',
caughtErrorsIgnorePattern: '^_+$',
argsIgnorePattern: '^_',
ignoreRestSiblings: true,
},
],
},
},

{
// 🔴 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',
},
},

Expand Down
1 change: 0 additions & 1 deletion l10n/be.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ OC.L10N.register(
"Recently created": "Нядаўна створаныя",
"Recently modified": "Нядаўна зменены",
"Refresh": "Абнавіць",
"Refresh dashboard": "Абнавіць панэль кіравання",
"Refresh facets": "Абнавіць фасеты",
"Registers": "Рэестры",
"Reimport configuration": "Паўторна імпартаваць канфігурацыю",
Expand Down
1 change: 0 additions & 1 deletion l10n/be.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@
"Recently created": "Нядаўна створаныя",
"Recently modified": "Нядаўна зменены",
"Refresh": "Абнавіць",
"Refresh dashboard": "Абнавіць панэль кіравання",
"Refresh facets": "Абнавіць фасеты",
"Registers": "Рэестры",
"Reimport configuration": "Паўторна імпартаваць канфігурацыю",
Expand Down
1 change: 0 additions & 1 deletion l10n/bg.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ OC.L10N.register(
"Recently created": "Наскоро създадено",
"Recently modified": "Наскоро променено",
"Refresh": "Опресняване",
"Refresh dashboard": "Опресняване на таблото",
"Refresh facets": "Опресняване на фасети",
"Registers": "Регистри",
"Reimport configuration": "Повторно импортиране на конфигурацията",
Expand Down
1 change: 0 additions & 1 deletion l10n/bg.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@
"Recently created": "Наскоро създадено",
"Recently modified": "Наскоро променено",
"Refresh": "Опресняване",
"Refresh dashboard": "Опресняване на таблото",
"Refresh facets": "Опресняване на фасети",
"Registers": "Регистри",
"Reimport configuration": "Повторно импортиране на конфигурацията",
Expand Down
1 change: 0 additions & 1 deletion l10n/bs.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ OC.L10N.register(
"Recently created": "Nedavno kreirano",
"Recently modified": "Nedavno izmijenjeno",
"Refresh": "Osvježi",
"Refresh dashboard": "Osvježi kontrolnu tablu",
"Refresh facets": "Osvježi fasete",
"Registers": "Registri",
"Reimport configuration": "Ponovo uvezi konfiguraciju",
Expand Down
1 change: 0 additions & 1 deletion l10n/bs.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@
"Recently created": "Nedavno kreirano",
"Recently modified": "Nedavno izmijenjeno",
"Refresh": "Osvježi",
"Refresh dashboard": "Osvježi kontrolnu tablu",
"Refresh facets": "Osvježi fasete",
"Registers": "Registri",
"Reimport configuration": "Ponovo uvezi konfiguraciju",
Expand Down
1 change: 0 additions & 1 deletion l10n/ca.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ OC.L10N.register(
"Recently created": "Creats recentment",
"Recently modified": "Modificats recentment",
"Refresh": "Actualitza",
"Refresh dashboard": "Actualitza el tauler",
"Refresh facets": "Actualitza les facetes",
"Registers": "Registres",
"Reimport configuration": "Torna a importar la configuració",
Expand Down
1 change: 0 additions & 1 deletion l10n/ca.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@
"Recently created": "Creats recentment",
"Recently modified": "Modificats recentment",
"Refresh": "Actualitza",
"Refresh dashboard": "Actualitza el tauler",
"Refresh facets": "Actualitza les facetes",
"Registers": "Registres",
"Reimport configuration": "Torna a importar la configuració",
Expand Down
1 change: 0 additions & 1 deletion l10n/cs.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ OC.L10N.register(
"Recently created": "Nedávno vytvořené",
"Recently modified": "Nedávno změněné",
"Refresh": "Obnovit",
"Refresh dashboard": "Obnovit nástěnku",
"Refresh facets": "Obnovit fasety",
"Registers": "Registry",
"Reimport configuration": "Znovu importovat konfiguraci",
Expand Down
1 change: 0 additions & 1 deletion l10n/cs.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@
"Recently created": "Nedávno vytvořené",
"Recently modified": "Nedávno změněné",
"Refresh": "Obnovit",
"Refresh dashboard": "Obnovit nástěnku",
"Refresh facets": "Obnovit fasety",
"Registers": "Registry",
"Reimport configuration": "Znovu importovat konfiguraci",
Expand Down
1 change: 0 additions & 1 deletion l10n/da.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ OC.L10N.register(
"Recently created": "Senest oprettet",
"Recently modified": "Senest ændret",
"Refresh": "Opdater",
"Refresh dashboard": "Opdater oversigt",
"Refresh facets": "Opdater facetter",
"Registers": "Registre",
"Reimport configuration": "Genimportér konfiguration",
Expand Down
1 change: 0 additions & 1 deletion l10n/da.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@
"Recently created": "Senest oprettet",
"Recently modified": "Senest ændret",
"Refresh": "Opdater",
"Refresh dashboard": "Opdater oversigt",
"Refresh facets": "Opdater facetter",
"Registers": "Registre",
"Reimport configuration": "Genimportér konfiguration",
Expand Down
1 change: 0 additions & 1 deletion l10n/de.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ OC.L10N.register(
"Recently created": "Kürzlich erstellt",
"Recently modified": "Kürzlich geändert",
"Refresh": "Aktualisieren",
"Refresh dashboard": "Dashboard aktualisieren",
"Refresh facets": "Facetten aktualisieren",
"Registers": "Register",
"Reimport configuration": "Konfiguration erneut importieren",
Expand Down
1 change: 0 additions & 1 deletion l10n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@
"Recently created": "Kürzlich erstellt",
"Recently modified": "Kürzlich geändert",
"Refresh": "Aktualisieren",
"Refresh dashboard": "Dashboard aktualisieren",
"Refresh facets": "Facetten aktualisieren",
"Registers": "Register",
"Reimport configuration": "Konfiguration erneut importieren",
Expand Down
1 change: 0 additions & 1 deletion l10n/el.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ OC.L10N.register(
"Recently created": "Πρόσφατα δημιουργημένα",
"Recently modified": "Πρόσφατα τροποποιημένα",
"Refresh": "Ανανέωση",
"Refresh dashboard": "Ανανέωση πίνακα ελέγχου",
"Refresh facets": "Ανανέωση όψεων",
"Registers": "Μητρώα",
"Reimport configuration": "Επανεισαγωγή διαμόρφωσης",
Expand Down
1 change: 0 additions & 1 deletion l10n/el.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@
"Recently created": "Πρόσφατα δημιουργημένα",
"Recently modified": "Πρόσφατα τροποποιημένα",
"Refresh": "Ανανέωση",
"Refresh dashboard": "Ανανέωση πίνακα ελέγχου",
"Refresh facets": "Ανανέωση όψεων",
"Registers": "Μητρώα",
"Reimport configuration": "Επανεισαγωγή διαμόρφωσης",
Expand Down
6 changes: 4 additions & 2 deletions l10n/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,6 @@ OC.L10N.register(
"Recently created": "Recently created",
"Recently modified": "Recently modified",
"Refresh": "Refresh",
"Refresh dashboard": "Refresh dashboard",
"Refresh facets": "Refresh facets",
"Registers": "Registers",
"Reimport configuration": "Reimport configuration",
Expand Down Expand Up @@ -982,7 +981,10 @@ OC.L10N.register(
"Welcome to OpenCatalogi": "Welcome to OpenCatalogi",
"You're publishing": "You're publishing",
"Load a small example catalog of publications, listings and organisations, so lists, search and the publication detail pages show a working product right away. Optional, and safe to run more than once. Skip this on a production install.": "Load a small example catalog of publications, listings and organisations, so lists, search and the publication detail pages show a working product right away. Optional, and safe to run more than once. Skip this on a production install.",
"Demo data (optional)": "Demo data (optional)"
"Demo data (optional)": "Demo data (optional)",
"Publishing is blocked: no approval chain is configured (woo_publish_approval_chain).": "Publishing is blocked: no approval chain is configured (woo_publish_approval_chain).",
"Publishing is blocked: the OpenRegister approval workflow is unavailable, so approval chain \"%s\" cannot be verified.": "Publishing is blocked: the OpenRegister approval workflow is unavailable, so approval chain \"%s\" cannot be verified.",
"Publishing is blocked: approval chain \"%s\" has not recorded a completed approval for this batch.": "Publishing is blocked: approval chain \"%s\" has not recorded a completed approval for this batch."
},
"nplurals=2; plural=(n != 1);"
)
Loading
Loading