Skip to content

chore(wallet): fix localization gaps and bump version to 8.7.0 (5) - #855

Merged
romchornyi merged 9 commits into
masterfrom
chore/localization-fixes-8.7.0
Jul 27, 2026
Merged

chore(wallet): fix localization gaps and bump version to 8.7.0 (5)#855
romchornyi merged 9 commits into
masterfrom
chore/localization-fixes-8.7.0

Conversation

@romchornyi

@romchornyi romchornyi commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Issue being fixed or feature implemented

An audit of how strings reach Localizable.strings turned up four separate problems, plus the release version bump.

The catalog had drifted from the code. bartycrouch update runs on every build, but its output was never committed: 81 keys already referenced by NSLocalizedString were missing from the catalog (most of the DEX/Swap screens — Dash DEX, Refund address, Quote expires, Swapping — plus App version, Mining Reward, Withdraw funds), and 30 keys no longer had a call site, mostly leftovers from the Maya → Swap rename.

BartyCrouch was reading a second copy of the project. It walks the file system rather than git, so .claude/worktrees — full project copies — were being scanned, importing keys from whatever branch was checked out there. Three such keys (%@ refund address, Missing swap details, Resolving deposit address…) had no call site in this branch at all. It was also rewriting the .strings files inside those worktrees.

Two strings were never localized. %d ATM(s) in %@ was in neither Localizable.strings nor Localizable.stringsdict, so the ATM filter cell read "5 ATM(s) in 20 km" in every language; its %d merchant(s) in %@ neighbour was already handled. And the extended public keys screen title was a bare SwiftUI literal, which BartyCrouch does not extract.

NavBarClose drew nothing. It referenced toolbar-close, which exists in no asset catalog, so the close button was invisible on four sheets (CSV export, private key import, extended public keys, ZenLedger info) and the simulator logged No image named 'toolbar-close' found in asset catalog.

What was done?

  • .bartycrouch.toml — added subpathsToIgnore including .claude. Note this key replaces BartyCrouch's default list rather than extending it, so the defaults (.git, build, carthage, docs, pods) are repeated; without them the tool would walk Pods/.
  • Regenerated the catalog: +81 / −30 keys, all 42 translated locales stay key-identical to en.
  • Added the %d ATM(s) in %@ plural entry and switched both call sites to String.localizedStringWithFormat — plain String(format:) never expands the %#@atms@ placeholder a stringsdict entry resolves to.
  • Extended public keys title now reuses the existing "Extended public keys" key instead of adding a near duplicate, so both screens share one title and its translations.
  • NavBarClose now uses DashUIKit's navigationbar-close. Only the image changed — the 44pt tap area and 34pt stroked circle are untouched, since NavigationBarElement.close would have brought its own chrome.
  • Version bumped to 8.7.0 (5) across all 20 MARKETING_VERSION and 28 CURRENT_PROJECT_VERSION entries.

How Has This Been Tested?

xcodebuild -scheme dashwallet succeeds. Verified against the built .app rather than the source:

  • version reports v8.7.0 (5) in dashwallet.app, TodayExtension.appex, WatchApp.app and WatchApp Extension.appex
  • %d ATM(s) in %@ is present in the bundled Localizable.stringsdict with correct one/other forms
  • navigationbar-close resolves from DashUIKit_DashUIKit.bundle, template-rendered so it follows .primaryText
  • BartyCrouch no longer touches the worktree copies (checksum unchanged); lint now covers 86 strings files instead of 172, i.e. exactly one set

Each of the 30 removed keys was checked against the tree first — none appears as an actual NSLocalizedString call. Seven looked live at first but were substring matches inside longer strings (Clear in Clear address, Reward in Mining Reward).

Breaking Changes

None. One visible change: the extended public keys title reads Extended public keys instead of Extended Public Keys in English, matching the older screen.

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have made corresponding changes to the documentation

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

Summary by CodeRabbit

  • New Features
    • Added expanded Dash DEX/SwapKit swap, quote, refund, memo/tag, routing, timeout, validation, and status messaging across the app.
    • Added improved “ATM(s) in …” pluralized phrasing (now covered more broadly by localization).
  • Bug Fixes
    • Fixed localized formatting for filter subtitles and dynamic, parameterized strings.
    • Localized the “Extended Public Keys” title and refreshed the navigation close icon.
  • Localization
    • Expanded and refreshed Dash DEX/SwapKit translations and updated shared UI text (including About/DashSync/copyright).

