feat: dölj SEK-receptkostnad för icke-SEK-användare + i18n:remove-language
- Recept-kostnaden ligger i SEK (basvaluta, D-028). För en spansk användare (currency != SEK) nollas estimatedCostMinorPerPortion i API:t (list + detalj) -> kostnads-taggen försvinner helt i stället för att visa en svensk SEK-siffra. (Beslut: hellre ingen uppskattning än fel valuta, tills riktpriser via kvitton/M8.) - i18n:remove-language – motsvarighet till add-language, tar bort ett språk rent. Verifierat: add el -> remove el -> byte-rent, vakt + typecheck gröna. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,8 @@
|
||||
"typecheck": "tsc --noEmit",
|
||||
"test": "vitest run --passWithNoTests",
|
||||
"i18n:check": "node scripts/i18n-check.mjs",
|
||||
"i18n:add-language": "node scripts/i18n-add-language.mjs"
|
||||
"i18n:add-language": "node scripts/i18n-add-language.mjs",
|
||||
"i18n:remove-language": "node scripts/i18n-remove-language.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@app/analytics": "workspace:*",
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* i18n:remove-language – ta bort ett språk rent (motsatsen till add-language).
|
||||
*
|
||||
* node scripts/i18n-remove-language.mjs <kod>
|
||||
* ex: node scripts/i18n-remove-language.mjs el
|
||||
*
|
||||
* Tar bort: locale-mappen, profile.language.<kod>-raden i alla filer, och de tre
|
||||
* raderna i i18n.ts (import + SUPPORTED_LANGUAGES + resources). Endast radborttag
|
||||
* → minimala diffar. Kör i18n:check + typecheck efteråt för att bekräfta.
|
||||
*/
|
||||
import { rmSync, readFileSync, writeFileSync, existsSync, readdirSync, statSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
|
||||
const ROOT = process.cwd(); // apps/mobile
|
||||
const LOC = join(ROOT, "src/locales");
|
||||
const I18N = join(ROOT, "src/lib/i18n.ts");
|
||||
|
||||
const code = process.argv[2];
|
||||
if (!code || !/^[a-z]{2,3}$/.test(code)) {
|
||||
console.error("Användning: node scripts/i18n-remove-language.mjs <kod> (t.ex. el)");
|
||||
process.exit(1);
|
||||
}
|
||||
if (code === "sv") {
|
||||
console.error("Kan inte ta bort sv – svenska är källspråket.");
|
||||
process.exit(1);
|
||||
}
|
||||
if (!existsSync(join(LOC, code))) {
|
||||
console.error(`src/locales/${code} finns inte – inget att ta bort.`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// 1. locale-mappen
|
||||
rmSync(join(LOC, code), { recursive: true, force: true });
|
||||
|
||||
// 2. profile.language.<kod>-raden ur alla kvarvarande locale-filer
|
||||
const labelNeedle = `"profile.language.${code}":`;
|
||||
for (const lang of readdirSync(LOC).filter((d) => statSync(join(LOC, d)).isDirectory())) {
|
||||
const p = join(LOC, lang, "common.json");
|
||||
const lines = readFileSync(p, "utf8").split("\n");
|
||||
const kept = lines.filter((l) => !l.includes(labelNeedle));
|
||||
if (kept.length !== lines.length) writeFileSync(p, kept.join("\n"));
|
||||
}
|
||||
|
||||
// 3. de tre raderna i i18n.ts
|
||||
const importNeedle = `import ${code} from "../locales/${code}/common.json";`;
|
||||
const supportedNeedle = `code: "${code}",`;
|
||||
const resourceRe = new RegExp(`^\\s+${code}: \\{ common: ${code} \\},$`);
|
||||
const kept = readFileSync(I18N, "utf8")
|
||||
.split("\n")
|
||||
.filter((l) => l.trim() !== importNeedle && !l.includes(supportedNeedle) && !resourceRe.test(l));
|
||||
writeFileSync(I18N, kept.join("\n"));
|
||||
|
||||
console.log(`✓ Tog bort språket "${code}" (locale-mapp, etikett i alla filer, i18n.ts-rader).`);
|
||||
console.log(`Kör: pnpm --filter @app/mobile i18n:check && pnpm --filter @app/mobile typecheck`);
|
||||
Reference in New Issue
Block a user