@concordance-wiki/i18n 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +54 -0
- package/dist/messages/en/about.json +102 -0
- package/dist/messages/en/age.json +34 -0
- package/dist/messages/en/api.json +86 -0
- package/dist/messages/en/category.json +58 -0
- package/dist/messages/en/decision.json +62 -0
- package/dist/messages/en/document.json +150 -0
- package/dist/messages/en/drawer.json +6 -0
- package/dist/messages/en/entity.json +170 -0
- package/dist/messages/en/footer.json +82 -0
- package/dist/messages/en/home.json +78 -0
- package/dist/messages/en/index.json +70 -0
- package/dist/messages/en/keyword.json +98 -0
- package/dist/messages/en/meeting.json +94 -0
- package/dist/messages/en/mentions.json +10 -0
- package/dist/messages/en/nav.json +18 -0
- package/dist/messages/en/neighbourhood.json +50 -0
- package/dist/messages/en/notfound.json +30 -0
- package/dist/messages/en/panels.json +10 -0
- package/dist/messages/en/pins.json +46 -0
- package/dist/messages/en/related.json +70 -0
- package/dist/messages/en/results.json +70 -0
- package/dist/messages/en/search.json +58 -0
- package/dist/messages/en/site.json +46 -0
- package/dist/messages/en/space.json +38 -0
- package/dist/messages/en/spaces.json +30 -0
- package/dist/messages/en/time.json +6 -0
- package/dist/messages/en/todo.json +50 -0
- package/dist/messages/en/transcript.json +10 -0
- package/dist/messages/en.json +1066 -0
- package/dist/messages/fr/about.json +27 -0
- package/dist/messages/fr/age.json +10 -0
- package/dist/messages/fr/api.json +23 -0
- package/dist/messages/fr/category.json +16 -0
- package/dist/messages/fr/decision.json +17 -0
- package/dist/messages/fr/document.json +39 -0
- package/dist/messages/fr/drawer.json +3 -0
- package/dist/messages/fr/entity.json +44 -0
- package/dist/messages/fr/footer.json +22 -0
- package/dist/messages/fr/home.json +21 -0
- package/dist/messages/fr/index.json +19 -0
- package/dist/messages/fr/keyword.json +26 -0
- package/dist/messages/fr/meeting.json +25 -0
- package/dist/messages/fr/mentions.json +4 -0
- package/dist/messages/fr/nav.json +6 -0
- package/dist/messages/fr/neighbourhood.json +14 -0
- package/dist/messages/fr/notfound.json +9 -0
- package/dist/messages/fr/panels.json +4 -0
- package/dist/messages/fr/pins.json +13 -0
- package/dist/messages/fr/related.json +19 -0
- package/dist/messages/fr/results.json +19 -0
- package/dist/messages/fr/search.json +16 -0
- package/dist/messages/fr/site.json +13 -0
- package/dist/messages/fr/space.json +11 -0
- package/dist/messages/fr/spaces.json +9 -0
- package/dist/messages/fr/time.json +3 -0
- package/dist/messages/fr/todo.json +14 -0
- package/dist/messages/fr/transcript.json +4 -0
- package/dist/messages/fr.json +268 -0
- package/dist/src/area.d.ts +17 -0
- package/dist/src/area.d.ts.map +1 -0
- package/dist/src/area.js +2 -0
- package/dist/src/area.js.map +1 -0
- package/dist/src/areas/about.d.ts +166 -0
- package/dist/src/areas/about.d.ts.map +1 -0
- package/dist/src/areas/about.js +34 -0
- package/dist/src/areas/about.js.map +1 -0
- package/dist/src/areas/age.d.ts +61 -0
- package/dist/src/areas/age.d.ts.map +1 -0
- package/dist/src/areas/age.js +17 -0
- package/dist/src/areas/age.js.map +1 -0
- package/dist/src/areas/api.d.ts +139 -0
- package/dist/src/areas/api.d.ts.map +1 -0
- package/dist/src/areas/api.js +30 -0
- package/dist/src/areas/api.js.map +1 -0
- package/dist/src/areas/category.d.ts +106 -0
- package/dist/src/areas/category.d.ts.map +1 -0
- package/dist/src/areas/category.js +23 -0
- package/dist/src/areas/category.js.map +1 -0
- package/dist/src/areas/decision.d.ts +105 -0
- package/dist/src/areas/decision.d.ts.map +1 -0
- package/dist/src/areas/decision.js +24 -0
- package/dist/src/areas/decision.js.map +1 -0
- package/dist/src/areas/document.d.ts +235 -0
- package/dist/src/areas/document.d.ts.map +1 -0
- package/dist/src/areas/document.js +46 -0
- package/dist/src/areas/document.js.map +1 -0
- package/dist/src/areas/drawer.d.ts +15 -0
- package/dist/src/areas/drawer.d.ts.map +1 -0
- package/dist/src/areas/drawer.js +10 -0
- package/dist/src/areas/drawer.js.map +1 -0
- package/dist/src/areas/entity.d.ts +288 -0
- package/dist/src/areas/entity.d.ts.map +1 -0
- package/dist/src/areas/entity.js +51 -0
- package/dist/src/areas/entity.js.map +1 -0
- package/dist/src/areas/footer.d.ts +143 -0
- package/dist/src/areas/footer.d.ts.map +1 -0
- package/dist/src/areas/footer.js +29 -0
- package/dist/src/areas/footer.js.map +1 -0
- package/dist/src/areas/home.d.ts +142 -0
- package/dist/src/areas/home.d.ts.map +1 -0
- package/dist/src/areas/home.js +28 -0
- package/dist/src/areas/home.js.map +1 -0
- package/dist/src/areas/index.d.ts +121 -0
- package/dist/src/areas/index.d.ts.map +1 -0
- package/dist/src/areas/index.js +26 -0
- package/dist/src/areas/index.js.map +1 -0
- package/dist/src/areas/keyword.d.ts +169 -0
- package/dist/src/areas/keyword.d.ts.map +1 -0
- package/dist/src/areas/keyword.js +33 -0
- package/dist/src/areas/keyword.js.map +1 -0
- package/dist/src/areas/meeting.d.ts +157 -0
- package/dist/src/areas/meeting.d.ts.map +1 -0
- package/dist/src/areas/meeting.js +32 -0
- package/dist/src/areas/meeting.js.map +1 -0
- package/dist/src/areas/mentions.d.ts +25 -0
- package/dist/src/areas/mentions.d.ts.map +1 -0
- package/dist/src/areas/mentions.js +11 -0
- package/dist/src/areas/mentions.js.map +1 -0
- package/dist/src/areas/nav.d.ts +33 -0
- package/dist/src/areas/nav.d.ts.map +1 -0
- package/dist/src/areas/nav.js +13 -0
- package/dist/src/areas/nav.js.map +1 -0
- package/dist/src/areas/neighbourhood.d.ts +87 -0
- package/dist/src/areas/neighbourhood.d.ts.map +1 -0
- package/dist/src/areas/neighbourhood.js +21 -0
- package/dist/src/areas/neighbourhood.js.map +1 -0
- package/dist/src/areas/notfound.d.ts +51 -0
- package/dist/src/areas/notfound.d.ts.map +1 -0
- package/dist/src/areas/notfound.js +16 -0
- package/dist/src/areas/notfound.js.map +1 -0
- package/dist/src/areas/panels.d.ts +21 -0
- package/dist/src/areas/panels.d.ts.map +1 -0
- package/dist/src/areas/panels.js +11 -0
- package/dist/src/areas/panels.js.map +1 -0
- package/dist/src/areas/pins.d.ts +75 -0
- package/dist/src/areas/pins.d.ts.map +1 -0
- package/dist/src/areas/pins.js +20 -0
- package/dist/src/areas/pins.js.map +1 -0
- package/dist/src/areas/related.d.ts +111 -0
- package/dist/src/areas/related.d.ts.map +1 -0
- package/dist/src/areas/related.js +26 -0
- package/dist/src/areas/related.js.map +1 -0
- package/dist/src/areas/results.d.ts +119 -0
- package/dist/src/areas/results.d.ts.map +1 -0
- package/dist/src/areas/results.js +26 -0
- package/dist/src/areas/results.js.map +1 -0
- package/dist/src/areas/search.d.ts +95 -0
- package/dist/src/areas/search.d.ts.map +1 -0
- package/dist/src/areas/search.js +23 -0
- package/dist/src/areas/search.js.map +1 -0
- package/dist/src/areas/site.d.ts +77 -0
- package/dist/src/areas/site.d.ts.map +1 -0
- package/dist/src/areas/site.js +20 -0
- package/dist/src/areas/site.js.map +1 -0
- package/dist/src/areas/space.d.ts +67 -0
- package/dist/src/areas/space.d.ts.map +1 -0
- package/dist/src/areas/space.js +18 -0
- package/dist/src/areas/space.js.map +1 -0
- package/dist/src/areas/spaces.d.ts +55 -0
- package/dist/src/areas/spaces.d.ts.map +1 -0
- package/dist/src/areas/spaces.js +16 -0
- package/dist/src/areas/spaces.js.map +1 -0
- package/dist/src/areas/time.d.ts +17 -0
- package/dist/src/areas/time.d.ts.map +1 -0
- package/dist/src/areas/time.js +10 -0
- package/dist/src/areas/time.js.map +1 -0
- package/dist/src/areas/todo.d.ts +89 -0
- package/dist/src/areas/todo.d.ts.map +1 -0
- package/dist/src/areas/todo.js +21 -0
- package/dist/src/areas/todo.js.map +1 -0
- package/dist/src/areas/transcript.d.ts +21 -0
- package/dist/src/areas/transcript.d.ts.map +1 -0
- package/dist/src/areas/transcript.js +11 -0
- package/dist/src/areas/transcript.js.map +1 -0
- package/dist/src/areas.d.ts +2737 -0
- package/dist/src/areas.d.ts.map +1 -0
- package/dist/src/areas.js +60 -0
- package/dist/src/areas.js.map +1 -0
- package/dist/src/arguments.d.ts +15 -0
- package/dist/src/arguments.d.ts.map +1 -0
- package/dist/src/arguments.js +43 -0
- package/dist/src/arguments.js.map +1 -0
- package/dist/src/catalogue.d.ts +42 -0
- package/dist/src/catalogue.d.ts.map +1 -0
- package/dist/src/catalogue.js +94 -0
- package/dist/src/catalogue.js.map +1 -0
- package/dist/src/ids.d.ts +44 -0
- package/dist/src/ids.d.ts.map +1 -0
- package/dist/src/ids.js +34 -0
- package/dist/src/ids.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/intl.d.ts +35 -0
- package/dist/src/intl.d.ts.map +1 -0
- package/dist/src/intl.js +87 -0
- package/dist/src/intl.js.map +1 -0
- package/dist/src/labels.d.ts +8 -0
- package/dist/src/labels.d.ts.map +1 -0
- package/dist/src/labels.js +86 -0
- package/dist/src/labels.js.map +1 -0
- package/dist/src/shipped.d.ts +7 -0
- package/dist/src/shipped.d.ts.map +1 -0
- package/dist/src/shipped.js +10 -0
- package/dist/src/shipped.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# @concordance-wiki/i18n
|
|
2
|
+
|
|
3
|
+
Message catalogues of the generated site and their resolution at build time.
|
|
4
|
+
|
|
5
|
+
Every label of the site comes from a catalogue per language in ICU MessageFormat, stored as the JSON translation platforms exchange, one file per area of the site under `messages/<language>/`: an area is an identifier prefix (`home`, `entity`, `search`, `results`, `spaces`...), `messages/en/<area>.json` is its source, `{ "<id>": { "defaultMessage": "...", "description": "..." } }`, and `messages/<language>/<area>.json` its flat translation, `{ "<id>": "..." }`. Every key of a file is under the prefix the file is named after, and the keys are sorted. `en` and `fr` ship complete; a test checks that every locale carries every key of the source with the same variables and kinds.
|
|
6
|
+
|
|
7
|
+
Each area has a module under `src/areas/<area>.ts` that imports its two files and declares the ICU kind of every argument of every message of the area (`{ count: "plural" }`, `{}` for a message without any), checked by `satisfies` against the keys of the source file. `src/areas.ts` lists the areas in the order of their prefixes; the catalogue merges them in that order, so the identifiers read in sorted order. Identifiers are typed from that merge (`MessageId` is the union of the keys of every area), and `MessageArguments` derives the argument types from the declared kinds: an unknown identifier, a missing variable or an extra one does not compile. A unit test keeps the declared kinds aligned with what the ICU parser reads in the catalogue, and computes the number of messages from the files rather than pinning it.
|
|
8
|
+
|
|
9
|
+
## Adding an area
|
|
10
|
+
|
|
11
|
+
A new page or part of the site gets its own prefix and its own files: `messages/en/<area>.json`, `messages/fr/<area>.json`, `src/areas/<area>.ts` declaring the arguments, and one line in the `AREAS` list of `src/areas.ts` at the place of its prefix. The tests reject a file whose keys leave the prefix or are unsorted, a module whose declared kinds differ from the parsed messages, and an area listed out of order.
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { formatMessage, loadCatalogue, textDirection } from "@concordance-wiki/i18n";
|
|
17
|
+
|
|
18
|
+
const catalogue = loadCatalogue("fr-CA", { labels: theme.labels });
|
|
19
|
+
formatMessage(catalogue, "entity.mentionsCount", { count: 2 }); // "2 mentions"
|
|
20
|
+
formatMessage(catalogue, "site.generatedAt", { date }); // "Généré le 5 mars 2024"
|
|
21
|
+
textDirection(catalogue.locale); // "ltr", for the dir attribute of the page
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
`loadCatalogue` picks the shipped catalogue by language subtag (`fr-CA` uses `fr` and formats numbers, dates and plurals with `fr-CA`) and falls back to the source language when a language ships no catalogue (`de` gets the `en` messages formatted in `en`, with `catalogue.fallback` set). A malformed tag raises a `CatalogueError`. Dates inside messages are formatted in UTC unless `timeZone` says otherwise, so that two builds of the same corpus agree.
|
|
25
|
+
|
|
26
|
+
`formatDate`, `formatNumber` and `formatRelative` wrap `Intl.DateTimeFormat`, `Intl.NumberFormat` and `Intl.RelativeTimeFormat` for the values rendered outside a message; `formatRelative` picks the largest unit that fits and lets the platform say "yesterday" or "hier". `textDirection` reads the text information of `Intl.Locale` (`getTextInfo()` on engines that have it, the earlier `textInfo` accessor otherwise) and falls back to the likely script of the locale against a list of right-to-left scripts.
|
|
27
|
+
|
|
28
|
+
Messages are resolved at build: `formatMessage` returns final strings and the published HTML contains no message, no catalogue and no formatting library. Nothing in this package touches the DOM or is meant to run in a browser; a test checks that the sources reference no browser global.
|
|
29
|
+
|
|
30
|
+
## Overriding a label
|
|
31
|
+
|
|
32
|
+
The `labels` block of `theme.yaml` overrides any message, by language of a shipped catalogue then by identifier:
|
|
33
|
+
|
|
34
|
+
```yaml
|
|
35
|
+
labels:
|
|
36
|
+
fr:
|
|
37
|
+
site.home: Début
|
|
38
|
+
entity.mentionsCount: "{count, plural, one {# citation} other {# citations}}"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
An override uses the syntax of the message it replaces and must use exactly the variables of the source message. `validateLabels(theme.labels)` returns the configuration issues of the whole block, one per faulty key with the path `labels.<language>.<id>`: an unknown identifier, an ICU syntax error with the parser's message, or the missing and unknown variables. The theme validation of the command line is where to call it, so that a bad override is reported with the other theme errors before any rendering; `loadCatalogue` validates the block it applies as well and throws a `CatalogueError` carrying the same issues. Dependencies point from this package to `core`, never the other way, so `core` only describes the `labels` key in the theme schema.
|
|
42
|
+
|
|
43
|
+
## Adding a locale
|
|
44
|
+
|
|
45
|
+
1. Add `messages/<language>/<area>.json` for every area, with every key of `messages/en/<area>.json`, sorted, each value a translation that keeps the variables and kinds of the source message. Plural forms follow the CLDR categories of the language (`one`, `other`, ...).
|
|
46
|
+
2. Import each file in the module of its area under `src/areas/`, add the language to the `Area` type in `src/area.ts` and to `src/shipped.ts`, and to the `labels` key of [`theme.schema.json`](../core/schemas/theme.schema.json).
|
|
47
|
+
3. Run the tests: the parity test lists any missing key or differing variable.
|
|
48
|
+
|
|
49
|
+
## Dependencies
|
|
50
|
+
|
|
51
|
+
- `intl-messageformat` 11.2.15 (BSD-3-Clause, FormatJS): formats an ICU message with the plural rules, number and date formats of a locale through the platform `Intl` objects, without any locale data of its own.
|
|
52
|
+
- `@formatjs/icu-messageformat-parser` 3.5.18 (MIT, FormatJS): the parser `intl-messageformat` already uses, needed on its own to read the variables of a message for the parity test and the validation of overrides.
|
|
53
|
+
|
|
54
|
+
Part of [Concordance](../../README.md).
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
{
|
|
2
|
+
"about.content": {
|
|
3
|
+
"defaultMessage": "Content kept",
|
|
4
|
+
"description": "Column of the sources table of the about page: how many pages or documents the site kept from the repository."
|
|
5
|
+
},
|
|
6
|
+
"about.contribute": {
|
|
7
|
+
"defaultMessage": "How to contribute",
|
|
8
|
+
"description": "Link of the about page to the contribution address of the configuration."
|
|
9
|
+
},
|
|
10
|
+
"about.correct": {
|
|
11
|
+
"defaultMessage": "Correct a page.",
|
|
12
|
+
"description": "Lead of the paragraph of the about page saying how a page is corrected."
|
|
13
|
+
},
|
|
14
|
+
"about.correctText": {
|
|
15
|
+
"defaultMessage": "Every page carries at its foot the path of its file and a link to the forge. There is no other way to edit, and that is deliberate.",
|
|
16
|
+
"description": "Paragraph of the about page saying how a page is corrected."
|
|
17
|
+
},
|
|
18
|
+
"about.lastChange": {
|
|
19
|
+
"defaultMessage": "Last change",
|
|
20
|
+
"description": "Column of the sources table of the about page: the newest change of the repository."
|
|
21
|
+
},
|
|
22
|
+
"about.lead": {
|
|
23
|
+
"defaultMessage": "This site is rebuilt at every change of the repositories. It is not edited here: every correction is made in the original file, and appears at the next publication.",
|
|
24
|
+
"description": "Sentence under the title of the about page."
|
|
25
|
+
},
|
|
26
|
+
"about.nature": {
|
|
27
|
+
"defaultMessage": "Nature",
|
|
28
|
+
"description": "Column of the sources table of the about page: what the repository holds."
|
|
29
|
+
},
|
|
30
|
+
"about.notContained": {
|
|
31
|
+
"defaultMessage": "What the site does not contain.",
|
|
32
|
+
"description": "Lead of the paragraph of the about page listing what was left out."
|
|
33
|
+
},
|
|
34
|
+
"about.notContainedText": {
|
|
35
|
+
"defaultMessage": "The files the configuration excludes, the documents whose conversion failed, and the words used fewer than {count, plural, one {# time} other {# times}}. The",
|
|
36
|
+
"description": "Paragraph of the about page listing what was left out, before the link to the report; the count is the publication threshold of a keyword page."
|
|
37
|
+
},
|
|
38
|
+
"about.pages": {
|
|
39
|
+
"defaultMessage": "Pages",
|
|
40
|
+
"description": "Figure at the head of the about page: how many pages the site holds."
|
|
41
|
+
},
|
|
42
|
+
"about.pseudonymised": {
|
|
43
|
+
"defaultMessage": "What is pseudonymised.",
|
|
44
|
+
"description": "Lead of the paragraph of the about page on pseudonymisation, shown when the configuration enables it."
|
|
45
|
+
},
|
|
46
|
+
"about.pseudonymisedText": {
|
|
47
|
+
"defaultMessage": "The names of the participants are replaced at publication by stable pseudonyms. The mapping is never published.",
|
|
48
|
+
"description": "Paragraph of the about page on pseudonymisation."
|
|
49
|
+
},
|
|
50
|
+
"about.publishedAt": {
|
|
51
|
+
"defaultMessage": "{day, date, medium} {time, time, short}",
|
|
52
|
+
"description": "Figure at the head of the about page: the build instant."
|
|
53
|
+
},
|
|
54
|
+
"about.publishedOn": {
|
|
55
|
+
"defaultMessage": "Published on",
|
|
56
|
+
"description": "Label of the first figure of the about page, the build instant."
|
|
57
|
+
},
|
|
58
|
+
"about.report": {
|
|
59
|
+
"defaultMessage": "publication report",
|
|
60
|
+
"description": "Link of the about page to the to-do page, which lists what the build could not finish."
|
|
61
|
+
},
|
|
62
|
+
"about.reportLists": {
|
|
63
|
+
"defaultMessage": "lists them.",
|
|
64
|
+
"description": "End of the paragraph of the about page listing what was left out, after the link to the report."
|
|
65
|
+
},
|
|
66
|
+
"about.repository": {
|
|
67
|
+
"defaultMessage": "Repository",
|
|
68
|
+
"description": "Column of the sources table of the about page: the name of the source."
|
|
69
|
+
},
|
|
70
|
+
"about.sources": {
|
|
71
|
+
"defaultMessage": "Sources",
|
|
72
|
+
"description": "Heading of the sources table of the about page."
|
|
73
|
+
},
|
|
74
|
+
"about.sourcesLead": {
|
|
75
|
+
"defaultMessage": "each with the version exactly used",
|
|
76
|
+
"description": "Sentence next to the heading of the sources table of the about page."
|
|
77
|
+
},
|
|
78
|
+
"about.staleExceeds": {
|
|
79
|
+
"defaultMessage": "exceeds the freshness threshold of {count, plural, one {# day} other {# days}}, which is reported here and in the build report, never on the pages themselves.",
|
|
80
|
+
"description": "End of the sentence naming a dormant source under the sources table of the about page, after its name."
|
|
81
|
+
},
|
|
82
|
+
"about.staleSource": {
|
|
83
|
+
"defaultMessage": "The source",
|
|
84
|
+
"description": "Start of the sentence naming a dormant source under the sources table of the about page, before its name."
|
|
85
|
+
},
|
|
86
|
+
"about.title": {
|
|
87
|
+
"defaultMessage": "About this wiki",
|
|
88
|
+
"description": "Title of the about page, and its link in the footer."
|
|
89
|
+
},
|
|
90
|
+
"about.version": {
|
|
91
|
+
"defaultMessage": "Version",
|
|
92
|
+
"description": "Column of the sources table of the about page: the commit the build read."
|
|
93
|
+
},
|
|
94
|
+
"about.versionsNote": {
|
|
95
|
+
"defaultMessage": "The versions are those read at publication: two publications on the same versions produce an identical site.",
|
|
96
|
+
"description": "Note under the sources table of the about page."
|
|
97
|
+
},
|
|
98
|
+
"about.words": {
|
|
99
|
+
"defaultMessage": "Indexed words",
|
|
100
|
+
"description": "Figure at the head of the about page: how many words the index lists."
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"age.cadence": {
|
|
3
|
+
"defaultMessage": "{count, plural, one {Publications are declared daily in the configuration.} other {Publications are declared every # days in the configuration.}}",
|
|
4
|
+
"description": "Sentence of the notice shown when the site is old: the cadence the configuration declares."
|
|
5
|
+
},
|
|
6
|
+
"age.close": {
|
|
7
|
+
"defaultMessage": "Close this notice",
|
|
8
|
+
"description": "Accessible name of the button closing the notice on the age of the site."
|
|
9
|
+
},
|
|
10
|
+
"age.missing": {
|
|
11
|
+
"defaultMessage": "A recent change of the repositories may therefore be missing here.",
|
|
12
|
+
"description": "Sentence of the notice shown when the site is old: what its age implies."
|
|
13
|
+
},
|
|
14
|
+
"age.notice": {
|
|
15
|
+
"defaultMessage": "Notice",
|
|
16
|
+
"description": "Chip at the head of the notice shown when the site is old."
|
|
17
|
+
},
|
|
18
|
+
"age.or": {
|
|
19
|
+
"defaultMessage": "or",
|
|
20
|
+
"description": "Word between the two exits of the notice shown when the site is old."
|
|
21
|
+
},
|
|
22
|
+
"age.published": {
|
|
23
|
+
"defaultMessage": "{count, plural, one {This version was published # day ago.} other {This version was published # days ago.}}",
|
|
24
|
+
"description": "Lead of the notice shown when the site is old, the days counted in the browser."
|
|
25
|
+
},
|
|
26
|
+
"age.repositories": {
|
|
27
|
+
"defaultMessage": "consult the repositories directly",
|
|
28
|
+
"description": "Second exit of the notice shown when the site is old: a link to the repository of a source."
|
|
29
|
+
},
|
|
30
|
+
"age.sources": {
|
|
31
|
+
"defaultMessage": "See the sources and their versions",
|
|
32
|
+
"description": "First exit of the notice shown when the site is old: a link to the list of the spaces."
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"api.callers": {
|
|
3
|
+
"defaultMessage": "{count, plural, one {# caller} other {# callers}}",
|
|
4
|
+
"description": "Number of pages citing an operation, in the operations table of the API page."
|
|
5
|
+
},
|
|
6
|
+
"api.colCallers": {
|
|
7
|
+
"defaultMessage": "Callers",
|
|
8
|
+
"description": "Header of the callers column of the operations table of the API page."
|
|
9
|
+
},
|
|
10
|
+
"api.colMethod": {
|
|
11
|
+
"defaultMessage": "Method",
|
|
12
|
+
"description": "Header of the method column of the operations table of the API page."
|
|
13
|
+
},
|
|
14
|
+
"api.colOperation": {
|
|
15
|
+
"defaultMessage": "Operation",
|
|
16
|
+
"description": "Header of the operation column of the operations table of the API page."
|
|
17
|
+
},
|
|
18
|
+
"api.colPath": {
|
|
19
|
+
"defaultMessage": "Path",
|
|
20
|
+
"description": "Header of the path column of the operations table of the API page."
|
|
21
|
+
},
|
|
22
|
+
"api.contract": {
|
|
23
|
+
"defaultMessage": "Interface contract",
|
|
24
|
+
"description": "Heading of the block of the API page that shows the imported contract."
|
|
25
|
+
},
|
|
26
|
+
"api.contractUnreachable": {
|
|
27
|
+
"defaultMessage": "The contract of this interface could not be read.",
|
|
28
|
+
"description": "Title of the notice on the page of an interface whose declared contract the build could not fetch or read."
|
|
29
|
+
},
|
|
30
|
+
"api.contractUnreachableDetail": {
|
|
31
|
+
"defaultMessage": "The note stands on its own meanwhile: its text and the operations it describes are indexed and cited like any page.",
|
|
32
|
+
"description": "Sentence of that notice: what remains reachable without the contract."
|
|
33
|
+
},
|
|
34
|
+
"api.download": {
|
|
35
|
+
"defaultMessage": "Download the contract",
|
|
36
|
+
"description": "Link to the original contract file on the API page."
|
|
37
|
+
},
|
|
38
|
+
"api.fiveKeys": {
|
|
39
|
+
"defaultMessage": "Five keys, no more. The operations come from the contract, not from the header.",
|
|
40
|
+
"description": "Note under the properties of the API page, cut to five keys."
|
|
41
|
+
},
|
|
42
|
+
"api.gapsLead": {
|
|
43
|
+
"defaultMessage": "The rows in italics are gaps: present in the contract without a page, or described without existing in the contract.",
|
|
44
|
+
"description": "Sentence after the lead of the operations table when the contract and the notes disagree."
|
|
45
|
+
},
|
|
46
|
+
"api.imported": {
|
|
47
|
+
"defaultMessage": "imported {when}",
|
|
48
|
+
"description": "When the contract was imported, relative to the build, on the line of the contract block of the API page."
|
|
49
|
+
},
|
|
50
|
+
"api.noOperation": {
|
|
51
|
+
"defaultMessage": "The contract declares no operation.",
|
|
52
|
+
"description": "Notice of the operations table of the API page when the contract declares none."
|
|
53
|
+
},
|
|
54
|
+
"api.notInContract": {
|
|
55
|
+
"defaultMessage": "described, absent from the contract",
|
|
56
|
+
"description": "Gap row of the operations table for a note the contract does not declare."
|
|
57
|
+
},
|
|
58
|
+
"api.openContract": {
|
|
59
|
+
"defaultMessage": "Open the contract address",
|
|
60
|
+
"description": "Exit of that notice: a link to the declared address of the contract."
|
|
61
|
+
},
|
|
62
|
+
"api.operations": {
|
|
63
|
+
"defaultMessage": "Operations",
|
|
64
|
+
"description": "Heading of the operations table of the API page."
|
|
65
|
+
},
|
|
66
|
+
"api.operationsFirst": {
|
|
67
|
+
"defaultMessage": "On an interface the operations rise to the top: that is the grain we work at.",
|
|
68
|
+
"description": "Note under the related pages of the API page, where the operations come first."
|
|
69
|
+
},
|
|
70
|
+
"api.operationsLead": {
|
|
71
|
+
"defaultMessage": "Matched to the contract by operation name.",
|
|
72
|
+
"description": "Sentence under the heading of the operations table of the API page."
|
|
73
|
+
},
|
|
74
|
+
"api.unknownPath": {
|
|
75
|
+
"defaultMessage": "unknown path",
|
|
76
|
+
"description": "Path cell of a gap row of the operations table when the note declares none."
|
|
77
|
+
},
|
|
78
|
+
"api.viewerNote": {
|
|
79
|
+
"defaultMessage": "No schema is copied into the text: the page shows the contract, it does not duplicate it.",
|
|
80
|
+
"description": "Note next to the contract viewer of the API page."
|
|
81
|
+
},
|
|
82
|
+
"api.withoutPage": {
|
|
83
|
+
"defaultMessage": "present in the contract, without a page",
|
|
84
|
+
"description": "Gap row of the operations table for an operation no note describes."
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"category.all": {
|
|
3
|
+
"defaultMessage": "All",
|
|
4
|
+
"description": "Entry of the attribute selector of a category list that lifts the filter."
|
|
5
|
+
},
|
|
6
|
+
"category.filedUnder": {
|
|
7
|
+
"defaultMessage": "{count, plural, one {# page filed under {path}} other {# pages filed under {path}}}",
|
|
8
|
+
"description": "Count of a category that is a folder below the top of its space, a year or a month, above the list; the path names the folders on the way, separated by ›."
|
|
9
|
+
},
|
|
10
|
+
"category.firstLine": {
|
|
11
|
+
"defaultMessage": "First line",
|
|
12
|
+
"description": "Heading of the column of a category list giving the summary of every page."
|
|
13
|
+
},
|
|
14
|
+
"category.links": {
|
|
15
|
+
"defaultMessage": "Links",
|
|
16
|
+
"description": "Heading of the column of a category list counting the related pages of every page."
|
|
17
|
+
},
|
|
18
|
+
"category.linksNote": {
|
|
19
|
+
"defaultMessage": "The Links column counts the related pages, which brings the most central {name} of the journey to the top.",
|
|
20
|
+
"description": "Note under a category list, the category name lowercased in it."
|
|
21
|
+
},
|
|
22
|
+
"category.page": {
|
|
23
|
+
"defaultMessage": "Page",
|
|
24
|
+
"description": "Heading of the first column of a category list whose folder maps to no type."
|
|
25
|
+
},
|
|
26
|
+
"category.pages": {
|
|
27
|
+
"defaultMessage": "{count, plural, one {# page} other {# pages}}",
|
|
28
|
+
"description": "Count of a category whose folder maps to no type, above the list."
|
|
29
|
+
},
|
|
30
|
+
"category.pagesName": {
|
|
31
|
+
"defaultMessage": "pages",
|
|
32
|
+
"description": "What the sentences of the list of a year or a month count with, in place of a folder name."
|
|
33
|
+
},
|
|
34
|
+
"category.pagination": {
|
|
35
|
+
"defaultMessage": "Pages of the list",
|
|
36
|
+
"description": "Accessible name of the page links under a category list."
|
|
37
|
+
},
|
|
38
|
+
"category.searchIn": {
|
|
39
|
+
"defaultMessage": "Search in {name}",
|
|
40
|
+
"description": "Placeholder of the search field on a category list, the category name lowercased in it."
|
|
41
|
+
},
|
|
42
|
+
"category.shown": {
|
|
43
|
+
"defaultMessage": "{shown} {name} of {total} — pagination by twenty.",
|
|
44
|
+
"description": "Under a category list: how many rows the page shows of the whole, the category name lowercased in it."
|
|
45
|
+
},
|
|
46
|
+
"category.sort": {
|
|
47
|
+
"defaultMessage": "Sort",
|
|
48
|
+
"description": "Accessible name of the sort selector of a category list."
|
|
49
|
+
},
|
|
50
|
+
"category.sortLinks": {
|
|
51
|
+
"defaultMessage": "Links",
|
|
52
|
+
"description": "Entry of the sort selector ordering a category list by number of related pages."
|
|
53
|
+
},
|
|
54
|
+
"category.sortTitle": {
|
|
55
|
+
"defaultMessage": "A–Z",
|
|
56
|
+
"description": "Entry of the sort selector ordering a category list by title."
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"decision.decidedOn": {
|
|
3
|
+
"defaultMessage": "Decided on",
|
|
4
|
+
"description": "Row of the properties block of a decision: the date it was taken."
|
|
5
|
+
},
|
|
6
|
+
"decision.keysNote": {
|
|
7
|
+
"defaultMessage": "{count, plural, one {# key} other {# keys}}: the status and the date are authoritative.",
|
|
8
|
+
"description": "Note under the properties of a decision, counting its rows."
|
|
9
|
+
},
|
|
10
|
+
"decision.relatedNote": {
|
|
11
|
+
"defaultMessage": "A decision affects pages without being affected by them: its relations are almost all written.",
|
|
12
|
+
"description": "Note under the related pages of a decision."
|
|
13
|
+
},
|
|
14
|
+
"decision.session": {
|
|
15
|
+
"defaultMessage": "Session",
|
|
16
|
+
"description": "Row of the properties block of a decision: the meeting it was taken in."
|
|
17
|
+
},
|
|
18
|
+
"decision.sessionDated": {
|
|
19
|
+
"defaultMessage": "Decided in session on {date}.",
|
|
20
|
+
"description": "First sentence of the callout under the text of a decision, naming the day of the meeting it was taken in."
|
|
21
|
+
},
|
|
22
|
+
"decision.sessionMinutes": {
|
|
23
|
+
"defaultMessage": "the minutes",
|
|
24
|
+
"description": "The words of the link to the meeting in the callout of a decision."
|
|
25
|
+
},
|
|
26
|
+
"decision.sessionPassage": {
|
|
27
|
+
"defaultMessage": "The exact passage is in '{minutes}', at {time}.",
|
|
28
|
+
"description": "Second sentence of the callout of a decision, the quoted placeholder standing for the link to the meeting, the time being the timecode of the cue the decision was recognised in."
|
|
29
|
+
},
|
|
30
|
+
"decision.sessionSee": {
|
|
31
|
+
"defaultMessage": "See '{minutes}'.",
|
|
32
|
+
"description": "Second sentence of the callout of a decision when no cue of the transcript names it, the quoted placeholder standing for the link to the meeting."
|
|
33
|
+
},
|
|
34
|
+
"decision.sessionUndated": {
|
|
35
|
+
"defaultMessage": "Decided in session.",
|
|
36
|
+
"description": "First sentence of the callout of a decision taken in a meeting whose note carries no date."
|
|
37
|
+
},
|
|
38
|
+
"decision.status": {
|
|
39
|
+
"defaultMessage": "Status",
|
|
40
|
+
"description": "Row of the properties block of a decision."
|
|
41
|
+
},
|
|
42
|
+
"decision.status.accepted": {
|
|
43
|
+
"defaultMessage": "Accepted",
|
|
44
|
+
"description": "The accepted status of a decision, as the chip and the properties word it."
|
|
45
|
+
},
|
|
46
|
+
"decision.status.proposed": {
|
|
47
|
+
"defaultMessage": "Proposed",
|
|
48
|
+
"description": "The proposed status of a decision, as the chip and the properties word it."
|
|
49
|
+
},
|
|
50
|
+
"decision.status.superseded": {
|
|
51
|
+
"defaultMessage": "Superseded",
|
|
52
|
+
"description": "The superseded status of a decision, as the chip and the properties word it."
|
|
53
|
+
},
|
|
54
|
+
"decision.supersededBy": {
|
|
55
|
+
"defaultMessage": "Superseded by",
|
|
56
|
+
"description": "Row of the properties block of a decision: the decision that replaces it."
|
|
57
|
+
},
|
|
58
|
+
"decision.supersedes": {
|
|
59
|
+
"defaultMessage": "Supersedes",
|
|
60
|
+
"description": "Row of the properties block of a decision: the decision it replaces."
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
{
|
|
2
|
+
"document.author": {
|
|
3
|
+
"defaultMessage": "Author",
|
|
4
|
+
"description": "Row of the properties block of a document page: the author the file states."
|
|
5
|
+
},
|
|
6
|
+
"document.convertedNote": {
|
|
7
|
+
"defaultMessage": "Converted at publication, cached by fingerprint",
|
|
8
|
+
"description": "Note under the rendered page of a document: how the preview was produced."
|
|
9
|
+
},
|
|
10
|
+
"document.date": {
|
|
11
|
+
"defaultMessage": "Date",
|
|
12
|
+
"description": "Row of the properties block of a document page: the date the file states."
|
|
13
|
+
},
|
|
14
|
+
"document.dateNote": {
|
|
15
|
+
"defaultMessage": "Read from the file, distinct from the repository date.",
|
|
16
|
+
"description": "Note under the properties of a document page, when they were read from the file."
|
|
17
|
+
},
|
|
18
|
+
"document.download": {
|
|
19
|
+
"defaultMessage": "Download the original",
|
|
20
|
+
"description": "Link to the original file of a converted document."
|
|
21
|
+
},
|
|
22
|
+
"document.extractedText": {
|
|
23
|
+
"defaultMessage": "Extracted text",
|
|
24
|
+
"description": "Tab of a document page showing the text extracted from the file."
|
|
25
|
+
},
|
|
26
|
+
"document.extractedTextOf": {
|
|
27
|
+
"defaultMessage": "Extracted text — {count, plural, one {# page} other {# pages}}",
|
|
28
|
+
"description": "Heading of the extracted text of a document whose conversion failed, with its number of pages."
|
|
29
|
+
},
|
|
30
|
+
"document.indexedNote": {
|
|
31
|
+
"defaultMessage": "indexed and searchable",
|
|
32
|
+
"description": "Note at the head of the extracted text of a document whose conversion failed."
|
|
33
|
+
},
|
|
34
|
+
"document.kind.markdown": {
|
|
35
|
+
"defaultMessage": "Markdown note",
|
|
36
|
+
"description": "Kind of a file that is a markdown note, among the files grouped into a page."
|
|
37
|
+
},
|
|
38
|
+
"document.kind.pdf": {
|
|
39
|
+
"defaultMessage": "PDF",
|
|
40
|
+
"description": "Kind of a document whose file is a PDF."
|
|
41
|
+
},
|
|
42
|
+
"document.kind.presentation": {
|
|
43
|
+
"defaultMessage": "Presentation",
|
|
44
|
+
"description": "Kind of a document whose file is a slide deck."
|
|
45
|
+
},
|
|
46
|
+
"document.kind.spreadsheet": {
|
|
47
|
+
"defaultMessage": "Spreadsheet",
|
|
48
|
+
"description": "Kind of a document whose file is a spreadsheet."
|
|
49
|
+
},
|
|
50
|
+
"document.kind.text": {
|
|
51
|
+
"defaultMessage": "Text document",
|
|
52
|
+
"description": "Kind of a document whose file is a word-processing document."
|
|
53
|
+
},
|
|
54
|
+
"document.noNote": {
|
|
55
|
+
"defaultMessage": "No note describes this document yet.",
|
|
56
|
+
"description": "Notes tab of a document page when no note is merged with the document."
|
|
57
|
+
},
|
|
58
|
+
"document.openPdf": {
|
|
59
|
+
"defaultMessage": "Open the PDF",
|
|
60
|
+
"description": "Link to the PDF of a document, offered where the page cannot show it."
|
|
61
|
+
},
|
|
62
|
+
"document.originalNote": {
|
|
63
|
+
"defaultMessage": "The original stays downloadable",
|
|
64
|
+
"description": "Note under the rendered page of a document: the original file is still offered."
|
|
65
|
+
},
|
|
66
|
+
"document.pageCount": {
|
|
67
|
+
"defaultMessage": "Pages",
|
|
68
|
+
"description": "Heading of the strip of pages and row of the properties block of a document page."
|
|
69
|
+
},
|
|
70
|
+
"document.pages": {
|
|
71
|
+
"defaultMessage": "{count, plural, one {# page} other {# pages}}",
|
|
72
|
+
"description": "Number of pages of a converted document."
|
|
73
|
+
},
|
|
74
|
+
"document.preview": {
|
|
75
|
+
"defaultMessage": "Preview",
|
|
76
|
+
"description": "Link to the rendered preview of a converted document."
|
|
77
|
+
},
|
|
78
|
+
"document.previewFailed": {
|
|
79
|
+
"defaultMessage": "The preview of this document could not be generated.",
|
|
80
|
+
"description": "Title of the notice on a document page whose conversion failed."
|
|
81
|
+
},
|
|
82
|
+
"document.previewNote": {
|
|
83
|
+
"defaultMessage": "Size and page count of the PDF preview, the original stating none.",
|
|
84
|
+
"description": "Note under the properties of a document page when the size or the page count was read from the PDF preview rather than from the original file."
|
|
85
|
+
},
|
|
86
|
+
"document.relatedNote": {
|
|
87
|
+
"defaultMessage": "A document does not enter the model: its pages bring passages, and the note that describes it stands among its files.",
|
|
88
|
+
"description": "Note under the related pages of a document page, saying that the document itself is not a note of the model."
|
|
89
|
+
},
|
|
90
|
+
"document.relatedNotes": {
|
|
91
|
+
"defaultMessage": "Related notes",
|
|
92
|
+
"description": "Tab of a document page showing the note merged with the document."
|
|
93
|
+
},
|
|
94
|
+
"document.reportedNote": {
|
|
95
|
+
"defaultMessage": "The same finding stands in the publication report and in the linter output: the failure is reported to whoever can fix it.",
|
|
96
|
+
"description": "Note under the state of the representations of a document whose conversion failed."
|
|
97
|
+
},
|
|
98
|
+
"document.representations": {
|
|
99
|
+
"defaultMessage": "State of the representations",
|
|
100
|
+
"description": "Heading of the panel listing the representations of a document and the state of each."
|
|
101
|
+
},
|
|
102
|
+
"document.rolePreview": {
|
|
103
|
+
"defaultMessage": "preview",
|
|
104
|
+
"description": "Role of the PDF among the files of a document page."
|
|
105
|
+
},
|
|
106
|
+
"document.stateAvailable": {
|
|
107
|
+
"defaultMessage": "available",
|
|
108
|
+
"description": "State of the original file in the panel of the representations."
|
|
109
|
+
},
|
|
110
|
+
"document.stateExtracted": {
|
|
111
|
+
"defaultMessage": "extracted",
|
|
112
|
+
"description": "State of the text in the panel of the representations when it was read."
|
|
113
|
+
},
|
|
114
|
+
"document.stateFailed": {
|
|
115
|
+
"defaultMessage": "failed",
|
|
116
|
+
"description": "State of the preview in the panel of the representations when the conversion failed."
|
|
117
|
+
},
|
|
118
|
+
"document.stateMissing": {
|
|
119
|
+
"defaultMessage": "missing",
|
|
120
|
+
"description": "State of the text in the panel of the representations when nothing was read."
|
|
121
|
+
},
|
|
122
|
+
"document.textExtracted": {
|
|
123
|
+
"defaultMessage": "The text was extracted all the same: it is indexed, cited on the other pages, and readable below.",
|
|
124
|
+
"description": "Sentence of the notice on a document page whose conversion failed, when the text of the document was read."
|
|
125
|
+
},
|
|
126
|
+
"document.textMissing": {
|
|
127
|
+
"defaultMessage": "Its text could not be extracted either: the original stays downloadable, and the note that describes it stands among its files.",
|
|
128
|
+
"description": "Sentence of the notice on a document page whose conversion failed, when no text of the document was read."
|
|
129
|
+
},
|
|
130
|
+
"document.textRepresentation": {
|
|
131
|
+
"defaultMessage": "text",
|
|
132
|
+
"description": "Row of the text in the panel of the representations."
|
|
133
|
+
},
|
|
134
|
+
"document.type": {
|
|
135
|
+
"defaultMessage": "Type",
|
|
136
|
+
"description": "Row of the properties block of a document page: the kind of the file."
|
|
137
|
+
},
|
|
138
|
+
"document.view": {
|
|
139
|
+
"defaultMessage": "Document",
|
|
140
|
+
"description": "Tab of a document page showing the rendered document."
|
|
141
|
+
},
|
|
142
|
+
"document.views": {
|
|
143
|
+
"defaultMessage": "Views of the document",
|
|
144
|
+
"description": "Accessible name of the tab bar of a document page."
|
|
145
|
+
},
|
|
146
|
+
"document.whyFailed": {
|
|
147
|
+
"defaultMessage": "Why this failure?",
|
|
148
|
+
"description": "Control of the notice on a document page whose conversion failed, unfolding the finding the build recorded."
|
|
149
|
+
}
|
|
150
|
+
}
|