Skip to content

Commit 2cd1dc9

Browse files
committed
test(i18n): add locale-parity test and clean up drift across 28 locales
1 parent 5f70516 commit 2cd1dc9

29 files changed

Lines changed: 526 additions & 1398 deletions
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import fs from "fs"
2+
import path from "path"
3+
4+
import en from "@app/i18n/en"
5+
6+
const TRANSLATIONS_DIR = path.resolve(
7+
__dirname,
8+
"..",
9+
"..",
10+
"app",
11+
"i18n",
12+
"raw-i18n",
13+
"translations",
14+
)
15+
16+
type AnyTranslation = Record<string, unknown>
17+
18+
const collectLeafPaths = (node: unknown, prefix = ""): string[] => {
19+
if (node === null || typeof node !== "object") return [prefix]
20+
const obj = node as AnyTranslation
21+
return Object.keys(obj)
22+
.sort()
23+
.flatMap((key) => collectLeafPaths(obj[key], prefix ? `${prefix}.${key}` : key))
24+
}
25+
26+
const sourceLeafPaths = new Set(collectLeafPaths(en))
27+
28+
const diffSets = (
29+
source: Set<string>,
30+
target: Set<string>,
31+
): { missing: string[]; extra: string[] } => {
32+
const missing: string[] = []
33+
const extra: string[] = []
34+
for (const p of source) if (!target.has(p)) missing.push(p)
35+
for (const p of target) if (!source.has(p)) extra.push(p)
36+
return { missing, extra }
37+
}
38+
39+
const localeFiles = fs
40+
.readdirSync(TRANSLATIONS_DIR)
41+
.filter((name) => name.endsWith(".json"))
42+
.sort()
43+
44+
describe("locale parity", () => {
45+
localeFiles.forEach((localeFile) => {
46+
describe(localeFile, () => {
47+
const filePath = path.join(TRANSLATIONS_DIR, localeFile)
48+
const raw = fs.readFileSync(filePath, "utf8")
49+
const parsed = JSON.parse(raw) as AnyTranslation
50+
const localeLeafPaths = new Set(collectLeafPaths(parsed))
51+
52+
it("has the same set of leaf keys as the English source", () => {
53+
expect(diffSets(sourceLeafPaths, localeLeafPaths)).toEqual({
54+
missing: [],
55+
extra: [],
56+
})
57+
})
58+
})
59+
})
60+
})

app/i18n/raw-i18n/translations/af.json

