@elite-dangerous-almanac/core 0.2.7 → 0.2.9

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 (266) hide show
  1. package/PROVENANCE/astro/SOURCES.md +13 -12
  2. package/PROVENANCE/commodities/SOURCES.md +50 -6
  3. package/PROVENANCE/equipment/SOURCES.md +229 -29
  4. package/PROVENANCE/i18n/SOURCES.md +328 -73
  5. package/PROVENANCE/ships/SOURCES.md +352 -216
  6. package/README.md +30 -7
  7. package/THIRD_PARTY_NOTICES.md +12 -1
  8. package/dist/astro/body-rings.d.ts +2 -2
  9. package/dist/astro/codex-region-lookup.d.ts +1 -1
  10. package/dist/astro/codex-region-lookup.js +1 -1
  11. package/dist/astro/hand-authored-regions.d.ts +1 -1
  12. package/dist/astro/index.d.ts +1 -1
  13. package/dist/astro/index.js +1 -1
  14. package/dist/astro/naming-region-origins.d.ts +1 -1
  15. package/dist/astro/naming-region-origins.js +1 -1
  16. package/dist/astro/nebulae-all.d.ts +4 -6
  17. package/dist/astro/nebulae-all.js +1 -1
  18. package/dist/astro/nebulae-all.js.map +1 -1
  19. package/dist/astro/nebulae-planetary.d.ts +4 -5
  20. package/dist/astro/nebulae-planetary.js +1 -1
  21. package/dist/astro/nebulae-procgen.d.ts +3 -3
  22. package/dist/astro/nebulae-real.d.ts +3 -3
  23. package/dist/astro/nebulae.d.ts +8 -8
  24. package/dist/astro/permit-locked-regions.d.ts +2 -2
  25. package/dist/astro/permit-locked-systems.d.ts +1 -1
  26. package/dist/astro/permit-locks.d.ts +2 -2
  27. package/dist/astro/procedural-system.d.ts +3 -3
  28. package/dist/astro/procedural-system.js +1 -1
  29. package/dist/astro/system-address.d.ts +1 -1
  30. package/dist/astro/system-address.js +1 -1
  31. package/dist/astro/system-name.js +1 -1
  32. package/dist/{chunk-XSLPWM5N.js → chunk-2J6NNI3Y.js} +1 -1
  33. package/dist/{chunk-DWRNXUAX.js → chunk-2KIZN3BY.js} +1 -1
  34. package/dist/{chunk-J7BM5NGK.js → chunk-2TY42PTF.js} +1 -1
  35. package/dist/{chunk-MVBVXK3G.js → chunk-3GNYPM6J.js} +1 -1
  36. package/dist/{chunk-MVBVXK3G.js.map → chunk-3GNYPM6J.js.map} +1 -1
  37. package/dist/{chunk-773VO2GK.js → chunk-4T3TTYUT.js} +1 -1
  38. package/dist/{chunk-773VO2GK.js.map → chunk-4T3TTYUT.js.map} +1 -1
  39. package/dist/chunk-7C7NJWCF.js +1 -0
  40. package/dist/chunk-7C7NJWCF.js.map +1 -0
  41. package/dist/{chunk-FMA36V6A.js → chunk-7Y5EK2VO.js} +1 -1
  42. package/dist/{chunk-FMA36V6A.js.map → chunk-7Y5EK2VO.js.map} +1 -1
  43. package/dist/chunk-AC3U7LRK.js +1 -0
  44. package/dist/{chunk-MGRDB2BZ.js.map → chunk-AC3U7LRK.js.map} +1 -1
  45. package/dist/{chunk-BJU27V6C.js → chunk-AUBV6S7V.js} +1 -1
  46. package/dist/{chunk-BJU27V6C.js.map → chunk-AUBV6S7V.js.map} +1 -1
  47. package/dist/{chunk-DI5RXSJR.js → chunk-BVLBS2QY.js} +1 -1
  48. package/dist/{chunk-DI5RXSJR.js.map → chunk-BVLBS2QY.js.map} +1 -1
  49. package/dist/chunk-C3YZ5KTA.js +1 -0
  50. package/dist/chunk-C3YZ5KTA.js.map +1 -0
  51. package/dist/{chunk-6UNAD74Z.js → chunk-C4FUV6GF.js} +1 -1
  52. package/dist/{chunk-6UNAD74Z.js.map → chunk-C4FUV6GF.js.map} +1 -1
  53. package/dist/chunk-CEF7SMB2.js +1 -0
  54. package/dist/chunk-CEF7SMB2.js.map +1 -0
  55. package/dist/chunk-E2HDF6PJ.js +1 -0
  56. package/dist/chunk-E2HDF6PJ.js.map +1 -0
  57. package/dist/{chunk-OFZGNWBT.js → chunk-ETREYN5U.js} +1 -1
  58. package/dist/{chunk-OFZGNWBT.js.map → chunk-ETREYN5U.js.map} +1 -1
  59. package/dist/{chunk-KBCA4GEZ.js → chunk-FP2TQJZP.js} +1 -1
  60. package/dist/{chunk-F7VWRDSL.js → chunk-G7WARJ3X.js} +1 -1
  61. package/dist/chunk-G7WARJ3X.js.map +1 -0
  62. package/dist/{chunk-Z4OUB4SJ.js → chunk-GLTCCDN5.js} +1 -1
  63. package/dist/{chunk-Z4OUB4SJ.js.map → chunk-GLTCCDN5.js.map} +1 -1
  64. package/dist/chunk-GVNTKCVF.js +1 -0
  65. package/dist/chunk-GVNTKCVF.js.map +1 -0
  66. package/dist/{chunk-Q6YDPREF.js → chunk-GZLD7RTK.js} +1 -1
  67. package/dist/{chunk-Q6YDPREF.js.map → chunk-GZLD7RTK.js.map} +1 -1
  68. package/dist/chunk-HIJR7DOC.js +1 -0
  69. package/dist/chunk-HIJR7DOC.js.map +1 -0
  70. package/dist/{chunk-ETWMPMZP.js → chunk-K5JK3XQB.js} +1 -1
  71. package/dist/{chunk-GRIK3EDH.js → chunk-KY7KSPU6.js} +1 -1
  72. package/dist/{chunk-GRIK3EDH.js.map → chunk-KY7KSPU6.js.map} +1 -1
  73. package/dist/{chunk-EHFHRQEP.js → chunk-M4STXLXO.js} +1 -1
  74. package/dist/{chunk-EHFHRQEP.js.map → chunk-M4STXLXO.js.map} +1 -1
  75. package/dist/{chunk-NZXSIHAW.js → chunk-OSMBAFRW.js} +1 -1
  76. package/dist/{chunk-NZXSIHAW.js.map → chunk-OSMBAFRW.js.map} +1 -1
  77. package/dist/chunk-PIU24HRN.js +1 -0
  78. package/dist/chunk-PIU24HRN.js.map +1 -0
  79. package/dist/{chunk-ELT3FEA4.js → chunk-PKKBYBL4.js} +1 -1
  80. package/dist/{chunk-ELT3FEA4.js.map → chunk-PKKBYBL4.js.map} +1 -1
  81. package/dist/{chunk-6HMIF2RJ.js → chunk-Q647OXON.js} +1 -1
  82. package/dist/{chunk-6HMIF2RJ.js.map → chunk-Q647OXON.js.map} +1 -1
  83. package/dist/{chunk-BMQM4JBL.js → chunk-QPT2WJYN.js} +1 -1
  84. package/dist/{chunk-BMQM4JBL.js.map → chunk-QPT2WJYN.js.map} +1 -1
  85. package/dist/{chunk-A6OINYNP.js → chunk-R2AEZYX7.js} +1 -1
  86. package/dist/chunk-RA4YJBU5.js +1 -0
  87. package/dist/chunk-RA4YJBU5.js.map +1 -0
  88. package/dist/{chunk-MRLUWHGI.js → chunk-RJ3ZLQRB.js} +1 -1
  89. package/dist/{chunk-MRLUWHGI.js.map → chunk-RJ3ZLQRB.js.map} +1 -1
  90. package/dist/chunk-SFEQXUIA.js +1 -0
  91. package/dist/chunk-SIL356HB.js +1 -0
  92. package/dist/chunk-SIL356HB.js.map +1 -0
  93. package/dist/chunk-SS7HVNP5.js +1 -0
  94. package/dist/chunk-SS7HVNP5.js.map +1 -0
  95. package/dist/chunk-TRGHPX2O.js +1 -0
  96. package/dist/chunk-TRGHPX2O.js.map +1 -0
  97. package/dist/{chunk-GMTAFUAG.js → chunk-TYRH73MO.js} +1 -1
  98. package/dist/{chunk-GMTAFUAG.js.map → chunk-TYRH73MO.js.map} +1 -1
  99. package/dist/{chunk-7TVFV3VO.js → chunk-U3IRMXMR.js} +1 -1
  100. package/dist/{chunk-A7IVMYNF.js → chunk-U73MBQ45.js} +1 -1
  101. package/dist/{chunk-A7IVMYNF.js.map → chunk-U73MBQ45.js.map} +1 -1
  102. package/dist/{chunk-IZIIGK3W.js → chunk-UE22QU7A.js} +1 -1
  103. package/dist/{chunk-IZIIGK3W.js.map → chunk-UE22QU7A.js.map} +1 -1
  104. package/dist/{chunk-DBDCOHI4.js → chunk-UI5RROGI.js} +1 -1
  105. package/dist/{chunk-DBDCOHI4.js.map → chunk-UI5RROGI.js.map} +1 -1
  106. package/dist/chunk-URRPEUIK.js +1 -0
  107. package/dist/{chunk-QJECDMQQ.js.map → chunk-URRPEUIK.js.map} +1 -1
  108. package/dist/chunk-UTWZZOSA.js +1 -0
  109. package/dist/chunk-UTWZZOSA.js.map +1 -0
  110. package/dist/{chunk-ZEN5K3GE.js → chunk-UVX7RCMP.js} +1 -1
  111. package/dist/{chunk-ZEN5K3GE.js.map → chunk-UVX7RCMP.js.map} +1 -1
  112. package/dist/{chunk-7ATBEOVC.js → chunk-WG4DPXJI.js} +1 -1
  113. package/dist/{chunk-XFDMCPDW.js → chunk-WZIBBJHA.js} +1 -1
  114. package/dist/{chunk-XFDMCPDW.js.map → chunk-WZIBBJHA.js.map} +1 -1
  115. package/dist/{chunk-7S7ZTZZY.js → chunk-X3MXPE7G.js} +1 -1
  116. package/dist/{chunk-7S7ZTZZY.js.map → chunk-X3MXPE7G.js.map} +1 -1
  117. package/dist/{chunk-SD6GNFDX.js → chunk-YBE5M27G.js} +1 -1
  118. package/dist/{chunk-SD6GNFDX.js.map → chunk-YBE5M27G.js.map} +1 -1
  119. package/dist/chunk-ZBUTGTZ3.js +1 -0
  120. package/dist/chunk-ZBUTGTZ3.js.map +1 -0
  121. package/dist/commodities/commodities-all.d.ts +2 -2
  122. package/dist/commodities/commodities-all.js +1 -1
  123. package/dist/commodities/commodities-rare.d.ts +3 -4
  124. package/dist/commodities/commodities-rare.js +1 -1
  125. package/dist/commodities/commodities-standard.d.ts +7 -7
  126. package/dist/commodities/commodities-standard.js +1 -1
  127. package/dist/commodities/commodities.d.ts +12 -12
  128. package/dist/commodities/commodities.js +1 -1
  129. package/dist/commodities/index.js +1 -1
  130. package/dist/equipment/engineering.d.ts +58 -1
  131. package/dist/equipment/engineering.js +1 -1
  132. package/dist/equipment/index.d.ts +14 -3
  133. package/dist/equipment/index.js +1 -1
  134. package/dist/equipment/modification-journal.js +1 -1
  135. package/dist/equipment/modifications.d.ts +43 -11
  136. package/dist/equipment/modifications.js +1 -1
  137. package/dist/equipment/suits.d.ts +2 -115
  138. package/dist/equipment/suits.js +1 -1
  139. package/dist/equipment/tools.d.ts +102 -0
  140. package/dist/equipment/tools.js +1 -0
  141. package/dist/equipment/tools.js.map +1 -0
  142. package/dist/equipment/upgrade-costs.d.ts +2 -3
  143. package/dist/equipment/upgrade-costs.js +1 -1
  144. package/dist/equipment/weapons.d.ts +2 -121
  145. package/dist/equipment/weapons.js +1 -1
  146. package/dist/i18n/blueprints.d.ts +2 -3
  147. package/dist/i18n/blueprints.js +1 -1
  148. package/dist/i18n/commodities.d.ts +36 -0
  149. package/dist/i18n/commodities.js +1 -0
  150. package/dist/i18n/commodities.js.map +1 -0
  151. package/dist/i18n/experimental-effect-descriptions.d.ts +5 -6
  152. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  153. package/dist/i18n/experimental-effects.d.ts +2 -3
  154. package/dist/i18n/experimental-effects.js +1 -1
  155. package/dist/i18n/index.d.ts +87 -1
  156. package/dist/i18n/index.js +1 -1
  157. package/dist/i18n/materials.d.ts +2 -4
  158. package/dist/i18n/materials.js +1 -1
  159. package/dist/i18n/micro-resources.d.ts +2 -4
  160. package/dist/i18n/micro-resources.js +1 -1
  161. package/dist/i18n/module-families.d.ts +3 -5
  162. package/dist/i18n/module-families.js +1 -1
  163. package/dist/i18n/modules.d.ts +3 -6
  164. package/dist/i18n/modules.js +1 -1
  165. package/dist/i18n/personal-modifications.d.ts +66 -0
  166. package/dist/i18n/personal-modifications.js +1 -0
  167. package/dist/i18n/personal-modifications.js.map +1 -0
  168. package/dist/i18n/personal-tools.d.ts +33 -0
  169. package/dist/i18n/personal-tools.js +1 -0
  170. package/dist/i18n/personal-tools.js.map +1 -0
  171. package/dist/i18n/personal-weapons.d.ts +32 -0
  172. package/dist/i18n/personal-weapons.js +1 -0
  173. package/dist/i18n/personal-weapons.js.map +1 -0
  174. package/dist/i18n/pre-engineered.d.ts +1 -1
  175. package/dist/i18n/slots.d.ts +2 -2
  176. package/dist/i18n/suits.d.ts +89 -0
  177. package/dist/i18n/suits.js +1 -0
  178. package/dist/i18n/suits.js.map +1 -0
  179. package/dist/materials/index.d.ts +4 -3
  180. package/dist/materials/index.js +1 -1
  181. package/dist/materials/materials-all.d.ts +2 -2
  182. package/dist/materials/materials-all.js +1 -1
  183. package/dist/materials/materials-raw.d.ts +3 -4
  184. package/dist/materials/materials-raw.js +1 -1
  185. package/dist/materials/materials.d.ts +18 -15
  186. package/dist/materials/materials.js +1 -1
  187. package/dist/materials/micro-resources-all.d.ts +2 -2
  188. package/dist/materials/micro-resources-all.js +1 -1
  189. package/dist/materials/micro-resources-component.d.ts +2 -2
  190. package/dist/materials/micro-resources-consumable.d.ts +2 -2
  191. package/dist/materials/micro-resources-data.d.ts +2 -2
  192. package/dist/materials/micro-resources-item.d.ts +2 -2
  193. package/dist/materials/micro-resources.d.ts +17 -14
  194. package/dist/materials/micro-resources.js +1 -1
  195. package/dist/ships/ammunition.d.ts +4 -4
  196. package/dist/ships/blueprint-costs.d.ts +13 -13
  197. package/dist/ships/blueprint-costs.js +1 -1
  198. package/dist/ships/blueprint-journal.d.ts +3 -3
  199. package/dist/ships/blueprint-journal.js +1 -1
  200. package/dist/ships/blueprints.d.ts +3 -3
  201. package/dist/ships/build-metrics.d.ts +2 -1
  202. package/dist/ships/build-metrics.js +1 -1
  203. package/dist/ships/default-loadouts.d.ts +2 -3
  204. package/dist/ships/default-loadouts.js +1 -1
  205. package/dist/ships/engineering-options.d.ts +29 -32
  206. package/dist/ships/engineering-options.js +1 -1
  207. package/dist/ships/engineering.d.ts +1 -2
  208. package/dist/ships/engineering.js +1 -1
  209. package/dist/ships/experimental-effect-costs.d.ts +1 -1
  210. package/dist/ships/gunsights.d.ts +3 -3
  211. package/dist/ships/heat.d.ts +1 -1
  212. package/dist/ships/index.d.ts +4 -5
  213. package/dist/ships/index.js +1 -1
  214. package/dist/ships/loadout-validation.d.ts +8 -3
  215. package/dist/ships/loadout-validation.js +1 -1
  216. package/dist/ships/module-families.d.ts +1 -1
  217. package/dist/ships/modules-all.d.ts +2 -3
  218. package/dist/ships/modules-all.js +1 -1
  219. package/dist/ships/modules-core.d.ts +3 -3
  220. package/dist/ships/modules-hardpoint.d.ts +4 -5
  221. package/dist/ships/modules-hardpoint.js +1 -1
  222. package/dist/ships/modules-internal.d.ts +19 -9
  223. package/dist/ships/modules-internal.js +1 -1
  224. package/dist/ships/modules-utility.d.ts +3 -4
  225. package/dist/ships/modules-utility.js +1 -1
  226. package/dist/ships/modules.d.ts +31 -25
  227. package/dist/ships/modules.js +1 -1
  228. package/dist/ships/pre-engineered-stats.d.ts +1 -1
  229. package/dist/ships/pre-engineered-stats.js +1 -1
  230. package/dist/ships/pre-engineered.d.ts +9 -10
  231. package/dist/ships/pre-engineered.js +1 -1
  232. package/dist/ships/ship-loadout.d.ts +13 -7
  233. package/dist/ships/ship-loadout.js +1 -1
  234. package/dist/ships/ships.d.ts +1 -2
  235. package/dist/ships/ships.js +1 -1
  236. package/dist/ships/slots.d.ts +5 -5
  237. package/dist/suits-B37rAORs.d.ts +414 -0
  238. package/dist/{system-address-cyJaeZIS.d.ts → system-address-DmzXRD48.d.ts} +6 -4
  239. package/package.json +25 -1
  240. package/dist/chunk-4U7KYQGK.js +0 -1
  241. package/dist/chunk-4U7KYQGK.js.map +0 -1
  242. package/dist/chunk-6GJHUWMO.js +0 -1
  243. package/dist/chunk-6GJHUWMO.js.map +0 -1
  244. package/dist/chunk-77TT4K53.js +0 -1
  245. package/dist/chunk-B7EYTZRK.js +0 -1
  246. package/dist/chunk-B7EYTZRK.js.map +0 -1
  247. package/dist/chunk-C5HG4GJI.js +0 -1
  248. package/dist/chunk-C5HG4GJI.js.map +0 -1
  249. package/dist/chunk-F7VWRDSL.js.map +0 -1
  250. package/dist/chunk-KLC5XT6F.js +0 -1
  251. package/dist/chunk-KLC5XT6F.js.map +0 -1
  252. package/dist/chunk-MGRDB2BZ.js +0 -1
  253. package/dist/chunk-QJECDMQQ.js +0 -1
  254. package/dist/chunk-TSEDU73T.js +0 -1
  255. package/dist/chunk-TSEDU73T.js.map +0 -1
  256. package/dist/chunk-XRGECU7S.js +0 -1
  257. package/dist/chunk-XRGECU7S.js.map +0 -1
  258. /package/dist/{chunk-XSLPWM5N.js.map → chunk-2J6NNI3Y.js.map} +0 -0
  259. /package/dist/{chunk-DWRNXUAX.js.map → chunk-2KIZN3BY.js.map} +0 -0
  260. /package/dist/{chunk-J7BM5NGK.js.map → chunk-2TY42PTF.js.map} +0 -0
  261. /package/dist/{chunk-KBCA4GEZ.js.map → chunk-FP2TQJZP.js.map} +0 -0
  262. /package/dist/{chunk-ETWMPMZP.js.map → chunk-K5JK3XQB.js.map} +0 -0
  263. /package/dist/{chunk-A6OINYNP.js.map → chunk-R2AEZYX7.js.map} +0 -0
  264. /package/dist/{chunk-77TT4K53.js.map → chunk-SFEQXUIA.js.map} +0 -0
  265. /package/dist/{chunk-7TVFV3VO.js.map → chunk-U3IRMXMR.js.map} +0 -0
  266. /package/dist/{chunk-7ATBEOVC.js.map → chunk-WG4DPXJI.js.map} +0 -0
