Skip to content

chore: add 3.0.0 translations - #1492

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

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

Conversation

@ovitrif

@ovitrif ovitrif commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #1493
Twin: synonymdev/bitkit-ios#938
Refs: #1489

Description

  • Pulls what Transifex already had for missing strings first (676 strings, merged key by key, previously chore: pull 2.6.0 translations from transifex #1491): most come from Transifex translation memory matching already-translated iOS strings, about half of them Pubky/Paykit. Where Transifex differs, the repo's value is kept (strings whose English changed after the last sync, or newer repo copy).
  • Fixes existing Spanish, French, Dutch, Greek, Portuguese and Czech mistakes found in review: Portuguese spelling acesso → acceso in Spanish passphrase strings, Su Apellido → name, Contactar → Contacto, grammar and typos.
  • Adds AI-assisted translations for every 2.6.0 string still missing after that pull, so all 15 shipped locales cover every English string the app references. Apart from the fixes above, existing translations and English are unchanged; new keys are appended to each locale file in English key order.
  • Reuses a human translation from the iOS app wherever iOS has the same key with identical English.
  • Skips English keys no code references, 8–13 per locale.
  • Per locale, added strings (AI-translated + copied from iOS):
    • ar 535 (529 + 6)
    • ca 514 (509 + 5)
    • cs 507 (502 + 5)
    • de 509 (504 + 5)
    • el 528 (522 + 6)
    • es 515 (509 + 6)
    • es-ES 513 (513 + 0)
    • es-419 504 (499 + 5)
    • fr 510 (504 + 6)
    • it 509 (504 + 5)
    • nl 514 (505 + 9)
    • pl 505 (500 + 5)
    • pt 534 (533 + 1)
    • pt-BR 504 (499 + 5)
    • ru 502 (498 + 4)
  • wallet__payment_requests_pending_count gets the full plural set for each locale (ar zero to other, cs/pl/ru one/few/many/other).
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-ES (Android) tú the es terms, with on-chain as "en cadena"
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. 138 of the added keys fall in these groups; the main prefixes:
    • wallet__payment_* (58)
    • hardware__passphrase_* (12)
    • wallet__send_pending__* (8)
    • profile__pay_* (8)
    • hardware__jade_* (4)
    • slashtags__error_* (4)
    • lightning__spending_confirm__*, lightning__savings_confirm__*, settings__quickpay__*
    • subscriptions__payment_*, subscriptions__first_*, subscriptions__created_*, subscriptions__unsupported_*
    • wallet__lnurl_pay__*, wallet__send_quickpay__*, wallet__toast_*, hardware__remove_*, contacts__add_*, other__pay_*
  • Known doubts for native reviewers:
    • de: existing hardware__passphrase_* reads "Passwort" while the rest of the app and the new strings use "Passphrase".
    • nl: Android strings mostly use "je" and the new strings use "u", matching iOS; the app-wide choice is open.
    • el: Android uses εσύ and iOS εσείς; strings shared by both apps use εσύ.
    • pt: new strings are European Portuguese while the existing values-pt is 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 %1$d 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 profile, contacts, subscriptions and payment request screens → copy is translated and fits — native reviewers check wording.

Automated Checks

  • ran XML parse and a key-level check of each added string — placeholders, <accent> tags and line breaks match the English
  • ran ./gradlew :app:lintDevDebug: resources merge and compile; lint analysis then crashes in EmptyNavDeepLinkDetector on ScreenDeepLinkRuntime.kt, which this PR does not touch, so lint results were not produced

@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:02:34.518964Z af76a8f 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 pwltr and removed request for a team October 14, 2026 20:56
@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Regtest APK

Built from 3dfe520 (run).

Download bitkit-dev-debug universal APK (expires in 30 days).

@greptile-apps

greptile-apps Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 4/5

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

The PR appears safe to merge, with two non-blocking fixes needed in the Dutch and Polish payment warnings.

Findings

  1. P2 Dutch payment warnings show German ▶
  2. P2 Polish payment warning has typo ▶

Summary

Adds missing 2.6.0 translations across 15 locale files, including localized pending payment counts. English and existing translations are unchanged.

  • Bitkit shows the missing 2.6.0 text in 15 locales.

Reviews (1) · Last reviewed commit: "chore: add ai translations for nl, pl, p..." · Reviewed by Greptile

Comment thread app/src/main/res/values-nl/strings.xml Outdated
Comment thread app/src/main/res/values-pl/strings.xml 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.

No findings. Adds about 7,700 AI-assisted and iOS-reused translations so the 15 Android locales cover every referenced 2.6.0 string, append-only. Reviewed af76a8f against its base 8496e09 (#1491). Reasoned from the diff and CI; the branch was not built here.

What I checked, and 3 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. All 15 files come out clean: 501 to 534 additions per locale, none with a placeholder or tag mismatch.

Plurals: wallet__payment_requests_pending_count carries the CLDR set per locale (ar zero/one/two/few/many/other; cs, pl, ru one/few/many/other; es, fr, it, pt, ca many/one/other; de, nl, el one/other), and every quantity keeps the English placeholder.

CI: build, build-local, lint and detekt green; the e2e-tests-local shards were still running.

Ruled out

  • Hard-coded ©2025 in settings__support__copyright: already present in every locale on master, not touched here.
  • <gray> instead of <accent> in pt security__pass_recovery: already on master, not touched here.
  • Keys added that English no longer has: none; every added key resolves in values/strings.xml.

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

Merge confidence: 4/5, every added string passes the placeholder, markup and plural checks; the e2e shards had not finished.

@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: Full review of the complete PR diff against merge base bcc3185, at 74b17e7. No earlier assessment baseline was available.

No new actionable code findings.

Added and edited strings keep the English placeholders, markup tags, and plural placeholders. Every locale includes other for wallet__payment_requests_pending_count, and the home bell passes the pending count into that plural. The Spanish passphrase edits read “acceso”. At this revision the Dutch contact-payment warning is Dutch, and the Polish warning uses “chcesz”.

Strings whose English matches bitkit-ios#938 at 745ee30 keep the same payment and recovery instruction. Remaining differences are line breaks and equivalent wording. That check covers this shared copy only.

Build, lint, and e2e succeeded on this revision. This review did not run Gradle or a device. Payment, recovery, and fee wording still needs a native reader during the manual pass already listed on the PR.

German settings__quickpay__settings__text already uses {Betrag} while QuickPay settings replace {amount}, so that threshold stays unsubstituted. This PR does not edit that string. The new daily-limit strings keep {limit}.

Device testing: not performed in this review.

Ready for device testing.

Suggested additional test cases

  • Android, QuickPay settings, German and pt-BR, daily limit 50. Expected: the daily sentence shows 50. The existing German threshold sentence still shows {Betrag}.
  • Android, Arabic, Czech, Polish, and Russian, with 1, 2, 5, and 11 pending payment requests. Expected: the payment-requests bell state description includes that count and a plural form that agrees with it.
  • Android, Spanish (es and es-419), passphrase and restore screens. Expected: “frase de acceso”.

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.

No findings at 74b17e7. I checked all 15 locales against values/strings.xml with scripts; wording still needs the native-speaker pass the PR body asks for.

Checked and clean:

  • XML: xmllint passes on all 16 files. There are no duplicate keys, and no locale has a key the default file lacks. No translatable="false" string is translated, no key is removed, and English is unchanged.
  • Format specifiers: all 8,431 added or changed items keep the same %N$s / %N$d set and position, and the same %%, as English. I seeded a %1$s→%1$d swap to confirm the script catches one.
  • {placeholders}, <accent> markup and \n: these match English. CDATA versus &lt;accent&gt; resolves to the same runtime string. The one extra line break, ru security__reset_graph_confirm, follows the existing two-line security__reset_confirm on the same screen.
  • Escaping: no unescaped ' or raw ", and no value starts with @ or ?.
  • Plurals: wallet__payment_requests_pending_count has every CLDR quantity each locale needs (ar zero–other; cs/pl/ru one/few/many/other; Romance one/many/other), and each keeps %1$d.
  • Brands and acronyms: QR, PIN, LNURL, NFC, Paykit, Trezor, Bitkit, LSP, Electrum, CJIT, BTCPay and Jade are untranslated. The es/es-419/es-rES "acceso" corrections keep their placeholders.
  • CI: build, lint, detekt and all e2e shards are green.

Device gate: 74b17e7 — no journey applies (strings only). I installed the CI APK on a regtest emulator and launched it with per-app locales ar, pl, es-419 and pt-BR. Home and the drawer render translated text, Arabic lays out right to left, and there was no crash. perf: not relevant.

Out of scope, already on master: "BitKit" casing in es-419 (cards__invite__description, security__mnemonic_error_description) and cs, which the new es-419 btcpay__missing_mnemonic copies.

@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: Android device follow-up at 74b17e7, following the existing code review.

Runtime localization checks passed. One pre-existing copy fix suggested.

Please also fix settings__quickpay__settings__text in app/src/main/res/values-de/strings.xml: change ${Betrag} to ${amount}. With the QuickPay threshold set to $5, the German screen visibly displays ${Betrag} instead of $5, because the screen replaces {amount}. This predates the PR, but is a small, directly related translation fix worth including here. After changing it, verify the displayed threshold follows the configured value.

Device testing: Pixel 6 emulator, Android 13, staging regtest. Checked profile, contacts, subscriptions and payment-request screens across all 15 locale configurations; pending-request descriptions at 1, 2, 5 and 11 in Arabic, Czech, Polish and Russian; QuickPay daily limit 50 in German and pt-BR; Spanish creation/restore passphrase spelling; and locale/lifecycle exploration. No funds sent. Native-speaker wording review remains outstanding.

@ovitrif ovitrif changed the title chore: add 2.6.0 translations chore: add 3.0.0 translations Oct 15, 2026
@ovitrif ovitrif removed this from the 3.0.0 milestone Oct 15, 2026
@ovitrif

ovitrif commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

Please also fix settings__quickpay__settings__text in app/src/main/res/values-de/strings.xml: change ${Betrag} to ${amount}.

@piotr-iohk Fixed in fb7e33e: German now uses ${amount}, so the QuickPay threshold shows its value.

I also compared every locale against English for translated placeholder names and formats and fixed the other real cases in that commit:

  • Spanish settings__quickpay__settings__text had a different sentence without the amount, and settings__addr__no_addrs_str dropped {searchTxt}.
  • Spanish settings__addr__spend_number now keeps {fundsToSpend}.
  • Spanish sweep__balance_format, sweep__custom_fee_total, sweep__utxo_format and sweep__utxos_format now use the same %1$s / %2$d formats as English.
  • French wallet__receive_connect_additional now has {networkFee} and {serviceFee} instead of {lspFee}.

All three files still parse as XML. The {year} copyright from master and the missing space before {amount} in the French QuickPay text are untouched.

pwltr
pwltr previously approved these changes Oct 15, 2026
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.

Verified the German QuickPay placeholder fix on the current-head CI APK (14315f8b), Pixel 6 emulator / Android 13, staging regtest. The sentence displayed $5, followed a change to $10, and returned to $5 after navigation and background/resume. QuickPay stayed disabled; original settings and locale were restored; no funds sent.

Targeted follow-up to the earlier full localization pass on 74b17e7, rather than a new full device pass. Reviewed the intervening translation corrections: placeholder/format arguments match English and the affected callers. No specific regression risk requiring a full rerun found. Current build, lint, detekt and all E2E shards passed. Native-speaker wording review remains a separate limitation.

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 this PR's strings, run on a Pixel emulator in all 15 locales plus a 720x1280 / 320dpi pass on the worst cases. 16 keys that land in buttons, swipe labels, maxLines fields and display headlines were checked on device. Inline: shorter translations for 4 keys that truncate, wrap badly or break inside a word. All LOW; the truncated button still shows enough to tell what it does.

Fit in every locale: Contacts intro (except ru), Profile intro, Pubky choice, Background payments intro, Pay contacts, Contacts list and Server accounts empty states, the Add Contact / Add Hardware Wallet / Enable / Continue buttons.

Not reached on device: SendConfirm (sheet stuck on "Connecting to network"), subscription screens, profile and contact screens, hardware pairing sheets, watch-only rows. Static risks there: pl subscriptions__swipe_to_subscribe_and_pay (36 chars, no maxLines on the swipe track) and cs hardware__passphrase_button (29 chars, half-width button).

Seen but already on master, not caused by this PR: widgets__add (second Widgets intro button) truncates in de/pt/pt-BR/el/ru/fr/nl/cs/es; settings__bg__title truncates in the pt/pt-BR top bar; es-ES security__backup_button truncates; the ar Widgets intro title breaks inside a word.

Device gate: 74b17e7 — Gate_Throwaway emulator, CI APK; l10n: 16 keys checked in 15 locales, 4 keys overflow (21 key/locale pairs). Later commits up to 14315f8 fix placeholders in de/es/fr and merge master.

Comment thread app/src/main/res/values-de/strings.xml Outdated
Comment thread app/src/main/res/values-el/strings.xml Outdated
Comment thread app/src/main/res/values-ru/strings.xml Outdated
Comment thread app/src/main/res/values-fr/strings.xml Outdated
Comment thread app/src/main/res/values-nl/strings.xml Outdated
Comment thread app/src/main/res/values-de/strings.xml Outdated
Comment thread app/src/main/res/values-nl/strings.xml Outdated
Comment thread app/src/main/res/values-ru/strings.xml Outdated
Comment thread app/src/main/res/values-fr/strings.xml Outdated
Comment thread app/src/main/res/values-ru/strings.xml Outdated
@ovitrif

ovitrif commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

@pwltr @piotr-iohk CI is green again on this PR, so it needs a fresh approval: your earlier approvals were dismissed by the pushes since (native-reviewed shorter strings from the length review by @jvsena42, the placeholder fixes and a Spanish accent fix). Could you re-approve when you have a moment?

@ovitrif
ovitrif enabled auto-merge October 15, 2026 13:54

@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.

Re-approved at 3dfe520 after reviewing the complete delta from the previously approved 14315f8 revision. The 23 changed strings shorten labels/headlines or correct the Spanish search accent; placeholder and markup checks found no mismatches. The German QuickPay amount placeholder remains correct. No new actionable findings.

Current-head build, lint, Detekt and all seven local E2E shards passed. This was a source/CI follow-up to the earlier localization and QuickPay device checks; visual checks were not rerun. Native-speaker wording review remains a separate limitation.

@ovitrif
ovitrif merged commit a25cc6b into master Oct 15, 2026
21 checks passed
@ovitrif
ovitrif deleted the chore/ai-translations-2.6.0 branch October 15, 2026 14:05
@piotr-iohk piotr-iohk mentioned this pull request Oct 16, 2026
3 of 5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: new pubky and paykit screens show english in other languages

5 participants