- PVSM.RU - https://www.pvsm.ru -
При поиске в google по запросам Core Data [1] или Autolayout [2], первый результат поиска содержит обновляемую информацию в «новом формате документации». Потратив определенный объем времени, читая и следуя инструкциям, достаточно не сложно ознакомиться с основными инструментами предоставляемыми той или иной технологией(особенно если чтение на английским не является для вас серьезным препятствием).
Аналогичную информацию [3] можно найти и по локализации продукта. Но в отличии от примеров указанных выше она:
A первой в выдаче мы видим страницу [4], которая в большей мере выглядит, как инструмент продажи локализации разработчикам и менеджерам, когда основной интерес представляют разрозненные ссылки в разделах WWDC Session Videos и Documentation and Sample Code.
В данной статье, я попытаюсь коротко упомянуть все инструменты, которые помогут вам в этом, как выяснилось для меня, нелегком деле. Каждый пункт я попытаюсь снабдить несколькими ссылками, пройдя по которым вы сможете получить более исчерпывающую информацию. Хватит вступительных слов, к делу.
их список [5]
Начиная разрабатывать, я не знал о их существовании, но относительно недавно я услышал о них в лекции на WWDC [6].
При желании самим создавать строковые представления данных стоит зайти в.
System Preferences/Language & Region/Advanced и посмотреть все предоставляемые настройки.
Просмотр данных настроек, напрочь у меня отбил желание писать велосипеды, теперь я всегда в первую очередь ищу подходящий форматер, и за последний год не было случая, чтобы я не смог найти нужный мне.
Как по мне, список стилей в NumberFormatter [7], очень ярко показывает, широкий список возможностей, которые будут работать «из коробки», без дополнительных затрат со стороны разработчика приложения.
Пример:
let dateComponents = DateComponents(hour: 3, minute: 2, second: 10)
let dateComponentsForatter = DateComponentsFormatter()
dateComponentsForatter.unitsStyle = .short
Swift.print("(dateComponentsForatter.string(from: dateComponents)!)")
dateComponentsForatter.unitsStyle = .full
Swift.print("(dateComponentsForatter.string(from: dateComponents)!)")
dateComponentsForatter.unitsStyle = .spellOut
Swift.print("(dateComponentsForatter.string(from: dateComponents)!)")
/*
Output for English:
3 hrs, 2 min, 10 secs
3 hours, 2 minutes, 10 seconds
three hours, two minutes, ten seconds
Output for Russian:
3 ч, 2 мин, 10 с
3 часа, 2 минуты, 10 секунд
три часа, два минуты, десять секунд
*/
У форматтеров есть большое разнообразие настроек и стилей, рассматривать их тут все, как по мне будет излишним, но я уверен, что пройдясь по данным в этой части ссылкам вы явно найдете для себя что-то стоящее, если ранее их не активно использовали.
Не задавайте явно dateFormat [8] у DateFormatter [9] используйте setLocalizedDateFormatFromTemplate [10]. (WWDC [11])
Я добавлю скрины, и думаю, что слова тут будут излишни. Единственное, что хочется отметить, это то, что язык можно добавлять только в проект, а не в один из таргетов.
В появившемся модальном окне оставьте галочки только рядом с теми файлами, которые планируете локализировать.
В реальном приложении у вас будет много файлов локализации. «xib», «strings», «stringsdict», «plist»(кол-во которых ограничивает лишь ваша фантазия.)… собирать их все в один архив, после отправлять переводчикам, а после перевода, распихивать по проекту это то еще удовольствие.
Осознавая это Apple предоставила нам весьма удобный инструмент для работы с локализацией строковых ресурсов: Импорт/Экспорт xliff файлов (рассказ на WWDC [12]).
Для использования этой функциональности, выберите ваш проект как показано на скрине
Далее зайдите в пункт меню Editor, Export For Localization, выберите список языков на локализацию, сохраните в желаемое место на диске.
Вуаля! вы только что вынесли все строковые ресурсы вашего проекта в одну папочку, которую можно смело отправлять на перевод.
После модификации данных файлом переводчиком вы сможете экспортировать их в пару кликов используя пункт меню Editor/Import Localizations.
Вот пример работы с xliff [13] от хабражителя. Не совсем согласен с минусами указанными им, да и много чего поменялось с выходом XCode 10, но это весьма подробный пример, следуя которому можно достаточно быстро понять всю технику работы с xliff.
Для этого выберете файл в дереве проекта, после чего в панели утилит выберете первую вкладку.
Нажмите на кнопку «Localize...».
В появившемся окне, выберите требуемый язык, нажмите на «Localize».
В дереве проекта появились файлы локализации.
А в правой панели, расставляя галочки, вы можете удалять/добавлять файлы локализации.
Нажимаем на таргет правее от кнопок «Build and Run» & «Stop».
Выбираем «Edit Scheme». В появившемся окне выбираем «Run» в левом вертикальном списке и «Options» в шапке правой части окна.
В появившемся окне выбираем желаемый язык. Закрываем окно «Edit Scheme»
Следующий запуск программы уже будет с выбранным вами языком.
Следует отдельно обратить внимание на то, что внизу выпадающего списка, на последнем скриншоте, есть 2 пункта (псевдоязыка):
Они могут помочь вам в тестировании.
Что тут сказать. Если вы по каким-то причинам все еще используете явное задание координат, вам придется тяжко. Все что я могу сказать: «Постарайтесь свести явное задание координат к минимуму. Autolayout [2] ваш лучший помощник в этом вопросе».
На чем бы я сакцентировал внимание:
При формировании сроки используя скажем -[NSString stringWithFormat:] [21] мы можем в спецификаторе задавать номер аргумента [22], который следует вставить.
Swift.print("(String(format: "%@ %@", "s1", "s2"))")
Swift.print("(String(format: "%1$@ %2$@", "s1", "s2"))")
Swift.print("(String(format: "%2$@ %1$@", "s1", "s2"))")
Swift.print("(String(format: "%1$@ %1$@", "s1", "s2"))")
Swift.print("(String(format: "%1$@ %2$@ %3$@", "s1", "s2", "s3"))")
Swift.print("(String(format: "%1$@ %3$@", "s1", "s2", "s3"))")//(**)
/*
Output:
s1 s2
s1 s2
s2 s1
s1 s1
s1 s2 s3
s1 s2
*/
Следует помнить, что пропуск одного из аргументов может привести к непредвиденному поведению.
When numbered argument specifications are used, specifying the Nth argument requires that all the leading arguments, from the first to the (N-1)th, are specified in the format string.
источник [23]
WWDC [24]
Иногда приходится локализировать не только обычные строки, но атрибутные. Для этой цели можно использовать Atributika [25].
let b = Style("b").font(.boldSystemFont(ofSize: 20)).foregroundColor(.red)
label.attributedText = "Hello <b>World</b>!!!".style(tags: b).attributedString
Заходим в настройки проекта, выставляем флаг «Missing Localizability» в YES.
В меню XCode выбираем «Product/Analyze». Видим, что появился warning аналайзера.
Нажав на него видим причину.
Подправив код
self.label.stringValue = NSLocalizedString(@"Test Label", @"");
Перезапускаем аналайзер и варнинг пропал.
В первую очередь хочу сказать, что остается еще много чего о чем стоит рассказать(как минимум заметки из предыдущего раздела). Так что если статья зайдет, то я постараюсь выделить время и написать продолжение разобрав некоторые части более подробно, и описать фичи вовсе не затронутые мной.(я долго пытался написать исчерпывающую статью, но понял, что это потребует приблизительно вечность.)
Отдельно прошу прощение за упущенные знаки препинания и прочие недочеты…
Буду рад любым вашим отзывам :)
Автор: Возле ректора
Источник [26]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/xcode/301267
Ссылки в тексте:
[1] Core Data: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/index.html
[2] Autolayout: https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html
[3] Аналогичную информацию: https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/Introduction/Introduction.html#//apple_ref/doc/uid/10000171i-CH1-SW1
[4] страницу: https://developer.apple.com/internationalization/
[5] их список: https://developer.apple.com/documentation/foundation/data_formatting
[6] лекции на WWDC: https://developer.apple.com/videos/play/wwdc2014/201/?time=336
[7] список стилей в NumberFormatter: https://developer.apple.com/documentation/foundation/numberformatter/style
[8] dateFormat: https://developer.apple.com/documentation/foundation/dateformatter/1413514-dateformat
[9] DateFormatter: https://developer.apple.com/documentation/foundation/dateformatter
[10] setLocalizedDateFormatFromTemplate: https://developer.apple.com/documentation/foundation/dateformatter/1417087-setlocalizeddateformatfromtempla
[11] WWDC: https://developer.apple.com/videos/play/wwdc2016/201/?time=750
[12] рассказ на WWDC: https://developer.apple.com/videos/play/wwdc2018/404/?time=98
[13] пример работы с xliff: https://habr.com/company/redmadrobot/blog/302682/
[14] content hugging and content compression resistance priorities: https://medium.com/@abhimuralidharan/ios-content-hugging-and-content-compression-resistance-priorities-476fb5828ef
[15] NSLayoutConstraint: https://developer.apple.com/documentation/uikit/nslayoutconstraint
[16] NSLineBreakMode: https://developer.apple.com/documentation/uikit/nslinebreakmode?language=objc
[17] right-to-left: https://en.wikipedia.org/wiki/Right-to-left
[18] leading: https://developer.apple.com/documentation/uikit/nslayoutconstraint/attribute/leading
[19] left: https://developer.apple.com/documentation/uikit/nslayoutconstraint/attribute/left
[20] WWDC about right-to-left languages: https://developer.apple.com/videos/play/wwdc2016/232/
[21] -[NSString stringWithFormat:]: https://developer.apple.com/documentation/foundation/nsstring/1497275-stringwithformat
[22] задавать номер аргумента: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html
[23] источник: http://pubs.opengroup.org/onlinepubs/009695399/functions/printf.html
[24] WWDC: https://developer.apple.com/videos/play/wwdc2015/227/?time=560
[25] Atributika: https://cocoapods.org/pods/Atributika
[26] Источник: http://habrahabr.ru/sandbox/125334/
Нажмите здесь для печати.