Skip to content

chore: add 3.0.0 translations - #938

Merged
ovitrif merged 20 commits into
masterfrom
chore/ai-translations-2.6.0
Oct 15, 2026
Merged

ovitrif merged 20 commits into
masterfrom
chore/ai-translations-2.6.0

Conversation

@ovitrif

@ovitrif ovitrif commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #945
Closes #946
Closes #941
Twin: synonymdev/bitkit-android#1492
Refs: #936

Description

  • Pulls what Transifex already had for missing strings first (1,005 strings, merged key by key, previously chore: pull 2.6.0 translations from transifex #937), including Arabic restored from Transifex (734 strings) after the February pull cut it to 29: pull-translations.sh lets the near-empty arb locale overwrite ar.lproj (the script is unchanged here).
  • Where Transifex differs, the repo's value is kept (strings whose English changed after the last sync, plus 4 where the Transifex copy is worse); skips 2 Arabic plurals whose Transifex copy drops {INPUT}/{OUTPUT}.
  • Fixes existing Spanish spelling acesso → acceso in the passphrase strings.
  • Adds AI-assisted translations for every 2.6.0 string still missing after that pull, so all 14 shipped locales cover every English string the app references. Apart from the fixes above, existing translations and English are unchanged; new keys are inserted in English key order.
  • Fills European Portuguese (pt.lproj), which had 52 strings: 799 come from the Android values-pt translations with identical English, and 575 are AI-translated in European Portuguese.
  • Reuses a human translation from the Android app wherever Android has the same key with identical English.
  • Skips English keys no Swift code references.
  • Per locale, added strings (AI-translated + copied from Android):
    • ar 638 (550 + 88)
    • ca 569 (515 + 54)
    • cs 551 (507 + 44)
    • de 553 (508 + 45)
    • el 588 (527 + 61)
    • es 569 (515 + 54)
    • es-419 552 (505 + 47)
    • fr 551 (509 + 42)
    • it 556 (509 + 47)
    • nl 551 (508 + 43)
    • pl 551 (505 + 46)
    • pt 1374 (575 + 799)
    • pt-BR 551 (505 + 46)
    • ru 552 (505 + 47)
Register and glossary per locale

Every locale reuses the terms its existing translations use most. Brand names stay in English: Bitkit, Pubky, Pubky Ring, Paykit, Lightning, Blocktank, USDT, BTCPay, Jade. The noun pubky also stays in English.

Locale Register Key terms
ar أنت, يرجى for requests محفظة, عبارة الاسترداد, عبارة المرور, طلب دفع, اشتراك, جهة اتصال, رسوم, محفظة الأجهزة
ca tu cartera, frase de recuperació, frase de pas, sol·licitud de pagament, subscripció, contacte, tarifa, compte de només lectura
cs vy peněženka, fráze pro obnovení, přístupová fráze, žádost o platbu, předplatné, kontakt, poplatek, hardwarová peněženka
de du Wallet, Wiederherstellungsphrase, Passphrase, Zahlungsanforderung, Abonnement, Kontakt, Gebühr, Hardware-Wallet, Watch-only
el Android εσύ, iOS εσείς; shared strings εσύ πορτοφόλι, φράση ανάκτησης, κωδική φράση, αίτημα πληρωμής, συνδρομή, επαφή, τέλος, πορτοφόλι υλικού
es usted monedero, frase de recuperación, frase de acceso, solicitud de pago, suscripción, contacto, comisión, de solo lectura
es-419 usted billetera, frase de recuperación, frase de acceso, solicitud de pago, suscripción, contacto, comisión / tarifa, de solo lectura
fr vous portefeuille, phrase de récupération, phrase secrète, demande de paiement, abonnement, contact, frais, portefeuille matériel, lecture seule
it tu wallet, frase di recupero, passphrase, richiesta di pagamento, abbonamento, contatto, commissione, di sola lettura
nl u wallet, herstelzin, wachtwoordzin, betaalverzoek, abonnement, contact, vergoeding, hardwarewallet, alleen-bekijken
pl ty (Twój capitalised, as existing) portfel, fraza odzyskiwania, hasło (passphrase), żądanie płatności, subskrypcja, kontakt, opłata, portfel sprzętowy
pt pt-PT, impersonal imperatives (Introduza, Toque) carteira, frase de recuperação, frase de acesso, pedido de pagamento, subscrição, contacto, taxa, ligação, só de leitura
pt-BR você, "a Bitkit" carteira, frase de recuperação, frase secreta, solicitação de pagamento, assinatura, contato, taxa, somente leitura
ru вы, Title Case on short labels as existing кошелёк, фраза восстановления, кодовая фраза, запрос на оплату, подписка, контакт, комиссия, ончейн

Out of Scope

  • Transifex: these strings exist only in the repo. The next Transifex pull keeps them only if they are uploaded to Transifex first.
  • Native review: payment, security, recovery, backup, passphrase/PIN and fee copy needs a native speaker before release. 162 of the added keys fall in these groups; the main prefixes:
    • wallet__payment_* (49)
    • wallet__onchain_* (20)
    • hardware__passphrase_* (11)
    • wallet__send_* (7)
    • profile__pay_* (4)
    • hardware__jade_* (4)
    • onboarding__restore_* (4)
    • settings__quickpay__* (4)
    • security__pin_*, security__mnemonic_*, settings__backup__*, onboarding__passphrase_*
    • lightning__spending_confirm__*, lightning__savings_confirm__*, slashtags__error_*, settings__notifications__*
    • subscriptions__payment_*, subscriptions__first_*, subscriptions__created_*, subscriptions__unsupported_*
    • wallet__boost_*, wallet__lnurl_pay__*, wallet__toast_*, hardware__remove_*
  • Known doubts for native reviewers:
    • pubky_auth__description_* and pubky_auth__success_*: the sentence is built from prefix, service name and suffix, so most locales moved words into the prefix and left the suffix as ".". Each locale needs an on-screen check of the assembled sentence.
    • de: existing hardware__passphrase_* reads "Passwort" while the rest of the app and the new strings use "Passphrase".
    • nl: some existing iOS strings are German, for example slashtags__contact_pay_error; they were not reused.
    • el: iOS uses εσείς; strings shared with Android use εσύ.
    • pt: the AI strings are European Portuguese, while the 799 strings copied from Android and the existing ones are mostly Brazilian (você, digite, contato).
    • es-419: existing profile__your_name reads "Su Apellido" (surname); the new strings use "nombre".
    • cs, pl, ru: counts such as "every {count} days" are plain strings, not plurals, so they use "Label: N" or abbreviated forms.
    • Coined terms with no precedent: watch-only, homeserver, relay and the Bitkit "claim" in Pubky auth errors.

Design

N/A — no UI changes.

Preview

N/A — translation-only change.

QA Notes

Journeys

N/A — no user-visible behaviour change.

Manual Tests

  • Switch the device language to each locale and open the Pubky auth approval sheet, profile, contacts, subscriptions and payment request screens → copy is translated and the assembled auth sentence reads correctly — native reviewers check wording.

Automated Checks

  • ran plutil -lint on every changed Localizable.strings
  • ran node scripts/validate-translations.js
  • ran scripts/generate-plural-localizations.swift over all locales
  • ran a key-level check of each added string — placeholders, <accent> tags and line breaks match the English

@ovitrif ovitrif added this to the 2.6.0 milestone Oct 14, 2026
@ovitrif ovitrif self-assigned this Oct 14, 2026
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-14T21:00:53.157312Z 0a68e1a PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@ovitrif
ovitrif requested review from a team, ben-kaufman and coreyphillips and removed request for a team October 14, 2026 20:56

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0a68e1a435

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Bitkit/Resources/Localization/ar.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/pt.lproj/Localizable.strings Outdated
@greptile-apps

greptile-apps Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 4/5

[Low impact] Adds translated UI strings for new features.

Update the fallback test before merging; the remaining translation fixes are small and non-blocking.

Findings

  1. P1 Fallback test now fails ▶
  2. P2 Lightning fee has wrong unit ▶
  3. P2 Contact headings read like actions ▶
  4. P2 Request success sentence is unfinished ▶

Summary

Adds 8,706 translation entries across 14 locales, including a large expansion of Portuguese coverage.

  • More app screens and messages have translations across 14 locales.

Reviews (1) · Last reviewed commit: "chore: fill european portuguese translat..." · Reviewed by Greptile

Comment thread Bitkit/Resources/Localization/ar.lproj/Localizable.strings
Comment thread Bitkit/Resources/Localization/pt.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/es.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/es.lproj/Localizable.strings Outdated

@talosmachina talosmachina left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 findings (2 P1). Adds AI-assisted and Android-reused translations so the 14 iOS locales cover every referenced 2.6.0 string, and fills European Portuguese from 52 to about 1,400 strings. Reviewed 0a68e1a against its base 98854b4 (#937). Reasoned from the diff and the Swift call sites; iOS does not build on this reviewer's Linux host.

What I checked, and 4 candidates I ruled out

Checked mechanically, every added or changed string: the file parses (Android: XML; iOS: every line is a "key" = "value"; entry), no duplicate keys, every key exists in English, and each value carries the same %1$s / {name} placeholders and the same markup tags as its English source. Only the two keys above differ from English.

Ran: node scripts/validate-translations.js at 0a68e1a: 0 errors. It does not compare placeholders, so it misses both findings.
CI: still running when reviewed.

Ruled out

  • settings__addr__spend_number in es and pt dropping {fundsToSpend} or mixing English: no Swift code reads that key.
  • Arabic and pt wallet__activity_input / _output losing {INPUT} / {OUTPUT}: in English those are plural branch text, not placeholders, and es on master has the same shape.
  • 50% in pt wallet__send_dialog2 / _dialog3 read as a format specifier: t() does no String(format:), so the % is printed as is.
  • Cold reader: both findings stood; it rated the copyright year P2, kept at P1 here because English renders the current year and these locales regress from it.

Wording was not reviewed by a native speaker; the PR body flags payment, security and recovery copy for that.

Merge confidence: 2/5, two P1s, each a one-line fix per locale.

Comment thread Bitkit/Resources/Localization/de.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/pt.lproj/Localizable.strings Outdated
@ovitrif
ovitrif changed the base branch from chore/transifex-pull-2.6.0 to master October 14, 2026 22:17
@ovitrif ovitrif changed the title chore: add ai translations for 2.6.0 chore: add 2.6.0 translations Oct 14, 2026

@piotr-iohk piotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QA review

Scope: Reviewed the full PR diff against its merge base 68a1653, at 745ee30.

2 actionable findings — resolve or provide an evidence-backed rebuttal.

European Portuguese onboarding, receive, and passphrase-warning strings were copied from a different English source than the keys the screens load. The new Russian reset-graph confirmation contains a line break. Placeholder names, <accent> tags, and plural shape match English on the added and changed strings. Earlier {year} and <gray> comments are fixed on this revision.

Compared the affected strings with Android 74b17e7 (values-pt, values-ru). That was not a review of bitkit-android#1492. pt-BR in this PR matches the iOS English for the same keys; values-pt still has the stale sibling text.

Validation: node scripts/validate-translations.js at this commit reported 0 errors. It does not compare placeholders. Run Tests and validate passed on this commit. The Xcode suite was not rerun here.

Device testing: not performed in this review.

Suggested additional test cases

  • iOS, language Português (Portugal): open onboarding. Slide 1 should mention profile, contacts, and borderless control; slide 2 should mention the Lightning Network; slide 3 should mention privacy and KYC.
  • Same language: open the spending receive card. The body should be one sentence about instant, cheap bitcoin payments on Lightning, without mid-sentence line breaks.
  • iOS, language Russian: open Recovery and the reset-graph alert. The destructive button should read “Да, Сбросить” on one line.

Findings

  • [MEDIUM] Translate the European Portuguese strings the screens actually load — inline at Bitkit/Resources/Localization/pt.lproj/Localizable.strings:416.
  • [LOW] Keep the Russian reset confirmation on one line — inline at Bitkit/Resources/Localization/ru.lproj/Localizable.strings:677.

Comment thread Bitkit/Resources/Localization/pt.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/ru.lproj/Localizable.strings Outdated

@piotr-iohk piotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QA review

Scope: Follow-up at bdec89fe, re-reviewing the delta since 745ee30 and the findings in baseline review 5531132914. Comparison base e40db96 and merge base 68a1653 are unchanged. This pass covered the six edited pt and ru strings, the screens that load them, and the Android sibling strings. Inherited baseline coverage is the other 12 locales, LocalizationPluralTests.swift, changelog.d/next/938.fixed.md, the unedited pt/ru strings, and the earlier placeholder, accent, plural, and newline comparison for every string this commit leaves as it was.

No new actionable code findings.

The European Portuguese onboarding alt slides, spending-receive sentence, and passphrase warning now follow the English those screens load. The Russian reset-graph confirmation is Да, Сбросить on one line. Placeholders, <accent> tags, and newline counts match English on these six keys. That matches the source for the Portuguese strings and the Russian button.

Android 74b17e7 values-pt still carries the older non-alt onboarding, receive, and passphrase copy, and values-ru security__reset_graph_confirm still contains a line break. That check is limited to those sibling strings and leaves bitkit-android#1492 for its own review.

Validation: node scripts/validate-translations.js at bdec89fe reported 0 errors. It does not compare placeholders; the six keys were compared separately. validate passed on this commit. The Xcode suite was not rerun here.

Device testing: not performed in this review.

Ready for device testing.

Suggested additional test cases

  • iOS, language Português (Portugal): open onboarding. The first slide should mention profile, contacts, and borderless control; the second should mention the Lightning Network; the third should mention privacy and KYC.
  • Same language: open the spending receive card. The body should be one sentence about instant, cheap bitcoin payments on Lightning, with no mid-sentence line breaks.
  • Same language: open the backup passphrase warning. It should name the passphrase and include the keep-it-secret sentence.
  • iOS, language Russian: open Recovery and the reset-graph alert. The destructive button should read “Да, Сбросить” on one line.

@jvsena42 jvsena42 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One copy suggestion on the Portuguese widgets hint. The rest of the review follows with the device gate.

Comment thread Bitkit/Resources/Localization/pt-BR.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/pt.lproj/Localizable.strings Outdated

@piotr-iohk piotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QA review

Scope: device-QA follow-up, with the two heading concerns rechecked in source at 5db0233. Device observations below are from d12d5e2; this is not a fresh device pass or a full code reassessment of the master merge.

2 minor findings (P3): shorten the Polish subscriptions and German payment-history headings, or make long headings fit without splitting words. See inline comments.

Neither appears fixed by the head advance: both localized strings and empty-state layouts are unchanged. DisplayText gained optional spacing parameters, but these callers retain the same 44-point font, kerning and line-height defaults.

Device testing: iPhone 17 simulator, iOS 26, staging regtest, default text size. Checked subscriptions, payment history and named auth approval across 14 locales. Portuguese onboarding/receive/passphrase copy and widget hints, Russian reset confirmation, German QuickPay amount and French notification platform checks passed. Profile/Contacts coverage could not complete because the saved Pubky session failed to restore; the legacy auth sentence path was also unavailable. Native-speaker wording review remains separate.

Please recheck both headings at default size after the copy/layout fix. The current merged head has not had a fresh device run; this review is not a full device sign-off.

Comment thread Bitkit/Resources/Localization/pl.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/de.lproj/Localizable.strings Outdated
jvsena42
jvsena42 previously approved these changes Oct 15, 2026

@jvsena42 jvsena42 left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Translation-length check on the keys this PR adds, run on iPhone 17 in el, es, ca, fr, ru, de, pt-PT, pt-BR, it, nl and en. Screens: Home, Settings General, Widgets, Hardware Wallets, Security, Data Backups. Inline: shorter translations for three keys that truncate or crowd the nav bar. All LOW; none hides an action, amount or fee.

The pt/pt-BR widgets hint from d12d5e2 fits.

Locale launch in ar, pt-PT and pl: no crash. Explorer plurals are correct (pl uses the "few" form for 2 outputs). Seen but not caused by this PR (ar.lproj already ships on master): ar amounts render digit groups in reverse order, chevrons and the back arrow do not mirror, and ActivityListFilter.swift:14 hard-codes "Search".

Device gate: bdec89f — iPhone 17 sim; locale launch ar/pt-PT/pl pass; Pubky auth sheet named variant pass (empty-clientID variant not reached); l10n: new keys on 6 screens checked in el/es/ca/fr/ru/de/pt-PT/pt-BR/it/nl, 3 keys overflow in 12 key/locale pairs (3 inferred from length, not captured). Later commits up to 97f20d4 change strings only on this branch, plus a master merge.

Comment thread Bitkit/Resources/Localization/el.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/ru.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/de.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/pt-BR.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/pt.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/nl.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/ca.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/pt.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/es.lproj/Localizable.strings Outdated
Comment thread Bitkit/Resources/Localization/ca.lproj/Localizable.strings Outdated
@ovitrif
ovitrif enabled auto-merge October 15, 2026 13:54
piotr-iohk
piotr-iohk previously approved these changes Oct 15, 2026

@piotr-iohk piotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved at e74f4a9 after the translation follow-up and current PR integration check. No new actionable code findings.

Reviewed the 19 copy changes since 97f20d4, the localized Activity search caller, English fallback plural test and the receive QR callback fix from #947. Current resource checks covered all 15 locale files: syntax passes, no duplicate or removed keys, and added/edited placeholder and markup contracts are preserved. Prior Portuguese, Russian and heading corrections remain present.

No additional device run was needed for this follow-up; this does not claim a fresh visual pass or native-speaker audit of every language. Build and validation passed when checked. Unit/integration/local E2E were still running at collection; approval does not claim those pending checks passed.

@ovitrif
ovitrif dismissed piotr-iohk’s stale review October 15, 2026 15:16

The merge-base changed after approval.

@ovitrif

ovitrif commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

@piotr-iohk could you re-approve? GitHub dismissed your approval only because the merge base moved when #947 (the master build fix) merged; the head is still e74f4a9, the commit you approved, with no new changes.

piotr-iohk
piotr-iohk previously approved these changes Oct 15, 2026
@ovitrif
ovitrif dismissed piotr-iohk’s stale review October 15, 2026 15:46

The merge-base changed after approval.

piotr-iohk
piotr-iohk previously approved these changes Oct 15, 2026
@ovitrif
ovitrif dismissed piotr-iohk’s stale review October 15, 2026 15:58

The merge-base changed after approval.

piotr-iohk
piotr-iohk previously approved these changes Oct 15, 2026
@ovitrif
ovitrif dismissed piotr-iohk’s stale review October 15, 2026 16:04

The merge-base changed after approval.

@ovitrif
ovitrif merged commit 0b76fe0 into master Oct 15, 2026
17 checks passed
@ovitrif
ovitrif deleted the chore/ai-translations-2.6.0 branch October 15, 2026 16:35
@ovitrif

ovitrif commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

admin merged because something unclear kept removing the approval from @piotr-iohk .

I will investigate later and find a resolution, likely caused by auto-merge ON + something in the ruleset

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

4 participants