@@ -1,7 +1,10 @@
1
1
  # Localized game-name catalogues
2
2
 
3
3
  These catalogues keep the canonical English display names already published by the
4
- ships data domain and add only localized values carried explicitly by accepted sources.
4
+ ships, equipment, materials and commodities data domains and add only localized values
5
+ carried explicitly by accepted sources. Where a catalogue holds display prose rather
6
+ than a name, the owning domain publishes no English for it and all six values are the
7
+ source's own.
5
8
  They are deliberately sparse: absence means that no accepted source carried a value, and
6
9
  the lookup API returns `null` for that locale rather than treating English as a
7
10
  translation.
@@ -26,33 +29,39 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
26
29
  - **Acquired:** 2026-08-30 UTC.
27
30
  - **In-game localisation revision:** none published; the game ships no immutable
28
31
  identifier for its localisation tables. The acquired table is the evidence.
29
- - **Derivation:** all 1,194 current module symbols and English names come from the four
32
+ - **Derivation:** every current module symbol and English name comes from the four
30
33
  `data/ships/modules-*.jsonc` catalogues, which stay authoritative for canonical
31
34
  English. Each symbol joins case-insensitively to the in-game module localisation
32
35
  identity, which carries a `name`, a `longname` and an `info` string per locale. The
33
- join is exact and total: every one of the 1,194 resolves.
36
+ join is exact and total over the symbols the acquired table covers: every one of them
37
+ resolves. The **unreleased** Large Planetary Vehicle Hangars postdate that table
38
+ (§`data/ships/SOURCES.md`) and are joined to a later observation of the same
39
+ localisation identities instead, acquired 2026-09-02 UTC: it names
40
+ `Int_LargeBuggyBay_Size{2,4,6}_Class3` and their `_Free` twins in all six locales. It
41
+ does not name the Mk II line, whose three records carry English alone.
34
42
  - **`longname` is the name taken.** It is the outfitting list's full name and equals
