У меня есть следующий код:
Text("key.\(item.count) \(item.actionName)")
И, исходя из item.actionName, мне нужно предоставить разные переводы, чтобы правильно реализовать множественное число. item.count is of type Double (it have step of 0.5) и item.actionName имеет тип String.
Я думал, что используя разные ключи в каталоге, вот так:
"key.%f actionName1", "key.%f actionName2"
должно сработать. Кроме того, перевод будет просто «%f actionName» без части .key, которую я использовал для своего рода «пространства имен» среди других ключей.
Однако этот подход, похоже, не работает так, как ожидалось. Кажется, что Xcode интерпретирует (наверное?) строку из представления Text как:
"key.%f %@"
а не "key.%f actionName1". Как я могу реализовать это правильно?
А еще я знаю о подходе ^[\(item.count) actionName"](inflect: true). Однако, похоже, он работает в основном с английским языком, так что для меня это не вариант.
Я пытался использовать String(localized:), но, возможно, неправильно, поэтому...
Любые предложения будут ценны!
Да это верно. Существует несколько возможных значений item.actionName, которые могут поддерживаться. @Подметальная машина





Хак, который вы могли бы использовать, — это добавить новую перегрузку appendInterpolation, которая добавляет строку как литерал.
extension LocalizedStringKey.StringInterpolation {
mutating func appendInterpolation(literal: String) {
appendLiteral(literal)
}
}
Тогда вы можете сделать:
let actionName = "foo"
var body: some View {
Text("\(1.0, specifier: "%.1f") \(literal: actionName)")
Text("\(2.0, specifier: "%.1f") \(literal: actionName)")
}
Наконец, добавьте такие ключи в свой каталог строк.
Ключи локализации не будут автоматически генерироваться в каталоге строк при сборке проекта.
См. также: Выбор названий категорий во множественном числе
Да, это сработало... Для будущих читателей обратите внимание на спецификатор. %f и %.1f не одно и то же :) Я забыл изменить ключ в каталоге, поэтому сначала это не сработало из-за несоответствия спецификаторов.
Есть ли какой-нибудь способ обработать строку после выполнения локализации таким образом? Например, удалить часть и т. д.? На самом деле я пытаюсь удалить номер. Я пытался удалить это в переводе, и это вроде как работает, но мне нужно иметь count хотя бы в переводе по умолчанию.
@Whirlwind Нужно удалить его из перевода. Обычно не следует манипулировать строкой после ее локализации, поскольку переведенная строка, как правило, не читается машиной, а читается человеком. Если вы действительно хотите это сделать, используйте String(localized:) и поставьте LocalizedStringResource.
@Whirlwind И вам понадобится перегрузка appendInterpolation, аналогичная той, что в моем ответе, но для String.LocalizationValue.StringInterpolation.
Я думал, что можно изменить его при переводе, но это не сработает, если вы удалите %.1f из перевода по умолчанию (и всех остальных). Хорошо, я попробую другую часть того, что вы предложили!
@Whirlwind О, я понимаю, что ты имеешь в виду. Я не уверен, почему каталог строк не может этого сделать, поскольку старый stringdict определенно может. И, вручную отредактировав файл .xcstrings аналогичным образом с помощью текстового редактора, мне удалось заставить его работать как stringdict. Однако в Xcode это почему-то невозможно сделать.
@Whirlwind Я думаю, вы можете опубликовать версию каталога строк как локализовать множественное число без числа в переведенной строке (если вы не возражаете), и я постараюсь написать ответ завтра, описывая " «прямое редактирование файла .xcstrings» и альтернативный, но довольно запутанный способ сделать это в Xcode.
Хорошо спасибо! Я думал задать отдельный вопрос. Мне просто не удается сделать это с каталогом строк, и это довольно распространенный вариант использования (когда число на самом деле не требуется).
Таким образом,
item.actionNameможет бытьactionName1илиactionName2, и вы хотите, чтобы для каждого из них использовался правильный ключ локализации. Это правильно?