jeanpierreroma and others added 6 commits July 22, 2026 22:02
`.claude/worktrees` holds full copies of the project. BartyCrouch walks the
file system rather than git, so it was scanning that duplicate source and
importing keys from whatever branch happened to be checked out there into
this branch's catalog — three such keys (`%@ refund address`, `Missing swap
details`, `Resolving deposit address…`) had no call site here at all. It was
also rewriting the .strings files inside the worktree.

Setting subpathsToIgnore replaces BartyCrouch's default list instead of
extending it, so the defaults are repeated alongside `.claude`; without them
the tool would start walking Pods/ and build/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
`%d ATM(s) in %@` was in neither Localizable.strings nor Localizable.stringsdict,
so NSLocalizedString returned the key and the filter cell read "5 ATM(s) in 20 km"
in every language. Add the plural entry, mirroring the `%d merchant(s) in %@`
one that already existed next to it.

The call sites also needed String.localizedStringWithFormat: plain String(format:)
never expands the %#@atms@ placeholder a stringsdict entry resolves to, which is
why the merchant equivalent already uses it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The title was a bare SwiftUI string literal, which BartyCrouch does not extract,
so it stayed English everywhere. Reuse the "Extended public keys" key that
ExtendedPublicKeysViewController already carries rather than adding a near
duplicate: the screens now share one title and its existing translations.

This changes the English casing from "Extended Public Keys" to "Extended public
keys", matching the other screen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
NavBarClose referenced "toolbar-close", which exists in no asset catalog, so
the close button rendered empty on every sheet using it — CSV export, private
key import, extended public keys and the ZenLedger info sheet — and the
simulator logged "No image named 'toolbar-close' found in asset catalog".

Point it at DashUIKit's navigationbar-close instead. Only the image changes;
the surrounding 44pt tap area and 34pt stroked circle stay as they were, since
NavigationBarElement.close would have brought its own chrome and altered the
look of those four sheets.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The catalog had drifted from the source: 81 keys already referenced by
NSLocalizedString were missing (most of the DEX/Swap screens — "Dash DEX",
"Refund address", "Quote expires", "Swapping" — plus "App version",
"Mining Reward", "Withdraw funds" and others), and 30 keys no longer had a
call site, largely leftovers from the Maya to Swap rename.

This is what the bartycrouch build phase produces; it was simply never
committed. Each of the 30 removals was checked against the tree first — none
of them appears as an actual NSLocalizedString call. All 42 translated locales
stay key-identical to en, as harmonizeWithSource requires.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Updates MARKETING_VERSION across all 20 build configurations and
CURRENT_PROJECT_VERSION across all 28, so every target — dashwallet, dashpay,
TodayExtension, WatchApp and its extension — reports the same version. The
Info.plist files already resolve both through build settings and needed no edit.

Note the build number goes down (6 to 5), which is only sound because the
marketing version moves at the same time; TestFlight rejects a lower build
number within one marketing version.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@romchornyi romchornyi changed the title chore(l10n): fix localization gaps and bump version to 8.7.0 (5) chore(wallet): fix localization gaps and bump version to 8.7.0 (5) Jul 22, 2026
@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@romchornyi, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 6 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 295dd872-dd8d-4049-8472-b2fe66db958a

📥 Commits

Reviewing files that changed from the base of the PR and between dd01ba4 and 74e5f5a.

📒 Files selected for processing (18)
  • DashWallet/Sources/Models/Swap/SwapOrder.swift
  • DashWallet/Sources/UI/Home/Tx Metadata/SwapOrderMetadataProvider.swift
  • DashWallet/Sources/UI/Tx/Details/Model/TxDetailModel.swift
  • DashWallet/Sources/UI/Tx/Details/TxDetailViewController.swift
  • DashWallet/es.lproj/Localizable.stringsdict
  • DashWallet/fr.lproj/Localizable.stringsdict
  • DashWallet/id.lproj/Localizable.stringsdict
  • DashWallet/it.lproj/Localizable.stringsdict
  • DashWallet/ja.lproj/Localizable.stringsdict
  • DashWallet/ko.lproj/Localizable.stringsdict
  • DashWallet/pl.lproj/Localizable.stringsdict
  • DashWallet/pt.lproj/Localizable.stringsdict
  • DashWallet/ru.lproj/Localizable.stringsdict
  • DashWallet/sk.lproj/Localizable.stringsdict
  • DashWallet/th.lproj/Localizable.stringsdict
  • DashWallet/uk.lproj/Localizable.stringsdict
  • DashWallet/zh.lproj/Localizable.stringsdict
  • DashWallet/zh_TW.lproj/Localizable.stringsdict
📝 Walkthrough

Walkthrough

This PR primarily overhauls localization across nearly all supported locales, adding extensive Dash DEX/SwapKit-related strings, removing legacy Maya Protocol strings, and normalizing placeholder formatting. It also bumps the Xcode build version, updates BartyCrouch config subpath exclusions, adds an ATM stringsdict entry across locales, and makes minor Swift UI/localization-call fixes.

Changes

Build, Tooling, and Code Fixes

Layer / File(s) Summary
BartyCrouch config exclusions
.bartycrouch.toml
Adds subpathsToIgnore lists to interfaces/code/normalize/lint sections, excluding build/vendor dirs and .claude.
Xcode build version bump
DashWallet.xcodeproj/project.pbxproj
Bumps CURRENT_PROJECT_VERSION (6→5) and MARKETING_VERSION (8.6.1→8.7.0) across all build configurations.
Swift UI/localization fixes
DashWallet/Sources/UI/Explore Dash/.../AtmListViewController.swift, DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/ExtendedPublicKeysView.swift, DashWallet/Sources/UI/SwiftUI Components/NavigationBar.swift
Switches to String.localizedStringWithFormat, localizes the "Extended public keys" title, and updates the close icon to use DashUIKit.
ATM count pluralization
DashWallet/*.lproj/Localizable.stringsdict (all locales)
Adds new plural-format entry for "%d ATM(s) in %@" across every locale's stringsdict file.

Localization Updates (Dash DEX/SwapKit)

Layer / File(s) Summary
All locale Localizable.strings files
DashWallet/*.lproj/Localizable.strings (~60 locales)
Adds Dash DEX/SwapKit swap-flow strings (errors, statuses, refund/memo prompts, quote handling, explorer links), removes legacy Maya-specific strings, normalizes format specifiers to positional placeholders, and updates copyright/version metadata.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

Suggested reviewers: hashengineering, bfoss765

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: localization fixes and the 8.7.0 (5) version bump.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/localization-fixes-8.7.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (9)
DashWallet/cs.lproj/Localizable.strings (1)

1-2: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Convert DashWallet/cs.lproj/Localizable.strings to UTF-16LE before merging.

.lproj/Localizable.strings files must be UTF-16 little-endian; this file is ASCII/UTF-8 and cannot be decoded as UTF-16LE.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/cs.lproj/Localizable.strings` around lines 1 - 2, Convert the
DashWallet Czech localization file to UTF-16LE encoding before merging,
preserving the existing key-value content and formatting exactly.

Source: Coding guidelines

DashWallet/zh-Hant-TW.lproj/Localizable.strings (1)

1-2: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

This localization file is UTF-8, not UTF-16LE.

DashWallet/zh-Hant-TW.lproj/Localizable.strings starts with / (0x2f) instead of a UTF-16LE BOM / wide-character pair, so it violates the iOS .strings encoding guideline and can fail localization tooling.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/zh-Hant-TW.lproj/Localizable.strings` around lines 1 - 2, The
localization file is encoded as UTF-8 instead of UTF-16LE, which violates the
required iOS .strings encoding. Convert Localizable.strings to UTF-16LE with the
appropriate BOM while preserving the existing key and value content.

Source: Coding guidelines

DashWallet/fa.lproj/Localizable.strings (1)

1-2: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Regenerate the localization catalog as UTF-16 little-endian.

DashWallet/fa.lproj/Localizable.strings starts with a UTF-8 header/comma instead of the UTF-16LE BOM required for iOS .strings files.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/fa.lproj/Localizable.strings` around lines 1 - 2, Regenerate the
localization catalog represented by Localizable.strings as UTF-16 little-endian,
including the required UTF-16LE BOM, while preserving all existing localization
entries and values.

Source: Coding guidelines

DashWallet/sr.lproj/Localizable.strings (1)

1-2: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Do not merge DashWallet/sr.lproj/Localizable.strings in its current form.

The file is not valid UTF-16LE around the existing content, which violates the .strings localization guideline and can break localization loading. Re-save the file as UTF-16LE and avoid UTF-8 BOMs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/sr.lproj/Localizable.strings` around lines 1 - 2, Re-save the
localization strings file as valid UTF-16LE without a UTF-8 BOM, preserving the
existing key-value content and formatting.

Source: Coding guidelines

DashWallet/th.lproj/Localizable.strings (1)

1-2: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Normalize this localization file to UTF-16LE.

DashWallet/th.lproj/Localizable.strings is UTF-8 ASCII on disk, but iOS localization strings are expected to be UTF-16 little-endian. Convert it with iconv -f UTF-8 -t UTF-16LE so Xcode handles it correctly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/th.lproj/Localizable.strings` around lines 1 - 2, Convert the
DashWallet Thai Localizable.strings file from UTF-8 ASCII to UTF-16LE using
iconv -f UTF-8 -t UTF-16LE, preserving its existing localization entry and
content.

Source: Coding guidelines

DashWallet/id.lproj/Localizable.strings (2)

1-3662: 📐 Maintainability & Code Quality | 🟡 Minor

UTF-16LE catalog encoding is not detected.

