Как правильно создать строковый ключ локализации с переменными внутри него

У меня есть следующий код:

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 может быть actionName1 или actionName2, и вы хотите, чтобы для каждого из них использовался правильный ключ локализации. Это правильно?

Sweeper 13.06.2024 04:17

Да это верно. Существует несколько возможных значений item.actionName, которые могут поддерживаться. @Подметальная машина

Whirlwind 13.06.2024 04:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хак, который вы могли бы использовать, — это добавить новую перегрузку 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 не одно и то же :) Я забыл изменить ключ в каталоге, поэтому сначала это не сработало из-за несоответствия спецификаторов.

Whirlwind 13.06.2024 05:44

Есть ли какой-нибудь способ обработать строку после выполнения локализации таким образом? Например, удалить часть и т. д.? На самом деле я пытаюсь удалить номер. Я пытался удалить это в переводе, и это вроде как работает, но мне нужно иметь count хотя бы в переводе по умолчанию.

Whirlwind 14.06.2024 14:04

@Whirlwind Нужно удалить его из перевода. Обычно не следует манипулировать строкой после ее локализации, поскольку переведенная строка, как правило, не читается машиной, а читается человеком. Если вы действительно хотите это сделать, используйте String(localized:) и поставьте LocalizedStringResource.

Sweeper 14.06.2024 14:45

@Whirlwind И вам понадобится перегрузка appendInterpolation, аналогичная той, что в моем ответе, но для String.LocalizationValue.StringInterpolation.

Sweeper 14.06.2024 14:47

Я думал, что можно изменить его при переводе, но это не сработает, если вы удалите %.1f из перевода по умолчанию (и всех остальных). Хорошо, я попробую другую часть того, что вы предложили!

Whirlwind 14.06.2024 15:02

@Whirlwind О, я понимаю, что ты имеешь в виду. Я не уверен, почему каталог строк не может этого сделать, поскольку старый stringdict определенно может. И, вручную отредактировав файл .xcstrings аналогичным образом с помощью текстового редактора, мне удалось заставить его работать как stringdict. Однако в Xcode это почему-то невозможно сделать.

Sweeper 14.06.2024 15:19

@Whirlwind Я думаю, вы можете опубликовать версию каталога строк как локализовать множественное число без числа в переведенной строке (если вы не возражаете), и я постараюсь написать ответ завтра, описывая " «прямое редактирование файла .xcstrings» и альтернативный, но довольно запутанный способ сделать это в Xcode.

Sweeper 14.06.2024 15:38

Хорошо спасибо! Я думал задать отдельный вопрос. Мне просто не удается сделать это с каталогом строк, и это довольно распространенный вариант использования (когда число на самом деле не требуется).

Whirlwind 14.06.2024 16:30

Другие вопросы по теме