i18n(app-svep) + i18n-vakt: hela mobil-UI:t översatt + CI-vakt mot regress

- Svepte 51 hårdkodade strängar -> t() över konto, sök/bläddra, sparade recept,
  kök, planera, skanna, byt måltid, inköp, minne, cooking, api-fel (+ locLabel/
  kategorier via nycklar). 47 nya nycklar, översatta till alla 12 språk.
- NY: apps/mobile/scripts/i18n-check.mjs (i18n:check) – fäller bygget om ett språk
  saknar en nyckel, en använd nyckel saknas, eller det finns hårdkodad UI-text.
  Wire:ad i CI (.github/workflows/ci.yml) efter typecheck. => 'lägg till språk'
  blir: kör vakten, den listar exakt vad som fattas. Aldrig mer leta för hand.
- Prettier-fixade 5 filer från tidigare leveranser så format:check blir grön.
- submit-recipe fri-text-payload + firebase dev-stubs markerade // i18n-ignore.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude
2026-08-21 01:50:08 +00:00
parent cadaa1a41f
commit 2d59a3e636
36 changed files with 1123 additions and 288 deletions
+1 -1
View File
@@ -51,7 +51,7 @@ export default function LoginScreen() {
<Screen style={{ flexGrow: 1, justifyContent: "center", gap: spacing.md }}>
<View style={{ alignItems: "center", marginBottom: spacing.lg }}>
<Title>{BRAND.name}</Title>
<Body muted>Mindre svinn, mindre stress, mer kvar i plånboken</Body>
<Body muted>{t("auth.tagline")}</Body>
</View>
<Input
placeholder={t("auth.email")}
+3 -3
View File
@@ -28,11 +28,11 @@ export default function RegisterScreen() {
const submit = async () => {
if (password.length < 8) {
setError("Lösenordet måste vara minst 8 tecken.");
setError(t("auth.passwordMin8"));
return;
}
if (password !== confirmPassword) {
setError("Lösenorden matchar inte.");
setError(t("auth.passwordMismatch"));
return;
}
setBusy(true);
@@ -112,7 +112,7 @@ export default function RegisterScreen() {
onChangeText={setPassword}
/>
<Input
placeholder="Upprepa lösenord"
placeholder={t("auth.repeatPassword")}
secureTextEntry
value={confirmPassword}
onChangeText={setConfirmPassword}