Использование функции согласования грамматики iOS 15 для английских строк

Новое в iOS 15 - функция согласования грамматики для английского и испанского языков. Например, я могу сказать

      You have x apple.

И если 1, то «яблоко» есть «яблоко», но если x больше 1, то «яблоко» волшебным образом становится «яблоком».

Это звучит как отличный способ избавиться от всего этого кода, когда я сам смотрю на число и выбираю между жестко запрограммированными параметрами единственного и множественного числа.

Однако мне кажется, что эта функция применима только для локализованных приложений и только для строк с атрибутами в UIKit. (SwiftUI отличается, потому что строки локализуются автоматически.) Как мне сделать это для обычной строки, обращенной к пользователю?

1 ответ

Вы должны использовать локализованную строку с атрибутами, чтобы получить эту функцию. Но это не значит, что указанная вами строка должна быть локализована или атрибутирована!

Вот пример. В какой-то момент мы могли бы сказать следующее:

      let count = 1
let output = String(AttributedString(
    localized:"You have ^[\(count) \("apple")](inflect: true).").characters)
print(output) // You have 1 apple.

А теперь представьте, что в какой-то другой момент мы говорим это:

      let count = 2
let output = String(AttributedString(
    localized:"You have ^[\(count) \("apple")](inflect: true).").characters)
print(output) // You have 2 apples.

Обратите внимание, что моя атрибутированная строка одинакова в обоих. И все же, исходя из значение, среда выполнения изменила «яблоко» на «яблоки» там, где это необходимо. Это как раз то, что мы хотели.

Итак, насколько я могу судить, вот в чем дело.

  • Вы должны использовать атрибутивную строку, и она должна быть объявлена ​​как локализованная (в UIKit).

  • Как только вы это сделаете, вам будет разрешено использовать Markdown. Вы действительно используете Markdown, используя специальный синтаксис настраиваемых атрибутов, разработанный Apple. Таким образом, область перегиба строки становится видимой для среды выполнения.

  • Все относящееся к делу должно быть включено в раздел квадратных скобок и должно быть отмечено с помощью строковой интерполяции, как я показал здесь. В данном случае «все, что имеет значение» - это счетное число и существительное. Используйте единственное число для существительного; если вы используете множественное число, оно не будет склоняться до единственного числа, но если вы используете единственное число, оно будет склоняться до множественного числа.

  • Сама строка должна быть литералом , чтобы получить специальные правила интерполяции; Я не мог, например, определить строку как константу а потом скажи .

Это дает вам автоматический перегиб. Затем, в этом случае, поскольку мне просто нужна строка, я прохожу через просмотр атрибутированной строки и принуждение ее к строке.

Обратите внимание, что мое приложение не локализовано в каком-либо значимом смысле. У меня нет никаких других языков , объявленных для приложения, и у меня нет .strings файлов или .stringsDict файлов. Я только прохожу через конструктор, потому что именно так вы получаете доступ к этой функции.

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