@elite-dangerous-almanac/core 0.2.4 → 0.2.6

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 (123) hide show
  1. package/PROVENANCE/i18n/SOURCES.md +118 -94
  2. package/PROVENANCE/materials/SOURCES.md +22 -0
  3. package/PROVENANCE/ships/SOURCES.md +33 -6
  4. package/README.md +14 -8
  5. package/assets/ships/LakonMiner/schematic-bottom.svg +5 -3
  6. package/assets/ships/LakonMiner/schematic-top.svg +2 -4
  7. package/dist/chunk-3CKWT2F3.js +1 -0
  8. package/dist/{chunk-7ZERP4TB.js.map → chunk-3CKWT2F3.js.map} +1 -1
  9. package/dist/{chunk-A7KNIFRU.js → chunk-3P455LF4.js} +1 -1
  10. package/dist/{chunk-A7KNIFRU.js.map → chunk-3P455LF4.js.map} +1 -1
  11. package/dist/chunk-5QSCLEEB.js +1 -0
  12. package/dist/chunk-5QSCLEEB.js.map +1 -0
  13. package/dist/{chunk-4TFAZX73.js → chunk-773VO2GK.js} +1 -1
  14. package/dist/{chunk-7EWZGDWY.js → chunk-7S7ZTZZY.js} +1 -1
  15. package/dist/chunk-A5TCT2AJ.js +1 -0
  16. package/dist/{chunk-AIEC3LBT.js.map → chunk-A5TCT2AJ.js.map} +1 -1
  17. package/dist/chunk-AAU7OM47.js +1 -0
  18. package/dist/chunk-AAU7OM47.js.map +1 -0
  19. package/dist/{chunk-3LZXB2MC.js → chunk-ABSDZINM.js} +1 -1
  20. package/dist/{chunk-DSMLYA2M.js → chunk-BMQM4JBL.js} +1 -1
  21. package/dist/{chunk-DSMLYA2M.js.map → chunk-BMQM4JBL.js.map} +1 -1
  22. package/dist/chunk-E3AUKPSQ.js +1 -0
  23. package/dist/{chunk-G2VSQFD6.js.map → chunk-E3AUKPSQ.js.map} +1 -1
  24. package/dist/chunk-EFQOUATZ.js +1 -0
  25. package/dist/chunk-EFQOUATZ.js.map +1 -0
  26. package/dist/chunk-GISL7YML.js +1 -0
  27. package/dist/chunk-GISL7YML.js.map +1 -0
  28. package/dist/chunk-IZIIGK3W.js +1 -0
  29. package/dist/{chunk-TW7LUBHD.js.map → chunk-IZIIGK3W.js.map} +1 -1
  30. package/dist/chunk-KBCA4GEZ.js +1 -0
  31. package/dist/chunk-KLC5XT6F.js +1 -0
  32. package/dist/chunk-KLC5XT6F.js.map +1 -0
  33. package/dist/chunk-LOWDDWDT.js +1 -0
  34. package/dist/{chunk-GLWPSVFV.js.map → chunk-LOWDDWDT.js.map} +1 -1
  35. package/dist/chunk-MRLUWHGI.js +1 -0
  36. package/dist/{chunk-FF2X4K5P.js.map → chunk-MRLUWHGI.js.map} +1 -1
  37. package/dist/chunk-NBLLW7TH.js +1 -0
  38. package/dist/chunk-NBLLW7TH.js.map +1 -0
  39. package/dist/{chunk-IWFQ4ZKF.js → chunk-OFZGNWBT.js} +1 -1
  40. package/dist/chunk-PF3HZ73R.js +1 -0
  41. package/dist/{chunk-ITKZKREP.js.map → chunk-PF3HZ73R.js.map} +1 -1
  42. package/dist/{chunk-KGJCTSVV.js → chunk-S3MONE55.js} +1 -1
  43. package/dist/chunk-S3MONE55.js.map +1 -0
  44. package/dist/{chunk-OLKNYGGT.js → chunk-SDXUPP4P.js} +1 -1
  45. package/dist/chunk-XFDMCPDW.js +1 -0
  46. package/dist/{chunk-GRSNX36B.js.map → chunk-XFDMCPDW.js.map} +1 -1
  47. package/dist/chunk-XSN53F7W.js +1 -0
  48. package/dist/{chunk-DBGXZF7O.js.map → chunk-XSN53F7W.js.map} +1 -1
  49. package/dist/{chunk-MTJ4MS7W.js → chunk-YCGISPDR.js} +1 -1
  50. package/dist/i18n/experimental-effect-descriptions.d.ts +21 -6
  51. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  52. package/dist/i18n/experimental-effects.js +1 -1
  53. package/dist/i18n/index.d.ts +0 -2
  54. package/dist/i18n/index.js +1 -1
  55. package/dist/i18n/materials.d.ts +7 -6
  56. package/dist/i18n/materials.js +1 -1
  57. package/dist/i18n/micro-resources.d.ts +7 -6
  58. package/dist/i18n/micro-resources.js +1 -1
  59. package/dist/i18n/pre-engineered.js +1 -1
  60. package/dist/materials/index.js +1 -1
  61. package/dist/materials/materials-all.js +1 -1
  62. package/dist/materials/materials-encoded.js +1 -1
  63. package/dist/materials/materials-manufactured.js +1 -1
  64. package/dist/materials/materials.js +1 -1
  65. package/dist/materials/micro-resources-all.js +1 -1
  66. package/dist/materials/micro-resources.js +1 -1
  67. package/dist/ships/blueprint-costs.js +1 -1
  68. package/dist/ships/blueprint-journal.js +1 -1
  69. package/dist/ships/build-metrics.js +1 -1
  70. package/dist/ships/engineering-options.d.ts +10 -4
  71. package/dist/ships/engineering-options.js +1 -1
  72. package/dist/ships/engineering.js +1 -1
  73. package/dist/ships/gunsights.d.ts +2 -2
  74. package/dist/ships/gunsights.js +1 -1
  75. package/dist/ships/index.js +1 -1
  76. package/dist/ships/modules-all.js +1 -1
  77. package/dist/ships/modules-hardpoint.js +1 -1
  78. package/dist/ships/modules.js +1 -1
  79. package/dist/ships/pre-engineered-stats.d.ts +5 -0
  80. package/dist/ships/pre-engineered-stats.js +1 -1
  81. package/dist/ships/ship-loadout.d.ts +4 -1
  82. package/dist/ships/ship-loadout.js +1 -1
  83. package/dist/ships/weapons.d.ts +14 -4
  84. package/dist/ships/weapons.js +1 -1
  85. package/package.json +1 -9
  86. package/dist/chunk-37JIMWLK.js +0 -1
  87. package/dist/chunk-37JIMWLK.js.map +0 -1
  88. package/dist/chunk-5ZVYRX6Z.js +0 -1
  89. package/dist/chunk-5ZVYRX6Z.js.map +0 -1
  90. package/dist/chunk-7ZERP4TB.js +0 -1
  91. package/dist/chunk-AIEC3LBT.js +0 -1
  92. package/dist/chunk-CJQ37JII.js +0 -1
  93. package/dist/chunk-CJQ37JII.js.map +0 -1
  94. package/dist/chunk-DAQ3PJ4R.js +0 -1
  95. package/dist/chunk-DAQ3PJ4R.js.map +0 -1
  96. package/dist/chunk-DBGXZF7O.js +0 -1
  97. package/dist/chunk-FD74K27A.js +0 -1
  98. package/dist/chunk-FD74K27A.js.map +0 -1
  99. package/dist/chunk-FF2X4K5P.js +0 -1
  100. package/dist/chunk-G2VSQFD6.js +0 -1
  101. package/dist/chunk-GLWPSVFV.js +0 -1
  102. package/dist/chunk-GRSNX36B.js +0 -1
  103. package/dist/chunk-ITKZKREP.js +0 -1
  104. package/dist/chunk-JO52LYO3.js +0 -1
  105. package/dist/chunk-KGJCTSVV.js.map +0 -1
  106. package/dist/chunk-KJFUNIIY.js +0 -1
  107. package/dist/chunk-KJFUNIIY.js.map +0 -1
  108. package/dist/chunk-SC6Z2TV7.js +0 -1
  109. package/dist/chunk-SC6Z2TV7.js.map +0 -1
  110. package/dist/chunk-TW7LUBHD.js +0 -1
  111. package/dist/i18n/engineering-groups.d.ts +0 -21
  112. package/dist/i18n/engineering-groups.js +0 -1
  113. package/dist/i18n/engineering-groups.js.map +0 -1
  114. package/dist/i18n/ships.d.ts +0 -36
  115. package/dist/i18n/ships.js +0 -1
  116. package/dist/i18n/ships.js.map +0 -1
  117. /package/dist/{chunk-4TFAZX73.js.map → chunk-773VO2GK.js.map} +0 -0
  118. /package/dist/{chunk-7EWZGDWY.js.map → chunk-7S7ZTZZY.js.map} +0 -0
  119. /package/dist/{chunk-3LZXB2MC.js.map → chunk-ABSDZINM.js.map} +0 -0
  120. /package/dist/{chunk-JO52LYO3.js.map → chunk-KBCA4GEZ.js.map} +0 -0
  121. /package/dist/{chunk-IWFQ4ZKF.js.map → chunk-OFZGNWBT.js.map} +0 -0
  122. /package/dist/{chunk-OLKNYGGT.js.map → chunk-SDXUPP4P.js.map} +0 -0
  123. /package/dist/{chunk-MTJ4MS7W.js.map → chunk-YCGISPDR.js.map} +0 -0
