{"_id":"@emdzej/ncsx-translations","_rev":"6-cedc49b035dd6d106bd578ace8096b32","name":"@emdzej/ncsx-translations","dist-tags":{"latest":"0.9.0"},"versions":{"0.4.0":{"name":"@emdzej/ncsx-translations","version":"0.4.0","_id":"@emdzej/ncsx-translations@0.4.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"07cd43fbad93e5d696d4331c8d4f7429ceb15443","tarball":"https://registry.npmjs.org/@emdzej/ncsx-translations/-/ncsx-translations-0.4.0.tgz","fileCount":19,"integrity":"sha512-pZlDe0dPnmZ3hMX8mK4pg6NBJ4mJEzzPBYffKwXwpyBOUce4lOMv+m1MAqt5Sth10zLjVlN+GFDNVgsIXFx/RA==","signatures":[{"sig":"MEUCIQCcx9O/dsr5+YqOnWoDaXMdVF3Cui9Nj2eupHx6fUAkhwIgRJeaLCJ6WI7vSsVqQR1ACmywxuvRnO3ZFTSm0vd4Xpg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20354},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-translations-0.4.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/4c02833f006652c730c8b2ed51575a84/emdzej-ncsx-translations-0.4.0.tgz","_integrity":"sha512-pZlDe0dPnmZ3hMX8mK4pg6NBJ4mJEzzPBYffKwXwpyBOUce4lOMv+m1MAqt5Sth10zLjVlN+GFDNVgsIXFx/RA==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/translations"},"_npmVersion":"11.14.1","description":"CSV parser + label formatter for NCSDummy's community-maintained Translations.csv (keyword → English). See ../../docs/ncsdummy-analysis.md.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-translations_0.4.0_1779705626884_0.4228773831554393","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@emdzej/ncsx-translations","version":"0.5.1","_id":"@emdzej/ncsx-translations@0.5.1","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"af18cc7278b65f6c7f8f07fe447a275702c7745f","tarball":"https://registry.npmjs.org/@emdzej/ncsx-translations/-/ncsx-translations-0.5.1.tgz","fileCount":19,"integrity":"sha512-3+YePWiO+edp6q2T/vMGPn3bu7N1zS/iUK6deY1Mkd86QtlfK4zAbulBkHvxE553F8fWoVIfxGGfuVFPTN+p1Q==","signatures":[{"sig":"MEUCIB/EluAFt7nbveD0nje8FUiVde0JCbFCE3cUinChVEJ7AiEAhn71g7U6p3cU+FkwfraDELuGo71/m1hiE2qNXyziveg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20354},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-translations-0.5.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/180c4a5b3aa06d3572b4670f2d601a51/emdzej-ncsx-translations-0.5.1.tgz","_integrity":"sha512-3+YePWiO+edp6q2T/vMGPn3bu7N1zS/iUK6deY1Mkd86QtlfK4zAbulBkHvxE553F8fWoVIfxGGfuVFPTN+p1Q==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/translations"},"_npmVersion":"11.14.1","description":"CSV parser + label formatter for NCSDummy's community-maintained Translations.csv (keyword → English). See ../../docs/ncsdummy-analysis.md.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-translations_0.5.1_1779876437711_0.5027113659813247","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@emdzej/ncsx-translations","version":"0.6.0","_id":"@emdzej/ncsx-translations@0.6.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"8ad9fd4b9423d4b81f06f55b6136db6afa4c1bf6","tarball":"https://registry.npmjs.org/@emdzej/ncsx-translations/-/ncsx-translations-0.6.0.tgz","fileCount":19,"integrity":"sha512-MQ8a/zVpNIx4M6073eMnGDea9ZVSQTsvUtpZ0IHhEnYDc6Q4JGNWHAHtAQ1cvJjHVPG12tvcKOAB3lK5PSfLCg==","signatures":[{"sig":"MEYCIQCoKRI+83sfTjItQT16ibaiHEYge6OboJZ3bN6WEqJNjQIhAKbacuHxOU25FT+/xQedeD1KXNdv/74R15S5XwZn16km","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20354},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-translations-0.6.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/0abd33794afd99b7c663c25a0d418e52/emdzej-ncsx-translations-0.6.0.tgz","_integrity":"sha512-MQ8a/zVpNIx4M6073eMnGDea9ZVSQTsvUtpZ0IHhEnYDc6Q4JGNWHAHtAQ1cvJjHVPG12tvcKOAB3lK5PSfLCg==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/translations"},"_npmVersion":"11.14.1","description":"CSV parser + label formatter for NCSDummy's community-maintained Translations.csv (keyword → English). See ../../docs/ncsdummy-analysis.md.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-translations_0.6.0_1779981241881_0.7467829090292053","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@emdzej/ncsx-translations","version":"0.7.0","_id":"@emdzej/ncsx-translations@0.7.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"bd1b311803ca32c233f2f78b5e79395690997757","tarball":"https://registry.npmjs.org/@emdzej/ncsx-translations/-/ncsx-translations-0.7.0.tgz","fileCount":19,"integrity":"sha512-k/J6ghoahsnZO156FbDMGBUQYKJtsK7HKH8lEfwt6w5Ag0cvYz4w+vmZ8ubvXeABL2KVHrFX/TmPqjsHhY7unA==","signatures":[{"sig":"MEYCIQDSGlLyx/S8fyc1TdybJQsMN2R68TPoWWx7FhN6JqyYrwIhAJ6AhkrTnJiAHsJrAVz0u1tKFXfCNeXtVYZ1d4uuJdo+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20354},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-translations-0.7.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/71209ca4c146c4897d36cde20dd33813/emdzej-ncsx-translations-0.7.0.tgz","_integrity":"sha512-k/J6ghoahsnZO156FbDMGBUQYKJtsK7HKH8lEfwt6w5Ag0cvYz4w+vmZ8ubvXeABL2KVHrFX/TmPqjsHhY7unA==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/translations"},"_npmVersion":"11.14.1","description":"CSV parser + label formatter for NCSDummy's community-maintained Translations.csv (keyword → English). See ../../docs/ncsdummy-analysis.md.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-translations_0.7.0_1780063007745_0.7446423782426164","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@emdzej/ncsx-translations","version":"0.8.0","_id":"@emdzej/ncsx-translations@0.8.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"4f9888e2cbf66bf62a55389ce3c3b039ea320d74","tarball":"https://registry.npmjs.org/@emdzej/ncsx-translations/-/ncsx-translations-0.8.0.tgz","fileCount":19,"integrity":"sha512-FIbWs7S5MnX+TM2ML8UZPxJxM2DMZfv2E2ZaOrE/2G6oYz8prOo9TklhZjOJb8iV6fj6xoLuXF/AnJhZ5E4uZw==","signatures":[{"sig":"MEQCICvma+l62JtqeodaruGVUQ80HjBKDzy7GRwBjyA1oVFTAiA2b1/oTxktEz9eBYORfo2r3wFx/AMCu1SMwx+Sifg+qw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20354},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-translations-0.8.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/39045ba35b9ba32437fdc00bd95d427f/emdzej-ncsx-translations-0.8.0.tgz","_integrity":"sha512-FIbWs7S5MnX+TM2ML8UZPxJxM2DMZfv2E2ZaOrE/2G6oYz8prOo9TklhZjOJb8iV6fj6xoLuXF/AnJhZ5E4uZw==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/translations"},"_npmVersion":"11.16.0","description":"CSV parser + label formatter for NCSDummy's community-maintained Translations.csv (keyword → English). See ../../docs/ncsdummy-analysis.md.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-translations_0.8.0_1780758412255_0.8341670491696913","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@emdzej/ncsx-translations","version":"0.9.0","description":"CSV parser + label formatter for NCSDummy's community-maintained Translations.csv (keyword → English). See ../../docs/ncsdummy-analysis.md.","main":"dist/index.js","types":"dist/index.d.ts","type":"module","devDependencies":{"@types/node":"^22.13.1","vitest":"^2.1.8"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/emdzej/ncsx.git","directory":"packages/translations"},"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run --passWithNoTests","test:watch":"vitest","lint":"eslint .","typecheck":"tsc --noEmit","clean":"rm -rf dist .turbo *.tsbuildinfo"},"_id":"@emdzej/ncsx-translations@0.9.0","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"homepage":"https://github.com/emdzej/ncsx#readme","_integrity":"sha512-XMDVsXXycz0nQygy/WNKqOwabJ2ccjBdz57+JSWwO7MsF39TCSfd00Hhv1B/PXc/dOsRwQojeCnhp/iajFb5NQ==","_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/4117c6c59157edf772915656b36aa6f2/emdzej-ncsx-translations-0.9.0.tgz","_from":"file:emdzej-ncsx-translations-0.9.0.tgz","_nodeVersion":"22.22.1","_npmVersion":"11.16.0","dist":{"integrity":"sha512-XMDVsXXycz0nQygy/WNKqOwabJ2ccjBdz57+JSWwO7MsF39TCSfd00Hhv1B/PXc/dOsRwQojeCnhp/iajFb5NQ==","shasum":"3295daa13aa3a97963cd05cdf64c94db21113671","tarball":"https://registry.npmjs.org/@emdzej/ncsx-translations/-/ncsx-translations-0.9.0.tgz","fileCount":19,"unpackedSize":20354,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHhUCHM7eAFwNWOqsI+zShDSlVKMJQomgSQHxp4a+4yVAiEA1D+JkvUMwB5jFDJGDPOFDH/2/mytDY59msB95btU69c="}]},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"directories":{},"maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ncsx-translations_0.9.0_1783336560747_0.8912565701425568"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T10:40:26.727Z","modified":"2026-07-06T11:16:00.982Z","0.4.0":"2026-05-25T10:40:27.026Z","0.5.1":"2026-05-27T10:07:17.858Z","0.6.0":"2026-05-28T15:14:02.045Z","0.7.0":"2026-05-29T13:56:47.888Z","0.8.0":"2026-06-06T15:06:52.392Z","0.9.0":"2026-07-06T11:16:00.886Z"},"bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"homepage":"https://github.com/emdzej/ncsx#readme","repository":{"type":"git","url":"git+https://github.com/emdzej/ncsx.git","directory":"packages/translations"},"description":"CSV parser + label formatter for NCSDummy's community-maintained Translations.csv (keyword → English). See ../../docs/ncsdummy-analysis.md.","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"readme":"# @emdzej/ncsx-translations\n\nCSV parser + label formatter for NCSDummy's community-maintained `Translations.csv` — the\nflat dictionary that turns `wert_01` into `Value 01`, `aktiv` into `Enabled`, `GPS_UHR`\ninto `Use time from GPS`, and ~26,000 other BMW coding keywords into English.\n\nThe CSV ships next to `NcsDummy.exe`. It's a single global lookup applied to every FSW,\nPSW, group description, and FA-token across all chassis — not scoped by chassis or\nmodule. The file is community-maintained; the header rows preserve the contributor\nlist and last-modified date.\n\nSee [`../../docs/ncsdummy-analysis.md`](../../docs/ncsdummy-analysis.md) for how this\nfits into the broader NCSDummy rendering pipeline.\n\n## Install\n\n```bash\npnpm add @emdzej/ncsx-translations\n# or in the ncsx monorepo:\n\"@emdzej/ncsx-translations\": \"workspace:*\"\n```\n\n## Quick start\n\n```ts\nimport { parseTranslationsCsv, formatLabel } from '@emdzej/ncsx-translations';\n\nconst csv = await fetch('/translations.csv').then((r) => r.text());\nconst file = parseTranslationsCsv(csv);\n\nconsole.log(file.lastModified);           // Date(2019-09-19) or null\nconsole.log(file.contributors);           // ['revtor', 'IcemanBHE', …]\nconsole.log(file.entries.get('wert_01')); // 'Value 01'\n\n// Render a row label the same way NCSDummy does:\nformatLabel('wert_01', file.entries);     // 'wert_01  -  Value 01'\nformatLabel('NEVERHEARDOF', file.entries); // 'NEVERHEARDOF'\n```\n\n## Format\n\nNCSDummy's CSV is ad-hoc — not RFC 4180. The parser is a faithful port of the\ncharacter-by-character loop in `Classes/Translations/TranslationFileReader.cs`:\n\n| Token         | Rule                                                          |\n|---------------|---------------------------------------------------------------|\n| `,` or `;`    | Unquoted cell separator. Inside quoted fields they're literal |\n| `\"…\"`         | Quote-delimit a field. `\"\"` (doubled quote) is one literal `\"` |\n| Empty body    | Empty rows are skipped                                        |\n| Empty translation | Keyword/translation rows with an empty translation are dropped — NCSDummy never adds them to the lookup |\n| `CONTRIBUTORS,\"a,b,c,…\"` | Stashed into `file.contributors` (split on commas)  |\n| `LASTMODIFIED,YYYYMMDD`  | Stashed into `file.lastModified` (UTC midnight)     |\n\n## API\n\n| Export                              | Purpose                                        |\n|-------------------------------------|------------------------------------------------|\n| `parseTranslationsCsv(text)`        | `text → TranslationFile` (entries + meta)      |\n| `formatLabel(keyword, translations)` | `\"keyword  -  translation\"` (NCSDummy style)  |\n| `splitLabel(keyword, translations)` | `{ keyword, translation: string \\| null }` — for HTML where keyword and translation render as separate spans |\n| `TranslationFile`                   | The parsed-file type                           |\n\n## Related\n\n- The CSV itself ships with NCSDummy at\n  `/path/to/BMW SOFTWARE/NCS Dummy/Translations.csv` — community-maintained, attribution\n  preserved in the `CONTRIBUTORS` row.\n- [`@emdzej/ncsx-function-list`](../function-list/) — the catalog this annotates.\n- [`@emdzej/ncsx-options`](../options/) — the parallel order-options layer (CVT-driven).\n","readmeFilename":"README.md"}