@glossarist/concept-browser 0.7.100 → 0.7.102

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.
Files changed (58) hide show
  1. package/cli/index.mjs +14 -251
  2. package/cli/index.ts +289 -0
  3. package/package.json +3 -2
  4. package/src/__tests__/__fixtures__/concepts.ts +3 -3
  5. package/src/__tests__/components/learn/learn-card-dimension-card.test.ts +112 -0
  6. package/src/__tests__/composables/use-concept-edges-v2.test.ts +1 -0
  7. package/src/__tests__/designation-relationship.test.ts +2 -2
  8. package/src/__tests__/perf/serialization-perf.test.ts +1 -0
  9. package/src/__tests__/use-rdf-document.test.ts +1 -0
  10. package/src/__tests__/views/learn/learn-designations-view.test.ts +84 -0
  11. package/src/__tests__/views/learn/learn-index-view.test.ts +45 -0
  12. package/src/__tests__/views/learn/learn-relationships-view.test.ts +83 -0
  13. package/src/__tests__/views/learn/learn-statuses-view.test.ts +60 -0
  14. package/src/adapters/bibliography-adapter.ts +1 -1
  15. package/src/adapters/model-bridge.ts +15 -15
  16. package/src/adapters/non-verbal/figure-bridge.ts +2 -2
  17. package/src/adapters/non-verbal/formula-bridge.ts +2 -2
  18. package/src/adapters/non-verbal/table-bridge.ts +2 -2
  19. package/src/components/CitationDisplay.vue +1 -1
  20. package/src/components/ConceptDetail.vue +2 -2
  21. package/src/components/ConceptDiffModal.vue +2 -2
  22. package/src/components/ConceptDiffView.vue +1 -1
  23. package/src/components/DesignationList.vue +4 -4
  24. package/src/components/NavIcon.vue +1 -0
  25. package/src/components/RelationSphere.vue +1 -1
  26. package/src/components/figure/FigureDisplay.vue +5 -5
  27. package/src/components/formula/FormulaDisplay.vue +4 -4
  28. package/src/components/learn/DimensionCard.vue +71 -0
  29. package/src/components/learn/LearnCard.vue +59 -0
  30. package/src/components/table/TableDisplay.vue +3 -3
  31. package/src/components/use-rdf-document.ts +16 -7
  32. package/src/composables/use-concept-content.ts +3 -3
  33. package/src/composables/use-concept-diff.ts +2 -2
  34. package/src/composables/use-concept-edges.ts +3 -3
  35. package/src/config/page-types.ts +1 -1
  36. package/src/i18n/locales/eng.yml +114 -9
  37. package/src/i18n/locales/fra.yml +114 -9
  38. package/src/layouts/Default.astro +32 -2
  39. package/src/router/index.ts +21 -2
  40. package/src/utils/content-renderer.ts +1 -1
  41. package/src/utils/partitive-multiplicity.ts +3 -2
  42. package/src/views/ConceptView.vue +3 -3
  43. package/src/views/learn/LearnDesignationsView.vue +190 -0
  44. package/src/views/learn/LearnIndexView.vue +75 -0
  45. package/src/views/learn/LearnRelationshipsView.vue +317 -0
  46. package/src/views/learn/LearnStatusesView.vue +114 -0
  47. package/tailwind.config.js +3 -3
  48. package/tsconfig.json +1 -1
  49. package/src/__tests__/views/relation-types-view.test.ts +0 -85
  50. package/src/adapters/model-bridge/bridges.ts +0 -159
  51. package/src/adapters/model-bridge/concept.ts +0 -97
  52. package/src/adapters/model-bridge/entity-refs.ts +0 -49
  53. package/src/adapters/model-bridge/hyperedge.ts +0 -103
  54. package/src/adapters/model-bridge/index.ts +0 -46
  55. package/src/adapters/model-bridge/mappers.ts +0 -277
  56. package/src/adapters/model-bridge/partitive.ts +0 -79
  57. package/src/adapters/non-verbal/glossarist-augment.d.ts +0 -339
  58. /package/src/adapters/{model-bridge/jsonld-types.ts → jsonld-types.ts} +0 -0