@@ -78,16 +78,29 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
78
78
 
79
79
  ## `experimental-effect-names.jsonc`
80
80
 
81
- - **Acquired:** 2026-08-14 UTC.
82
- - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
83
- database version `424009901`, last-modified marker `20260810`.
81
+ - **Acquired:** 2026-08-30 UTC.
82
+ - **In-game localisation revision:** none published; the game ships no immutable
83
+ identifier for its localisation tables. The acquired table is the evidence.
84
84
  - **Derivation:** each of the 86 current keys and its English name comes from
85
- `data/ships/experimental-effects.jsonc`. The Frontier symbol joins directly to
86
- EDSY's `expeffect.fdname`; that record's id selects an explicit `expeffect-<id>` entry
87
- from each language file.
88
- - **Coverage:** English covers all 86 effects; EDSY covers 84 in German and 85 each in
89
- Spanish, French, Brazilian Portuguese and Russian.
90
- - **Manual corrections:** none.
85
+ `data/ships/experimental-effects.jsonc`, which stays authoritative for canonical
86
+ English. The Frontier symbol joins to the in-game experimental-effect name table,
87
+ which supplies every locale for all 86. The table replaces the EDSY join this
88
+ catalogue previously used: where the two disagree the in-game value is kept, as
89
+ everywhere else in this repository. It supplies six values EDSY did not carry — all
90
+ five non-English `special_super_penetrator` names and the German
91
+ `special_weapon_rateoffire` — and changes two EDSY already carried: German
92
+ `special_regeneration_sequence` is "Regenerationssequenz" (EDSY
93
+ "Regenerierungssequenz") and Brazilian Portuguese `special_lock_breaker` is "Quebra da
94
+ Trava do Alvo" (EDSY "Quebra de Trava de Alvo"). Every other value agrees.
95
+ - **The three `_cooled` variants take their base effect's names.**
96
+ `special_feedback_cascade_cooled`, `special_plasma_slug_cooled` and
97
+ `special_super_penetrator_cooled` are pre-engineered rail-gun variants the game does
98
+ not name separately, so the source marks them as carrying the base effect's entry.
99
+ Each takes those values, exactly as a shadowing blueprint id takes its generic's.
100
+ - **Coverage:** complete. All 86 effects carry all six locales.
101
+ - **Manual corrections:** the source appends a `†` to every marked cell of the three
102
+ `_cooled` variants above; it is the acquisition's own shadow marker rather than part of
103
+ a name, and is removed here.
91
104
 
