Другой шрифт для параметров в NSLocalizedString

Я хочу дать ярлыку текст, в котором есть несколько шрифтов. Этого можно добиться, создав файл NSMutableAttributedString. Однако я не уверен, как форматировать следующий случай:

String(format: NSLocalizedString("%@ has replied in '%@'", comment: ""), username, conversationTitle)

Я хочу выделить имя пользователя и заголовок беседы отдельным шрифтом. Я хочу сделать это менее глючным способом. Что я имею в виду под этим:

  • Я не хочу узнавать username позже в строке, используя подстроку. Это вызывает проблемы, когда conversationTitle совпадает с username, или conversationTitle находится в username и т. д. и т. д.
  • Я не хочу создавать строку, как показано здесь: https://stackoverflow.com/a/37992022/7715250. Это просто плохо при создании NSLocalizedString's, я думаю, что переводчикам будет плохо, когда строка будет создана таким образом.

Такие вопросы, как: выделение текста полужирным шрифтом с использованием строки с атрибутами в swift, Существуют ли подходы для использования строк с атрибутами в сочетании с локализация? и другие в основном являются строковыми литералами без NSLocalizedString или NSLocalizedString с параметрами.


person J. Doe    schedule 27.01.2019    source источник
comment
Я воспользуюсь примером жирного шрифта, потому что его проще объяснить. Используйте теги, такие как html: <b> или другие (markdown, custom и т. д.). Я также предлагаю не иметь %@ has replied in '%@' в качестве ключа, а вместо этого: REPLIED_IN = <b>%1$@<b> has replied in <b>%2$@</b>;, потому что в английском это может быть в этом порядке, но не обязательно в других языках. Затем вы используете NSAttributedString для чтения и анализа этой строки с тегами.   -  person Larme    schedule 27.01.2019


Ответы (1)


Во-первых, в ваших .strings должен быть гораздо более общий и удобочитаемый ключ, например:

"_REPLIED_IN_" = "%@ has replied in %@";

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

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

Итак, вместо этого:

"_REPLIED_IN_" = "%1$@ has replied in %$2@";

Теперь я буду использовать образец, выделенный жирным шрифтом, потому что он проще, но вы можете использовать некоторые пользовательские теги, чтобы сказать вам, что он должен быть выделен жирным шрифтом, например HTML, MarkDown и т. д.

В HTML:

"_REPLIED_IN_" = "<b>%1$@</b> has replied in <b>%$2@</b>";

Вам нужно разобрать его на NSAttributedString:

let translation = String(format: NSLocalizedString(format: "_REPLIED_IN_", comment: nil), userName, conversationTitle)
let attributedText = NSAttributedString.someMethodThatParseYourTags(translation)

Вы можете выбрать самый простой формат тега) в соответствии с вашими потребностями: простой для понимания переводчиками и простой для анализа (в CocoaTouch уже есть анализатор HTML и т. д.).

person Larme    schedule 27.01.2019
comment
Хотя это и не связано с фактическим вопросом ОП, многие люди, вероятно, не согласятся с вашим вступительным заявлением о ключе. Собственная документация Apple показывает обычное использование NSLocalizedString с ключом в качестве фактической строки на основном языке приложения. Это значительно упрощает чтение кода. В вашем примере код имеет только ключ, поэтому любой, кто читает код, понятия не имеет, что это за строка. Что еще более важно, использование genstrings в вашем предложенном коде приводит к тому, что файл строк имеет ""_REPLIED_IN_" = ""_REPLIED_IN_";. Это делает невозможным предоставление надлежащих переводов. - person rmaddy; 27.01.2019
comment
Я добавлю, что дать правильное имя с контекстом - хорошее применение, но мне не хватало контекста. Насколько я помню, однажды у меня возникла проблема с приложением Apple, и оно не было переведено: AppName.Screen.Something.Else. Я не использую genstrings, поэтому не знаю об этом. - person Larme; 27.01.2019