35
43
  the canonical English on 1,041 of the symbols, where `name` — the abbreviated panel
36
44
  form — equals it on 726. **Both totals were counted over the 1,199-symbol set that
37
45
  preceded the removal of the five plain size-8 drives (§`data/ships/SOURCES.md`), and
38
46
  are not re-derived here:** the in-game localisation table is not vendored, so whether
39
47
  those five sat inside either total cannot be checked from this repository. Read them
40
- as upper bounds over 1,194 symbols until the table is re-acquired. `name` is taken
48
+ as upper bounds over the current symbol set until the table is re-acquired. `name` is taken
41
49
  only where a longname is a template rather than a name, which is the cargo racks,
42
50
  fuel tanks and corrosion-resistant racks whose longname carries a capacity.
43
51
  - **Aliasing is followed.** A localisation value may be a `$Other_Key;` pointer rather
44
52
  than text; roughly three thousand of the keys are. Each is followed to the entry
45
53
  holding real text before anything is stored, and a value still carrying a `$` token
46
54
  after that is not a name and is rejected.
47
- - **The `(Free)` vessel-hangar grants have no name of their own** — theirs is a
48
- template wrapping the base hangar's. Their canonical English is already the base
49
- module's, so they share its record, exactly as they did before.
50
- - **This table replaces the EDDI and EDSY joins the catalogue previously used**, and wins
51
- where they disagree, as in-game values do everywhere in this repository. It fills the
52
- 349 values those joins left empty and restyles 3,135 they carried, across 324 distinct
53
- record-and-locale pairs: 73 differ only in letter case, 10 only in punctuation or
54
- accents, and 241 in wording. Many of the last are the game being specific where the
55
- registries were general Russian `Двигатели` becomes `Маневровые двигатели`, Brazilian
55
+ - **The `(Free)` grants have no name of their own** — theirs is a template wrapping the
56
+ base module's. Their canonical English is already the base module's, so they share
57
+ its record. This covers the six Vessel Hangar grants and the three unreleased Large
58
+ Planetary Vehicle Hangar grants, observed as "Large Planetary Vehicle Hangar (Free)"
59
+ and its five translations each the base name plus a rendered marker.
60
+ - **The in-game table is authoritative over the EDDI and EDSY joins.** It carries 349
61
+ values absent from those registries and differs from them in 3,135 cells across 324
62
+ distinct record-and-locale pairs: 73 differ only in letter case, 10 only in punctuation
63
+ or accents, and 241 in wording. Many of the last are the game being specific where the
64
+ registries are general — Russian `Двигатели` is `Маневровые двигатели`, Brazilian
56
65
  Portuguese `Propulsores` becomes `Propulsores de desempenho melhorado`.