92
105
  ## `material-names.jsonc`
93
106
 
@@ -100,12 +113,31 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
100
113
  `locale/material/horizons/{raw,manufactured,encoded}.csv`; only that row's explicit
101
114
  localized columns are copied. The source's English column is not copied because the
102
115
  owning materials catalogues remain authoritative for canonical names. The canonical
103
- English values therefore keep the existing `Segment` spelling and omit the source's
104
- parenthetical Guardian and Thargoid category labels where the owning catalogue does;
105
- localized columns remain verbatim source values.
106
- - **Coverage:** English, Spanish and Russian cover all 146 materials. The explicit
107
- translations cover 128 in German, and 140 each in French and Brazilian Portuguese.
108
- - **Manual corrections:** none.
116
+ English values therefore omit the source's parenthetical Guardian and Thargoid
117
+ category labels where the owning catalogue does; localized columns remain verbatim
118
+ source values.
119
+ - **Second source, the in-game material localisation tables**, acquired 2026-08-30 UTC;
120
+ the game publishes no immutable identifier for them, so the acquired table is the
121
+ evidence. It covers all 146 materials in all six locales and, as everywhere else in
122
+ this repository, wins where the two disagree. That fills the 30 values Odyssey
123
+ Materials Helper did not carry and restyles 30 it did: 23 are the French apostrophe
124
+ (the in-game tables use `'` throughout, as every other catalogue here does, where
125
+ Odyssey Materials Helper uses `’`), five are Spanish names the helper title-cased
126
+ (`Fragmento Caústico` against the game's `Fragmento cáustico`), and the rest are
127
+ wording.
128
+ - **Coverage:** complete. All 146 materials carry all six locales.
129
+ - **Manual corrections:** six of the in-game values are the outfitting UI's own
130
+ abbreviations, shortened to fit its widget rather than translated differently —
131
+ `Comp. de destroços Guardian` against the helper's `Componentes de destroços Sentinela
132
+ Guardian`, and likewise for `Guardian_Sentinel_WeaponParts` (French and Brazilian
133
+ Portuguese), `Guardian_TechComponent` (French and Brazilian Portuguese) and
134
+ `HeatConductionWiring` (Spanish). The unabbreviated value is kept in each.
135
+ - **`Guardian_Sentinel_WreckageComponents` drops `Sentinel` in every locale**, following
136
+ the owning catalogue's rename (see `data/materials/SOURCES.md`). Its Brazilian
137
+ Portuguese is the one value here taken from neither source verbatim: the in-game table
138
+ abbreviates it to `Comp. de destroços Guardian` to fit the widget, so the whole word is
139
+ kept as it is for the other abbreviated labels above, giving
140
+ `Componentes de destroços Guardian`.
109
141
 
110
142
  ## `micro-resource-names.jsonc`
111
143
 
@@ -123,66 +155,24 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
123
155
  `SmallCapacityPowerRegulator` do not. All 30 take the explicit in-game `name` values for
124
156
  German, Spanish, French and Russian. In both cases the owning catalogue remains
125
157
  authoritative for canonical English names.
126
- - **Coverage:** English, Spanish and Russian cover all 226 micro resources. The explicit
127
- translations cover 218 in German, 225 in French and 188 in Brazilian Portuguese. The
128
- 30 in-game-backed records take Portuguese from Odyssey Materials Helper where it has a
129
- row, because the in-game capture supplied no Portuguese; `PowerVirus` and
130
- `SmallCapacityPowerRegulator`, which the source does not carry at all, have none.
131
- - **Manual corrections:** none.
132
-
133
- ## `ship-names.jsonc`
134
-
135
- - **Acquired:** 2026-08-18 UTC.
136
- - **Odyssey Materials Helper revision:** commit
137
- `23343c453938e724f317c56e9eb7db0dbfa71f78`;
138
- `application/src/main/resources/locale/ships/ships.csv` has SHA-256
139
- `6785f7cea00f36ca0a853091fd88f8ed5481a60f55c269643bff1ab0c3d6993d`.
140
- - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
141
- database version `424009901`, last-modified marker `20260810`.
142
- - **Derivation:** each of the 48 current ship symbols and canonical English names comes
143
- from `data/ships/ships.jsonc`. The symbol is joined to Odyssey Materials
144
- Helper's `ships.name.*` key after removing punctuation and folding case. EDSY's
145
- `eddb.js` `ship.fdname` supplies the second join, with explicit `ship-<id>` language
146
- entries filling locales absent from the CSV. The CSV keys a row by the ship's display
147
- name rather than its symbol, which differ for the four hulls whose name carries a mark
148
- the symbol omits (`Viper` is `ships.name.viper_mk_iii`), so the name is tried first and
149
- the symbol second. The resulting source-backed coverage is 48 ships in Spanish, 44 in
150
- French, 38 in Brazilian Portuguese and 48 in Russian; no accepted source carries a
151
- German ship-name table.
152
- - **Standing conclusion:** every source-backed non-English value is byte-for-byte equal
153
- to the canonical English ship name. The explicit values remain in the catalogue so a
154
- lookup distinguishes a source-backed same spelling from an unavailable translation.
155
- - **Manual corrections:** none.
156
-
157
- ## `ship-manufacturer-names.jsonc`
158
-
159
- - **Acquired:** 2026-08-18 UTC.
160
- - **Derivation:** all 48 symbol-to-manufacturer values are projected directly from
161
- `data/ships/ships.jsonc`, whose pinned sources and corrections are recorded in
162
- `data/ships/SOURCES.md`. Repeated manufacturer strings remain keyed by ship symbol so
163
- consumers need no separate manufacturer identity space.
164
- - **Coverage:** canonical English covers every ship. The accepted sources carry no
165
- localized manufacturer labels.
166
- - **Manual corrections:** none.
167
-
168
- ## `engineering-group-names.jsonc`
169
-
170
- - **Acquired:** 2026-08-18 UTC.
171
- - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
172
- database version `424009901`, last-modified marker `20260810`; `lang-en.json` and
173
- `lang-ru.json` have Git blob ids `9b199db635f7b968b75c8e9a14bdce68e37e4120` and
174
- `36496372d056754c34da03ca6836e27987c96b6a` respectively.
175
- - **Derivation:** each of the 48 group ids and its canonical English name is projected
176
- from `data/ships/engineering-options.jsonc`. That catalogue derives its group menus
177
- from EDSY, with the supplemental sources and corrections recorded in
178
- `data/ships/SOURCES.md`. Where a canonical English name matches an EDSY `mtype-*`
179
- value in `lang-en.json` byte-for-byte and uniquely, explicit values with the same key
180
- are copied from `lang-ru.json`.
181
- - **Coverage:** canonical English covers every engineering option group; Brazilian
182
- Portuguese and Russian each cover 44 of 48. The Guardian power-plant, power-distributor
183
- and hull-reinforcement groups have no distinct EDSY label, and EDSY carries no value in
184
- either language for `frameShiftDrivesSCO`.
185
- - **Manual corrections:** none.
158
+ - **Second source, the in-game micro-resource localisation tables**, acquired
159
+ 2026-08-30 UTC; the game publishes no immutable identifier for them, so the acquired
160
+ table is the evidence. It covers 225 of the 226 in all six locales and wins where the
161
+ two disagree, on the same footing as the material tables above. That fills all 47
162
+ remaining values including the Brazilian Portuguese for `PowerVirus` and
163
+ `SmallCapacityPowerRegulator`, which no registry carries — and restyles 46, of which 36
164
+ are the French apostrophe and seven are the French Powerplay term, which the game
165
+ lower-cases (`Données classifiées de puissance`).
166
+ `PowerMegashipData` is absent from the micro-resource table and appears in the material
167
+ one; its values are taken from there.
168
+ - **Coverage:** complete. All 226 micro resources carry all six locales.
169
+ - **Manual corrections:** five in-game values are layout, not names. Four German
170
+ consumables carry a `<br>` inside a compound word that the UI wraps —
171
+ `Energie-<br>zelle`, `Splitter-<br>granate`, `Schild-<br>unterbrecher` and
172
+ `Schild-<br>generator` and the French `Amm_Grenade_EMP` is abbreviated to
173
+ `Neutralisat. de bouclier` to fit its widget. The whole word is kept in each:
174
+ `Energiezelle`, `Splittergranate`, `Schildunterbrecher`, `Schildgenerator` and
175
+ `Neutralisateur de bouclier`.
186
176
 
187
177
  ## `module-family-names.jsonc`
188
178
 
@@ -209,15 +199,30 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
209
199
 
210
200
  ## `experimental-effect-descriptions.jsonc`
211
201
 
212
- - **Acquired:** 2026-08-18 UTC.
213
- - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
214
- database version `424009901`, last-modified marker `20260810`.
215
- - **Derivation:** the 29 effects with a `description` project that canonical English
216
- value from `data/ships/experimental-effects.jsonc`. Effects without a source-backed
217
- description remain absent rather than receiving generated prose.
218
- - **Coverage:** canonical English covers 29 of 86 effects. The accepted sources carry no
219
- localized description table.
220
- - **Manual corrections:** none.
202
+ - **Acquired:** 2026-08-30 UTC.
203
+ - **In-game localisation revision:** none published; the game ships no immutable
204
+ identifier for its localisation tables. The acquired table is the evidence.
205
+ - **Derivation:** each of the 86 current keys comes from
206
+ `data/ships/experimental-effects.jsonc`; the Frontier symbol joins to the in-game
207
+ experimental-effect description table, which supplies every locale for all 86. All six
208
+ values, English included, are the source's verbatim.
209
+ - **This catalogue no longer projects the ships catalogue's `description`.** The two
210
+ answer different questions and are deliberately different strings. An effect's
211
+ `description` in `data/ships/experimental-effects.jsonc` is a mechanical note that
212
+ states what the `modifiers` list cannot — that High Yield Shell deals 50/50
213
+ kinetic/explosive damage with module splash, say — and 57 of the 86 effects need no
214
+ such note and carry none. What the game shows a player is display prose that names no
215
+ magnitudes ("Modified munitions that convert a portion of damage to explosive …"), and
216
+ it exists for every effect. Projecting one onto the other would have cost the
217
+ mechanical notes their numbers; storing the display prose here keeps each field doing
218
+ its own job, and the ships catalogue is unchanged.
219
+ - **Coverage:** complete. All 86 effects carry all six locales.
220
+ - **Manual corrections:** 26 of the source's descriptions begin with one or more
221
+ bracketed tokens — `[ShieldRegen]`, and `[SnsrBlinding][Heat]` on
222
+ `special_radiant_canister`. A token is byte-identical across all six locales and is
223
+ left untranslated in each, so it is an identifier the game's client consumes rather
224
+ than text meant for a player; the tokens are removed here. The `†` shadow marker
225
+ described under `experimental-effect-names.jsonc` is removed from descriptions too.
221
226
 
222
227
  ## `pre-engineered-variant-names.jsonc`
223
228
 
@@ -230,23 +235,42 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
230
235
  names such as the three `Decorative_*` festive launchers remain canonical English.
231
236
  - **The 22 Merc-shop rows carry the shop's own names**, in 14 distinct records — the shop
232
237
  sells a "Far-Reaching Abrasion Blaster", not an Abrasion Blaster — so they do not reuse
233
- their base module's record. English and the German, Spanish, French and Russian values
234
- are supplied by the repository owner from the in-game shop listing; no registry
235
- publishes them.
238
+ their base module's record. All six locales are supplied by the repository owner from
239
+ the in-game shop listing; no registry publishes them. The Brazilian Portuguese column
240
+ was acquired 2026-08-30 UTC and agrees byte-for-byte with the five columns already
241
+ stored, which it does not change.
236
242
  - **Coverage:** English covers every variant. Ordinary names inherit the explicit
237
- localized values available for their base module, which now includes Brazilian
238
- Portuguese on 51 of the 76 variants; the Merc-shop names carry the five locales the
239
- repository owner supplied and no Portuguese; fixed reward names have no accepted
240
- translation source.
243
+ localized values available for their base module, which includes Brazilian Portuguese
244
+ on 51 of the 76 variants; the Merc-shop names carry all six locales. Only the three
245
+ `Decorative_*` fixed reward names have no accepted translation source, in any locale.
241
246
  - **Manual corrections:** none.
242
247
 
248
+ ## Names this repository deliberately does not localize
249
+
250
+ Three catalogues were removed rather than completed, because the game does not translate
251
+ what they held and storing English under five more keys said otherwise.
252
+
253
+ - **Ship names and manufacturers.** Odyssey Materials Helper and EDSY each publish a
254
+ per-locale ship column, and every value either one publishes is byte-for-byte the
255
+ canonical English name: a hull name is a proper noun the game leaves alone, and so is
256
+ a manufacturer's. No source publishes a localized manufacturer label at all. A lookup
257
+ that can only ever answer in English is not a translation lookup, so `getShipName` and
258
+ `getShipManufacturer` are gone; `data/ships/ships.jsonc` carries both strings and stays
259
+ the one place to read them.
260
+ - **Engineering-group labels.** An engineering group is this repository's own partition
261
+ of the modules that share one menu; the game heads that menu with the module's
262
+ outfitting family and publishes no group label of its own. The EDSY `mtype-*` values
263
+ previously stored here were outfitting labels reached by a name join, which is why they
264
+ disagreed with `module-family-names.jsonc` in 22 places on wording. A group therefore
265
+ carries no name at all — see the header of `data/ships/engineering-options.jsonc` — and
266
+ a consumer names one by joining a module's `familyId` to `module-family-names.jsonc`.
267
+
243
268
  ## Known gaps
244
269
 
245
270
  Localized coverage follows the accepted sources and is not complete for every catalogue or
246
- stored locale. A language absent from all eleven catalogues is the locale decision
271
+ stored locale. A language absent from all eight catalogues is the locale decision
247
272
  recorded above rather than a gap. The accepted sources carry only canonical English for
248
- ship manufacturers, experimental-effect descriptions, 19 of the 77 outfitting-family
249
- labels, some engineering-group labels, slot and restriction labels, fixed reward names,
273
+ 19 of the 77 outfitting-family labels, slot and restriction labels, fixed reward names,
250
274
  and structured loadout, calculation, SLEF and edit messages. Missing source-backed
251
275
  translations remain tracked by
252
276
  [#320](https://github.com/DarkSession/Elite-Dangerous-Almanac/issues/320).
@@ -26,6 +26,28 @@
26
26
  Phosphorus, Sulphur, Iron, Nickel, Rhenium, Lead** — the convention the in-game raw
27
27
  grid columns follow.
28
28
 
29
+ ### Manual correction — the three Guardian blueprint fragments
30
+
31
+ FDevIDs' `material.csv` names `Guardian_ModuleBlueprint`, `Guardian_WeaponBlueprint` and
32
+ `Guardian_VesselBlueprint` `… Blueprint Segment`. The game calls them **Fragment**, which
33
+ is the name carried here. The in-game localisation table confirmed by repository-owner
34
+ in-game verification (2026-08-30 UTC) says `Fragment` in every locale, and the French and
35
+ Russian columns Odyssey Materials Helper already supplied said `Fragment de plan …` and
36
+ `Фрагмент чертежа …` while its English, German, Spanish and Portuguese said Segment — the
37
+ disagreement was inside one source, not between the game and this repository.
38
+
39
+ ### Manual correction — Guardian Wreckage Components has no Sentinel
40
+
41
+ FDevIDs names `Guardian_Sentinel_WreckageComponents` `Guardian Sentinel Wreckage
42
+ Components`; the game calls it **Guardian Wreckage Components**, which is the name
43
+ carried here. The symbol keeps Frontier's own `_Sentinel_` spelling, because that is what
44
+ the journal writes. Repository-owner in-game verification, 2026-08-30 UTC; the in-game
45
+ localisation table drops the word in German, Spanish, French and Brazilian Portuguese
46
+ too, and the Russian column Odyssey Materials Helper already supplied had no equivalent
47
+ of it either — `Обломки кораблекрушения Стражей`, against the `часовых Стражей` it uses
48
+ for `Guardian_Sentinel_WeaponParts`. That sibling **keeps** its Sentinel: the game names
49
+ it `Guardian Sentinel Weapon Parts`, so only the wreckage components are renamed.
50
+
29
51
  ### Secondary source — Thargoid caustic / Titan materials absent from FDevIDs
30
52
 
31
53
  Several Thargoid caustic and Titan materials are absent from the pinned FDevIDs
@@ -140,9 +140,16 @@ identity from FDevIDs, stats and slots from coriolis-data, joined on `symbol`.
140
140
  are omitted. Hull identity is already the map key; display names, slot keys and
141
141
  hardpoint counts are recoverable from `ships.jsonc`; all other acquisition and
142
142
  presentation metadata is unnecessary for projection and is dropped.
143
- - **Precision:** offsets remain at their observed numeric precision. Exact zero and tiny
144
- near-zero values both describe centerline mounts; the residuals are numeric precision,
145
- not meaningful sub-millimetre displacements to interpret or normalize.
143
+ - **Precision:** the offsets come from 32-bit-float model geometry, so decimal digits
144
+ below that grid describe nothing the source resolves. 196 of the 458 non-zero recorded
145
+ numbers are plainly a 32-bit float printed to ten decimals (`1.3350000381` is 1.335,
146
+ `-4.1649999619` is -4.165) and the rest sit within half a 32-bit-float step of one, so
147
+ each number is stored as the shortest rounding of its recorded decimal that still
148
+ lands on the same 32-bit float. 436 of the 468 shorten under that rule and none moves
149
+ by a full 32-bit-float step; the largest movement is 1.6 µm, the Cutter's
150
+ `48.7663916349` written `48.76639`. Exact zero and tiny near-zero values both describe
151
+ centerline mounts; the residuals are numeric precision, not meaningful sub-millimetre
152
+ displacements to interpret or normalize.
146
153
  - **Manual corrections:** none. All 48 hulls and all 234 of their hardpoint slot keys join
147
154
  one-to-one without correction.
148
155
 
@@ -493,7 +500,16 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
493
500
  every other record remains an omitted sparse field.
494
501
  - **`rateOfFire` is derived, not copied.** Upstream stores the fire interval; the
495
502
  journal (and this catalogue) report the combined shots per second, so it is
496
- computed as `burst / ((burst − 1) / burstRateOfFire + fireInterval)`. Coriolis
503
+ computed as `burst / ((burst − 1) / burstRateOfFire + fireInterval)` — with a float32
504
+ stored after every operation and the result written to six decimal places, which is
505
+ how the game computes and serializes it. The float matters on three records, where
506
+ exact arithmetic lands one place away: a capture is what settles it, and
507
+ `journal-cobra-mkv.jsonc` states a stock `RateOfFire` of 8.333334 for the small
508
+ gimballed multi-cannon, whose 0.12 s interval gives 8.333333 exactly and 8.333334
509
+ through the float. `Hpt_Slugshot_Fixed_Small` (5.555555) and
510
+ `Hpt_MkIIPlasmaShockAutocannon_Fixed_Large` (7.844017) follow the same rule; no
511
+ capture states either, so they are the derivation the multi-cannon vindicates rather
512
+ than observed readings. Coriolis
497
513
  (`Module.getRoF`) and EDSY (`rof = fpc / spc`) also fold `chargeTime` into this
498
514
  figure, but Frontier does not: `journal-federation-corvette-mixed.jsonc` states
499
515
  `RateOfFire` base values of 1.587302 for the small rail gun and 1.204819 for the
@@ -1470,6 +1486,17 @@ up straight through with no disambiguation at all. Both paths are evidence that
1470
1486
  "which experimentals go with blueprint X" has no single answer. Modules are therefore
1471
1487
  grouped (48 groups covering 1005 ordinary engineering menus) and each group lists the
1472
1488
  `blueprints` and `experimentals` it offers.
1489
+ - **A group carries no display name.** The grouping is this repository's own partition of
1490
+ the modules sharing one menu; the game publishes no engineering-group label, heading
1491
+ each menu with the module's outfitting family instead. EDSY's `mtype-*` strings, which
1492
+ this file previously stored as group names, are outfitting labels reached by a name
1493
+ join — which is why they disagreed with `module-families.jsonc` in 22 places on wording
1494
+ (`cannons` Russian "Пушки" against the family's "Орудия", `moduleReinforcements`
1495
+ Brazilian Portuguese title case against the family's sentence case). Consumers name a
1496
+ group by joining a module's `familyId` to `module-families.jsonc`. The two partitions
1497
+ do not coincide exactly: 47 of the 48 groups sit wholly inside one family, while
1498
+ `heatSinkLaunchers` covers both `heatsinkLaunchers` and `causticSinkLaunchers`, and the
1499
+ `fsd` and `hullReinforcements` families are each split across two groups.
1473
1500
  - **Source:** EDSY `eddb.js`, whose module-group tables carry each group's `blueprints`
1474
1501
  and `expeffects` lists and which modules belong to each group, and whose module records
1475
1502
  carry the per-module `noblueprints` / `noexpeffects`
@@ -1913,8 +1940,8 @@ up straight through with no disambiguation at all. Both paths are evidence that
1913
1940
  itself.
1914
1941
  - **Burst interval has to be added to the decoder's output by hand.** EDSY carries no
1915
1942
  journal Label for `bstint` — the journal reports the resulting `RateOfFire`, never the
1916
- interval it comes from — so a straight decode drops it, leaving the 13 variants that
1917
- change a burst pattern on the _stock_ cadence, and four of them (the two frag cannons
1943
+ interval it comes from — so a straight decode drops it, leaving the 13 variants whose
1944
+ stat block changes a burst pattern on the _stock_ cadence, and four of them (the two frag cannons
1918
1945
  and the two Guardian gauss cannons) inconsistent as well as slow, carrying the
1919
1946
  engineered `BurstSize` — and, on the gauss cannons, the engineered `BurstRateOfFire` —
1920
1947
  against a stock interval. All 13 are stored under **`BurstInterval`**, the same label
package/README.md CHANGED
@@ -168,19 +168,18 @@ pinned sources carry no translation instead of silently substituting English:
168
168
  ```ts
169
169
  import {
170
170
  getBlueprintName,
171
- getEngineeringGroupName,
172
171
  getMaterialName,
173
172
  getMicroResourceName,
174
173
  getModuleName,
175
- getShipName,
174
+ getOutfittingFamilyName,
176
175
  } from '@elite-dangerous-almanac/core/i18n';
177
176
 
178
177
  getModuleName('Int_Hyperdrive_Size6_Class5', 'de-DE'); // -> "Frameshiftantrieb"
179
178
  getBlueprintName('FSD_LongRange', 'fr-FR'); // -> "Portée FSD améliorée"
180
179
  getMaterialName('GridResistors', 'de'); // -> "Gitterwiderstände"
181
180
  getMicroResourceName('graphene', 'fr'); // -> "Graphène"
182
- getShipName('empire_trader', 'fr'); // -> "Imperial Clipper"
183
- getEngineeringGroupName('frameShiftDrives', 'de'); // -> null
181
+ getOutfittingFamilyName('shieldGenerators', 'de'); // -> "Schildgeneratoren"
182
+ getOutfittingFamilyName('xenoScanners', 'de'); // -> null
184
183
  ```
185
184
 
186
185
  The functions return an explicit source value verbatim, so a source-backed spelling may
@@ -189,10 +188,17 @@ catalogues carry English, French, German, Portuguese, Russian and Spanish, each
189
188
  under a bare language tag: a regional or script subtag is dropped (`de-DE` → `de`), and
190
189
  any other language returns `null`.
191
190
 
192
- The same contract covers ship manufacturers, pre-engineered variant names, engineering
193
- group names, experimental-effect descriptions, loadout-slot and restriction labels, and
194
- structured loadout, calculation, SLEF and edit messages. A family whose accepted source
195
- currently supplies only English returns `null` for every non-English locale.
191
+ The same contract covers pre-engineered variant names, experimental-effect names and
192
+ descriptions, loadout-slot and restriction labels, and structured loadout, calculation,
193
+ SLEF and edit messages. A family whose accepted source currently supplies only English
194
+ returns `null` for every non-English locale.
195
+
196
+ **Ship names, manufacturers and engineering groups have no lookup**, because the game
197
+ does not translate them. Hull names and manufacturers are proper nouns — every source
198
+ that publishes a localized ship column publishes the English spelling — so read them
199
+ from the ships catalogue (`getShipBySymbol(symbol)?.name` and `?.manufacturer`). An
200
+ engineering group has no in-game label at all: its menu is headed by the module's own
201
+ outfitting family, so name it with `getOutfittingFamilyName(module.familyId, locale)`.
196
202
 
197
203
  Registry lookups ignore case and surrounding whitespace. The material, commodity and
198
204
  module lookups that resolve one record by symbol or name search their complete registry