Lines changed: 19 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818
"howToUseYourCashRegister": "Hoe om jou Kasregister te gebruik",
1919
"howToUseYourAddressExplainer": "Deel met iemand wat 'n versoenbare beursie het soos:",
2020
"howToUseYourPaycodeExplainer": "Jy kan jou LNURL uitdruk op papier (dit is tegnies 'n lnurl-pay adres) en dit in jou besigheid vertoon om betalings te ontvang. Individue kan jou betaal deur dit te skandeer met enige Lightning-beursie. \n\nWees egter bewus dat seker beursies nie 'n LNURL kan skandeer nie.",
21-
"howToUseYourCashRegisterExplainer": "Laat mense toe om betalings namens jou te aanvaar via die Kasregister skakel sonder om hulle toegang te gee tot die beursie. \n\nHulle kan dan self fakature genereer en betalings sal direk na jou {bankName: string} beursie gaan. ",
22-
"yourAddress": "{bankName: string}-adres",
23-
"copiedAddressToClipboard": "{bankName: string}-adres is na knipbord oorgedra"
21+
"howToUseYourCashRegisterExplainer": "Laat mense toe om betalings namens jou te aanvaar via die Kasregister skakel sonder om hulle toegang te gee tot die beursie. \n\nHulle kan dan self fakature genereer en betalings sal direk na jou {bankName: string} beursie gaan. "
2422
},
2523
"AcceptTermsAndConditionsScreen": {
2624
"title": "Bepalings en Voorwaardes",
@@ -78,8 +76,7 @@
7876
"feeError": "Kon nie die omskakelingsfooi haal nie"
7977
},
8078
"ConversionSuccessScreen": {
81-
"message": "Omskakeling suksesvol",
82-
"title": "Omskakeling sukses"
79+
"message": "Omskakeling suksesvol"
8380
},
8481
"EarnScreen": {
8582
"satoshi": "sat",
@@ -2075,12 +2072,7 @@
20752072
"payBusiness": "betaal hierdie besigheid",
20762073
"openSettings": "Maak instellings oop",
20772074
"title": "Kaart",
2078-
"error": "Oeps. Iets het verkeerd gegaan terwyl jou ligging bepaal is",
2079-
"locationPermissionMessage": "Aktiveer jou ligging sodat ons weet waar jy is op die kaart",
2080-
"locationPermissionNegative": "Kanselleer ",
2081-
"locationPermissionNeutral": "Vra my later",
2082-
"locationPermissionPositive": "OK",
2083-
"locationPermissionTitle": "Vind jou ligging op die kaart"
2075+
"error": "Oeps. Iets het verkeerd gegaan terwyl jou ligging bepaal is"
20842076
},
20852077
"HomeScreen": {
20862078
"receive": "Ontvang",
@@ -2264,16 +2256,7 @@
22642256
"clipboardError": "Fout - Kon nie die waarde van die knipbord kry nie. ",
22652257
"pastedClipboardSuccess": "Vanaf knipbord geplak",
22662258
"invalidPhoneNumber": "Voer 'n geldige selfoonnommer in",
2267-
"phoneNotAllowed": "Hierdie veld aanvaar nie telefoonnommers nie",
2268-
"confirmModal": {
2269-
"title": "Jy het nog nooit fondse na die adres gestuur nie",
2270-
"body1": "Maak asseblief seker die ontvanger het vir jou 'n {bankName: adres} gegee",
2271-
"bold2bold": "nie 'n gebruikersnaam van 'n ander beursie nie.",
2272-
"body3": "Anders gaan die geld na 'n {bankName: string} rekening wat die \"{lnAddress: string}\"-adres bevat.\n\nBevestig die spelling van die eerste deel van die adres ook bv. fanie en fan1e is 2 verskillende adresse.",
2273-
"warning": "As die {bankName: string}-adres verkeerd ingevul word, kan {bankName: string} nie die transaksie regstel of verander nie. ",
2274-
"checkBox": "{lnAddress: string} is die regte adres. ",
2275-
"confirmButton": "Ek is 100% seker"
2276-
}
2259+
"phoneNotAllowed": "Hierdie veld aanvaar nie telefoonnommers nie"
22772260
},
22782261
"SendBitcoinScreen": {
22792262
"willBeSentToMempoolBy": "Transaksie behoort aan mempool voorgelê te word",
@@ -2327,8 +2310,6 @@
23272310
"slow": "Stadig",
23282311
"recommended": "Aanbeveel",
23292312
"walletOffline": "Jou beursie is vanlyn. Kontroleer asseblief jou verbinding en probeer weer.",
2330-
"destinationIsRequired": "Bestemming word benodig",
2331-
"lnurlInvoiceIncorrectDescription": "Die LNURL-bediener het reageer met 'n faktuur met 'n verkeerde transaksie-hash",
23322313
"sdkInsufficientFunds": "Nie genoeg fondse vir hierdie transaksie nie.",
23332314
"sdkAmountTooLow": "Bedrag is te laag vir 'n on-chain transaksie.",
23342315
"sdkNetworkError": "Netwerkfout. Kontroleer asseblief jou verbinding en probeer weer.",
@@ -2379,7 +2360,8 @@
23792360
"backupStatusLabel": "Backup status",
23802361
"backupStatusCompleted": "Backup complete",
23812362
"backupStatusNotCompleted": "Backup not complete",
2382-
"loadError": "Could not load your account information."
2363+
"loadError": "Could not load your account information.",
2364+
"lightningAddressLabel": "Lightning-adres"
23832365
}
23842366
},
23852367
"NotificationSettingsScreen": {
@@ -2512,9 +2494,9 @@
25122494
"body": "Die Dollar-rekening gebruik Stablesats-tegnologie om Bitcoin stabiel teen USD-prys te hou. Jy hou altyd Bitcoin — nie werklike dollars nie — maar die USD-waarde fluktueer nie. Jy kan Bitcoin stuur en ontvang soos gewoonlik, maar dit is nie versoenbaar met die tradisionele bankstelsel nie.",
25132495
"termsAndConditions": "Lees die Terme en Voorwaardes",
25142496
"learnMore": "Leer meer van Stablesats",
2515-
"headerSelfCustodial": "Jou Dollar-rekening hou stablecoins",
2516-
"bodySelfCustodial": "In die Dollar-rekening hou jy stablecoins. Tokens gerugsteun deur bates met waarde gestabiliseer aan die USD. Jy kan nog nie stablecoins stuur en ontvang nie. Wanneer jy van die Dollar-rekening stuur, sal jy jou stablecoins omruil en as Bitcoin aan die ontvanger stuur.",
2517-
"learnMoreSelfCustodial": "Lees meer"
2497+
"headerSelfCustodial": "Jou Dollar-rekening hou stablecoins",
2498+
"bodySelfCustodial": "In die Dollar-rekening hou jy stablecoins. Tokens gerugsteun deur bates met waarde gestabiliseer aan die USD. Jy kan nog nie stablecoins stuur en ontvang nie. Wanneer jy van die Dollar-rekening stuur, sal jy jou stablecoins omruil en as Bitcoin aan die ontvanger stuur.",
2499+
"learnMoreSelfCustodial": "Lees meer"
25182500
},
25192501
"SplashScreen": {
25202502
"update": "Jou toepassing is lanklaas opgedateer. Dateer asseblief die toepassing op voordat jy dit kan gebruik.\n\nDit kan gedoen word by die Android of google Playstore of Apple App store vir IOS."
@@ -2839,7 +2821,8 @@
28392821
"invalidRegion": "Ongeldige streekkeuse"
28402822
},
28412823
"passwordTooWeak": "Wagwoord is te swak. Gebruik ’n mengsel van hoofletters, kleinletters, syfers en spesiale karakters.",
2842-
"passwordCommon": "Hierdie wagwoord is te algemeen. Kies asseblief ’n sterker wagwoord."
2824+
"passwordCommon": "Hierdie wagwoord is te algemeen. Kies asseblief ’n sterker wagwoord.",
2825+
"copied": "Na knipbord gekopieer"
28432826
},
28442827
"errors": {
28452828
"generic": "Daar was 'n fout.\nProbeer asseblief later weer.",
@@ -2968,27 +2951,6 @@
29682951
"title": "Junie-uitdaging!",
29692952
"description": "Brei jou binnekring uit met 10 vir 'n kans om 'n $1000-voorregkaartjie vir die Adopting Bitcoin El Salvador te wen",
29702953
"details": "Wen 'n voorregkaartjie vir Adopting Bitcoin El Salvador\n\nBrei jou binnekring uit met 10 vir 'n kans om 'n $1000-voorregkaartjie te wen vir Adopting Bitcoin El Salvador! Die kaartjie sluit eksklusiewe toegang in tot die hoofkonferensie, mezzanine met kos/drank/versnaperinge, sprekers se aandete, en die Filmfees.\n\nDeel jou sirkels op sosiale media met die hutsmerk #blinkcircles om deel te neem.\n\nHierdie keer sal daar twee wenners wees!"
2971-
},
2972-
"septChallenge": {
2973-
"title": "September Uitdaging!",
2974-
"description": "Binnesirkel {innerCircle: number}/21 - Verdien $21\nTop 3 - Wen kaartjies na Adopting Bitcoin!",
2975-
"details": "Groei jou binnesirkel met 21 mense in September en deel op sosiale media met #blinkcircles om $21 se Stablesats in jou blink-rekening te ontvang. Top 3 wen kaartjies na Adopting Bitcoin! ",
2976-
"peopleWelcomedSoFar": "mense reeds verwelkom",
2977-
"yourRank": "Jou rang",
2978-
"reminder": "Herhindering: Jou binnesirkel groei wanneer jy die eerste sats na 'n nuwe Blink-gebruiker stuur",
2979-
"fullDetails": "Volle besonderhede"
2980-
},
2981-
"octoberChallenge": {
2982-
"title": "Oktober uitdaging!",
2983-
"description": "Deel jou #blinksirkels vir 'n kans om 1,000,000 sats te wen!",
2984-
"details": "Ons gee 1,000,000 sats weg! Deel jou sirkels op sosiaal en tag #blinksirkels om in te skryf! Die wenner word lukraak gekies op 31 Oktober.\n\nJy moet minstens een persoon in jou binnesirkel hê om in te skryf!",
2985-
"connectOnSocial": "Skakel op sosiaal:",
2986-
"fullDetails": "Volle besonderhede by"
2987-
},
2988-
"novemberChallenge": {
2989-
"title": "November Challenge!",
2990-
"description": "Earn 2,100 sats for every person you welcome to Blink in November!",
2991-
"details": "Earn 2,100 sats for every person you welcome to Blink in November!\n\nTo claim your sats, simply share your Circles on social any time during November with the tag `#blinkcircles`.\n\nYour sats will be paid out on December 1, 2023."
29922954
}
29932955
},
29942956
"FullOnboarding": {
@@ -3012,9 +2974,6 @@
30122974
"title": "Kennisgewings",
30132975
"noNotifications": "Jy het tans geen kennisgewings nie"
30142976
},
3015-
"Fake": {
3016-
"doNotTranslate": "NA"
3017-
},
30182977
"CardFlow": {
30192978
"TransactionStatus": {
30202979
"pending": "Hangend",
@@ -3032,7 +2991,10 @@
30322991
"emptyTransactions": "Nog geen transaksies nie",
30332992
"addFunds": "Voeg fondse by",
30342993
"transactionsTitle": "Transaksies",
3035-
"title": "Visa-kaart"
2994+
"title": "Visa-kaart",
2995+
"noCardAvailable": "Geen kaarte beskikbaar nie",
2996+
"cardNotUsable": "Hierdie kaart is tans nie beskikbaar vir gebruik nie",
2997+
"cardUpdateError": "Kon kaartstatus nie opdateer nie"
30362998
},
30372999
"validThruLabel": "GELDIG TOT",
30383000
"networkVisa": "Visa",
@@ -3304,9 +3266,6 @@
33043266
"damagedCard": "Beskadigde kaart",
33053267
"damagedCardDescription": "My kaart is fisies beskadig",
33063268
"whatHappensNext": "Wat gebeur volgende?",
3307-
"currentCardDeactivated": "Jou huidige kaart sal onmiddellik gedeaktiveer word",
3308-
"newCardShipped": "'n Nuwe kaart sal na jou adres gestuur word",
3309-
"digitalCardAvailable": "Jou digitale kaart bly beskikbaar tydens hierdie proses",
33103269
"cardManagement": "Kaartbestuur",
33113270
"bullet1": "Jou huidige kaart sal gevries word vir sekuriteit",
33123271
"bullet2": "'n Nuwe kaart met verskillende nommers sal uitgereik word",
@@ -3327,15 +3286,9 @@
33273286
"title": "Hersien jou versoek",
33283287
"subtitle": "Bevestig asseblief die besonderhede van jou kaartvervanging",
33293288
"requestSummary": "Versoekoopsomming",
3330-
"reason": "Rede",
33313289
"delivery": "Aflewering",
3332-
"shippingAddress": "Versendingsadres",
3333-
"deliveryCost": "Afleweringskoste",
33343290
"submitRequest": "Dien versoek in",
33353291
"importantInformation": "Belangrike inligting",
3336-
"processedImmediately": "Jou versoek sal onmiddellik verwerk word",
3337-
"currentCardDeactivated": "Huidige kaart sal met bevestiging gedeaktiveer word",
3338-
"trackStatus": "Jy kan jou nuwe kaart se afleweringstatus in die app volg",
33393292
"issueType": "Rede",
33403293
"deliveryTime": "Afleweringstyd",
33413294
"shippingCost": "Afleweringskoste",
@@ -3388,10 +3341,7 @@
33883341
"feature2": "EMV-skyfie vir verbeterde sekuriteit",
33893342
"feature3": "Magneetstrook vir universele aanvaarding",
33903343
"feature4": "Jou naam op die kaart ge-embosseer",
3391-
"important": "Belangrik",
3392-
"importantBullet1": "Jou virtuele kaart bly aktief terwyl jy vir die fisiese kaart wag",
3393-
"importantBullet2": "Jy sal jou fisiese kaart moet aktiveer wanneer dit aankom",
3394-
"importantBullet3": "Albei kaarte sal dieselfde kaartnommer en besonderhede hê"
3344+
"important": "Belangrik"
33953345
},
33963346
"Confirm": {
33973347
"title": "Bevestig jou bestelling",
@@ -3540,7 +3490,6 @@
35403490
"savedConfirm": "Ek het dit gestoor",
35413491
"copy": "Kopieer",
35423492
"continueButton": "Gaan voort",
3543-
"selfCustodialDisabled": "Nie-bewaring is tydelik onbeskikbaar.",
35443493
"testBackup": "Toets jou rugsteun"
35453494
},
35463495
"Confirm": {
@@ -3603,7 +3552,8 @@
36033552
"chooseMethod": "Kies metode",
36043553
"restoreComingSoonTitle": "Binnekort beskikbaar",
36053554
"restoreComingSoonDescription": "Herstelfunksie sal in 'n toekomstige opdatering beskikbaar wees.",
3606-
"createFailed": "Kon nie tronk skep nie. Probeer asseblief weer."
3555+
"createFailed": "Kon nie tronk skep nie. Probeer asseblief weer.",
3556+
"selfCustodialDisabled": "Nie-bewaring is tydelik onbeskikbaar."
36073557
},
36083558
"RestoreScreen": {
36093559
"title": "Herstel beursie",
@@ -3707,7 +3657,6 @@
37073657
"description": "Totaal: {sats} sats beskikbaar om te eis",
37083658
"claim": "Eis nou",
37093659
"claiming": "Besig om te eis...",
3710-
"belowMinimum": "{count} deposito('s) onder minimum (~{minimum} sats). Hierdie kan nog nie geëis word nie.",
37113660
"screenTitle": "Ongeëiste Deposito's",
37123661
"cardTitle": "Eis {sats} sats",
37133662
"claimWithFee": "Eis (maks fooi: {fee} sats)",
@@ -3730,12 +3679,7 @@
37303679
"refundNow": "Betaal nou terug",
37313680
"refundSuccess": "Terugbetaling suksesvol begin",
37323681
"claimSuccess": "Deposito suksesvol geëis",
3733-
"error": "Kan nie hierdie deposito eis nie",
3734-
"badgeReady": "Gereed",
3735-
"badgePending": "Hangend",
3736-
"badgeFeeIssue": "Fooi probleem",
3737-
"badgeError": "Fout",
3738-
"badgeRefunded": "Terugbetaal"
3682+
"error": "Kan nie hierdie deposito eis nie"
37393683
},
37403684
"FeatureUnavailable": {
37413685
"SelfCustodial": {

0 commit comments

Comments
 (0)