From 50c57cfac1182854e23d78cd2c751119bfede10d Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 18 Sep 2026 23:10:51 +0700 Subject: [PATCH] fix(ios): translate the table page range --- CHANGELOG.md | 1 + .../TableProMobile/Localizable.xcstrings | 28 +++++++++++++++++++ .../ViewModels/DataBrowserViewModel.swift | 10 ++++--- .../DataBrowserViewModelTests.swift | 10 +++++++ 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e27885c5a..c71f41a98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -118,6 +118,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Deleted connections still showing in Spotlight, Siri, Shortcuts and Handoff on iPhone and iPad. - No confirmation before deleting a tag on iPhone and iPad. - Picking an SSH key file on iPhone and iPad replacing another connection's key file of the same name. +- Table page range shown in English in every language on iPhone and iPad. ### Security diff --git a/TableProMobile/TableProMobile/Localizable.xcstrings b/TableProMobile/TableProMobile/Localizable.xcstrings index c0fa82ace..8b4bc5546 100644 --- a/TableProMobile/TableProMobile/Localizable.xcstrings +++ b/TableProMobile/TableProMobile/Localizable.xcstrings @@ -114,6 +114,34 @@ } } }, + "%1$lld-%2$lld of %3$lld" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld-%2$lld / %3$lld" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld-%2$lld trĂȘn %3$lld" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld-%2$lld / %3$lld" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld-%2$lld / %3$lld" + } + } + } + }, "%@" : { "localizations" : { "ko" : { diff --git a/TableProMobile/TableProMobile/ViewModels/DataBrowserViewModel.swift b/TableProMobile/TableProMobile/ViewModels/DataBrowserViewModel.swift index 6ab16aabf..421c16d8b 100644 --- a/TableProMobile/TableProMobile/ViewModels/DataBrowserViewModel.swift +++ b/TableProMobile/TableProMobile/ViewModels/DataBrowserViewModel.swift @@ -75,10 +75,12 @@ final class DataBrowserViewModel { guard !legacyRows.isEmpty else { return "" } let start = pagination.currentOffset + 1 let end = pagination.currentOffset + legacyRows.count - if let total = pagination.totalRows { - return "\(start)-\(end) of \(total)" - } - return "\(start)-\(end)" + guard let total = pagination.totalRows else { return "\(start)-\(end)" } + return Self.pageRangeLabel(start: start, end: end, total: total) + } + + nonisolated static func pageRangeLabel(start: Int, end: Int, total: Int, bundle: Bundle = .main) -> String { + String(format: String(localized: "%1$lld-%2$lld of %3$lld", bundle: bundle), start, end, total) } // MARK: - Attach diff --git a/TableProMobile/TableProMobileTests/DataBrowserViewModelTests.swift b/TableProMobile/TableProMobileTests/DataBrowserViewModelTests.swift index 977fbe4ee..d8936e88d 100644 --- a/TableProMobile/TableProMobileTests/DataBrowserViewModelTests.swift +++ b/TableProMobile/TableProMobileTests/DataBrowserViewModelTests.swift @@ -129,6 +129,16 @@ struct DataBrowserViewModelTests { #expect(vm.pagination.currentPage == 0, "previous on page 0 should not underflow") } + @Test("The page range reads in the app's language") + func pageRangeLabelIsLocalized() throws { + #expect(DataBrowserViewModel.pageRangeLabel(start: 1, end: 100, total: 3_503) == "1-100 of 3503") + + let path = try #require(Bundle.main.path(forResource: "vi", ofType: "lproj")) + let vietnamese = try #require(Bundle(path: path)) + let label = DataBrowserViewModel.pageRangeLabel(start: 1, end: 100, total: 3_503, bundle: vietnamese) + #expect(label == "1-100 trĂȘn 3503") + } + @Test("primaryKeyValues returns only PK columns from row") func primaryKeyExtraction() async { let driver = MockDatabaseDriver()