57
66
  - **The least abbreviated spelling is the one stored**, as it is in
58
67
  `material-names.jsonc`. The outfitting panel shortens a label that will not fit, and
@@ -66,19 +75,37 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
66
75
  `Elektr. Gegenmaßnahmen`. **Ten values remain abbreviated** because no source spells
67
76
  them out — the Mk II gravity-optimised thrusters in four locales, the Advanced
68
77
  Planetary Approach Suite in three, and three others — and there the alternative is a
69
- bare `Schubdüsen` or `Propulseurs` that loses what distinguishes the module.
78
+ bare `Schubdüsen` or `Propulseurs` that loses what distinguishes the module. The
79
+ unreleased Large Planetary Vehicle Hangar's Russian
80
+ `Крупный гараж для планет. транспорта` joins them: its `планет.` is the only spelling
81
+ observed, and expanding it to match the shipped hangar's `планетарного` would be this
82
+ repository writing the translation rather than reading it.
70
83
  - **A rendered capacity or grant marker is not a name.** A longname may carry a module's
71
84
  own capacity or a `(Free)` marker — `Anti-Korrosions-Frachtgestell (KAP.: 1)` — which
72
85
  describes one module rather than naming the family, so it is rejected and the source's
73
86
  other field is read instead.
74
87
  - **One record per canonical English name.** Where the source distinguishes in another
75
88
  locale what English spells the same way, the reading most symbols share is stored:
76
- `Lightweight Alloy` and `Reinforced Alloy` are singular on 25 hulls and plural on the
89
+ `Lightweight Alloy` and `Reinforced Alloy` are singular on most hulls and plural on the
77
90
  rest, and the singular is kept, which is also the number the English carries.
78
- `Hatch Breaker Limpet Controller` is specific on twenty symbols and generic on one, and
91
+ `Hatch Breaker Limpet Controller` is specific on most symbols and generic on one, and
79
92
  the specific is kept.
80
- - **Coverage:** complete. All 1,194 symbols carry all six locales.
81
- - **Manual corrections:** none.
93
+ - **Coverage:** complete. Every symbol carries all six locales — but five of those
94
+ values are **constructed rather than read**; see the manual correction below.
95
+ - **Manual corrections:** the **Mk II** Large Planetary Vehicle Hangar's five non-English
96
+ names are built, not sourced. Nothing acquired names that unreleased module in any
97
+ locale but English, and rather than leave the lookups answering `null` the repository
98
+ owner chose to form each as the plain hangar's own translation with `Mk II` appended —
99
+ `Großer Planetenfahrzeug-Hangar Mk II`, `Hangar de vehículo planetario Mk II`,
100
+ `Grand hangar des véhicules planétaires Mk II`,
101
+ `Hangar de veículo planetário grande Mk II`,
102
+ `Крупный гараж для планет. транспорта Mk II`. Four locales have a precedent for that
103
+ shape in the shipped Mk II Vessel Hangar and Mk II Cargo Rack, which suffix `Mk II`;
104
+ **German does not** — Frontier writes `Mk-II-Schiffshangar` for the hangar and
105
+ `Frachtgestell für Mk II` for the rack, so the German value here matches neither and is
106
+ the likeliest of the five to be wrong. All five are to be replaced by a real
107
+ localisation reading on release, and none should be treated as evidence of what
108
+ Frontier publishes. #16 tracks them with the records themselves.
82
109
 
83
110
  ## `blueprint-names.jsonc`
84
111
 
@@ -87,11 +114,11 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
87
114
  database version `424009901`, last-modified marker `20260810`.
88
115
  - **In-game localisation revision:** none published; the game ships no immutable
89
116
  identifier for its localisation tables. The acquired table is the evidence.
90
- - **Derivation:** each of the 107 current keys and its English name comes from
117
+ - **Derivation:** each current key and its English name comes from
91
118
  `data/ships/blueprints.jsonc`. Names remain keyed per blueprint because a single
92
119
  English phrase can have different grammatical translations for different module
93
120
  families. The Frontier symbol joins case-insensitively to the in-game modification
94
- name table, which supplies every locale for the 90 recipes it names. The remaining 17
121
+ name table, which supplies every locale for the recipes it names. The rest
95
122
  are ids this repository keys separately because their numbers differ, where the game
96
123
  offers only the generic recipe's menu entry and so publishes only its name: each takes
97
124
  the locales of the generic id it shadows — `AFM_Shielded`, `Refineries_Shielded` and
@@ -105,7 +132,7 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
105
132
  canonical name is kept, as it is for every other blueprint. Where EDSY and the in-game
106
133
  table disagree the in-game value is kept, as everywhere else in this repository: it
107
134
  differs for ten values across four locales, all of them wording, none of them meaning.
108
- - **Coverage:** complete. All 107 blueprints carry all six locales.
135
+ - **Coverage:** complete. Every blueprint carries all six locales.
109
136
  - **Manual corrections:** two values in the in-game table carry a stray leading or
110
137
  trailing ASCII space, marked in the acquired table and removed here so a successful