DashWallet/id.lproj/Localizable.strings starts with /* No... rather than a UTF-16LE BOM (FF FE), so the catalog appears to be plain UTF-8/plain text. Save it as UTF-16LE with Xcode for .lproj/Localizable.strings, or remove/correct this entry if it was intentionally intended as plain text.

[low_effort_and_medium_reward]

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/id.lproj/Localizable.strings` around lines 1 - 3662, The
Localizable.strings catalog is not encoded as the required UTF-16LE resource.
Re-save DashWallet/id.lproj/Localizable.strings through Xcode as UTF-16LE so it
begins with the FF FE BOM, while preserving all localization entries; if this
file is intentionally plain text, remove or correct the catalog entry instead.

Source: Coding guidelines


13-517: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Translate the untranslated DEX/receipt strings in DashWallet/id.lproj/Localizable.strings.

Several changed values still use the English source strings, including "Amount too low" (227), "Could not load Buy Dash options — please check your connection and try again" (650), "If the swap fails, your ...", refund-address labels/messages, and "Your transfer must include this memo. Funds sent without it cannot be matched to your swap and will be lost." (3637). These should be translated, especially the refund/memo fund-loss guidance.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/id.lproj/Localizable.strings` around lines 13 - 517, Translate
every remaining English-valued DEX and receipt entry in Localizable.strings,
including “Amount too low,” Buy Dash loading errors, swap-failure guidance,
refund-address labels/messages, and the memo warning about unmatched funds.
Preserve each localization key and format placeholder exactly, and prioritize
clear Indonesian wording for refund and potential-fund-loss instructions.
DashWallet/nb.lproj/Localizable.strings (1)

1-3664: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Convert nb.lproj/Localizable.strings to UTF-16 little-endian before merge.

The file is not UTF-16LE; .lproj/*.strings files must be UTF-16LE, so regenerate it with Xcode or save the committed file in UTF-16LE.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/nb.lproj/Localizable.strings` around lines 1 - 3664, Convert the
complete nb.lproj/Localizable.strings file to UTF-16 little-endian encoding,
preserving all localization keys, values, comments, and formatting; do not alter
the translations or content.

Source: Coding guidelines

DashWallet/pl.lproj/Localizable.strings (1)

1-1: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Re-encode the Polish localizable strings as UTF-16 little-endian.

DashWallet/pl.lproj/Localizable.strings is checked in as UTF-8 instead of the required UTF-16 LE format, so it should not be merged in this encoding. Re-export from Xcode/genstrings with UTF-16 LE, or convert the file back to UTF-16 LE before merging.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/pl.lproj/Localizable.strings` at line 1, Re-encode the Polish
Localizable.strings resource as UTF-16 little-endian, preserving all existing
localized strings and content; use Xcode/genstrings export or an equivalent
conversion before committing.

Source: Coding guidelines

🟠 Major comments (24)
DashWallet/en.lproj/Localizable.stringsdict-21-36 (1)

21-36: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Add the %d ATM(s) in %@ stringsdict entry to every supported locale.

AtmListViewController is localized for all app locales, but only DashWallet/en.lproj/Localizable.stringsdict contains the plural resource for this key. Add matching entries to the remaining Localizable.stringsdict catalogs so non-English locales show localized pluralized text instead of the raw English key.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/en.lproj/Localizable.stringsdict` around lines 21 - 36, Add the
“%d ATM(s) in %@” plural entry, matching the structure used in
en.lproj/Localizable.stringsdict, to every remaining supported locale’s
Localizable.stringsdict catalog. Provide each locale’s translated one and other
forms while preserving the existing NSStringLocalizedFormatKey and plural format
metadata.
DashWallet/ca.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the newly added Dash DEX/SwapKit strings for Catalan.

The new entries in this locale, including this one and the later swap status/error strings, use the English source text unchanged. This leaves the new swap flows largely untranslated when Catalan is selected; provide Catalan values before merging.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/ca.lproj/Localizable.strings` around lines 13 - 14, Translate the
newly added Dash DEX/SwapKit entries in the Catalan Localizable.strings
resource, including dex_error_blacklisted and the later swap status/error
strings, replacing each unchanged English value with accurate Catalan while
preserving the existing keys and format placeholders.
DashWallet/cs.lproj/Localizable.strings-13-24 (1)

13-24: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Provide Czech translations for the newly added user-facing strings.

Many added catalog values are still identical to their English keys, including core swap states, validation errors, refund-address guidance, navigation, and status messages. Czech users will therefore see English throughout the new Dash DEX/SwapKit flows. Translate these entries before release rather than treating English placeholders as completed localization.

Also applies to: 49-51, 226-228, 250-252, 319-321, 422-424, 470-472, 497-499, 509-517, 551-554, 595-596, 613-624, 634-638, 649-651, 786-788, 944-949, 959-961, 1088-1090, 1130-1132, 1295-1297, 1352-1354, 1427-1429, 1487-1488, 1535-1537, 1599-1601, 1735-1737, 1856-1864, 1880-1885, 1931-1933, 2108-2110, 2214-2216, 2277-2279, 2349-2354, 2456-2458, 2486-2494, 2529-2531, 2643-2645, 2694-2696, 2710-2721, 2792-2797, 2825-2827, 2840-2854, 2882-2898, 2921-2929, 2995-2997, 3040-3042, 3058-3060, 3217-3225, 3286-3297, 3368-3370, 3458-3460, 3527-3528, 3542-3544, 3629-3640

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/cs.lproj/Localizable.strings` around lines 13 - 24, Translate
every newly added user-facing entry in the Czech Localizable.strings catalog,
including the listed ranges and the shown swap, contact-request, and
transaction-status strings. Replace English-placeholder values with accurate,
natural Czech while preserving each localization key, format specifier, and
placeholder position.
DashWallet/uk.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Do not ship untranslated or regressed Ukrainian copy.

A large number of new user-facing Dash DEX/SwapKit strings are copied verbatim from English. Existing Ukrainian translations were also replaced with English for Clipboard, Contact support, and the CrowdNode balance warning. Translate these strings before merging; protocol and brand labels can remain unchanged.

Also applies to: 22-24, 226-228, 250-252, 319-321, 422-424, 470-472, 497-517, 595-596, 613-624, 649-651, 786-788, 944-961, 1088-1090, 1130-1132, 1295-1297, 1352-1354, 1427-1429, 1487-1488, 1535-1537, 1599-1601, 1723-1725, 1735-1737, 1792-1794, 1856-1864, 1880-1885, 1931-1933, 2108-2110, 2213-2215, 2276-2278, 2348-2349, 2454-2456, 2484-2492, 2527-2529, 2641-2643, 2692-2720, 2734-2741, 2790-2795, 2823-2852, 2886-2926, 2993-2995, 3038-3058, 3218-3223, 3284-3295, 3367-3369, 3456-3458, 3525-3526, 3540-3542, 3627-3638

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/uk.lproj/Localizable.strings` around lines 13 - 14, Translate all
newly added Dash DEX/SwapKit user-facing strings in the Ukrainian
Localizable.strings entries, including the listed ranges, and restore Ukrainian
translations for Clipboard, Contact support, and the CrowdNode balance warning.
Preserve format specifiers and leave protocol and brand names unchanged.
DashWallet/vi.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the newly added Vietnamese strings before release.

Most new user-facing values in these ranges are still byte-for-byte English, including core Dash DEX swap, refund, amount, status, error, and transaction messages. Vietnamese users will therefore see English throughout the new flow. Add Vietnamese translations while preserving all existing %@, %ld, and %d placeholders.

Also applies to: 22-23, 49-51, 226-228, 250-252, 319-321, 422-424, 470-472, 497-499, 515-517, 595-596, 613-624, 649-651, 786-788, 944-961, 1088-1090, 1130-1132, 1295-1297, 1352-1354, 1427-1429, 1487-1488, 1535-1537, 1599-1601, 1723-1725, 1856-1864, 1880-1885, 1931-1933, 2214-2216, 2277-2279, 2349-2350, 2456-2458, 2486-2494, 2529-2531, 2643-2645, 2694-2696, 2710-2722, 2736-2743, 2792-2797, 2825-2827, 2840-2854, 2888-2899, 2921-2929, 3286-3297, 3369-3371, 3458-3460, 3527-3528, 3542-3544, 3629-3640

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/vi.lproj/Localizable.strings` around lines 13 - 14, Translate the
newly added English-valued entries throughout the specified ranges in the
Vietnamese Localizable.strings file, covering the Dash DEX swap, refund, amount,
status, error, and transaction messages. Preserve each entry’s key and all
format placeholders, including %@, %ld, and %d, while ensuring the displayed
values are natural Vietnamese.
DashWallet/zh-Hant-TW.lproj/Localizable.strings-13-24 (1)

13-24: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Provide Traditional Chinese translations for the new DEX flow.

These newly added user-facing Dash DEX/SwapKit strings remain English in the zh-Hant-TW catalog, so the new swap experience is not localized for Traditional Chinese users. Translate these entries before shipping or explicitly exclude this locale from the supported localization set.

Also applies to: 49-50, 320-321, 423-424, 498-499, 516-517, 614-624, 650-651, 774-776, 945-961, 1296-1297, 1353-1354, 1488-1489, 1600-1601, 1724-1725, 1793-1807, 1857-1885, 1932-1933, 2215-2216, 2278-2279, 2487-2531, 2644-2645, 2695-2722, 2793-2930, 3041-3060, 3137-3138, 3221-3225, 3287-3297, 3528-3529, 3630-3640

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/zh-Hant-TW.lproj/Localizable.strings` around lines 13 - 24,
Translate all newly added Dash DEX and SwapKit user-facing entries in the
zh-Hant-TW Localizable.strings catalog into Traditional Chinese, including the
listed occurrences, while preserving format placeholders such as %@. If these
strings cannot be translated, explicitly remove zh-Hant-TW from the supported
localization set instead.
DashWallet/zh.lproj/Localizable.strings-13-24 (1)

13-24: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Complete localization of the new DEX/SwapKit catalog entries.

The same untranslated-value defect affects both Chinese catalogs and repeats across the newly added DEX/SwapKit messages, including amount validation, refund-address, swap-status, timeout, and transfer-warning text.

  • DashWallet/zh.lproj/Localizable.strings#L13-L24: translate the added user-facing DEX/SwapKit strings and apply the same correction to the repeated affected ranges.
  • DashWallet/zh_TW.lproj/Localizable.strings#L13-L24: translate the added user-facing DEX/SwapKit strings and apply the same correction to the repeated affected ranges.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/zh.lproj/Localizable.strings` around lines 13 - 24, Complete the
Chinese localization for all newly added DEX/SwapKit user-facing strings,
replacing untranslated English values across the affected amount-validation,
refund-address, swap-status, timeout, transfer-warning, and related entries.
Apply the same translations consistently in
DashWallet/zh.lproj/Localizable.strings lines 13-24 and
DashWallet/zh_TW.lproj/Localizable.strings lines 13-24, preserving format
placeholders such as %@.
DashWallet/de.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Provide German translations for the new DEX/SwapKit strings.

The newly added German-catalog entries are largely identical to their English keys, including swap errors, payment instructions, status labels, and refund guidance. This will expose substantial English UI text to German users throughout the DEX flow. Add reviewed German values while preserving all placeholders; the same issue appears across the added DEX ranges, including Lines 422-424, 1295-1297, 2692-2719, 2790-2896, 3284-3294, and 3627-3637.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/de.lproj/Localizable.strings` around lines 13 - 14, Translate the
newly added DEX/SwapKit entries in the German Localizable.strings catalog into
reviewed German, covering the referenced ranges and related swap errors, payment
instructions, status labels, and refund guidance. Preserve every localization
key and placeholder while replacing English values with natural German
translations; do not alter unrelated entries.
DashWallet/el.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the newly added Greek strings before merging.

Many new user-facing values are still identical to their English keys—for example, Line [226] Amount too low, Line [595] Contact support, and the DEX error/transfer messages around Lines [3284]-[3294] and [3627]-[3637]. This leaves substantial parts of the new flows in English for Greek users. Translate these entries, excluding intentional brand/protocol names such as Dash DEX, SwapKit, NEAR, and URI.

Also applies to: 22-23, 49-50, 226-227, 250-251, 319-320, 422-423, 470-471, 497-498, 515-516, 595-596, 613-614, 622-623, 649-650, 786-787, 944-945, 947-948, 959-960, 1088-1089, 1130-1131, 1295-1296, 1352-1353, 1427-1428, 1487-1488, 1535-1536, 1599-1600, 1723-1724, 1735-1736, 1792-1793, 1856-1857, 1859-1860, 1862-1863, 1877-1878, 1880-1881, 1931-1932, 2108-2109, 2213-2214, 2276-2277, 2348-2349, 2454-2455, 2484-2485, 2490-2491, 2527-2528, 2641-2642, 2692-2693, 2708-2709, 2715-2716, 2718-2719, 2733-2734, 2739-2740, 2790-2791, 2793-2794, 2823-2824, 2838-2839, 2844-2845, 2850-2851, 2880-2881, 2886-2887, 2889-2890, 2892-2893, 2895-2896, 2919-2920, 2925-2926, 2993-2994, 3038-3039, 3056-3057, 3218-3219, 3221-3222, 3284-3285, 3287-3288, 3290-3291, 3293-3294, 3366-3367, 3456-3457, 3525-3526, 3540-3541, 3627-3628, 3636-3637

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/el.lproj/Localizable.strings` around lines 13 - 14, Translate
every newly added user-facing English value in the Greek Localizable.strings
entries identified by the review, including DEX, transfer, support, and amount
messages; retain intentional brand and protocol names such as Dash DEX, SwapKit,
NEAR, and URI unchanged.
DashWallet/es.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Translate the new Spanish catalog values before merging.

Many newly added user-facing Dash DEX/SwapKit strings have English values, so Spanish users will see English throughout the new flows. Also keep the existing Spanish translation for the shared Convert key; introduce a distinct source key if DEX needs different wording rather than changing this shared entry.

Also applies to: 22-23, 49-50, 226-227, 250-251, 319-320, 422-423, 470-471, 497-498, 515-516, 595-596, 613-614, 622-623, 649-650, 786-787, 944-948, 959-961, 1088-1089, 1130-1131, 1295-1296, 1352-1353, 1427-1428, 1487-1488, 1535-1536, 1599-1600, 1723-1724, 1735-1736, 1792-1793, 1856-1863, 1880-1881, 1931-1932, 2108-2109, 2213-2214, 2276-2277, 2348-2349, 2454-2455, 2484-2492, 2527-2528, 2641-2642, 2692-2693, 2708-2719, 2733-2741, 2790-2795, 2823-2824, 2838-2840, 2844-2846, 2850-2852, 2880-2896, 2919-2927, 2993-2995, 3038-3040, 3056-3058, 3284-3295, 3366-3368, 3456-3458, 3525-3526, 3540-3542, 3627-3638

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/es.lproj/Localizable.strings` around lines 13 - 14, Translate
every newly added English user-facing value in the Spanish Localizable.strings
catalog, including the listed Dash DEX and SwapKit entries, while preserving
placeholders and formatting. Keep the existing Spanish translation for the
shared “Convert” key; if DEX requires different wording, add or use a distinct
source key instead of modifying that shared entry.
DashWallet/sl.lproj/Localizable.strings-13-14 (1)

13-14: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Keep the .strings catalog UTF-16LE-encoded.

DashWallet/sl.lproj/Localizable.strings is currently decoded successfully as UTF-8 and fails UTF-16LE decoding in Python; convert/save it back to UTF-16 little-endian before landing this change.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/sl.lproj/Localizable.strings` around lines 13 - 14, Re-encode the
Localizable.strings catalog as UTF-16LE before committing, preserving all
existing Slovenian localization entries and the added dex_error_blacklisted
string content unchanged.

Source: Coding guidelines

DashWallet/tr.lproj/Localizable.strings-13-24 (1)

13-24: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the newly added Turkish user-facing strings.

Many new Dash DEX/SwapKit/AboutDash entries copy the English source verbatim, so the new flows will appear partially untranslated. Preserve placeholders while translating; for example, %ld is compatible, but sec should use the Turkish abbreviation (sn).

Also applies to: 49-51, 226-252, 319-321, 422-424, 470-498, 515-517, 595-596, 613-624, 635-651, 786-800, 944-960, 1088-1132, 1295-1297, 1352-1354, 1427-1429, 1487-1488, 1535-1537, 1599-1601, 1723-1737, 1792-1794, 1856-1885, 1931-1933, 2108-2110, 2213-2215, 2276-2278, 2348-2349, 2454-2456, 2484-2492, 2527-2529, 2641-2643, 2692-2720, 2734-2741, 2790-2795, 2823-2852, 2880-2897, 2919-2927, 3038-3058, 3218-3223, 3284-3295, 3367-3368, 3456-3458, 3525-3542, 3627-3638

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/tr.lproj/Localizable.strings` around lines 13 - 24, Translate all
newly added English user-facing entries in the Turkish Localizable.strings file,
including the listed Dash DEX, SwapKit, and AboutDash ranges, while preserving
every format placeholder exactly; use Turkish abbreviations such as “sn” for
“sec” where applicable.
DashWallet/fil.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the newly added Filipino strings before shipping.

Many new entries retain the English source text, including refund, memo, expiration, balance, and lost-funds warnings. These will render in English for Filipino users and can make critical swap instructions easy to miss. Provide reviewed Filipino translations while preserving all %@, %d, and %% placeholders.

Also applies to: 22-23, 49-50, 226-227, 250-251, 319-320, 422-423, 470-471, 497-498, 515-516, 595-596, 613-614, 622-623, 649-650, 786-787, 944-945, 947-948, 959-960, 1088-1089, 1130-1131, 1295-1296, 1352-1353, 1427-1428, 1487-1488, 1535-1536, 1599-1600, 1735-1736, 1792-1793, 1856-1857, 1859-1860, 1862-1863, 1880-1881, 1931-1932, 2108-2109, 2213-2214, 2276-2277, 2348-2349, 2454-2455, 2484-2485, 2490-2491, 2527-2528, 2641-2642, 2692-2693, 2708-2709, 2715-2716, 2718-2719, 2733-2734, 2739-2740, 2790-2791, 2793-2794, 2823-2824, 2838-2839, 2844-2845, 2850-2851, 2880-2881, 2886-2887, 2889-2890, 2892-2893, 2895-2896, 2919-2920, 2925-2926, 2993-2994, 3038-3039, 3056-3057, 3218-3219, 3221-3222, 3284-3285, 3287-3288, 3290-3291, 3293-3294, 3366-3367, 3456-3457, 3525-3526, 3540-3541, 3627-3628, 3636-3637

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/fil.lproj/Localizable.strings` around lines 13 - 14, Translate
every newly added English value in Localizable.strings into reviewed Filipino,
including the refund, memo, expiration, balance, swap, and lost-funds messages
identified by the comment. Preserve each localization key and all placeholder
tokens such as %@, %d, and %% exactly, while leaving already translated entries
unchanged.
DashWallet/fr.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the new French-locale strings.

Many added DEX, swap, error, status, and AboutDash entries copy the English source value verbatim, so French users will see English throughout core flows. Add approved French translations instead of shipping these fallback values.

Also applies to: 22-24, 226-228, 250-252, 319-321, 422-424, 497-499, 515-517, 595-597, 613-615, 622-624, 649-651, 786-788, 944-949, 959-961, 1088-1090, 1130-1132, 1295-1297, 1352-1354, 1427-1429, 1487-1489, 1535-1537, 1599-1601, 1735-1737, 1792-1794, 1856-1864, 1880-1882, 1931-1933, 2108-2110, 2213-2215, 2276-2278, 2348-2350, 2454-2456, 2484-2486, 2490-2492, 2527-2529, 2641-2643, 2692-2694, 2708-2719, 2733-2735, 2739-2741, 2790-2795, 2823-2825, 2838-2839, 2844-2845, 2850-2851, 2880-2882, 2886-2896, 2919-2926, 2993-2995, 3038-3040, 3056-3058, 3218-3222, 3284-3294, 3366-3368, 3456-3458, 3525-3526, 3540-3542, 3627-3638

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/fr.lproj/Localizable.strings` around lines 13 - 14, Translate
every newly added French localization entry identified in the comment, including
the DEX, swap, error, status, and AboutDash strings, instead of leaving English
source values unchanged. Preserve each localization key and format placeholders
such as %@ while providing approved natural French translations for all listed
ranges.
DashWallet/it.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Complete the Italian translations for the new entries.

Many newly added user-facing values are identical to their English keys, including swap errors, progress states, payment instructions, About text, and labels. This leaves substantial portions of the DEX flow in English for Italian users. Placeholder formats are preserved, so the fix is to translate the values while retaining the existing format specifiers and technical proper nouns.

Also applies to: 22-24, 226-228, 250-252, 319-321, 422-424, 470-472, 497-499, 515-517, 595-596, 613-624, 649-651, 786-788, 944-960, 1088-1090, 1130-1132, 1295-1297, 1352-1354, 1427-1429, 1487-1488, 1535-1537, 1599-1601, 1735-1737, 1792-1794, 1856-1864, 1880-1881, 1931-1933, 2108-2110, 2213-2215, 2276-2278, 2348-2349, 2454-2456, 2484-2492, 2527-2529, 2641-2643, 2692-2694, 2708-2719, 2733-2741, 2790-2795, 2823-2825, 2838-2852, 2880-2896, 2919-2927, 2993-2995, 3038-3040, 3056-3058, 3218-3223, 3284-3295, 3366-3368, 3456-3458, 3525-3526, 3540-3542, 3627-3638

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/it.lproj/Localizable.strings` around lines 13 - 14, Complete the
Italian translations for all newly added entries in Localizable.strings,
including the listed ranges covering DEX errors, progress states, payment
instructions, About text, and labels. Translate each value into Italian while
preserving every format specifier such as %@ and retaining technical proper
nouns and existing localization keys.
DashWallet/ja.lproj/Localizable.strings-13-14 (2)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Provide Japanese translations before release.

Many newly added and updated values are still English in the Japanese catalog, including core swap instructions, payment errors, refund-address requirements, and status messages. This leaves Japanese users with English UI throughout the Dash DEX flow and also regresses existing strings such as Amount too low and Clipboard. Translate the right-hand values while preserving all %@, %d, and positional placeholder shapes.

Also applies to: 22-23, 49-50, 226-227, 250-251, 319-320, 422-423, 470-471, 497-498, 509-510, 515-516, 595-596, 613-614, 622-623, 649-650, 786-787, 944-948, 959-960, 1088-1089, 1130-1131, 1295-1296, 1352-1353, 1427-1428, 1487-1488, 1535-1536, 1599-1600, 1723-1724, 1735-1736, 1792-1793, 1856-1863, 1880-1881, 1931-1932, 2108-2109, 2213-2214, 2276-2277, 2348-2349, 2454-2455, 2484-2485, 2490-2491, 2527-2528, 2641-2642, 2692-2693, 2708-2709, 2715-2716, 2718-2719, 2733-2734, 2739-2740, 2790-2794, 2823-2824, 2838-2839, 2844-2845, 2850-2851, 2880-2881, 2886-2893, 2895-2896, 2919-2920, 2925-2926, 2993-2994, 3038-3039, 3056-3057, 3218-3222, 3284-3294, 3366-3367, 3525-3526, 3540-3541, 3627-3628, 3636-3637

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/ja.lproj/Localizable.strings` around lines 13 - 14, Translate
every listed English right-hand value in the Japanese Localizable.strings
catalog, including the Dash DEX swap, payment, refund, status, Amount too low,
and Clipboard strings. Preserve each key and the exact placeholder shape and
ordering for all %@, %d, and positional placeholders while ensuring no affected
Japanese UI value remains English.

13-14: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Encoding is UTF-8, not UTF-16LE.

This .strings file does not have a UTF-16 LE BOM, and Japanese content is encoded as UTF-8 bytes, which makes the file invalid for iOS localization consumers. Convert it to UTF-16LE before committing.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/ja.lproj/Localizable.strings` around lines 13 - 14, Convert the
entire Localizable.strings file to UTF-16LE encoding and include the required
UTF-16LE BOM, preserving all localization keys and translated values unchanged.

Source: Coding guidelines

DashWallet/ko.lproj/Localizable.strings-595-596 (1)

595-596: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate newly added user-facing values for Korean before release.

This entry—and many new Dash DEX/SwapKit entries such as Lines 13–24, 1295–1297, 2484–2529, 3284–3295, and 3627–3638—maps Korean keys to English text. Because the keys exist in the Korean catalog, Korean users will see English instead of a localized value throughout core swap and payment flows. Exclude proper names, but provide Korean translations for user-facing labels, instructions, errors, and statuses.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/ko.lproj/Localizable.strings` around lines 595 - 596, Translate
the newly added user-facing entries in the Korean localization catalog,
including “Contact support” and the referenced Dash DEX/SwapKit ranges, into
natural Korean. Preserve proper names and localization keys unchanged, while
ensuring labels, instructions, errors, and statuses no longer fall back to
English.
DashWallet/nl.lproj/Localizable.strings-13-24 (1)

13-24: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the newly added Dutch entries before release.

Many new swap, payment, error, and account strings use the English source text verbatim, so Dutch users will see English throughout core Dash DEX flows. This conflicts with the localization rollout objective.

Also applies to: 226-228, 250-252, 319-321, 422-424, 470-472, 497-499, 515-517, 595-596, 613-624, 649-651, 786-788, 944-949, 959-961, 1088-1090, 1130-1132, 1295-1297, 1352-1354, 1427-1429, 1487-1488, 1535-1537, 1599-1601, 1735-1737, 1792-1794, 1856-1864, 1880-1885, 1931-1933, 2213-2215, 2276-2278, 2348-2349, 2454-2456, 2484-2492, 2527-2529, 2641-2643, 2692-2694, 2708-2720, 2734-2741, 2790-2795, 2823-2825, 2838-2852, 2880-2897, 2919-2927, 2993-2995, 3038-3040, 3056-3058, 3218-3223, 3284-3295, 3367-3368, 3456-3458, 3525-3526, 3540-3542, 3627-3638

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/nl.lproj/Localizable.strings` around lines 13 - 24, Translate
every newly added English-valued entry in Localizable.strings, including the
listed swap, payment, error, and account strings, into natural Dutch while
preserving format placeholders such as %@ exactly. Leave entries that already
have appropriate Dutch translations unchanged.
DashWallet/pl.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Replace the English DEX/SwapKit fallback values in Polish localization.

DashWallet/pl.lproj/Localizable.strings still copies many newly added DEX, SwapKit, payment, and error strings directly from the English key, so Polish users will see English text in core swap flows. Update the referenced values to approved Polish translations, or remove these deferred fallbacks before merging.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/pl.lproj/Localizable.strings` around lines 13 - 14, Update the
newly added DEX, SwapKit, payment, and error entries in the Polish
Localizable.strings resource to use approved Polish translations instead of
English fallback values; alternatively remove entries whose translations are
intentionally deferred. Ensure no referenced Polish localization value remains
identical to its English source.
DashWallet/pt.lproj/Localizable.strings-13-24 (1)

13-24: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the newly added Portuguese strings before shipping.

Many new user-facing values are still English, including DEX errors, swap progress states, Explore Dash labels, AboutDash text, and CrowdNode messages. This leaves Portuguese users with broad English fallbacks across the new flows. Translate these values while preserving all format placeholders and product names.

Also applies to: 49-51, 226-228, 250-252, 319-321, 422-424, 470-472, 497-499, 515-517, 595-596, 613-624, 649-651, 786-788, 944-949, 959-961, 1088-1090, 1130-1132, 1295-1297, 1352-1354, 1427-1429, 1487-1488, 1535-1537, 1599-1601, 1735-1737, 1792-1794, 1856-1864, 1880-1885, 1931-1933, 2108-2110, 2213-2215, 2276-2278, 2348-2349, 2454-2456, 2484-2492, 2527-2529, 2641-2643, 2692-2694, 2708-2720, 2734-2741, 2790-2795, 2823-2825, 2838-2852, 2880-2897, 2919-2927, 2993-2995, 3038-3040, 3056-3058, 3218-3223, 3284-3295, 3367-3369, 3456-3458, 3525-3526, 3540-3542, 3627-3638

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/pt.lproj/Localizable.strings` around lines 13 - 24, Translate
every newly added English user-facing value in the Portuguese
Localizable.strings entries, including DEX, swap, Explore Dash, AboutDash, and
CrowdNode messages. Preserve all format placeholders exactly and leave product
names unchanged; apply the translations consistently across the referenced
entries.
DashWallet/ro.lproj/Localizable.strings-13-14 (1)

13-14: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Fix the ro.lproj/Localizable.strings encoding before merging.

The file is not valid UTF-16LE .strings content: it lacks a UTF-16LE BOM, and decoding it as UTF-16LE produces corrupted/mojibaked runtime strings instead of valid localization. Commit the file with proper UTF-16LELE/Xcode export encoding, or regenerate it from the localization catalog.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/ro.lproj/Localizable.strings` around lines 13 - 14, Re-encode the
Romanian Localizable.strings resource as valid UTF-16LE Xcode .strings content,
including the required BOM, while preserving all existing keys and translations;
alternatively regenerate it from the localization catalog using the proper
export encoding.

Source: Coding guidelines

DashWallet/ru.lproj/Localizable.strings-13-14 (1)

13-14: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the new user-facing strings in the Russian catalog.

Many newly added DEX, SwapKit, and UI messages use the English source text as their Russian value. This causes Russian users to see English throughout swap flows, including errors, confirmations, and status messages. Replace these values with Russian translations while preserving all %@, %d, and %ld placeholders; apply the same fix to the other newly added English-valued entries in this file.

Also applies to: 226-227, 422-423, 649-650, 1856-1863, 2484-2491, 2886-2896, 3284-3294, 3627-3637

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/ru.lproj/Localizable.strings` around lines 13 - 14, Translate the
newly added English-valued DEX, SwapKit, and UI entries in the Russian
Localizable.strings catalog, including the entries identified by the listed
ranges. Preserve every %@, %d, and %ld placeholder exactly while replacing each
English value with accurate Russian text; use the existing localization keys and
do not alter unrelated translations.
DashWallet/sk.lproj/Localizable.strings-13-24 (1)

13-24: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Translate the new user-facing strings for Slovak.

These additions leave many DEX, payment, status, and error messages in English in sk.lproj. Translate the values while retaining only product/protocol names such as Dash DEX, SwapKit, NEAR, URI, and DashSync.

Also applies to: 49-51, 226-228, 250-252, 319-321, 422-424, 470-472, 497-499, 515-517, 595-596, 613-624, 649-651, 786-788, 944-949, 959-961, 1088-1090, 1130-1132, 1295-1297, 1352-1354, 1427-1429, 1487-1488, 1535-1537, 1599-1601, 1723-1725, 1735-1737, 1792-1794, 1856-1864, 1880-1882, 1931-1933, 2213-2215, 2276-2278, 2348-2350, 2454-2456, 2484-2486, 2490-2492, 2527-2529, 2641-2643, 2692-2694, 2708-2720, 2734-2741, 2790-2795, 2823-2825, 2838-2840, 2844-2845, 2850-2852, 2880-2882, 2886-2896, 2919-2921, 2925-2926, 2993-2995, 3038-3040, 3056-3058, 3218-3222, 3284-3294, 3367-3368, 3456-3458, 3525-3526, 3540-3542, 3627-3637

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/sk.lproj/Localizable.strings` around lines 13 - 24, Translate
every newly added user-facing English value in sk.lproj/Localizable.strings into
Slovak, including the listed DEX, payment, status, and error messages. Preserve
format specifiers and retain product/protocol names such as Dash DEX, SwapKit,
NEAR, URI, and DashSync unchanged; update only the localized values, not the
keys.
🧹 Nitpick comments (1)
DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/AtmListViewController.swift (1)

93-97: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Align the multiline arguments to satisfy SwiftLint.

SwiftLint reports vertical_parameter_alignment_on_call at Line [94]. Reformat this call with one argument per line or vertically aligned arguments.

Suggested formatting
-return String.localizedStringWithFormat(NSLocalizedString("%d ATM(s) in %@", comment: "`#bc-ignore`!"), items.count,
-                              ExploreDash.distanceFormatter
-                                  .string(from: Measurement(value: model.currentRadius, unit: UnitLength.meters)))
+return String.localizedStringWithFormat(
+    NSLocalizedString("%d ATM(s) in %@", comment: "`#bc-ignore`!"),
+    items.count,
+    ExploreDash.distanceFormatter
+        .string(from: Measurement(value: model.currentRadius, unit: UnitLength.meters))
+)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@DashWallet/Sources/UI/Explore` Dash/Merchants &
ATMs/List/AtmListViewController.swift around lines 93 - 97, Reformat the
String.localizedStringWithFormat calls in the ATM list subtitle logic so each
argument is on its own line with consistent vertical alignment, resolving
SwiftLint’s vertical_parameter_alignment_on_call warning while preserving the
existing localization and values.

Source: Linters/SAST tools


ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 684223da-389a-4490-9e04-971a1b713a49

📥 Commits

Reviewing files that changed from the base of the PR and between 0bc4b5d and 3370c26.

📒 Files selected for processing (49)
  • .bartycrouch.toml
  • DashWallet.xcodeproj/project.pbxproj
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/AtmListViewController.swift
  • DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/ExtendedPublicKeysView.swift
  • DashWallet/Sources/UI/SwiftUI Components/NavigationBar.swift
  • DashWallet/ar.lproj/Localizable.strings
  • DashWallet/bg.lproj/Localizable.strings
  • DashWallet/ca.lproj/Localizable.strings
  • DashWallet/cs.lproj/Localizable.strings
  • DashWallet/da.lproj/Localizable.strings
  • DashWallet/de.lproj/Localizable.strings
  • DashWallet/el.lproj/Localizable.strings
  • DashWallet/en.lproj/Localizable.strings
  • DashWallet/en.lproj/Localizable.stringsdict
  • DashWallet/eo.lproj/Localizable.strings
  • DashWallet/es.lproj/Localizable.strings
  • DashWallet/et.lproj/Localizable.strings
  • DashWallet/fa.lproj/Localizable.strings
  • DashWallet/fi.lproj/Localizable.strings
  • DashWallet/fil.lproj/Localizable.strings
  • DashWallet/fr.lproj/Localizable.strings
  • DashWallet/hr.lproj/Localizable.strings
  • DashWallet/hu.lproj/Localizable.strings
  • DashWallet/id.lproj/Localizable.strings
  • DashWallet/it.lproj/Localizable.strings
  • DashWallet/ja.lproj/Localizable.strings
  • DashWallet/ko.lproj/Localizable.strings
  • DashWallet/mk.lproj/Localizable.strings
  • DashWallet/ms.lproj/Localizable.strings
  • DashWallet/nb.lproj/Localizable.strings
  • DashWallet/nl.lproj/Localizable.strings
  • DashWallet/pl.lproj/Localizable.strings
  • DashWallet/pt.lproj/Localizable.strings
  • DashWallet/ro.lproj/Localizable.strings
  • DashWallet/ru.lproj/Localizable.strings
  • DashWallet/sk.lproj/Localizable.strings
  • DashWallet/sl.lproj/Localizable.strings
  • DashWallet/sl_SI.lproj/Localizable.strings
  • DashWallet/sq.lproj/Localizable.strings
  • DashWallet/sr.lproj/Localizable.strings
  • DashWallet/sv.lproj/Localizable.strings
  • DashWallet/th.lproj/Localizable.strings
  • DashWallet/tr.lproj/Localizable.strings
  • DashWallet/uk.lproj/Localizable.strings
  • DashWallet/vi.lproj/Localizable.strings
  • DashWallet/zh-Hans.lproj/Localizable.strings
  • DashWallet/zh-Hant-TW.lproj/Localizable.strings
  • DashWallet/zh.lproj/Localizable.strings
  • DashWallet/zh_TW.lproj/Localizable.strings

The previous commit added `%d ATM(s) in %@` to en.lproj only, so every other
language still fell back to the raw key. Plural keys in this project live in
all locale catalogs — `%d merchant(s) in %@` sits in 41 of them, holding the
English text where no translation exists yet — so add the ATM entry the same
way and let Transifex fill it in.

zh-Hans and zh-Hant-TW are left alone: they carry only 2 of the 5 plural keys
and lack the merchant entry too, so they need a separate look.

Also reformat the two call sites onto one argument per line. Widening the call
to String.localizedStringWithFormat had pushed the continuation lines out of
alignment, adding vertical_parameter_alignment_on_call and line_length warnings
that were not there before; SwiftLint output for this file now matches master.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

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

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@DashWallet/ar.lproj/Localizable.stringsdict`:
- Around line 21-36: Translate the one and other values for the “%d ATM(s) in
%@” plural entry in each affected catalog:
DashWallet/ar.lproj/Localizable.stringsdict lines 21-36,
DashWallet/bg.lproj/Localizable.stringsdict lines 21-36,
DashWallet/ca.lproj/Localizable.stringsdict lines 21-36,
DashWallet/cs.lproj/Localizable.stringsdict lines 25-40,
DashWallet/pl.lproj/Localizable.stringsdict lines 25-40,
DashWallet/pt.lproj/Localizable.stringsdict lines 23-38,
DashWallet/ro.lproj/Localizable.stringsdict lines 21-36,
DashWallet/ru.lproj/Localizable.stringsdict lines 25-40,
DashWallet/sk.lproj/Localizable.stringsdict lines 25-40, and
DashWallet/sl.lproj/Localizable.stringsdict lines 21-36. Preserve the existing
NSStringPluralRuleType structure and format placeholders while supplying natural
translations for each locale.

In `@DashWallet/cs.lproj/Localizable.stringsdict`:
- Around line 25-40: Update the “%d ATM(s) in %@” plural entry in
DashWallet/cs.lproj/Localizable.stringsdict (lines 25-40),
DashWallet/pl.lproj/Localizable.stringsdict (lines 25-40),
DashWallet/ru.lproj/Localizable.stringsdict (lines 25-40), and
DashWallet/sk.lproj/Localizable.stringsdict (lines 25-40) by adding the
locale-appropriate few and many categories; update the same entry in
DashWallet/pt.lproj/Localizable.stringsdict (lines 23-38) by adding many.
Preserve the existing one and other forms and match the wording/style of nearby
pluralized ATM strings in each catalog.

In `@DashWallet/da.lproj/Localizable.stringsdict`:
- Around line 21-36: Translate the ATM plural strings in the `atms` entries
across all listed catalogs: DashWallet/da.lproj/Localizable.stringsdict lines
21-36 (Danish preposition), DashWallet/el.lproj/Localizable.stringsdict lines
21-36 (both Greek forms), DashWallet/eo.lproj/Localizable.stringsdict lines
21-36 (both Esperanto forms), DashWallet/es.lproj/Localizable.stringsdict lines
23-38 (both Spanish forms), DashWallet/sl_SI.lproj/Localizable.stringsdict lines
21-36 (Slovenian preposition), DashWallet/sq.lproj/Localizable.stringsdict lines
21-36 (both Albanian forms), DashWallet/sr.lproj/Localizable.stringsdict lines
21-36 (Serbian preposition), DashWallet/sv.lproj/Localizable.stringsdict lines
21-36 (Swedish preposition), and DashWallet/th.lproj/Localizable.stringsdict
lines 19-34 (both Thai forms); preserve the existing plural keys and format
placeholders.

In `@DashWallet/et.lproj/Localizable.stringsdict`:
- Around line 21-36: Replace the English ATM plural values under the “%d ATM(s)
in %@” entry with locale-specific translations, preserving the %d and %@
placeholders and each locale’s plural behavior. Apply this in
DashWallet/et.lproj/Localizable.stringsdict lines 21-36,
DashWallet/fa.lproj/Localizable.stringsdict lines 21-36,
DashWallet/fi.lproj/Localizable.stringsdict lines 21-36,
DashWallet/fil.lproj/Localizable.stringsdict lines 21-36,
DashWallet/fr.lproj/Localizable.stringsdict lines 23-38,
DashWallet/tr.lproj/Localizable.stringsdict lines 21-36,
DashWallet/uk.lproj/Localizable.stringsdict lines 25-40,
DashWallet/vi.lproj/Localizable.stringsdict lines 19-34,
DashWallet/zh.lproj/Localizable.stringsdict lines 19-34, and
DashWallet/zh_TW.lproj/Localizable.stringsdict lines 19-34.

In `@DashWallet/hr.lproj/Localizable.stringsdict`:
- Around line 21-36: Replace the English one/other ATM templates in the
pluralization entry with locale-appropriate translations at
DashWallet/hr.lproj/Localizable.stringsdict lines 21-36,
DashWallet/hu.lproj/Localizable.stringsdict lines 21-36,
DashWallet/id.lproj/Localizable.stringsdict lines 19-34,
DashWallet/it.lproj/Localizable.stringsdict lines 23-38,
DashWallet/ja.lproj/Localizable.stringsdict lines 19-34,
DashWallet/ko.lproj/Localizable.stringsdict lines 19-34,
DashWallet/mk.lproj/Localizable.stringsdict lines 21-36,
DashWallet/ms.lproj/Localizable.stringsdict lines 21-36,
DashWallet/nb.lproj/Localizable.stringsdict lines 21-36, and
DashWallet/nl.lproj/Localizable.stringsdict lines 21-36; preserve the existing
NSStringLocalizedFormatKey and pluralization structure while translating both
templates for each locale.

In `@DashWallet/uk.lproj/Localizable.stringsdict`:
- Around line 35-38: Update the atms plural entry in the Ukrainian localization
to include the existing one, few, many, and other categories, with grammatically
appropriate ATM strings for each. Preserve the localization format and verify
the categories resolve correctly for counts such as 1, 2, and 5.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 29666708-5be1-4a2c-9cdb-ca11ab877cf9

📥 Commits

Reviewing files that changed from the base of the PR and between 3370c26 and dd01ba4.

📒 Files selected for processing (41)
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/AtmListViewController.swift
  • DashWallet/ar.lproj/Localizable.stringsdict
  • DashWallet/bg.lproj/Localizable.stringsdict
  • DashWallet/ca.lproj/Localizable.stringsdict
  • DashWallet/cs.lproj/Localizable.stringsdict
  • DashWallet/da.lproj/Localizable.stringsdict
  • DashWallet/de.lproj/Localizable.stringsdict
  • DashWallet/el.lproj/Localizable.stringsdict
  • DashWallet/eo.lproj/Localizable.stringsdict
  • DashWallet/es.lproj/Localizable.stringsdict
  • DashWallet/et.lproj/Localizable.stringsdict
  • DashWallet/fa.lproj/Localizable.stringsdict
  • DashWallet/fi.lproj/Localizable.stringsdict
  • DashWallet/fil.lproj/Localizable.stringsdict
  • DashWallet/fr.lproj/Localizable.stringsdict
  • DashWallet/hr.lproj/Localizable.stringsdict
  • DashWallet/hu.lproj/Localizable.stringsdict
  • DashWallet/id.lproj/Localizable.stringsdict
  • DashWallet/it.lproj/Localizable.stringsdict
  • DashWallet/ja.lproj/Localizable.stringsdict
  • DashWallet/ko.lproj/Localizable.stringsdict
  • DashWallet/mk.lproj/Localizable.stringsdict
  • DashWallet/ms.lproj/Localizable.stringsdict
  • DashWallet/nb.lproj/Localizable.stringsdict
  • DashWallet/nl.lproj/Localizable.stringsdict
  • DashWallet/pl.lproj/Localizable.stringsdict
  • DashWallet/pt.lproj/Localizable.stringsdict
  • DashWallet/ro.lproj/Localizable.stringsdict
  • DashWallet/ru.lproj/Localizable.stringsdict
  • DashWallet/sk.lproj/Localizable.stringsdict
  • DashWallet/sl.lproj/Localizable.stringsdict
  • DashWallet/sl_SI.lproj/Localizable.stringsdict
  • DashWallet/sq.lproj/Localizable.stringsdict
  • DashWallet/sr.lproj/Localizable.stringsdict
  • DashWallet/sv.lproj/Localizable.stringsdict
  • DashWallet/th.lproj/Localizable.stringsdict
  • DashWallet/tr.lproj/Localizable.stringsdict
  • DashWallet/uk.lproj/Localizable.stringsdict
  • DashWallet/vi.lproj/Localizable.stringsdict
  • DashWallet/zh.lproj/Localizable.stringsdict
  • DashWallet/zh_TW.lproj/Localizable.stringsdict
🚧 Files skipped from review as they are similar to previous changes (1)
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/AtmListViewController.swift

Comment thread DashWallet/ar.lproj/Localizable.stringsdict
Comment thread DashWallet/cs.lproj/Localizable.stringsdict
Comment thread DashWallet/da.lproj/Localizable.stringsdict
Comment thread DashWallet/et.lproj/Localizable.stringsdict
Comment thread DashWallet/hr.lproj/Localizable.stringsdict
Comment thread DashWallet/uk.lproj/Localizable.stringsdict
jeanpierreroma and others added 2 commits July 23, 2026 01:40
The ATM stringsdict entry was added with en's one/other everywhere, but the
plural rules differ per language. Where the neighbouring "%d merchant(s) in %@"
already carries more categories — many for es/fr/it/pt, few+many for
pl/ru/sk/uk — an intermediate count (2 or 5 in Ukrainian, say) fell through to
`other`, which is the wrong grammatical form. And the CLDR "other only"
languages (id/ja/ko/th/zh/zh_TW) carried a spurious `one` their rules never
select.

Align each ATM entry's category set to the merchant entry in the same catalog,
so the plural coverage matches what the app already ships. The values stay the
English placeholders Transifex fills in on the next pull; this only fixes which
plural buckets exist.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
When a transaction is the DASH leg of a DashDEX swap, the details sheet shows a
second explorer card below "View in Block Explorer" — "View in Maya Explorer"
or "View in NEAR Explorer" depending on the order's provider. It's its own card,
styled identically to the Dash one; ordinary transactions are unchanged.

Provider classification mirrors SwapTrackingService.trackingRoute, and the two
explorers key on different identifiers (Maya on the tx hash, NEAR on the deposit
address). The card is hidden until that identifier is available, so no dead links.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@HashEngineering HashEngineering left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM.

@romchornyi
romchornyi merged commit 9b8ae5b into master Jul 27, 2026
2 checks passed
@romchornyi
romchornyi deleted the chore/localization-fixes-8.7.0 branch July 27, 2026 21:05
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.

3 participants