@cat-factory/app 0.46.2 → 0.46.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/i18n/i18n.config.ts +22 -0
- package/i18n/locales/en.json +24 -3
- package/package.json +1 -1
package/i18n/i18n.config.ts
CHANGED
|
@@ -5,10 +5,32 @@
|
|
|
5
5
|
// Locale MESSAGES are NOT defined here — they live in `i18n/locales/*.json` so the
|
|
6
6
|
// module can deep-merge them across the `extends` layer chain. This file carries only
|
|
7
7
|
// the runtime vue-i18n behaviour (fallback, number/date formats) shared by every locale.
|
|
8
|
+
// Slavic one/few/many plural selector (CLDR rule for Polish & Ukrainian), returning the
|
|
9
|
+
// 0|1|2 index into a 3-form `"one | few | many"` message. vue-i18n's BUILT-IN pluralizer
|
|
10
|
+
// only ever picks index 0 (n===1) or 1/2 by a non-Slavic rule, so without this the pl/uk
|
|
11
|
+
// 3-form catalog entries (e.g. board.toolbar.decisionWord "decyzja | decyzje | decyzji")
|
|
12
|
+
// render the WRONG form for counts like 2-4 and 22-24. `choicesLength` is unused — the
|
|
13
|
+
// three forms are assumed; en/es/fr keep the default 2-form behaviour (not listed here).
|
|
14
|
+
const slavicPluralRule = (choice: number): number => {
|
|
15
|
+
const n = Math.abs(choice)
|
|
16
|
+
const mod10 = n % 10
|
|
17
|
+
const mod100 = n % 100
|
|
18
|
+
if (n === 1) return 0 // one
|
|
19
|
+
if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 1 // few
|
|
20
|
+
return 2 // many (incl. 0, 5-21, …)
|
|
21
|
+
}
|
|
22
|
+
|
|
8
23
|
export default defineI18nConfig(() => ({
|
|
9
24
|
legacy: false,
|
|
10
25
|
fallbackLocale: 'en',
|
|
11
26
|
|
|
27
|
+
// Per-locale plural selectors. Only the Slavic locales need overriding; the others use
|
|
28
|
+
// vue-i18n's default (correct for their 2-form catalogs).
|
|
29
|
+
pluralRules: {
|
|
30
|
+
pl: slavicPluralRule,
|
|
31
|
+
uk: slavicPluralRule,
|
|
32
|
+
},
|
|
33
|
+
|
|
12
34
|
// Locale-aware number/currency formatting. Use `$n(value, 'currency')` etc. at call
|
|
13
35
|
// sites instead of a raw `Intl.NumberFormat`; `$n`/`$d` are thin `Intl` wrappers so
|
|
14
36
|
// `en` behaviour is identical. `currency` style needs a `currency` override per call
|
package/i18n/locales/en.json
CHANGED
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
"cancel": "Cancel",
|
|
14
14
|
"retry": "Retry",
|
|
15
15
|
"actionFailed": "Action failed",
|
|
16
|
-
"close": "Close"
|
|
16
|
+
"close": "Close",
|
|
17
|
+
"@close": {
|
|
18
|
+
"description": "Verb meaning dismiss / shut (a panel, drawer, dialog), NOT the adjective 'near'. Used as an aria-label on close affordances - translate as the imperative verb."
|
|
19
|
+
}
|
|
17
20
|
},
|
|
18
21
|
"nav": {
|
|
19
22
|
"menu": "Navigation menu",
|
|
@@ -27,18 +30,27 @@
|
|
|
27
30
|
"bootstrapRepo": "Bootstrap repo",
|
|
28
31
|
"integrations": "Integrations",
|
|
29
32
|
"sandbox": "Sandbox",
|
|
33
|
+
"@sandbox": {
|
|
34
|
+
"description": "Named feature area (a screen for trying prompt versions / models against graded fixtures). Fine to localize descriptively per locale - unlike nav.kaizen, this one is NOT kept verbatim."
|
|
35
|
+
},
|
|
30
36
|
"kaizen": "Kaizen",
|
|
37
|
+
"@kaizen": {
|
|
38
|
+
"description": "Proper-noun product feature name (grading history + verified prompt/agent/model combos). Do NOT translate - keep 'Kaizen' verbatim in every locale."
|
|
39
|
+
},
|
|
31
40
|
"workspaceContext": "Workspace context",
|
|
32
41
|
"contextFragments": "Context fragments",
|
|
33
42
|
"configuration": "Configuration",
|
|
34
43
|
"workspaceSettings": "Workspace settings",
|
|
35
|
-
"modelConfiguration": "Model
|
|
44
|
+
"modelConfiguration": "Model configuration",
|
|
36
45
|
"accountSettings": "Account settings"
|
|
37
46
|
},
|
|
38
47
|
"board": {
|
|
39
48
|
"toolbar": {
|
|
40
49
|
"addService": "Add service",
|
|
41
|
-
"decisionWord": "decision | decisions"
|
|
50
|
+
"decisionWord": "decision | decisions",
|
|
51
|
+
"@decisionWord": {
|
|
52
|
+
"description": "Count-based plural noun rendered AFTER a number, e.g. '3 decisions' (pending human decisions in the run queue). Resolved via t(key, count); count is always 1 or more. Provide ALL plural forms your language needs (English has 2; Polish/Ukrainian need 3 - one/few/many - and rely on the custom pluralRules wired in i18n.config.ts)."
|
|
53
|
+
}
|
|
42
54
|
}
|
|
43
55
|
},
|
|
44
56
|
"errors": {
|
|
@@ -53,8 +65,14 @@
|
|
|
53
65
|
"dependencies_unmet": "Blocked by dependencies",
|
|
54
66
|
"task_limit_reached": "Concurrency limit reached",
|
|
55
67
|
"tester_infra_unsupported": "Test infrastructure not configured",
|
|
68
|
+
"@tester_infra_unsupported": {
|
|
69
|
+
"description": "Conflict-toast title for the Tester step's start gate. UMBRELLA over two cases not visible from the string: (a) the service has no test infra configured, AND (b) this deployment's container runtime can't run local test infra (limited mode). The detailed description carries the specific cause; keep the title broad ('not configured / unavailable')."
|
|
70
|
+
},
|
|
56
71
|
"agent_backend_unconfigured": "Agent backend not configured",
|
|
57
72
|
"run_not_retryable": "Run can’t be retried",
|
|
73
|
+
"@run_not_retryable": {
|
|
74
|
+
"description": "'Run' is a NOUN here = a pipeline execution (only a failed run can be retried). Translate it as the execution noun, not the verb 'to run'."
|
|
75
|
+
},
|
|
58
76
|
"no_pr_to_merge": "No PR to merge",
|
|
59
77
|
"github_not_connected": "GitHub not connected",
|
|
60
78
|
"bootstrap_not_retryable": "Bootstrap can’t be retried",
|
|
@@ -64,6 +82,9 @@
|
|
|
64
82
|
"providersUnconfigured": {
|
|
65
83
|
"title": "No AI provider for this model",
|
|
66
84
|
"body": "No provider is configured for {models}. Add a provider key, connect a subscription, or enable Cloudflare AI to run it.",
|
|
85
|
+
"@body": {
|
|
86
|
+
"description": "Keep the named placeholder for the model list intact (a comma-separated list of model ids is injected at runtime)."
|
|
87
|
+
},
|
|
67
88
|
"action": "Configure AI"
|
|
68
89
|
}
|
|
69
90
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.46.
|
|
3
|
+
"version": "0.46.3",
|
|
4
4
|
"description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|