@@ -77,11 +77,11 @@ function resolvedLabel(dr: { content: string | null; ref?: { source: string | nu
77
77
  <div v-if="d.related?.length" class="mt-0.5 space-y-0.5">
78
78
  <div v-for="(dr, dri) in d.related" :key="'dr'+dri" class="text-xs text-ink-400 flex items-center gap-1.5">
79
79
  <span class="badge text-[9px] bg-gray-50 text-gray-600">{{ relationshipLabel(dr.type ?? '') }}</span>
80
- <template v-if="getDesignationTarget(dr)">
81
- <span class="italic">{{ getDesignationTarget(dr) }}</span>
80
+ <template v-if="getDesignationTarget(dr as any)">
81
+ <span class="italic">{{ getDesignationTarget(dr as any) }}</span>
82
82
  </template>
83
- <button v-else-if="'ref' in dr && dr.ref" @click="emit('navigate-related', dr.ref)" class="concept-link">{{ resolvedLabel(dr) }}</button>
84
- <span v-else>{{ resolvedLabel(dr) }}</span>
83
+ <button v-else-if="'ref' in dr && dr.ref" @click="emit('navigate-related', dr.ref)" class="concept-link">{{ resolvedLabel(dr as any) }}</button>
84
+ <span v-else>{{ resolvedLabel(dr as any) }}</span>
85
85
  </div>
86
86
  </div>
87
87
  </div>
@@ -10,6 +10,7 @@ const icons: Record<string, string> = {
10
10
  list: 'M4 6h16M4 10h16M4 14h16M4 18h16',
11
11
  schema: 'M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z',
12
12
  database: 'M4 7c0 1.1 3.6 2 8 2s8-.9 8-2M4 7c0-1.1 3.6-2 8-2s8 .9 8 2M4 7v10c0 1.1 3.6 2 8 2s8-.9 8-2V7M4 12c0 1.1 3.6 2 8 2s8-.9 8-2',
13
+ book: 'M12 6.042A8.967 8.967 0 006 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 016 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 016-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0018 18a8.967 8.967 0 00-6 2.292m0-14.25v14.25',
13
14
  };
14
15
 
15
16
  defineProps<{ name: string }>();
@@ -1419,7 +1419,7 @@ defineExpose({ navigate });
1419
1419
  <span class="sp-count">{{ item.count }}</span>
1420
1420
  </button>
1421
1421
  <router-link class="sp-legend-label"
1422
- :to="{ name: 'relation-types', hash: '#' + item.type }"
1422
+ :to="{ name: 'learn-relationships', hash: '#' + item.type }"
1423
1423
  :title="t('sphere.learnAbout') + ': ' + item.label">{{ item.label }}</router-link>
1424
1424
  </div>
1425
1425
  </div>
@@ -50,8 +50,8 @@ const topLevelImages = computed(() => fig.value?.images ?? []);
50
50
  >
51
51
  <div v-if="topLevelImages.length" :class="`figure__media figure__media--${layout}`">
52
52
  <FigureImages
53
- :images="topLevelImages"
54
- :alt="fig.alt"
53
+ :images="[...topLevelImages]"
54
+ :alt="(fig.alt as any)"
55
55
  :dataset-id="datasetId"
56
56
  :locale="locale"
57
57
  :fallback-chain="fallbackChain"
@@ -76,8 +76,8 @@ const topLevelImages = computed(() => fig.value?.images ?? []);
76
76
 
77
77
  <NonVerbalCaption
78
78
  :identifier="fig.identifier"
79
- :caption="fig.caption"
80
- :description="fig.description"
79
+ :caption="(fig.caption as any)"
80
+ :description="(fig.description as any)"
81
81
  :locale="locale"
82
82
  :fallback-chain="fallbackChain"
83
83
  :description-id="descriptionId"
@@ -85,7 +85,7 @@ const topLevelImages = computed(() => fig.value?.images ?? []);
85
85
 
86
86
  <NonVerbalSources
87
87
  v-if="fig.sources?.length"
88
- :sources="fig.sources"
88
+ :sources="[...(fig.sources || [])]"
89
89
  />
90
90
  </figure>
91
91
 
@@ -41,7 +41,7 @@ const descriptionId = computed(() => `${anchor.value}-desc`);
41
41
  >
42
42
  <div class="formula__expr-line">
43
43
  <FormulaExpression
44
- :expression="form.expression"
44
+ :expression="(form.expression as any)"
45
45
  :notation="(form.notation as FormulaNotation | null)"
46
46
  :locale="locale"
47
47
  :fallback-chain="fallbackChain"
@@ -50,8 +50,8 @@ const descriptionId = computed(() => `${anchor.value}-desc`);
50
50
 
51
51
  <NonVerbalCaption
52
52
  :identifier="form.identifier"
53
- :caption="form.caption"
54
- :description="form.description"
53
+ :caption="(form.caption as any)"
54
+ :description="(form.description as any)"
55
55
  :locale="locale"
56
56
  :fallback-chain="fallbackChain"
57
57
  :description-id="descriptionId"
@@ -59,7 +59,7 @@ const descriptionId = computed(() => `${anchor.value}-desc`);
59
59
 
60
60
  <NonVerbalSources
61
61
  v-if="form.sources?.length"
62
- :sources="form.sources"
62
+ :sources="[...(form.sources || [])]"
63
63
  />
64
64
  </figure>
65
65
 
@@ -0,0 +1,71 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * DimensionCard — structured breakdown of a single dimension along
4
+ * which hyperedge members vary. Used on /learn/relationships for the
5
+ * partitive dimensions (presence, count, delimiting).
6
+ *
7
+ * Renders one row per value showing:
8
+ * - the raw value (machine key)
9
+ * - the human label
10
+ * - a short meaning (what it encodes)
11
+ * - a small visual representation (slot — typically a mini SVG)
12
+ *
13
+ * The user's specific concern: "individually show what dimensions
14
+ * there are and how lines look like". This component is the answer.
15
+ */
16
+ export interface DimensionValue {
17
+ value: string;
18
+ label: string;
19
+ meaning: string;
20
+ }
21
+
22
+ defineProps<{
23
+ id?: string;
24
+ name: string;
25
+ isoReference?: string;
26
+ /** Plain-language summary of what this dimension captures. */
27
+ summary: string;
28
+ values: readonly DimensionValue[];
29
+ }>();
30
+ </script>
31
+
32
+ <template>
33
+ <article :id="id" class="dimension-card card p-5 scroll-mt-20">
34
+ <header class="flex items-baseline justify-between gap-3 mb-2 flex-wrap">
35
+ <h4 class="text-base font-semibold text-ink-800 dark:text-ink-50">{{ name }}</h4>
36
+ <span v-if="isoReference" class="text-xs font-mono text-ink-400 dark:text-ink-500">
37
+ {{ isoReference }}
38
+ </span>
39
+ </header>
40
+ <p class="text-sm text-ink-600 dark:text-ink-200 mb-4">{{ summary }}</p>
41
+ <ul class="dimension-values space-y-3">
42
+ <li v-for="v in values" :key="v.value" class="dimension-value-row">
43
+ <div class="flex items-center gap-3">
44
+ <div class="dimension-visual">
45
+ <slot name="visual" :value="v.value" />
46
+ </div>
47
+ <div class="flex-1 min-w-0">
48
+ <div class="flex items-baseline gap-2 flex-wrap">
49
+ <span class="font-medium text-ink-800 dark:text-ink-100">{{ v.label }}</span>
50
+ <code class="text-xs text-ink-400 dark:text-ink-500 font-mono">{{ v.value }}</code>
51
+ </div>
52
+ <p class="text-sm text-ink-600 dark:text-ink-300 mt-0.5">{{ v.meaning }}</p>
53
+ </div>
54
+ </div>
55
+ </li>
56
+ </ul>
57
+ </article>
58
+ </template>
59
+
60
+ <style scoped>
61
+ .dimension-card {
62
+ scroll-margin-top: 5rem;
63
+ }
64
+ .dimension-visual {
65
+ flex-shrink: 0;
66
+ width: 48px;
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ }
71
+ </style>
@@ -0,0 +1,59 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * LearnCard — the standard topic container across all /learn pages.
4
+ *
5
+ * Layout: title + ISO reference on top, then a flexible body. Optional
6
+ * named slots:
7
+ * - `diagram` — a small visual (live SVG, badge samples, etc.)
8
+ * - `example` — a concrete real-world example
9
+ * Optional `learnMoreUrl` renders a "Learn more on glossarist.org"
10
+ * link at the bottom — keeps concept-browser reader-focused while
11
+ * bridging to the canonical author docs on glossarist.org.
12
+ *
13
+ * Anchored at the `id` prop so URLs like `/learn/relationships#partitive`
14
+ * deep-link to the right card.
15
+ */
16
+ defineProps<{
17
+ id?: string;
18
+ title: string;
19
+ isoReference?: string;
20
+ learnMoreUrl?: string;
21
+ learnMoreLabel?: string;
22
+ }>();
23
+ </script>
24
+
25
+ <template>
26
+ <article :id="id" class="learn-card card p-5 scroll-mt-20">
27
+ <header class="flex items-baseline justify-between gap-3 mb-3 flex-wrap">
28
+ <h3 class="text-lg font-semibold text-ink-800 dark:text-ink-50">{{ title }}</h3>
29
+ <span v-if="isoReference" class="text-xs font-mono text-ink-400 dark:text-ink-500">
30
+ {{ isoReference }}
31
+ </span>
32
+ </header>
33
+ <div v-if="$slots.diagram" class="learn-card-diagram mb-3">
34
+ <slot name="diagram" />
35
+ </div>
36
+ <div class="learn-card-body text-sm text-ink-600 dark:text-ink-200">
37
+ <slot />
38
+ </div>
39
+ <div v-if="$slots.example" class="learn-card-example mt-3 pt-3 border-t border-ink-100 dark:border-ink-700 text-xs text-ink-500 dark:text-ink-400">
40
+ <slot name="example" />
41
+ </div>
42
+ <footer v-if="learnMoreUrl" class="learn-card-footer mt-3 text-xs">
43
+ <a :href="learnMoreUrl" target="_blank" rel="noopener"
44
+ class="text-ink-500 dark:text-ink-400 hover:text-ink-800 dark:hover:text-ink-100 underline">
45
+ {{ learnMoreLabel ?? 'Learn more on glossarist.org' }} ↗
46
+ </a>
47
+ </footer>
48
+ </article>
49
+ </template>
50
+
51
+ <style scoped>
52
+ .learn-card {
53
+ scroll-margin-top: 5rem;
54
+ }
55
+ .learn-card-diagram {
56
+ display: flex;
57
+ justify-content: center;
58
+ }
59
+ </style>
@@ -65,8 +65,8 @@ const markup = computed(() => {
65
65
 
66
66
  <NonVerbalCaption
67
67
  :identifier="table.identifier"
68
- :caption="table.caption"
69
- :description="table.description"
68
+ :caption="(table.caption as any)"
69
+ :description="(table.description as any)"
70
70
  :locale="locale"
71
71
  :fallback-chain="fallbackChain"
72
72
  :description-id="descriptionId"
@@ -74,7 +74,7 @@ const markup = computed(() => {
74
74
 
75
75
  <NonVerbalSources
76
76
  v-if="table.sources?.length"
77
- :sources="table.sources"
77
+ :sources="[...(table.sources || [])]"
78
78
  />
79
79
  </figure>
80
80
 
@@ -8,12 +8,21 @@ import {
8
8
  writeTurtleSync,
9
9
  collectQuads,
10
10
  PREFIXES,
11
- type ClassInstance,
12
- type PropValue,
13
- type Quad,
14
11
  } from 'glossarist/rdf';
12
+ import type { Quad } from '@rdfjs/types';
15
13
 
16
- export type { ClassInstance, PropValue };
14
+ export interface PropValue {
15
+ predicate: string;
16
+ values: string[];
17
+ nested?: boolean;
18
+ }
19
+
20
+ export interface ClassInstance {
21
+ classId: string;
22
+ classLabel: string;
23
+ label: string;
24
+ props: PropValue[];
25
+ }
17
26
 
18
27
  export interface RdfDocument {
19
28
  sections: ComputedRef<ClassInstance[]>;
@@ -111,10 +120,10 @@ export function useRdfDocument(
111
120
  const concept = getConcept();
112
121
  const uri = getConceptUri();
113
122
  const conceptQuads = collectQuads(
114
- conceptToQuads(concept, {
123
+ conceptToQuads(concept as any, {
115
124
  registerId: options.registerId ?? '',
116
125
  uriBase: options.uriBase ?? '',
117
- }),
126
+ }) as any,
118
127
  );
119
128
  const provenanceQuads = collectQuads(
120
129
  provenanceToQuads({
@@ -122,7 +131,7 @@ export function useRdfDocument(
122
131
  serializer: 'concept-browser',
123
132
  serializerVersion: SERIALIZER_VERSION,
124
133
  generatedAt: new Date().toISOString(),
125
- }),
134
+ }) as any,
126
135
  );
127
136
  return [...conceptQuads, ...provenanceQuads];
128
137
  });
@@ -101,14 +101,14 @@ export function useConceptContent(
101
101
  renderedAnnotations: annotations.map((a: string) => renderContent(a, opts)),
102
102
  notes,
103
103
  examples,
104
- sources: lc.sources,
105
- designations: lc.terms,
104
+ sources: [...lc.sources],
105
+ designations: [...lc.terms],
106
106
  renderedDesignations: new Map(lc.terms.map(d => [d.designation, renderContent(d.designation)])),
107
107
  entryStatus: lc.entryStatus ?? '',
108
108
  classification: lc.classification,
109
109
  reviewType: lc.reviewType,
110
110
  release: lc.release,
111
- lineageSourceSimilarity: lc.lineageSourceSimilarity,
111
+ lineageSourceSimilarity: (lc.lineageSourceSimilarity as any),
112
112
  lcScript: lc.script,
113
113
  lcSystem: lc.system,
114
114
  });
@@ -211,8 +211,8 @@ export function useConceptDiff() {
211
211
  error.value = null;
212
212
  try {
213
213
  diffResult.value = diffConcepts(
214
- oldData ? toDiffableConcept(oldData) : null,
215
- newData ? toDiffableConcept(newData) : null,
214
+ (oldData ? toDiffableConcept(oldData) : null) as any,
215
+ (newData ? toDiffableConcept(newData) : null) as any,
216
216
  );
217
217
  } catch (e: unknown) {
218
218
  error.value = e instanceof Error ? e.message : String(e);
@@ -7,7 +7,7 @@ import type { Concept, RelatedConcept, ConceptRef } from 'glossarist';
7
7
  import { PartitiveHyperedge } from 'glossarist';
8
8
  import { GenericHyperedge } from 'glossarist/models';
9
9
  import type {
10
- PartitiveRelation as GlsPartitiveRelation,
10
+ PartitiveHyperedge as GlsPartitiveRelation,
11
11
  PartitiveMember as GlsPartitiveMember,
12
12
  } from 'glossarist/models';
13
13
  import type {
@@ -39,7 +39,7 @@ export interface EdgeDisplay {
39
39
  }
40
40
 
41
41
  export function useConceptEdges(
42
- concept: ComputedRef<Concept | null | undefined>,
42
+ concept: ComputedRef<any>,
43
43
  registerId: ComputedRef<string>,
44
44
  manifest: ComputedRef<Manifest | null | undefined>,
45
45
  edges: ComputedRef<GraphEdge[]>,
@@ -138,7 +138,7 @@ export function useConceptEdges(
138
138
  // Concept-level related concepts (managed concept cross-references)
139
139
  const conceptRelated = computed(() => {
140
140
  if (!concept.value) return [];
141
- const direct = concept.value.relatedConcepts?.filter(rc => !INVERSE_RELATIONSHIPS[rc.type]) ?? [];
141
+ const direct = concept.value.relatedConcepts?.filter((rc: any) => !INVERSE_RELATIONSHIPS[rc.type]) ?? [];
142
142
  const derived = incomingEdges.value
143
143
  .filter(e => INVERSE_RELATIONSHIPS[e.type])
144
144
  .map(e => {
@@ -35,7 +35,7 @@ export const PAGE_TYPES: readonly PageTypeDefinition[] = [
35
35
  { type: 'stats', route: 'stats', title: 'Statistics', icon: 'chart', scope: 'dataset', featureFlag: '!stats', autoSynthesize: true },
36
36
  { type: 'sources', route: 'sources', title: 'Sources', icon: 'database', scope: 'dataset', autoSynthesize: true },
37
37
  { type: 'about', route: 'about', title: 'About', icon: 'info', scope: 'dataset', featureFlag: '!about', autoSynthesize: true },
38
- { type: 'relation-types', route: 'relation-types', title: 'Relation Types', icon: 'schema', scope: 'global', autoSynthesize: true },
38
+ { type: 'learn', route: 'learn', title: 'Learn', icon: 'book', scope: 'global', autoSynthesize: true },
39
39
  ] as const;
40
40
 
41
41
  export type BuiltinPageType = typeof PAGE_TYPES[number]['type'];
@@ -13,16 +13,121 @@ nav.sources: Sources
13
13
  nav.navigation: Navigation
14
14
  nav.datasets: Datasets
15
15
  nav.relationTypes: Relation Types
16
+ nav.learn: Learn
16
17
 
17
- # Relation Types teaching page
18
- relationTypes.intro: What each line shape and label means in this site. Diagrams use the same renderers as the Relation Sphere, so what you see here is what you'll see in the wild.
19
- relationTypes.hyperedgeSection: Hyperedge relations (one-to-many)
20
- relationTypes.bilateralSection: Bilateral relations (one-to-one)
21
- relationTypes.isoStandard: ISO standard
22
- relationTypes.example: Example
23
- relationTypes.category: Category
24
- relationTypes.diagram: Diagram
25
- relationTypes.notInDataset: Not used in the current dataset
18
+ # Learn section (reader-focused teaching)
19
+ learn.intro: This section explains what you see on this site and what each label means. For canonical methodology docs (authoring datasets, ISO alignment), see glossarist.org.
20
+ learn.glossaristOrgNote: Methodology documentation for dataset authors lives on glossarist.org.
21
+ learn.example: Example
22
+ learn.learnMore: Learn more on glossarist.org
23
+ learn.relationships.title: Relationships
24
+ learn.relationships.short: How to read the bilateral edges, partitive rake, and general pipe-and-thread.
25
+ learn.relationships.intro: Every line and label on the Relation Sphere, the detail page, and the graph view maps to a typed semantic relation. This page explains what each kind means and how to read its visual encoding.
26
+ learn.relationships.bilateralSection: Bilateral relations (one-to-one)
27
+ learn.relationships.bilateralIntro: One-to-one typed relations between two concepts. Drawn as straight colored lines with arrowheads in the sphere.
28
+ learn.relationships.partitiveSection: Partitive hyperedge (one-to-many)
29
+ learn.relationships.partitiveTitle: partitive relation
30
+ learn.relationships.partitiveBody: A whole/part decomposition. The comprehensive concept is the whole; each member is a part. Rendered as a rake — a stem from the comprehensive to a perpendicular spine, with teeth dropping to each partitive member.
31
+ learn.relationships.generalSection: General hyperedge (one-to-many)
32
+ learn.relationships.generalTitle: general relation
33
+ learn.relationships.generalBody: A genus/species decomposition. The comprehensive concept is the genus; each member is a coordinate species differing along a shared dimension. Rendered as a tree branch — a thick parent pipe from the comprehensive to a middle node, with thin threads radiating to each member.
34
+ learn.relationships.criterionTitle: Criterion of subdivision
35
+ learn.relationships.criterionBody: "The dimension along which coordinate concepts differ. Shown once on the parent pipe body. Optional: when no criterion is described, no label is drawn."
36
+ learn.relationships.thickThinTitle: Thick/thin hierarchy
37
+ learn.relationships.thickThinBody: ISO 704 traditionally uses thicker lines to mark different criteria of subdivision (multidimensionality). The pipe-and-thread honors this with a thick parent pipe (3.2px) and thinner child threads (1.0px) — the tree-branch metaphor (trunk vs twigs).
38
+ learn.dimensions.sectionTitle: Partitive dimensions (how to read the rake teeth)
39
+ learn.dimensions.presence.title: Presence
40
+ learn.dimensions.presence.summary: Whether the part must be present (compulsory) or may be absent (optional).
41
+ learn.dimensions.presence.required.label: required
42
+ learn.dimensions.presence.required.meaning: The part must be present. Drawn as a solid line.
43
+ learn.dimensions.presence.optional.label: optional
44
+ learn.dimensions.presence.optional.meaning: The part may be absent. Drawn as a dashed line.
45
+ learn.dimensions.count.title: Count
46
+ learn.dimensions.count.summary: How many instances of the part occur in the whole.
47
+ learn.dimensions.count.exactly_one.label: exactly one
48
+ learn.dimensions.count.exactly_one.meaning: One and only one. Drawn as a single line.
49
+ learn.dimensions.count.at_least_one.label: at least one
50
+ learn.dimensions.count.at_least_one.meaning: One or more. Drawn as a double line, the secondary dashed ("possibly more").
51
+ learn.dimensions.count.multiple.label: multiple
52
+ learn.dimensions.count.multiple.meaning: Two or more. Drawn as a double line, both the same style as the primary.
53
+ learn.dimensions.delimiting.title: Delimiting
54
+ learn.dimensions.delimiting.summary: Whether the part reflects a delimiting characteristic — one that distinguishes the whole from coordinate concepts.
55
+ learn.dimensions.delimiting.false.label: not delimiting
56
+ learn.dimensions.delimiting.false.meaning: An ordinary part. Drawn at normal stroke width (1.5px).
57
+ learn.dimensions.delimiting.true.label: delimiting
58
+ learn.dimensions.delimiting.true.meaning: The part is essential to the whole's identity. Drawn at 3× normal stroke width (4.5px).
59
+ learn.dimensions.combinationsTitle: Valid multiplicity combinations
60
+ learn.dimensions.combinationsDescription: ISO 704 description
61
+ learn.dimensions.combinationsModel: Our model
62
+ learn.dimensions.combinationsVisual: Visual
63
+ learn.dimensions.combo.compulsory: compulsory
64
+ learn.dimensions.combo.atLeastOne: at least one
65
+ learn.dimensions.combo.optional: optional
66
+ learn.dimensions.combo.optionalMultiple: optional multiple
67
+ learn.dimensions.combo.compulsoryMultiple: compulsory multiple
68
+ learn.dimensions.invalidDescription: (invalid)
69
+ learn.dimensions.invalidModel: optional + at_least_one
70
+ learn.dimensions.invalidReason: Vacuous — collapses to optional + multiple (0..*). Rejected by glossarist-js.
71
+ learn.designations.title: Designations
72
+ learn.designations.short: Terms and symbols — preferred, admitted, deprecated, full form, abbreviation, acronym, initialism.
73
+ learn.designations.intro: Concepts are designated by terms, proper names, and symbols. This page explains the vocabulary you'll see on each concept page.
74
+ learn.designations.normativeSection: Normative status
75
+ learn.designations.normativeIntro: Each term carries a normative rating from the standardizing body. There can be MORE THAN ONE of each rating — preferred terms aren't unique.
76
+ learn.designations.preferred.label: preferred term
77
+ learn.designations.preferred.meaning: The primary term for the concept, rated by a standardizing body.
78
+ learn.designations.preferred.multipleNote: There can be more than one preferred term.
79
+ learn.designations.admitted.label: admitted term
80
+ learn.designations.admitted.meaning: A synonym for the preferred term, but not rated as preferred.
81
+ learn.designations.admitted.multipleNote: There can be more than one admitted term.
82
+ learn.designations.deprecated.label: deprecated term
83
+ learn.designations.deprecated.meaning: A synonym for the preferred term, but rated as undesired.
84
+ learn.designations.deprecated.multipleNote: There can be more than one deprecated term.
85
+ learn.designations.kindsSection: Kinds and forms of term
86
+ learn.designations.fullForm.label: full form
87
+ learn.designations.fullForm.meaning: The complete representation of a designation.
88
+ learn.designations.abbreviatedForm.label: abbreviated form
89
+ learn.designations.abbreviatedForm.meaning: A representation resulting from the omission of any part of the full form.
90
+ learn.designations.abbreviatedForm.multipleNote: For some full forms, two or more abbreviated forms may exist.
91
+ learn.designations.borrowed.label: borrowed term
92
+ learn.designations.borrowed.meaning: A term taken from another language or from another domain.
93
+ learn.designations.variant.label: variant
94
+ learn.designations.variant.meaning: One of the alternative forms of a designation (e.g. spelling differences across regions).
95
+ learn.designations.typesSection: Designation types
96
+ learn.designations.typesIntro: Three top-level types — terms, proper names, and symbols. Within terms, abbreviations split further into acronyms vs initialisms based on how they're pronounced.
97
+ learn.designations.term.label: term (expression)
98
+ learn.designations.term.meaning: A spoken or written designation — the most common type.
99
+ learn.designations.acronym.label: acronym
100
+ learn.designations.acronym.meaning: An abbreviated form pronounced as a single word.
101
+ learn.designations.initialism.label: initialism
102
+ learn.designations.initialism.meaning: An abbreviated form pronounced letter by letter.
103
+ learn.designations.symbol.label: symbol
104
+ learn.designations.symbol.meaning: A graphical or mathematical designation governed by ISO 80000 / IEC 60027.
105
+ learn.statuses.title: Statuses
106
+ learn.statuses.short: Entry status (valid/withdrawn/draft), normative status, source status — what each badge means.
107
+ learn.statuses.intro: Status badges appear throughout the site. This page is a quick reference for what each one means.
108
+ learn.statuses.entrySection: Entry status
109
+ learn.statuses.entry.valid.label: valid
110
+ learn.statuses.entry.valid.meaning: The concept entry is currently in force.
111
+ learn.statuses.entry.withdrawn.label: withdrawn
112
+ learn.statuses.entry.withdrawn.meaning: The entry has been removed from active use.
113
+ learn.statuses.entry.draft.label: draft
114
+ learn.statuses.entry.draft.meaning: The entry is under development and not yet finalized.
115
+ learn.statuses.entry.superseded.label: superseded
116
+ learn.statuses.entry.superseded.meaning: The entry has been replaced by a newer one.
117
+ learn.statuses.normativeSection: Normative status
118
+ learn.statuses.normativeTitle: preferred / admitted / deprecated
119
+ learn.statuses.normativeSummary: Per-term rating (preferred, admitted, deprecated). Each rating can apply to more than one term per concept.
120
+ learn.statuses.normativeGoDeeper: See designation types for examples
121
+ learn.statuses.sourceSection: Source status
122
+ learn.statuses.sourceIntro: Each citation carries a status describing how faithfully it reproduces the source.
123
+ learn.statuses.source.identical.label: identical
124
+ learn.statuses.source.identical.meaning: The definition matches the source verbatim.
125
+ learn.statuses.source.modified.label: modified
126
+ learn.statuses.source.modified.meaning: The definition is adapted from the source with editorial changes.
127
+ learn.statuses.source.restyled.label: restyled
128
+ learn.statuses.source.restyled.meaning: The definition preserves the source meaning but rewords it heavily.
129
+ learn.statuses.source.lineage.label: lineage
130
+ learn.statuses.source.lineage.meaning: The source is the historical ancestor of this concept, not a direct citation.
26
131
 
27
132
  # Home page
28
133
  home.search: Search
@@ -12,16 +12,121 @@ nav.about: À propos
12
12
  nav.navigation: Navigation
13
13
  nav.datasets: Jeux de données
14
14
  nav.relationTypes: Types de relations
15
+ nav.learn: Apprendre
15
16
 
16
- # Page enseignante « Types de relations »
17
- relationTypes.intro: Ce que chaque forme de ligne et étiquette signifie sur ce site. Les diagrammes utilisent les mêmes rendus que la Sphère de relations — ce que vous voyez ici correspond à ce que vous verrez en navigation.
18
- relationTypes.hyperedgeSection: Relations hyper-arêtes (un-plusieurs)
19
- relationTypes.bilateralSection: Relations bilatérales (un-un)
20
- relationTypes.isoStandard: Norme ISO
21
- relationTypes.example: Exemple
22
- relationTypes.category: Catégorie
23
- relationTypes.diagram: Diagramme
24
- relationTypes.notInDataset: Non utilisé dans le jeu de données courant
17
+ # Section « Apprendre » (enseignement orienté lecteur)
18
+ learn.intro: Cette section explique ce que vous voyez sur ce site et ce que chaque étiquette signifie. Pour la documentation méthodologique canonique (rédaction de jeux de données, alignement ISO), consultez glossarist.org.
19
+ learn.glossaristOrgNote: La documentation méthodologique pour les auteurs de jeux de données se trouve sur glossarist.org.
20
+ learn.example: Exemple
21
+ learn.learnMore: En savoir plus sur glossarist.org
22
+ learn.relationships.title: Relations
23
+ learn.relationships.short: Comment lire les arêtes bilatérales, le râteau partitif, et le tuyau-fil générique.
24
+ learn.relationships.intro: Chaque ligne et étiquette de la Sphère de relations, de la page de détail et de la vue graphe correspond à une relation sémantique typée. Cette page explique ce que chaque type signifie et comment lire son encodage visuel.
25
+ learn.relationships.bilateralSection: Relations bilatérales (un-un)
26
+ learn.relationships.bilateralIntro: Relations typées un-un entre deux concepts. Dessinées sous forme de lignes droites colorées avec flèches dans la sphère.
27
+ learn.relationships.partitiveSection: Hyper-arête partitive (un-plusieurs)
28
+ learn.relationships.partitiveTitle: relation partitive
29
+ learn.relationships.partitiveBody: Décomposition tout/partie. Le concept englobant est le tout ; chaque membre est une partie. Rendu sous forme de râteau — une tige depuis l'englobant vers une colonne perpendiculaire, avec des dents descendant vers chaque membre.
30
+ learn.relationships.generalSection: Hyper-arête générique (un-plusieurs)
31
+ learn.relationships.generalTitle: relation générique
32
+ learn.relationships.generalBody: Décomposition genre/espèce. Le concept englobant est le genre ; chaque membre est une espèce coordonnée différant selon une dimension partagée. Rendu sous forme de branche d'arbre — un tuyau parent épais depuis l'englobant vers un nœud central, avec des fils fins rayonnant vers chaque membre.
33
+ learn.relationships.criterionTitle: Critère de subdivision
34
+ learn.relationships.criterionBody: "La dimension selon laquelle les concepts coordonnés diffèrent. Affichée une fois sur le corps du tuyau parent. Optionnelle : si aucun critère n'est décrit, aucune étiquette n'est dessinée."
35
+ learn.relationships.thickThinTitle: Hiérarchie épais/mince
36
+ learn.relationships.thickThinBody: ISO 704 utilise traditionnellement des lignes plus épaisses pour marquer différents critères de subdivision (multidimensionalité). Le tuyau-fil respecte cela avec un tuyau parent épais (3,2 px) et des fils enfants plus fins (1,0 px) — la métaphore de la branche d'arbre (tronc vs rameaux).
37
+ learn.dimensions.sectionTitle: Dimensions partitives (comment lire les dents du râteau)
38
+ learn.dimensions.presence.title: Présence
39
+ learn.dimensions.presence.summary: Indique si la partie doit être présente (obligatoire) ou peut être absente (optionnelle).
40
+ learn.dimensions.presence.required.label: obligatoire
41
+ learn.dimensions.presence.required.meaning: La partie doit être présente. Dessinée en ligne pleine.
42
+ learn.dimensions.presence.optional.label: optionnelle
43
+ learn.dimensions.presence.optional.meaning: La partie peut être absente. Dessinée en ligne pointillée.
44
+ learn.dimensions.count.title: Nombre
45
+ learn.dimensions.count.summary: Combien d'instances de la partie apparaissent dans le tout.
46
+ learn.dimensions.count.exactly_one.label: exactement un
47
+ learn.dimensions.count.exactly_one.meaning: Un et un seul. Dessiné en ligne simple.
48
+ learn.dimensions.count.at_least_one.label: au moins un
49
+ learn.dimensions.count.at_least_one.meaning: Un ou plusieurs. Dessiné en ligne double, la secondaire pointillée (« possiblement plus »).
50
+ learn.dimensions.count.multiple.label: plusieurs
51
+ learn.dimensions.count.multiple.meaning: Deux ou plusieurs. Dessiné en ligne double, les deux de même style que la primaire.
52
+ learn.dimensions.delimiting.title: Délimitation
53
+ learn.dimensions.delimiting.summary: Indique si la partie reflète une caractéristique délimitante — qui distingue le tout des concepts coordonnés.
54
+ learn.dimensions.delimiting.false.label: non délimitante
55
+ learn.dimensions.delimiting.false.meaning: Une partie ordinaire. Dessinée à largeur de trait normale (1,5 px).
56
+ learn.dimensions.delimiting.true.label: délimitante
57
+ learn.dimensions.delimiting.true.meaning: La partie est essentielle à l'identité du tout. Dessinée à largeur de trait 3× (4,5 px).
58
+ learn.dimensions.combinationsTitle: Combinaisons de multiplicité valides
59
+ learn.dimensions.combinationsDescription: Description ISO 704
60
+ learn.dimensions.combinationsModel: Notre modèle
61
+ learn.dimensions.combinationsVisual: Visuel
62
+ learn.dimensions.combo.compulsory: obligatoire
63
+ learn.dimensions.combo.atLeastOne: au moins un
64
+ learn.dimensions.combo.optional: optionnel
65
+ learn.dimensions.combo.optionalMultiple: optionnel multiple
66
+ learn.dimensions.combo.compulsoryMultiple: obligatoire multiple
67
+ learn.dimensions.invalidDescription: (invalide)
68
+ learn.dimensions.invalidModel: optional + at_least_one
69
+ learn.dimensions.invalidReason: Vacuous — se réduit à optional + multiple (0..*). Rejeté par glossarist-js.
70
+ learn.designations.title: Désignations
71
+ learn.designations.short: Termes et symboles — préféré, admis, déconseillé, forme complète, abréviation, acronyme, sigle.
72
+ learn.designations.intro: Les concepts sont désignés par des termes, noms propres et symboles. Cette page explique le vocabulaire que vous verrez sur chaque page de concept.
73
+ learn.designations.normativeSection: Statut normatif
74
+ learn.designations.normativeIntro: Chaque terme porte un statut normatif attribué par l'organisme de normalisation. IL PEUT Y AVOIR PLUS D'UN terme de chaque statut — les termes préférés ne sont pas uniques.
75
+ learn.designations.preferred.label: terme préféré
76
+ learn.designations.preferred.meaning: Le terme principal pour le concept, attribué par l'organisme de normalisation.
77
+ learn.designations.preferred.multipleNote: Il peut y avoir plus d'un terme préféré.
78
+ learn.designations.admitted.label: terme admis
79
+ learn.designations.admitted.meaning: Un synonyme du terme préféré, mais non retenu comme préféré.
80
+ learn.designations.admitted.multipleNote: Il peut y avoir plus d'un terme admis.
81
+ learn.designations.deprecated.label: terme déconseillé
82
+ learn.designations.deprecated.meaning: Un synonyme du terme préféré, mais jugé indésirable.
83
+ learn.designations.deprecated.multipleNote: Il peut y avoir plus d'un terme déconseillé.
84
+ learn.designations.kindsSection: Types et formes de terme
85
+ learn.designations.fullForm.label: forme complète
86
+ learn.designations.fullForm.meaning: La représentation complète d'une désignation.
87
+ learn.designations.abbreviatedForm.label: forme abrégée
88
+ learn.designations.abbreviatedForm.meaning: Une représentation résultant de l'omission d'une partie de la forme complète.
89
+ learn.designations.abbreviatedForm.multipleNote: Pour certaines formes complètes, deux ou plusieurs formes abrégées peuvent exister.
90
+ learn.designations.borrowed.label: terme emprunté
91
+ learn.designations.borrowed.meaning: Un terme pris depuis une autre langue ou un autre domaine.
92
+ learn.designations.variant.label: variante
93
+ learn.designations.variant.meaning: L'une des formes alternatives d'une désignation (ex. différences d'orthographe entre régions).
94
+ learn.designations.typesSection: Types de désignation
95
+ learn.designations.typesIntro: Trois types de plus haut niveau — termes, noms propres et symboles. Pour les termes, les abréviations se divisent en acronymes vs sigles selon la prononciation.
96
+ learn.designations.term.label: terme (expression)
97
+ learn.designations.term.meaning: Une désignation parlée ou écrite — le type le plus courant.
98
+ learn.designations.acronym.label: acronyme
99
+ learn.designations.acronym.meaning: Une forme abrégée prononcée comme un seul mot.
100
+ learn.designations.initialism.label: sigle
101
+ learn.designations.initialism.meaning: Une forme abrégée prononcée lettre par lettre.
102
+ learn.designations.symbol.label: symbole
103
+ learn.designations.symbol.meaning: Une désignation graphique ou mathématique régie par ISO 80000 / IEC 60027.
104
+ learn.statuses.title: Statuts
105
+ learn.statuses.short: Statut d'entrée (valide/retiré/brouillon), statut normatif, statut de source — ce que chaque badge signifie.
106
+ learn.statuses.intro: Les badges de statut apparaissent partout sur le site. Cette page est une référence rapide pour leur signification.
107
+ learn.statuses.entrySection: Statut d'entrée
108
+ learn.statuses.entry.valid.label: valide
109
+ learn.statuses.entry.valid.meaning: L'entrée du concept est actuellement en vigueur.
110
+ learn.statuses.entry.withdrawn.label: retiré
111
+ learn.statuses.entry.withdrawn.meaning: L'entrée a été retirée de l'usage actif.
112
+ learn.statuses.entry.draft.label: brouillon
113
+ learn.statuses.entry.draft.meaning: L'entrée est en cours de développement et non finalisée.
114
+ learn.statuses.entry.superseded.label: remplacé
115
+ learn.statuses.entry.superseded.meaning: L'entrée a été remplacée par une plus récente.
116
+ learn.statuses.normativeSection: Statut normatif
117
+ learn.statuses.normativeTitle: préféré / admis / déconseillé
118
+ learn.statuses.normativeSummary: Statut par terme (préféré, admis, déconseillé). Chaque statut peut s'appliquer à plus d'un terme par concept.
119
+ learn.statuses.normativeGoDeeper: Voir les types de désignation pour des exemples
120
+ learn.statuses.sourceSection: Statut de source
121
+ learn.statuses.sourceIntro: Chaque citation porte un statut décrivant la fidélité de sa reproduction de la source.
122
+ learn.statuses.source.identical.label: identique
123
+ learn.statuses.source.identical.meaning: La définition correspond verbatim à la source.
124
+ learn.statuses.source.modified.label: modifié
125
+ learn.statuses.source.modified.meaning: La définition est adaptée de la source avec des modifications éditoriales.
126
+ learn.statuses.source.restyled.label: reformulé
127
+ learn.statuses.source.restyled.meaning: La définition préserve le sens de la source mais la reformule largement.
128
+ learn.statuses.source.lineage.label: lignage
129
+ learn.statuses.source.lineage.meaning: La source est l'ancêtre historique de ce concept, pas une citation directe.
25
130
 
26
131
  # Home page
27
132
  home.search: Rechercher