Интернационализация Вашего кода

В дополнение к интернационализации Вашего пользовательского интерфейса запишите код, обрабатывающий текст на нескольких языках. Сначала сохраните международный текст в строковых файлах, подобных строковым файлам, используемым основной интернационализацией в Интернационализации Пользовательского интерфейса. Также используйте язык и чувствительный к локали APIs для перечисления, поиска и сортировки текста в Вашем коде. Используйте стандартные текстовые представления для отображения и парсинга ввода текста также. Позвольте этому APIs обработать сложность различной записи и ввести системы для Вас.

Разделение бывшего обращенным к пользователю текста от кода

Весь бывший обращенным к пользователю текст, предоставленный Вашим приложением программно, должен быть локализован — т.е. бывший обращенным к пользователю текст, не содержащийся в .storyboard или .xib файлы, такие как сообщения об ошибках, должны быть переведены на текущий язык, прежде чем он будет представлен пользователю. iOS и OS X обеспечивают механизм для получения локализованного текста от строковых файлов во время выполнения. В Вашем коде, строки замены, содержащие бывший обращенным к пользователю текст с возвращаемым значением NSLocalizedString макрос. При экспорте локализаций XCode ищет код макросы и включает строковые файлы в экспортируемый файл локализации для перевода. При импорте локализаций XCode добавляет строковые файлы, используемые кодом, к проекту XCode.

Например, вместо того, чтобы использовать @"26.22 miles" представьте в виде строки в своем коде, используйте:

NSLocalizedString(@"RunningDistance", @"distance for a marathon")

где @"RunningDistance" ключ для текста, полученного от файла локализованных строк. @"distance for a marathon" параметр является комментарием о паре ключ/значение, сохраненной в строковом файле как подсказка к localizers. Если Вы хотите различное поведение, используйте один из другого NSLocalizedString макросы, которые берут больше параметров, описанных в Ссылке Функций Основы.

Вы не должны хранить все свои пары ключ/значение в тех же строковых файлах. Можно использовать другой NSLocalizedString макросы для создания отдельных строковых файлов и дополнительно сохраните их в различных пакетах. Для получения дополнительной информации о NSLocalizedString макросы, считайте Строковые ресурсы в Руководстве по программированию Ресурса.

Получать локализованную строку от строкового файла, вместо того, чтобы добавлять его к строковому файлу, использование localizedStringForKey:value:table: метод в NSBundle класс. Когда строковый файл, соответствующий указанной таблице, не находится в Вашем проекте, NSLocalizedString макросы и localizedStringForKey:value:table: возврат метода параметр, передаваемый по значению как локализованная строка.

Позже при импорте локализаций, как описано в Импорте Локализаций, файлы локализованных строк добавляются к проекту. (Также можно генерировать строковые файлы языка разработки от NSLocalizedString макросы непосредственно, как описано в Создании Строковых Файлов для Бывшего обращенным к пользователю текста в Вашем Коде.)

Если Ваши строки содержат множественные числа существительных или единиц измерения, считайте Множественные числа Существительного Обработки и Единицы измерения для того, как расширить этот механизм для языков, имеющих различные множественные правила.

Используя строки Unicode

Для всего бывшего обращенным к пользователю текста используйте строковые объекты — экземпляры NSString, NSAttributedString, и их подклассы — тот Unicode поддержки. Unicode является стандартом для кодирования символов от всех систем письменности в мире. Строковые объекты инкапсулируют строку Unicode, закодированную в формате UTF-16. Что видит пользователь, поскольку символ может быть представлен и закодирован как многократные символы в строке Unicode. Поэтому используйте строковые методы, управляющие составленными последовательностями символов, не отдельными символами в строке. Используйте надлежащую строку APIs для итерации, поиска и сортировки также. Используйте стандартные представления и средства управления, выводящие на экран строковые объекты Unicode правильно.

Для подробной документации относительно строковых объектов считайте Строковое Руководство по программированию.

Доступ к символам в строках

NSString класс обрабатывает сложность кодировки символов для Вас путем разрешения Вам кластерам символа доступа или диапазонам. Используйте rangeOfComposedCharacterSequenceAtIndex: и rangeOfComposedCharacterSequencesForRange: методы, чтобы гарантировать, чтобы Вы не разделили пользовательские символы в строке и повредили текст. Эти методы возвращают диапазон в строке, представляющей пользовательский символ.

Например, Таблица 3-1 показывает числовое представление пользовательских символов в кодировании UTF-32 и UTF-16. Обратите внимание на то, что пользовательские символы имеют различные длины независимо от того, какой формат кодирования Вы используете.

Табличное 3-1  кодирование Unicode пользовательских символов

Пользовательский символ

UTF-16

UTF-32

../Art/chinese_string_table.svg

D85E DFFD

27BFD

../Art/korean_string_table.svg

1100 1161 11A8

01100 01 161 011A8

Перечисление строк

Перечислите строки составленной последовательностью символов, словом, предложением, или абзацем, не отдельными символами в строке. Для перечисления строки составленной последовательностью символов используйте enumerateSubstringsInRange:options:usingBlock: метод и передача NSStringEnumerationByComposedCharacterSequences как параметр опций. Перечислить строку словом (перескакивающий через пунктуацию), передача NSStringEnumerationByWords как параметр опций.

Например, если Вы передаете NSStringEnumerationByComposedCharacterSequences к enumerateSubstringsInRange:options:usingBlock: метод, это возвращает пользовательские символы, как в составленных последовательностях символов:

  • ../Art/chinese_string_table.svg

  • ../Art/korean_string_table.svg

Если строка

  • ../Art/enumerating_strings.svg

