From a2b443dfdc134091e631f47886ebace8a4de888c Mon Sep 17 00:00:00 2001 From: Leo Li Date: Wed, 21 Oct 2026 09:58:17 +0000 Subject: [PATCH] Revert "cmux NEXT Home: plural step counts in every locale; the store keeps the thought's headline, not its text (#22707)" This reverts commit c4fc4e9d757442d8f65de933cb5b117690f51750. --- .../Sources/CmuxHomeCore/Store/HomeLive.swift | 3 +- .../CmuxHomeCore/Store/HomeLiveBook.swift | 2 +- .../Store/HomeThoughtHeadline.swift | 45 - .../Cmux/HomeTurnProgress.swift | 41 +- .../Resources/CmuxHome.xcstrings | 2808 +++-------------- .../HomeTurnProgressTests.swift | 22 +- scripts/localization-plurals.json | 36 - 7 files changed, 422 insertions(+), 2535 deletions(-) delete mode 100644 Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeThoughtHeadline.swift diff --git a/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeLive.swift b/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeLive.swift index 735723c2c02d..b6264c5a60e7 100644 --- a/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeLive.swift +++ b/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeLive.swift @@ -136,8 +136,7 @@ public struct HomeLiveRun: Hashable, Sendable { /// The run's talk steps in order, joined by a blank line ("" before the first text). public var text: String public var activity: HomeLiveActivity? - /// The headline of the run's newest thought (``HomeThoughtHeadline``), kept after its step ends - /// until the next thought; nil when there is none. + /// The newest thought the run streams now (a thought step not yet ended), whole; nil when none. /// Home's running indicator shows its headline as the Chief's progress narration. public var thought: String? = nil diff --git a/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeLiveBook.swift b/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeLiveBook.swift index 98cc59dc9c94..3aca0e4587e2 100644 --- a/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeLiveBook.swift +++ b/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeLiveBook.swift @@ -267,7 +267,7 @@ struct HomeLiveBook { .sorted { (Self.place(run.steps[$0.element]), $0.offset) < (Self.place(run.steps[$1.element]), $1.offset) } .compactMap { run.steps[$0.element]?.text } .filter { !$0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty } - let thought = run.lastThought.flatMap(HomeThoughtHeadline.of) + let thought = run.lastThought.flatMap { $0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ? nil : $0 } return HomeLiveRun(participant: key.author, run: key.run, turn: turn(of: key), text: talk.joined(separator: "\n\n"), activity: run.activity, thought: thought) } diff --git a/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeThoughtHeadline.swift b/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeThoughtHeadline.swift deleted file mode 100644 index c47ec4097d5d..000000000000 --- a/Packages/Shared/CmuxHomeCore/Sources/CmuxHomeCore/Store/HomeThoughtHeadline.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Foundation - -/// The headline of one of the Chief's thoughts: what its running indicator shows as progress narration. -/// -/// The live book publishes this, not the whole thought, so a streamed thought token changes the -/// store's live state only when the line a person sees changes. -public enum HomeThoughtHeadline { - /// Most characters a headline keeps. - public static let limit = 72 - - /// A thought's headline: its last bold heading line ("**Checking the tests**", how Claude and - /// Codex title their reasoning summaries), else its last sentence, as plain text of at most - /// ``limit`` characters. Nil for a thought with no words. - public static func of(_ thought: String) -> String? { - let lines = thought.split(whereSeparator: \.isNewline).map { $0.trimmingCharacters(in: .whitespaces) } - .filter { !$0.isEmpty } - let heading = lines.last { $0.count > 4 && $0.hasPrefix("**") && $0.hasSuffix("**") } - let raw: String - if let heading { - raw = String(heading.dropFirst(2).dropLast(2)) - } else if let last = lines.last { - raw = lastSentence(last) - } else { - return nil - } - let plain = raw.replacingOccurrences(of: "**", with: "").replacingOccurrences(of: "`", with: "") - .trimmingCharacters(in: CharacterSet(charactersIn: "*_#> ").union(.whitespaces)) - guard !plain.isEmpty else { return nil } - guard plain.count > limit else { return plain } - return String(plain.prefix(limit - 1)).trimmingCharacters(in: .whitespaces) + "…" - } - - /// The last sentence of `line` (after its last ". ", "! " or "? "), or the line. - static func lastSentence(_ line: String) -> String { - let trimmed = line.trimmingCharacters(in: .whitespaces) - let body = trimmed.last.map { ".!?".contains($0) } == true ? String(trimmed.dropLast()) : trimmed - // After the last ". ", then the last "! " after it, then the last "? ": after the last end of any kind. - var rest = body - for end in [". ", "! ", "? "] { - if let range = rest.range(of: end, options: .backwards) { rest = String(rest.suffix(from: range.upperBound)) } - } - let sentence = rest.trimmingCharacters(in: .whitespaces) - return sentence.isEmpty ? trimmed : sentence - } -} diff --git a/Packages/Shared/CmuxMessagesLab/Sources/MessagesLabHome/Cmux/HomeTurnProgress.swift b/Packages/Shared/CmuxMessagesLab/Sources/MessagesLabHome/Cmux/HomeTurnProgress.swift index 42f20753bd16..37fa8854d975 100644 --- a/Packages/Shared/CmuxMessagesLab/Sources/MessagesLabHome/Cmux/HomeTurnProgress.swift +++ b/Packages/Shared/CmuxMessagesLab/Sources/MessagesLabHome/Cmux/HomeTurnProgress.swift @@ -34,7 +34,7 @@ struct HomeTurnProgress: Equatable { /// Lines the owner sends for its own writing, not a step of the turn's work. static let notSteps: Set = ["Thinking", "Writing the reply", "Working"] /// Most characters a narration row keeps. - static var narrationLimit: Int { HomeThoughtHeadline.limit } + static let narrationLimit = 72 init(summary: String?, narration: String?, current: String) { self.summary = summary @@ -54,8 +54,7 @@ struct HomeTurnProgress: Equatable { } let finished = steps.filter { $0.end != nil }.map(\.line).filter { !Self.notSteps.contains($0) } let summary = Self.summary(finished) - // `thought` is already the headline (the live book publishes `HomeThoughtHeadline.of`). - var narration = style == .narrated ? thought : nil + var narration = style == .narrated ? thought.flatMap(Self.headline) : nil var current = line if let told = narration, activity.line == "Thinking" { // Thinking now: its headline is the running row, not a second row over "Thinking". @@ -127,6 +126,38 @@ struct HomeTurnProgress: Equatable { // MARK: Narration - /// A thought's headline (``HomeThoughtHeadline``): the store already publishes it this way. - static func headline(_ thought: String) -> String? { HomeThoughtHeadline.of(thought) } + /// A thought's headline: its last bold heading line ("**Checking the tests**", how Claude and + /// Codex title their reasoning summaries), else its last sentence, as plain text of at most + /// ``narrationLimit`` characters. Nil for a thought with no words. + static func headline(_ thought: String) -> String? { + let lines = thought.split(whereSeparator: \.isNewline).map { $0.trimmingCharacters(in: .whitespaces) } + .filter { !$0.isEmpty } + let heading = lines.last { $0.count > 4 && $0.hasPrefix("**") && $0.hasSuffix("**") } + let raw: String + if let heading { + raw = String(heading.dropFirst(2).dropLast(2)) + } else if let last = lines.last { + raw = lastSentence(last) + } else { + return nil + } + let plain = raw.replacingOccurrences(of: "**", with: "").replacingOccurrences(of: "`", with: "") + .trimmingCharacters(in: CharacterSet(charactersIn: "*_#> ").union(.whitespaces)) + guard !plain.isEmpty else { return nil } + guard plain.count > narrationLimit else { return plain } + return String(plain.prefix(narrationLimit - 1)).trimmingCharacters(in: .whitespaces) + "…" + } + + /// The last sentence of `line` (after its last ". ", "! " or "? "), or the line. + static func lastSentence(_ line: String) -> String { + let trimmed = line.trimmingCharacters(in: .whitespaces) + let body = trimmed.last.map { ".!?".contains($0) } == true ? String(trimmed.dropLast()) : trimmed + // After the last ". ", then the last "! " after it, then the last "? ": after the last end of any kind. + var rest = body + for end in [". ", "! ", "? "] { + if let range = rest.range(of: end, options: .backwards) { rest = String(rest.suffix(from: range.upperBound)) } + } + let sentence = rest.trimmingCharacters(in: .whitespaces) + return sentence.isEmpty ? trimmed : sentence + } } diff --git a/Packages/Shared/CmuxMessagesLab/Sources/MessagesLabHome/Resources/CmuxHome.xcstrings b/Packages/Shared/CmuxMessagesLab/Sources/MessagesLabHome/Resources/CmuxHome.xcstrings index 881bcb704d79..78e91687d676 100644 --- a/Packages/Shared/CmuxMessagesLab/Sources/MessagesLabHome/Resources/CmuxHome.xcstrings +++ b/Packages/Shared/CmuxMessagesLab/Sources/MessagesLabHome/Resources/CmuxHome.xcstrings @@ -3419,471 +3419,129 @@ "extractionState": "manual", "localizations": { "en": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "translated", - "value": "Ran %lld command" - } - }, - "other": { - "stringUnit": { - "state": "translated", - "value": "Ran %lld commands" - } - } - } + "stringUnit": { + "state": "translated", + "value": "Ran %lld commands" } }, "ar": { - "variations": { - "plural": { - "zero": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld أمر" - } - }, - "one": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld أمر" - } - }, - "two": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld أمرين" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld أوامر" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld أمرًا" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld أمر" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "تم تشغيل %lld أوامر" } }, "bs": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Pokrenuta %lld komanda" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Pokrenute %lld komande" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Pokrenuto %lld komandi" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Pokrenuto komandi: %lld" } }, "da": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Kørte %lld kommando" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Kørte %lld kommandoer" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Kørte %lld kommandoer" } }, "de": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Befehl ausgeführt" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Befehle ausgeführt" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld Befehle ausgeführt" } }, "es": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Se ejecutó %lld comando" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Se ejecutaron %lld de comandos" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Se ejecutaron %lld comandos" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Se ejecutaron %lld comandos" } }, "fr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld commande exécutée" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de commandes exécutées" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld commandes exécutées" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld commandes exécutées" } }, "it": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Eseguito %lld comando" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Eseguiti %lld comandi" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Eseguiti %lld comandi" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Eseguiti %lld comandi" } }, "ja": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 件のコマンドを実行しました" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 件のコマンドを実行しました" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld 件のコマンドを実行しました" } }, "km": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "បានដំណើរការពាក្យបញ្ជា %lld" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "បានដំណើរការពាក្យបញ្ជា %lld" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "បានដំណើរការពាក្យបញ្ជា %lld" } }, "ko": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "명령 %lld개 실행함" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "명령 %lld개 실행함" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "명령 %lld개 실행함" } }, "nb": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Kjørte %lld kommando" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Kjørte %lld kommandoer" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Kjørte %lld kommandoer" } }, "pl": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Uruchomiono %lld polecenie" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Uruchomiono %lld polecenia" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Uruchomiono %lld poleceń" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Uruchomiono %lld polecenia" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Uruchomiono poleceń: %lld" } }, "pt-BR": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld comando executado" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de comandos executados" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld comandos executados" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld comandos executados" } }, "ru": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Выполнена %lld команда" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Выполнено %lld команды" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Выполнено %lld команд" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Выполнено %lld команды" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Выполнено команд: %lld" } }, "th": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "รันแล้ว %lld คำสั่ง" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "รันแล้ว %lld คำสั่ง" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "รันแล้ว %lld คำสั่ง" } }, "tr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld komut çalıştırıldı" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld komut çalıştırıldı" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld komut çalıştırıldı" } }, "uk": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Виконано %lld команду" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Виконано %lld команди" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Виконано %lld команд" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Виконано %lld команди" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Виконано команд: %lld" } }, "vi": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Đã chạy %lld lệnh" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Đã chạy %lld lệnh" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Đã chạy %lld lệnh" } }, "zh-Hans": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "运行了 %lld 个命令" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "运行了 %lld 个命令" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "运行了 %lld 个命令" } }, "zh-Hant": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "執行了 %lld 個指令" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "執行了 %lld 個指令" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "執行了 %lld 個指令" } } } @@ -3893,471 +3551,129 @@ "extractionState": "manual", "localizations": { "en": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "translated", - "value": "Read %lld file" - } - }, - "other": { - "stringUnit": { - "state": "translated", - "value": "Read %lld files" - } - } - } + "stringUnit": { + "state": "translated", + "value": "Read %lld files" } }, "ar": { - "variations": { - "plural": { - "zero": { - "stringUnit": { - "state": "needs_review", - "value": "قراءة %lld ملف" - } - }, - "one": { - "stringUnit": { - "state": "needs_review", - "value": "قراءة %lld ملف" - } - }, - "two": { - "stringUnit": { - "state": "needs_review", - "value": "قراءة %lld ملفين" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "قراءة %lld ملفات" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "قراءة %lld ملفًا" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "قراءة %lld ملف" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "قراءة %lld ملفات" } }, "bs": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Pročitana %lld datoteka" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Pročitane %lld datoteke" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Pročitano %lld datoteka" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Pročitano datoteka: %lld" } }, "da": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Læste %lld fil" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Læste %lld filer" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Læste %lld filer" } }, "de": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Datei gelesen" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Dateien gelesen" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld Dateien gelesen" } }, "es": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Leyó %lld archivo" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Leyó %lld de archivos" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Leyó %lld archivos" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Leyó %lld archivos" } }, "fr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld fichier lu" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de fichiers lus" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld fichiers lus" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld fichiers lus" } }, "it": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Letto %lld file" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Letti %lld file" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Letti %lld file" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Letti %lld file" } }, "ja": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 件のファイルを読みました" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 件のファイルを読みました" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld 件のファイルを読みました" } }, "km": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "បានអានឯកសារ %lld" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "បានអានឯកសារ %lld" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "បានអានឯកសារ %lld" } }, "ko": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "파일 %lld개 읽음" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "파일 %lld개 읽음" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "파일 %lld개 읽음" } }, "nb": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Leste %lld fil" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Leste %lld filer" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Leste %lld filer" } }, "pl": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Odczytano %lld plik" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Odczytano %lld pliki" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Odczytano %lld plików" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Odczytano %lld pliku" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Odczytano plików: %lld" } }, "pt-BR": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld arquivo lido" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de arquivos lidos" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld arquivos lidos" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld arquivos lidos" } }, "ru": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Прочитан %lld файл" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Прочитано %lld файла" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Прочитано %lld файлов" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Прочитано %lld файла" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Прочитано файлов: %lld" } }, "th": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "อ่าน %lld ไฟล์" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "อ่าน %lld ไฟล์" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "อ่าน %lld ไฟล์" } }, "tr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld dosya okundu" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld dosya okundu" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld dosya okundu" } }, "uk": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Прочитано %lld файл" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Прочитано %lld файли" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Прочитано %lld файлів" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Прочитано %lld файлу" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Прочитано файлів: %lld" } }, "vi": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Đã đọc %lld tệp" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Đã đọc %lld tệp" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Đã đọc %lld tệp" } }, "zh-Hans": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "读取了 %lld 个文件" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "读取了 %lld 个文件" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "读取了 %lld 个文件" } }, "zh-Hant": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "讀取了 %lld 個檔案" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "讀取了 %lld 個檔案" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "讀取了 %lld 個檔案" } } } @@ -4367,471 +3683,129 @@ "extractionState": "manual", "localizations": { "en": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "translated", - "value": "Edited %lld file" - } - }, - "other": { - "stringUnit": { - "state": "translated", - "value": "Edited %lld files" - } - } - } + "stringUnit": { + "state": "translated", + "value": "Edited %lld files" } }, "ar": { - "variations": { - "plural": { - "zero": { - "stringUnit": { - "state": "needs_review", - "value": "تحرير %lld ملف" - } - }, - "one": { - "stringUnit": { - "state": "needs_review", - "value": "تحرير %lld ملف" - } - }, - "two": { - "stringUnit": { - "state": "needs_review", - "value": "تحرير %lld ملفين" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "تحرير %lld ملفات" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "تحرير %lld ملفًا" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "تحرير %lld ملف" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "تحرير %lld ملفات" } }, "bs": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Uređena %lld datoteka" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Uređene %lld datoteke" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Uređeno %lld datoteka" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Uređeno datoteka: %lld" } }, "da": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Redigerede %lld fil" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Redigerede %lld filer" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Redigerede %lld filer" } }, "de": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Datei bearbeitet" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Dateien bearbeitet" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld Dateien bearbeitet" } }, "es": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Editó %lld archivo" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Editó %lld de archivos" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Editó %lld archivos" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Editó %lld archivos" } }, "fr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld fichier modifié" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de fichiers modifiés" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld fichiers modifiés" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld fichiers modifiés" } }, "it": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Modificato %lld file" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Modificati %lld file" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Modificati %lld file" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Modificati %lld file" } }, "ja": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 件のファイルを編集しました" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 件のファイルを編集しました" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld 件のファイルを編集しました" } }, "km": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "បានកែសម្រួលឯកសារ %lld" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "បានកែសម្រួលឯកសារ %lld" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "បានកែសម្រួលឯកសារ %lld" } }, "ko": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "파일 %lld개 편집함" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "파일 %lld개 편집함" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "파일 %lld개 편집함" } }, "nb": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Redigerte %lld fil" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Redigerte %lld filer" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Redigerte %lld filer" } }, "pl": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Edytowano %lld plik" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Edytowano %lld pliki" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Edytowano %lld plików" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Edytowano %lld pliku" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Edytowano plików: %lld" } }, "pt-BR": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld arquivo editado" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de arquivos editados" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld arquivos editados" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld arquivos editados" } }, "ru": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Изменён %lld файл" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Изменено %lld файла" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Изменено %lld файлов" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Изменено %lld файла" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Изменено файлов: %lld" } }, "th": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "แก้ไข %lld ไฟล์แล้ว" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "แก้ไข %lld ไฟล์แล้ว" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "แก้ไข %lld ไฟล์แล้ว" } }, "tr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld dosya düzenlendi" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld dosya düzenlendi" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld dosya düzenlendi" } }, "uk": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Відредаговано %lld файл" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Відредаговано %lld файли" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Відредаговано %lld файлів" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Відредаговано %lld файлу" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Відредаговано файлів: %lld" } }, "vi": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Đã chỉnh sửa %lld tệp" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Đã chỉnh sửa %lld tệp" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Đã chỉnh sửa %lld tệp" } }, "zh-Hans": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "编辑了 %lld 个文件" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "编辑了 %lld 个文件" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "编辑了 %lld 个文件" } }, "zh-Hant": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "編輯了 %lld 個檔案" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "編輯了 %lld 個檔案" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "編輯了 %lld 個檔案" } } } @@ -4841,471 +3815,129 @@ "extractionState": "manual", "localizations": { "en": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "translated", - "value": "Ran %lld search" - } - }, - "other": { - "stringUnit": { - "state": "translated", - "value": "Ran %lld searches" - } - } - } + "stringUnit": { + "state": "translated", + "value": "Ran %lld searches" } }, "ar": { - "variations": { - "plural": { - "zero": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld عملية بحث" - } - }, - "one": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld عملية بحث" - } - }, - "two": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld عمليتي بحث" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld عمليات بحث" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld عملية بحث" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "تم تشغيل %lld عملية بحث" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "تم تشغيل %lld عمليات بحث" } }, "bs": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Pokrenuta %lld pretraga" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Pokrenute %lld pretrage" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Pokrenuto %lld pretraga" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Pokrenuto pretraga: %lld" } }, "da": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Kørte %lld søgning" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Kørte %lld søgninger" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Kørte %lld søgninger" } }, "de": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Suche ausgeführt" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Suchen ausgeführt" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld Suchen ausgeführt" } }, "es": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Ejecutó %lld búsqueda" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Ejecutó %lld de búsquedas" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Ejecutó %lld búsquedas" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Ejecutó %lld búsquedas" } }, "fr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld recherche effectuée" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de recherches effectuées" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld recherches effectuées" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld recherches effectuées" } }, "it": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Eseguita %lld ricerca" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Eseguite %lld ricerche" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Eseguite %lld ricerche" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Eseguite %lld ricerche" } }, "ja": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 回検索しました" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 回検索しました" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld 回検索しました" } }, "km": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "បានដំណើរការការស្វែងរក %lld" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "បានដំណើរការការស្វែងរក %lld" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "បានដំណើរការការស្វែងរក %lld" } }, "ko": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "검색 %lld회 실행함" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "검색 %lld회 실행함" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "검색 %lld회 실행함" } }, "nb": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Kjørte %lld søk" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Kjørte %lld søk" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Kjørte %lld søk" } }, "pl": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Wykonano %lld wyszukiwanie" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Wykonano %lld wyszukiwania" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Wykonano %lld wyszukiwań" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Wykonano %lld wyszukiwania" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Wykonano wyszukiwań: %lld" } }, "pt-BR": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld pesquisa executada" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de pesquisas executadas" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld pesquisas executadas" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld pesquisas executadas" } }, "ru": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Выполнен %lld поиск" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Выполнено %lld поиска" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Выполнено %lld поисков" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Выполнено %lld поиска" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Выполнено поисков: %lld" } }, "th": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "ค้นหาแล้ว %lld ครั้ง" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "ค้นหาแล้ว %lld ครั้ง" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "ค้นหาแล้ว %lld ครั้ง" } }, "tr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld arama yapıldı" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld arama yapıldı" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld arama yapıldı" } }, "uk": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Виконано %lld пошук" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Виконано %lld пошуки" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Виконано %lld пошуків" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Виконано %lld пошуку" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Виконано пошуків: %lld" } }, "vi": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Đã chạy %lld lượt tìm kiếm" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Đã chạy %lld lượt tìm kiếm" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Đã chạy %lld lượt tìm kiếm" } }, "zh-Hans": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "运行了 %lld 次搜索" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "运行了 %lld 次搜索" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "运行了 %lld 次搜索" } }, "zh-Hant": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "執行了 %lld 次搜尋" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "執行了 %lld 次搜尋" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "執行了 %lld 次搜尋" } } } @@ -5315,471 +3947,129 @@ "extractionState": "manual", "localizations": { "en": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "translated", - "value": "%lld step" - } - }, - "other": { - "stringUnit": { - "state": "translated", - "value": "%lld steps" - } - } - } + "stringUnit": { + "state": "translated", + "value": "%lld steps" } }, "ar": { - "variations": { - "plural": { - "zero": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوة" - } - }, - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوة" - } - }, - "two": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوتان" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوات" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوة" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوة" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld خطوات" } }, "bs": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld korak" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "%lld koraka" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld koraka" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld koraka" } }, "da": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld trin" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld trin" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld trin" } }, "de": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Schritt" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld Schritte" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld Schritte" } }, "es": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld paso" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de pasos" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld pasos" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld pasos" } }, "fr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld étape" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld d’étapes" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld étapes" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld étapes" } }, "it": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld passaggio" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld passaggi" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld passaggi" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld passaggi" } }, "ja": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 個のステップ" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 個のステップ" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld 個のステップ" } }, "km": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld ជំហាន" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld ជំហាន" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld ជំហាន" } }, "ko": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld단계" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld단계" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld단계" } }, "nb": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld trinn" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld trinn" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld trinn" } }, "pl": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld krok" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "%lld kroki" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld kroków" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld kroku" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Kroki: %lld" } }, "pt-BR": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld etapa" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de etapas" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld etapas" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld etapas" } }, "ru": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld шаг" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "%lld шага" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld шагов" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld шага" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Шагов: %lld" } }, "th": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld ขั้นตอน" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld ขั้นตอน" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld ขั้นตอน" } }, "tr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld adım" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld adım" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld adım" } }, "uk": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld крок" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "%lld кроки" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld кроків" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld кроку" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Кроків: %lld" } }, "vi": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld bước" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld bước" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld bước" } }, "zh-Hans": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 个步骤" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 个步骤" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld 个步骤" } }, "zh-Hant": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 個步驟" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld 個步驟" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld 個步驟" } } } @@ -5789,471 +4079,129 @@ "extractionState": "manual", "localizations": { "en": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "translated", - "value": "%lld more step" - } - }, - "other": { - "stringUnit": { - "state": "translated", - "value": "%lld more steps" - } - } - } + "stringUnit": { + "state": "translated", + "value": "%lld more steps" } }, "ar": { - "variations": { - "plural": { - "zero": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوة أخرى" - } - }, - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوة أخرى" - } - }, - "two": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوتان أخريان" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوات أخرى" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوة أخرى" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld خطوة أخرى" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld خطوات أخرى" } }, "bs": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "još %lld korak" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "još %lld koraka" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "još %lld koraka" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "još %lld koraka" } }, "da": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld trin mere" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld trin mere" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld trin mere" } }, "de": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld weiterer Schritt" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld weitere Schritte" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld weitere Schritte" } }, "es": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld paso más" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld de pasos más" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld pasos más" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld pasos más" } }, "fr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld étape de plus" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "%lld d’étapes de plus" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld étapes de plus" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld étapes de plus" } }, "it": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "altro %lld passaggio" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "altri %lld passaggi" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "altri %lld passaggi" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "altri %lld passaggi" } }, "ja": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "他 %lld 個のステップ" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "他 %lld 個のステップ" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "他 %lld 個のステップ" } }, "km": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld ជំហានទៀត" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld ជំហានទៀត" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld ជំហានទៀត" } }, "ko": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld단계 더" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld단계 더" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld단계 더" } }, "nb": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld trinn til" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld trinn til" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld trinn til" } }, "pl": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Jeszcze %lld krok" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Jeszcze %lld kroki" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Jeszcze %lld kroków" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Jeszcze %lld kroku" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Więcej kroków: %lld" } }, "pt-BR": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "mais %lld etapa" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "mais %lld de etapas" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "mais %lld etapas" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "mais %lld etapas" } }, "ru": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Ещё %lld шаг" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Ещё %lld шага" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Ещё %lld шагов" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Ещё %lld шага" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Ещё шагов: %lld" } }, "th": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "อีก %lld ขั้นตอน" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "อีก %lld ขั้นตอน" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "อีก %lld ขั้นตอน" } }, "tr": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "%lld adım daha" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "%lld adım daha" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "%lld adım daha" } }, "uk": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "Ще %lld крок" - } - }, - "few": { - "stringUnit": { - "state": "needs_review", - "value": "Ще %lld кроки" - } - }, - "many": { - "stringUnit": { - "state": "needs_review", - "value": "Ще %lld кроків" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "Ще %lld кроку" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "Ще кроків: %lld" } }, "vi": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "thêm %lld bước" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "thêm %lld bước" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "thêm %lld bước" } }, "zh-Hans": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "另外 %lld 个步骤" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "另外 %lld 个步骤" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "另外 %lld 个步骤" } }, "zh-Hant": { - "variations": { - "plural": { - "one": { - "stringUnit": { - "state": "needs_review", - "value": "另外 %lld 個步驟" - } - }, - "other": { - "stringUnit": { - "state": "needs_review", - "value": "另外 %lld 個步驟" - } - } - } + "stringUnit": { + "state": "needs_review", + "value": "另外 %lld 個步驟" } } } diff --git a/Packages/Shared/CmuxMessagesLab/Tests/MessagesLabHomeTests/HomeTurnProgressTests.swift b/Packages/Shared/CmuxMessagesLab/Tests/MessagesLabHomeTests/HomeTurnProgressTests.swift index 08f724b87179..382f953c2cb4 100644 --- a/Packages/Shared/CmuxMessagesLab/Tests/MessagesLabHomeTests/HomeTurnProgressTests.swift +++ b/Packages/Shared/CmuxMessagesLab/Tests/MessagesLabHomeTests/HomeTurnProgressTests.swift @@ -17,11 +17,10 @@ import Testing return steps } - /// The indicator for `lines` with the raw `thought`, headlined the way the live book publishes it. static func progress(_ lines: [String], thought: String? = nil, style: HomeTurnProgressStyle = .narrated) -> HomeTurnProgress { let steps = steps(lines) let current = HomeLiveActivity(line: lines.last ?? "Thinking", since: t0.addingTimeInterval(Double(lines.count - 1) * 10)) - return HomeTurnProgress(steps: steps.steps, current: current, thought: thought.flatMap(HomeThoughtHeadline.of), + return HomeTurnProgress(steps: steps.steps, current: current, thought: thought, now: current.since.addingTimeInterval(5), style: style) } @@ -71,14 +70,6 @@ import Testing #expect(line.rows == ["Checking on a31 · 5s"]) } - @Test func thePublishedHeadlineShowsAsItIs() { - // A heading with a sentence end inside it stays whole: the indicator does not headline it again. - let progress = Self.progress(["Telling a31", "Checking on a31"], thought: "**Checking a31. Then a7**") - #expect(progress.narration == "Checking a31. Then a7") - let done = Self.progress(["Telling a31", "Checking on a31"], thought: "**Done!**") - #expect(done.narration == "Done!") - } - @Test func whileThinkingTheThoughtIsTheStepNow() { let progress = Self.progress(["Telling a31", "Thinking"], thought: "Let me look. I should check whether a31 finished") #expect(progress.rows == ["Telling a31 ›", "I should check whether a31 finished · 5s"]) @@ -109,7 +100,7 @@ import Testing line.dispatch = { shown.append($0) } let activity = HomeLiveActivity(line: "Checking on a31", since: Self.t0) line.show(activity) - line.show(activity, thought: "Waiting for the tests") + line.show(activity, thought: "**Waiting for the tests**") #expect(shown.last == "Waiting for the tests\nChecking on a31") line.stop() } @@ -125,13 +116,12 @@ import Testing activity: HomeLiveActivity(line: "Checking on a31", since: Date()))))) rig.store.handle(.live(.delta(HomeLiveDelta(conversation: conversation, author: rig.chief, run: "r1", step: "thought:0", isTalk: false, seq: 0, text: "**Waiting for a31**", isFinal: false)))) - // The store publishes the thought's headline, not its whole text. - #expect(rig.store.liveRun(in: conversation)?.thought == "Waiting for a31") + #expect(rig.store.liveRun(in: conversation)?.thought == "**Waiting for a31**") // Its last frame ends the step; the thought stays the run's narration until the next one. rig.store.handle(.live(.delta(HomeLiveDelta(conversation: conversation, author: rig.chief, run: "r1", step: "thought:0", - isTalk: false, seq: 1, text: "\n\n**Reading its test log**", isFinal: true)))) - #expect(rig.store.liveRun(in: conversation)?.thought == "Reading its test log") + isTalk: false, seq: 1, text: "\n\nIt runs its tests.", isFinal: true)))) + #expect(rig.store.liveRun(in: conversation)?.thought == "**Waiting for a31**\n\nIt runs its tests.") rig.frame() - #expect(rig.view.debugStatusLine?.components(separatedBy: "\n").first == "Reading its test log") + #expect(rig.view.debugStatusLine?.components(separatedBy: "\n").first == "Waiting for a31") } } diff --git a/scripts/localization-plurals.json b/scripts/localization-plurals.json index cb6519ede8cc..1b51c52126a3 100644 --- a/scripts/localization-plurals.json +++ b/scripts/localization-plurals.json @@ -621,41 +621,5 @@ "arguments": [ 1 ] - }, - "home.turn.ranCommands": { - "source": "Ran %lld commands", - "arguments": [ - 1 - ] - }, - "home.turn.readFiles": { - "source": "Read %lld files", - "arguments": [ - 1 - ] - }, - "home.turn.editedFiles": { - "source": "Edited %lld files", - "arguments": [ - 1 - ] - }, - "home.turn.ranSearches": { - "source": "Ran %lld searches", - "arguments": [ - 1 - ] - }, - "home.turn.steps": { - "source": "%lld steps", - "arguments": [ - 1 - ] - }, - "home.turn.moreSteps": { - "source": "%lld more steps", - "arguments": [ - 1 - ] } }