111
138
  lookup is already trimmed like every other catalogue name: French `FSD_FastBoot` (which
@@ -118,13 +145,12 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
118
145
  - **Acquired:** 2026-08-30 UTC.
119
146
  - **In-game localisation revision:** none published; the game ships no immutable
120
147
  identifier for its localisation tables. The acquired table is the evidence.
121
- - **Derivation:** each of the 86 current keys and its English name comes from
148
+ - **Derivation:** each current key and its English name comes from
122
149
  `data/ships/experimental-effects.jsonc`, which stays authoritative for canonical
123
150
  English. The Frontier symbol joins to the in-game experimental-effect name table,
124
- which supplies every locale for all 86. The table replaces the EDSY join this
125
- catalogue previously used: where the two disagree the in-game value is kept, as
126
- everywhere else in this repository. It supplies six values EDSY did not carry — all
127
- five non-English `special_super_penetrator` names and the German
151
+ which supplies every locale for all of them. Where it and EDSY disagree, the in-game value
152
+ is kept, as everywhere else in this repository. It supplies six values EDSY does not
153
+ carry all five non-English `special_super_penetrator` names and the German
128
154
  `special_weapon_rateoffire` — and changes two EDSY already carried: German
129
155
  `special_regeneration_sequence` is "Regenerationssequenz" (EDSY
130
156
  "Regenerierungssequenz") and Brazilian Portuguese `special_lock_breaker` is "Quebra da
@@ -134,7 +160,7 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
134
160
  `special_super_penetrator_cooled` are pre-engineered rail-gun variants the game does
135
161
  not name separately, so the source marks them as carrying the base effect's entry.
136
162
  Each takes those values, exactly as a shadowing blueprint id takes its generic's.
137
- - **Coverage:** complete. All 86 effects carry all six locales.
163
+ - **Coverage:** complete. Every effect carries all six locales.
138
164
  - **Manual corrections:** the source appends a `†` to every marked cell of the three
139
165
  `_cooled` variants above; it is the acquisition's own shadow marker rather than part of
140
166
  a name, and is removed here.
@@ -144,7 +170,7 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
144
170
  - **Acquired:** 2026-08-16 UTC.
145
171
  - **Odyssey Materials Helper revision:** commit
146
172
  `23343c453938e724f317c56e9eb7db0dbfa71f78`.
147
- - **Derivation:** each of the 146 current symbols and its canonical English name comes
173
+ - **Derivation:** each current symbol and its canonical English name comes
148
174
  from the three `data/materials/materials-*.jsonc` catalogues. The lower-cased symbol
149
175
  joins directly to the final component of Odyssey Materials Helper's message key in
150
176
  `locale/material/horizons/{raw,manufactured,encoded}.csv`; only that row's explicit
@@ -155,14 +181,14 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
155
181
  source values.
156
182
  - **Second source, the in-game material localisation tables**, acquired 2026-08-30 UTC;
157
183
  the game publishes no immutable identifier for them, so the acquired table is the
158
- evidence. It covers all 146 materials in all six locales and, as everywhere else in
159
- this repository, wins where the two disagree. That fills the 30 values Odyssey
160
- Materials Helper did not carry and restyles 30 it did: 23 are the French apostrophe
184
+ evidence. It covers every material in all six locales and, as everywhere else in
185
+ this repository, wins where the two disagree. That fills the values Odyssey Materials
186
+ Helper did not carry and restyles others it did: most are the French apostrophe
161
187
  (the in-game tables use `'` throughout, as every other catalogue here does, where
162
- Odyssey Materials Helper uses `’`), five are Spanish names the helper title-cased
188
+ Odyssey Materials Helper uses `’`), the next largest group is Spanish names the helper title-cased
163
189
  (`Fragmento Caústico` against the game's `Fragmento cáustico`), and the rest are
164
190
  wording.
165
- - **Coverage:** complete. All 146 materials carry all six locales.
191
+ - **Coverage:** complete. Every material carries all six locales.
166
192
  - **Manual corrections:** six of the in-game values are the outfitting UI's own
167
193
  abbreviations, shortened to fit its widget rather than translated differently —
168
194
  `Comp. de destroços Guardian` against the helper's `Componentes de destroços Sentinela
@@ -183,26 +209,26 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
183
209
  `23343c453938e724f317c56e9eb7db0dbfa71f78`.
184
210
  - **Supplemental source:** in-game verification, acquired 2026-08-16 UTC; immutable
185
211
  revision unavailable.
186
- - **Derivation:** each of the 226 current symbols and its canonical English name comes
212
+ - **Derivation:** each current symbol and its canonical English name comes
187
213
  from the four `data/materials/micro-resources-*.jsonc` catalogues. The 196 FDevIDs-backed
188
214
  records join directly to the final component of Odyssey Materials Helper's message key
189
215
  in `locale/material/odyssey/{asset,consumable,data,good}.csv`; only that row's explicit
190
- localized columns are copied. Twenty-eight of the 30 in-game-backed records also have
191
- rows in Odyssey Materials Helper, while `PowerVirus` and
192
- `SmallCapacityPowerRegulator` do not. All 30 take the explicit in-game `name` values for
193
- German, Spanish, French and Russian. In both cases the owning catalogue remains
194
- authoritative for canonical English names.
216
+ localized columns are copied. All but two of the in-game-backed records also have
217
+ rows in Odyssey Materials Helper, the exceptions being `PowerVirus` and
218
+ `SmallCapacityPowerRegulator`. Every in-game-backed record takes the explicit in-game
219
+ `name` values for German, Spanish, French and Russian. In both cases the owning
220
+ catalogue remains authoritative for canonical English names.
195
221
  - **Second source, the in-game micro-resource localisation tables**, acquired
196
222
  2026-08-30 UTC; the game publishes no immutable identifier for them, so the acquired
197
- table is the evidence. It covers 225 of the 226 in all six locales and wins where the
198
- two disagree, on the same footing as the material tables above. That fills all 47
199
- remaining values — including the Brazilian Portuguese for `PowerVirus` and
200
- `SmallCapacityPowerRegulator`, which no registry carries — and restyles 46, of which 36
201
- are the French apostrophe and seven are the French Powerplay term, which the game
223
+ table is the evidence. It covers all but one symbol in all six locales and wins where the
224
+ two disagree, on the same footing as the material tables above. That fills every
225
+ remaining value — including the Brazilian Portuguese for `PowerVirus` and
226
+ `SmallCapacityPowerRegulator`, which no registry carries — and restyles others, mostly
227
+ the French apostrophe and the French Powerplay term, which the game
202
228
  lower-cases (`Données classifiées de puissance`).
203
229
  `PowerMegashipData` is absent from the micro-resource table and appears in the material
204
230
  one; its values are taken from there.
205
- - **Coverage:** complete. All 226 micro resources carry all six locales.
231
+ - **Coverage:** complete. Every micro resource carries all six locales.
206
232
  - **Manual corrections:** five in-game values are layout, not names. Four German
207
233
  consumables carry a `<br>` inside a compound word that the UI wraps —
208
234
  `Energie-<br>zelle`, `Splitter-<br>granate`, `Schild-<br>unterbrecher` and
@@ -223,9 +249,9 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
223
249
  labels are copied verbatim. The join is on family identity rather than on English
224
250
  string equality, because the English column of the in-game table *is* the canonical
225
251
  English name the ships catalogue took from it.
226
- - **Coverage:** English covers all 77 families; the five other locales cover the same 58.
227
- The 19 without a source-backed label are the families the in-game outfitting screen
228
- does not name separately: `axMissileRacks`, `axMultiCannons`, `cargoHatches`,
252
+ - **Coverage:** English covers every family; the five other locales cover only the
253
+ families the in-game outfitting screen names. The families without a source-backed
254
+ label are: `axMissileRacks`, `axMultiCannons`, `cargoHatches`,
229
255
  `causticSinkLaunchers`, `guardianGaussCannons`, `guardianHybridPowerDistributors`,
230
256
  `guardianHybridPowerPlants`, `guardianNaniteTorpedoPylons`, `guardianPlasmaChargers`,
231
257
  `guardianShardCannons`, `guardianShieldReinforcementPackages`,
@@ -239,21 +265,21 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
239
265
  - **Acquired:** 2026-08-30 UTC.
240
266
  - **In-game localisation revision:** none published; the game ships no immutable
241
267
  identifier for its localisation tables. The acquired table is the evidence.
242
- - **Derivation:** each of the 86 current keys comes from
268
+ - **Derivation:** each current key comes from
243
269
  `data/ships/experimental-effects.jsonc`; the Frontier symbol joins to the in-game
244
- experimental-effect description table, which supplies every locale for all 86. All six
245
- values, English included, are the source's verbatim.
246
- - **This catalogue no longer projects the ships catalogue's `description`.** The two
270
+ experimental-effect description table, which supplies every locale for all of them.
271
+ All six values, English included, are the source's verbatim.
272
+ - **This catalogue does not project the ships catalogue's `description`.** The two
247
273
  answer different questions and are deliberately different strings. An effect's
248
274
  `description` in `data/ships/experimental-effects.jsonc` is a mechanical note that
249
275
  states what the `modifiers` list cannot — that High Yield Shell deals 50/50
250
- kinetic/explosive damage with module splash, say — and 57 of the 86 effects need no
276
+ kinetic/explosive damage with module splash, say — and most effects need no
251
277
  such note and carry none. What the game shows a player is display prose that names no
252
278
  magnitudes ("Modified munitions that convert a portion of damage to explosive …"), and
253
279
  it exists for every effect. Projecting one onto the other would have cost the
254
280
  mechanical notes their numbers; storing the display prose here keeps each field doing
255
281
  its own job, and the ships catalogue is unchanged.
256
- - **Coverage:** complete. All 86 effects carry all six locales.
282
+ - **Coverage:** complete. Every effect carries all six locales.
257
283
  - **Manual corrections:** 26 of the source's descriptions begin with one or more
258
284
  bracketed tokens — `[ShieldRegen]`, and `[SnsrBlinding][Heat]` on
259
285
  `special_radiant_canister`. A token is byte-identical across all six locales and is
@@ -264,19 +290,19 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
264
290
  ## `pre-engineered-variant-names.jsonc`
265
291
 
266
292
  - **Acquired:** 2026-08-18 UTC; the Merc-shop names 2026-08-22 UTC.
267
- - **Derivation:** all 76 compound identities and English names come from
293
+ - **Derivation:** every compound identity and English name comes from
268
294
  `data/ships/pre-engineered.jsonc`. An identity combines the base module symbol,
269
295
  blueprint, optional experimental effect and acquisition route. When a variant name
270
296
  exactly matches its base module's canonical name, it reuses that record from
271
- `module-names.jsonc`; the 41 distinct display records are stored once. Fixed reward
297
+ `module-names.jsonc`; each distinct display record is stored once. Fixed reward
272
298
  names such as the three `Decorative_*` festive launchers remain canonical English.
273
- - **The 22 Merc-shop rows carry the shop's own names**, in 14 distinct records — the shop
299
+ - **The Merc-shop rows carry the shop's own names** — the shop
274
300
  sells a "Far-Reaching Abrasion Blaster", not an Abrasion Blaster — so they do not reuse
275
301
  their base module's record. All six locales are supplied by the repository owner from
276
302
  the in-game shop listing; no registry publishes them. The Brazilian Portuguese column
277
303
  was acquired 2026-08-30 UTC and agrees byte-for-byte with the five columns already
278
304
  stored, which it does not change.
279
- - **A tech-broker unlock may carry an unlock marker**, and 19 of them do — see
305
+ - **A tech-broker unlock may carry an unlock marker**, and some do — see
280
306
  `data/ships/SOURCES.md`. Those names are not their base module's, so they do not reuse
281
307
  its record. Where the marker is a manufacturer (`Sirius`, `Azimuth`) or a version
282
308
  (`V1`) it is not a translatable word, so the localized value is that marker composed
@@ -300,39 +326,268 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
300
326
  own localized name.
301
327
 
302
328
  Replace any of the twelve with a source-backed value the moment one is published.
303
- - **Coverage:** English covers every variant, and Brazilian Portuguese and Russian now do
304
- too. Ordinary names inherit the explicit localized values available for their base
329
+ - **Coverage:** English, Brazilian Portuguese and Russian cover every variant. Ordinary
330
+ names inherit the explicit localized values available for their base
305
331
  module; the Merc-shop names carry all six locales. The German, Spanish and French gaps
306
332
  that remain are their base modules' own — the SCO drive and the Enhanced AX
307
333
  Multi-Cannon carry no value in those locales for composition to build on.
308
334
  - **Manual corrections:** none.
309
335
 
336
+ ## `suit-names.jsonc`
337
+
338
+ - **Acquired:** 2026-09-01 UTC.
339
+ - **In-game localisation revision:** none published; the game ships no immutable
340
+ identifier for its localisation tables. The acquired table is the evidence.
341
+ - **Derivation:** the four suit families and their canonical English names come from
342
+ `data/equipment/suits.jsonc`, which stays authoritative for canonical English. Each
343
+ family's grade symbols join case-insensitively to the in-game suit localisation
344
+ identity, which carries a `name`, a `longname` and an `info` string per locale. The
345
+ join is exact and total: every grade symbol resolves.
346
+ - **`name` is the value taken.** It is the suit's own name and equals the canonical
347
+ English on all four families.
348
+ - **The manufacturer is not part of the name.** `longname` prefixes one —
349
+ `Remlok Maverick Suit`, `Supratech Artemis Suit`, `Manticore Dominator Suit` — which
350
+ names a Pioneer Supplies listing rather than the suit, so it is rejected the way a
351
+ rendered capacity is in `module-names.jsonc`. The brand is a proper noun the game
352
+ leaves in English in every locale, so composing it back on costs nothing but the
353
+ name it would displace.
354
+ - **A suit is named per family, not per grade.** Every grade of a family carries
355
+ byte-identical values in all six locales, so one record is stored per family and
356
+ `nameKeys` maps the family id and every grade symbol onto it. Both forms a consumer
357
+ holds therefore resolve: `Suit.family` and the `utilitysuit_class3` a journal line
358
+ writes. The flight suit has a single grade whose symbol *is* the family id, so it
359
+ contributes one identifier where the other families contribute their family id and
360
+ each grade symbol.
361
+ - **Coverage:** complete. Every identifier carries all six locales.
362
+ - **Two suits are not stored**, because `data/equipment/suits.jsonc` does not carry them:
363
+ the five `specialistsuit_class{1..5}` grades, which the source does name
364
+ (`Specialist Suit`, listed as `Remlok Paragon Specialist Suit`), and `hyperspacesuit`,
365
+ which carries no text at all. Storing a name for equipment no catalogue owns would
366
+ leave a lookup answering for something the library cannot otherwise describe.
367
+ - **Manual corrections:** none.
368
+
369
+ ## `suit-descriptions.jsonc`
370
+
371
+ - **Acquired:** 2026-09-01 UTC.
372
+ - **In-game localisation revision:** none published; the game ships no immutable
373
+ identifier for its localisation tables. The acquired table is the evidence.
374
+ - **Derivation:** the same four families and the same identifier set as
375
+ `suit-names.jsonc`, joined to the `info` string of the in-game suit localisation
376
+ identity. All six values, English included, are the source's verbatim: the owning
377
+ catalogue publishes no description for a suit, so there is no canonical English here
378
+ to be authoritative for.
379
+ - **This is display prose, not the suit's stats.** `data/equipment/suits.jsonc` answers
380
+ what a suit does — shield strength, battery capacity, the four resistances — and the
381
+ description answers what it is for, naming no figure at all. Neither is projected onto
382
+ the other.
383
+ - **Coverage:** complete. Every identifier carries all six locales, and every grade of a
384
+ family shares its record exactly as in `suit-names.jsonc`.
385
+ - **The Specialist Suit grades carry no description at all**, which is a second reason
386
+ they are absent here beyond the owning catalogue not carrying them.
387
+ - **Manual corrections:** none. The English keeps the source's own mixed apostrophes
388
+ (`Manticore's`, `a user’s`); they are the game's prose and are stored as published.
389
+
390
+ ## `personal-weapon-descriptions.jsonc`
391
+
392
+ - **Acquired:** 2026-09-01 UTC.
393
+ - **In-game localisation revision:** none published; the game ships no immutable
394
+ identifier for its localisation tables. The acquired table is the evidence.
395
+ - **Derivation:** every current weapon symbol comes from `data/equipment/weapons.jsonc`.
396
+ Each joins case-insensitively to the in-game weapon localisation identity and takes its
397
+ `info` string; the join is exact and total. All six values, English included, are the
398
+ source's verbatim, because the owning catalogue publishes no weapon description.
399
+ - **No sibling name catalogue exists**, and that is a decision rather than a gap — see
400
+ §Names this repository deliberately does not localize.
401
+ - **Coverage:** complete. Every weapon carries all six locales.
402
+ - **Two entries the source carries are not stored:** `wpn_h_launcher_rocket_sauto`
403
+ (`Karma HL-9`), the heavy rocket launcher no current catalogue owns, and
404
+ `wpn_m_submachinegun_kinetic_burst`, which the table lists with no text at all.
405
+ - **Manual corrections:** none.
406
+
407
+ ## `personal-modification-names.jsonc`
408
+
409
+ - **Acquired:** 2026-09-01 UTC.
410
+ - **In-game localisation revision:** none published; the game ships no immutable
411
+ identifier for its localisation tables. The acquired table is the evidence.
412
+ - **Derivation:** every recipe symbol and its canonical English name comes from
413
+ `data/equipment/modifications.jsonc`, which stays authoritative for canonical English.
414
+ A symbol joins case-insensitively to the in-game modification identity as
415
+ `humanoidmod_<symbol>`, which carries a `name` and a `description` per locale.
416
+ - **The nine technology-specific recipes share the entry the game publishes.** Greater
417
+ Range, Headshot Damage and Improved Hip Fire Accuracy are one engineering option each
418
+ in game; this repository keys the Kinetic, Laser and Plasma recipes separately because
419
+ their material costs differ (§`data/equipment/SOURCES.md`). The `_kinetic`, `_laser`
420
+ and `_plasma` suffix is dropped before the join, so each of the three takes its generic
421
+ entry's locales — exactly as a shadowing blueprint id takes its generic's in
422
+ `blueprint-names.jsonc`. A smaller set of source entries therefore covers every recipe,
423
+ and the catalogue stores them once each: `nameKeys` maps a recipe symbol onto the entry the
424
+ game publishes, as `module-names.jsonc` maps a module symbol onto a shared name.
425
+ - **That shape is about visibility, not bytes.** Storing each shared entry three times
426
+ instead costs about the same, because the duplicate name records weigh roughly what
427
+ the `nameKeys` map does; the descriptions save about a fifteenth. What the
428
+ deduplicated form buys is that the sharing is stated in the data, rather than sitting in
429
+ six duplicate records a later edit could silently pull apart.
430
+ - **`Headshot Damage` is the one English value the game spells differently.** The in-game
431
+ menu reads `Headshot damage`; the owning catalogue's canonical `Headshot Damage` is
432
+ kept, as canonical English is kept everywhere in this directory. The lower-case
433
+ `Stowed reloading` the owning catalogue already carries *is* the game's own spelling
434
+ and agrees with it.
435
+ - **Coverage:** complete. Every recipe carries all six locales.
436
+ - **One in-game modification is not stored:** `humanoidmod_suit_headshotresistance`
437
+ (`Increased Helmet Protection`), which `data/equipment/modifications.jsonc` does not
438
+ carry as a recipe.
439
+ - **Manual corrections:** two German names are the engineering panel's own layout rather
440
+ than translations. `Kampf-Bewegungs-geschwindigkeit` and `Geräusch-unterdrückung` break
441
+ a compound word mid-noun, leaving a lower-case second half no German spelling has. The
442
+ whole word is kept in each, as it is for the wrapped consumables in
443
+ `micro-resource-names.jsonc`: `Kampfbewegungsgeschwindigkeit` and
444
+ `Geräuschunterdrückung`.
445
+
446
+ ## `personal-modification-descriptions.jsonc`
447
+
448
+ - **Acquired:** 2026-09-01 UTC.
449
+ - **In-game localisation revision:** none published; the game ships no immutable
450
+ identifier for its localisation tables. The acquired table is the evidence.
451
+ - **Derivation:** the same recipe symbols as `personal-modification-names.jsonc`,
452
+ joined the same way and sharing the generic entry across the nine technology-specific
453
+ recipes for the same reason. Each takes the identity's `description` string. All six
454
+ values, English included, are the source's verbatim.
455
+ - **This is display prose, not the recipe's magnitudes.** The game says a modification
456
+ "allows more ammo to be carried for each weapon" and never how much more; the
457
+ `modifiers` list in `data/equipment/modifications.jsonc` is what states the multiplier,
458
+ and the two are deliberately different strings. It is also the only account of the ten
459
+ recipes whose `modifiers` list is empty — some switch a capability on, the rest move a
460
+ stat the panel puts no number on (§`data/equipment/SOURCES.md`).
461
+ - **Coverage:** complete. Every recipe carries all six locales.
462
+ - **Manual corrections:** none. The French
463
+ `weapon_backpackreloading` description keeps the non-breaking space the source sets
464
+ between a figure and its unit (`5 secondes`), which is French typography rather than
465
+ layout.
466
+
467
+ ## `personal-tool-names.jsonc`
468
+
469
+ - **Acquired:** 2026-09-03 UTC.
470
+ - **In-game localisation revision:** none published; the game ships no immutable
471
+ identifier for its localisation tables. The acquired table is the evidence.
472
+ - **Derivation:** every tool id and its canonical English name comes from
473
+ `data/equipment/tools.jsonc`, which stays authoritative for canonical English. Each id
474
+ joins by name to the tool's row in the in-game localisation table, which carries a
475
+ `name` per locale. The join is exact and total: every id resolves, and every row's
476
+ English `name` equals the canonical English.
477
+ - **The library id is the only key.** The localisation table keys a tool row by an
478
+ internal identity no journal field carries (§`data/equipment/SOURCES.md`), so a
479
+ consumer never holds one and it is not stored. The library id is the single identifier
480
+ both `getPersonalToolName` and `getPersonalToolById` take, and a second key set would
481
+ let one of the two answer where the other cannot.
482
+ - **A value equal to the English is the game's own.** The game leaves `Arc Cutter` in
483
+ English in German, Spanish, French and Brazilian Portuguese, and `Genetic Sampler` in
484
+ German; Russian translates both. Storing them verbatim is what the sparse contract
485
+ requires: the lookup answers with a source value and never manufactures an English
486
+ fallback.
487
+ - **Coverage:** complete. Every tool carries all six locales.
488
+ - **Manual corrections:** none.
489
+
490
+ ## `commodity-names.jsonc`
491
+
492
+ - **Acquired:** 2026-09-03 UTC.
493
+ - **In-game localisation revision:** none published; the game ships no immutable
494
+ identifier for its localisation tables. The acquired table is the evidence.
495
+ - **Derivation:** every symbol and canonical English name comes from
496
+ `data/commodities/commodities.jsonc` and `rare-commodities.jsonc`, which stay
497
+ authoritative for canonical English. Each symbol joins case-insensitively to the
498
+ in-game commodity localisation identity, which carries a `name` and an `info` string
499
+ per locale. `name` is the value taken. The join is exact and total: every commodity the
500
+ two catalogues hold resolves. The game also names commodity units no catalogue here
501
+ carries (§`data/commodities/SOURCES.md`); a name with no owning record is not stored,
502
+ so the key set is the catalogues' and not the game's.
503
+ - **Standard and rare share one catalogue here**, because they share one symbol space
504
+ and the game names them from one table.
505
+ - **The owning catalogues win the six English disagreements**, as this file's opening
506
+ rule requires. The game's English name is the shorter or the differently cased
507
+ spelling in all but the last of them: `Drones` keeps `Limpets` against `Limpet`,
508
+ `LowTemperatureDiamond` keeps `Low Temperature Diamonds` against
509
+ `Low Temp. Diamonds`, `AerialEdenApple`,
510
+ `WatersOfShintara` and `HIPOrganophosphates` keep their `of`, `of` and `HIP` against
511
+ `Of`, `Of` and `Hip`, and `ThargoidPod` keeps `Xenobiological Prison Pod` against
512
+ `Thargoid Bio-storage Capsule`. The last is a different name rather than a different
513
+ spelling, and it is the one to revisit first if the owning catalogue is ever re-derived
514
+ from the game.
515
+ - **Nine stored non-English values are the game's own abbreviations** — the German
516
+ `Fortschr. Katalysatoren` and `Histor. Kamorin-Waffen`, the Spanish
517
+ `Interconect. de eyector térmico` and `Conductos de transf. de energía`, the French
518
+ `Sys. surveillance animale`, `Sys. enrichissement sols` and
519
+ `Interconnexion dissipateur therm.`, and the Russian
520
+ `Агенты нервно-паралит. действия` and `Детали оборон. беспилотников` — and they stay
521
+ abbreviated because no source spells them out. This is the same position
522
+ `module-names.jsonc` records for its own abbreviated labels. The English `H.E. Suits`
523
+ is not one of them: it is the owning catalogue's own name.
524
+ - **Coverage:** complete. Every commodity carries all six locales, and no commodity has
525
+ five non-English values all byte-identical to its English, so no commodity name is a
526
+ proper noun the game leaves alone.
527
+ - **The registry's `info` prose is not stored.** Each commodity also carries an `info`
528
+ string per locale — the market panel's production, consumption and description text. A
529
+ commodity description catalogue would take those six values verbatim, the way
530
+ `suit-descriptions.jsonc` does; none exists, so the prose is absent rather than
531
+ partial.
532
+ - **Manual corrections:** one. The Spanish `BuckyballBeerMats` is published as
533
+ `"Posavasos Buckyball "` with a trailing space, which is layout and not part of the
534
+ name; it is stored trimmed. Every other value is verbatim.
535
+
310
536
  ## Names this repository deliberately does not localize
311
537
 
312
- Three catalogues were removed rather than completed, because the game does not translate
313
- what they held and storing English under five more keys said otherwise.
538
+ No catalogues are stored for the following names, either because the game does not
539
+ translate them storing English under five more keys would say otherwise — or because no
540
+ record in this repository is keyed by them.
314
541
 
315
542
  - **Ship names and manufacturers.** Odyssey Materials Helper and EDSY each publish a
316
543
  per-locale ship column, and every value either one publishes is byte-for-byte the
317
544
  canonical English name: a hull name is a proper noun the game leaves alone, and so is
318
- a manufacturer's. No source publishes a localized manufacturer label at all. A lookup
319
- that can only ever answer in English is not a translation lookup, so `getShipName` and
320
- `getShipManufacturer` are gone; `data/ships/ships.jsonc` carries both strings and stays
321
- the one place to read them.
545
+ a manufacturer's. No source publishes a localized manufacturer label at all.
546
+ `data/ships/ships.jsonc` is the one place to read both strings.
322
547
  - **Engineering-group labels.** An engineering group is this repository's own partition
323
548
  of the modules that share one menu; the game heads that menu with the module's
324
- outfitting family and publishes no group label of its own. The EDSY `mtype-*` values
325
- previously stored here were outfitting labels reached by a name join, which is why they
326
- disagreed with `module-family-names.jsonc` in 22 places on wording. A group therefore
549
+ outfitting family and publishes no group label of its own. EDSY's `mtype-*` values are
550
+ outfitting labels reached by a name join and disagree with
551
+ `module-family-names.jsonc` in 22 places on wording. A group therefore
327
552
  carries no name at all — see the header of `data/ships/engineering-options.jsonc` — and
328
553
  a consumer names one by joining a module's `familyId` to `module-family-names.jsonc`.
554
+ - **Handheld personal-weapon names.** The in-game weapon localisation table publishes all
555
+ six locales for every weapon, and every non-English value
556
+ is byte-for-byte the English: `Karma P-15`, `TK Aphelion` and `Manticore Executioner`
557
+ are product names the game leaves alone, exactly as it does a hull's. `PersonalWeapon`
558
+ in `data/equipment/weapons.jsonc` is the one place to read the name; the weapons'
559
+ *descriptions* are prose and are localized, in `personal-weapon-descriptions.jsonc`.
560
+ - **Personal-equipment manufacturers.** `Supratech`, `Remlok`, `Manticore` and
561
+ `Kinematic Armaments` are byte-for-byte identical in all six locales wherever the game
562
+ names them, which is why `suit-names.jsonc` stores a suit's own name and not the
563
+ outfitting list's manufacturer-prefixed listing.
564
+ - **Suit and weapon stat labels, the on-foot loadout panel's rows other than the weapon
565
+ mounts, and engineer dialogue.** These are the second reason rather than the first: the
566
+ game does publish all six locales for each, and none of them names a record in any
567
+ catalogue here. A stat label names a field of `Suit` or `PersonalWeapon`, a panel row
568
+ names a line of the on-foot loadout screen, and an engineer's line is spoken flavour
569
+ attached to an offer. Storing them would mean inventing keys this repository does not
570
+ otherwise own, so a consumer that needs a field label supplies its own. The weapon-mount
571
+ rows are outside this conclusion: `Suit.mounts` carries Frontier's own journal
572
+ `SlotName` for each one, so a mount row names a record this repository holds and its
573
+ localization is a gap rather than an invented key. **This is not the ship slot and
574
+ restriction gap of [#320](https://github.com/DarkSession/Elite-Dangerous-Almanac/issues/320)**,
575
+ which is about labels no source translates at all.
329
576
 
330
577
  ## Known gaps
331
578
 
332
579
  Localized coverage follows the accepted sources and is not complete for every catalogue or
333
- stored locale. A language absent from all eight catalogues is the locale decision
580
+ stored locale. A language absent from every catalogue is the locale decision
334
581
  recorded above rather than a gap. The accepted sources carry only canonical English for
335
- 19 of the 77 outfitting-family labels, slot and restriction labels, fixed reward names,
336
- and structured loadout, calculation, SLEF and edit messages. Missing source-backed
337
- translations remain tracked by
582
+ the outfitting-family labels listed above, slot and restriction labels, the suit
583
+ weapon-mount labels, fixed reward names, and structured loadout, calculation, SLEF and
584
+ edit messages. A missing source-backed translation that has no issue of its own
585
+ remains tracked by
338
586
  [#320](https://github.com/DarkSession/Elite-Dangerous-Almanac/issues/320).
587
+
588
+ Every suit, handheld weapon, tool and modification the personal-equipment catalogues
589
+ hold is complete in all six locales. That area carries these gaps:
590
+
591
+ - **The suit weapon-mount labels are English only.** The game publishes all six locales
592
+ for them, so the values exist to be read. The gap is tracked by
593
+ [#26](https://github.com/DarkSession/Elite-Dangerous-Almanac/issues/26).