и Вы передаете NSStringEnumerationByWords как параметр опций, возвращаются следующие слова:

  • ../Art/enumerating_word_1.svg

  • ../Art/enumerating_word_2.svg

  • ../Art/enumerating_word_3.svg

  • ../Art/enumerating_word_4.svg

Заметьте, что пробелы и пунктуация не включены в слова.

Поиск строк

Чтобы искать содержание строки или проверить присутствие строки в строке с помощью чувствительных к локали алгоритмов сравнения, используйте rangeOfString:options:range:locale: метод, передавая текущую локаль как параметр локали. Константы можно объединить и передать как параметр опций:

NSCaseInsensitiveSearch

Поиск без учета регистра. Например, ‘B’ совпадает с ‘b’.

NSDiacriticInsensitiveSearch

Игнорирует диакритические знаки. Например, ‘ö’ равно ‘o’.

NSBackwardsSearch

Ищите назад. (Значение по умолчанию является форвардами.)

NSAnchoredSearch

Поиск в начальной точке.

Например, если Вы ищете пользовательский текст в строке, передаете NSCaseInsensitiveSearch и NSDiacriticInsensitiveSearch константы как параметр опций к rangeOfString:options:range:locale: метод. Как правило, поиск текста является случаем и диакритической нечувствительной работой, но текст сортировки является случаем и чувствительным диакритическим знаком.

Сортировка строк

Для текста Вы выводите на экран пользователям, используете чувствительный к локали APIs для сортировки и сравнения строк. Различные языки и области имеют различные стандарты порядка сортировки. Например, на французском языке диакритические знаки являются значительными, и на английском языке они не. На некоторых языках многократные буквы объединены и влияют на порядок сортировки.

Для использования чувствительных к локали алгоритмов сравнения используйте localizedStandardCompare: метод, приводящий к тем же результатам как Средство поиска.

Если Вы не хотите те же результаты как Средство поиска, используйте compare:options:range:locale: метод, передавая текущую локаль как параметр локали, или localizedCompare: метод.

Не используйте localizedCaseInsensitiveCompare: метод для сортировки.

Отображение текста

Используйте стандартные представления и средства управления, обрабатывающие сложность текстового расположения Unicode и дисплея для Вас. Символы в строке непосредственно не соответствуют тексту, представленному на экране. То, что появляется на экране, является последовательностью глифов. Глиф является самым маленьким визуализуемым модулем в шрифте. Глиф может представлять один символ, больше чем один символ или часть символа. Отображение символов к глифам не просто — это может быть many-many. Кроме того, порядок и позиция глифов в строке сложны. Стандартные представления и средства управления даже размечают двунаправленный текст должным образом для Вас — например, порядок символов в строке, содержащей английское слово, сопровождаемое еврейским словом, не является тем же порядком, используемым для разметки текста в представлении, как описано в Обработке Двунаправленного текста.

Если необходимо записать пользовательский код дисплея, используйте надлежащий низкоуровневый текст APIs. Для приобретения знаний о текстовых классах для iOS считайте текстовое Руководство по программированию для iOS и для Mac, считайте текстовое Руководство по программированию Расположения.

Парсинг ввода текста

Пользователь мог бы ввести текст на любом языке и формате. iOS и OS X могут распознать язык, который вводит пользователь, и обеспечьте надлежащие опции клавиатуры. Если Вы анализируете текст, поскольку пользователь вводит его, имейте в виду, что существует many-many, отображающийся от клавиатурных символов до символов языка.

Парсинг символов языка

Для некоторых языков пользователь не вводит текст один символ за один раз. Т.е. вводит, пользовательские нажатия на клавиатуре не обязательно соответствуют символам на языке. На французском языке пользователь добавляет диакритический знак в точке вставки путем выбора его из всплывающего меню. На японском и китайском языках пользователь вводит фонетические представления и выбирает кандидата из списка кандидатов для подтверждения отмеченного текста. В обоих случаях предварительный текст вставляется сначала и затем преобразовывается в окончательный текст, когда пользователь подтверждает его.

Определение, когда пользователь подтверждает отмеченный текст (только iOS)

Чтобы определить, подтвердил ли пользователь отмеченный текст, отправить markedTextRange к текстовому представлению. Если этот метод возвращает пустую строку, пользователь подтвердил некоторый введенный текст.

Определение типизированного языка (только iOS)

Для получения языка, который в настоящее время вводит пользователь используйте textInputMode свойство в UIResponder класс, как в:

NSString *languageID = [[[UIApplication sharedApplication] textInputMode] primaryLanguage];

Возвращаемая строка является языком ID, как описано на Языке и Локали IDs, идентифицирующий письменный язык или диалект.

Получить набор языков, которые включает пользователь:

NSArray *languages = [[[UIApplication sharedApplication] textInputMode] activeInputModes];

где возвращенный массив содержит экземпляры UITextInputMode класс.

Обнаруживая имена, почтовые адреса и телефонные номера

Во всем мире формат имен, почтовых адресов и телефонных номеров варьируется значительно. Имена имеют много различных форматов включая различное упорядочивание компонентов. Например, в азиатских странах, фамилия сопровождается именем без пробелов между. Формат почтовых адресов зависит от страны. Телефонные номера имеют различные суммы цифр и пунктуации между ними. Для обработки переменных форматов ввода в текстовых представлениях используйте Интерфейсного Разработчика для добавления детекторов данных к текстовым представлениям. Детектор данных идентифицирует адреса и телефонные номера во многих различных международных форматах и дополнительно превращает их в ссылки.

Для обнаружения этого типа данных в строках программно считайте Ссылку класса NSDataDetector.

Получение текущего языка

Для получения языка, который приложение использует от пакета главного приложения используйте preferredLocalizations метод в NSBundle класс:

NSString *languageID = [[NSBundle mainBundle] preferredLocalizations].firstObject;