Строковые ресурсы

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

Файлы ресурсов, содержащие локализуемые строки, упоминаются как строковые файлы из-за их расширения файла, которое является .strings. Можно создать строковые файлы вручную или программно в зависимости от потребностей. Строковый формат файла стандарта состоит из одной или более пар ключ/значение вместе с дополнительными комментариями. Ключ и значение в данной паре являются строками текста, включенного в двойные кавычки и разделенного знаком «равно». (Можно также использовать формат списка свойств для строковых файлов. В таком случае узел верхнего уровня является словарем, и каждая пара ключ/значение того словаря является строковой записью.)

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

Перечисление 2-1  файл простых строк

/* Insert Element menu item */
"Insert Element" = "Insert Element";
/* Error string used for unknown error types. */
"ErrorString_1" = "An unknown error occurred.";

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

Загрузка строковых ресурсов (и локализованный и нелокализованный) в конечном счете полагается на пакет и поддержку интернационализации, найденную и в OS X и в iOS. Для получения информации о пакетах см. Руководство по программированию Пакета. Для получения дополнительной информации об интернационализации и локализации, посмотрите Руководство по Интернационализации и Локализации.

Создание строковых файлов ресурсов

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

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

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

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

if (CFStringHasPrefix(value, CFSTR("-")) {    CFArrayAppendValue(myArray, value);};

В этом примере, строка “-” используется внутренне и никогда не замечается пользователем; поэтому, это не должно быть помещено в строковый файл.

Следующий код показывает другой пример строки, которую не видел бы пользователь. Строка "%d %d %s" не должен быть локализован, так как пользователь никогда не видит его, и это не имеет никакого эффекта ни на что, что действительно видит пользователь.

matches = sscanf(s, "%d %d %s", &first, &last, &other);

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

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

  • Если те строки добавляются программно, заголовок пункта меню представляет в виде строки. Например, при использовании пользовательских строк для пункта меню Undo те строки должны быть в строковом файле.

  • Сообщения об ошибках, выведенные на экран пользователю.

  • Любой шаблонный текст, выведенный на экран пользователю.

  • Некоторые строки от информационного списка свойств Вашего приложения (Info.plist) файл; см. Инструкции по Конфигурации Во время выполнения.

  • Новый файл и названия документа.

О загружающих строку макросах

Основа и Базовые платформы Основы определяют следующие макросы для создания загружающихся строк из строкового файла проще:

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

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

Используя genstrings Инструмент для Создания Строковых Файлов

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

Использовать genstrings инструмент, Вы обычно обеспечиваете по крайней мере два параметра:

  • Список исходных файлов

  • Дополнительный выходной каталог

genstrings инструмент может проанализировать C, Objective C и файлы кода Java с .c, .m, или .java расширения файла. Несмотря на то, что не строго требуемый, указывая выходной каталог рекомендуется и где genstrings помещает файлы получивших строк. В большинстве случаев Вы хотели бы указать каталог, содержащий ресурсы проекта для Вашего языка разработки.

Следующий пример показывает простую команду для выполнения genstrings инструмент. Эта команда заставляет инструмент анализировать все исходные файлы Objective C в текущем каталоге и вставлять файлы получивших строк en.lproj подкаталог, который должен уже существовать.

genstrings -o en.lproj *.m

В первый раз Вы работаете genstrings инструмент, это создает ряд новых строковых файлов для Вас. Последующие выполнения заменяют содержание тех строковых файлов с текущими строковыми записями, найденными в Вашем исходном коде. Для последующих выполнений это - хорошая идея сохранить копию Ваших текущих строковых файлов перед выполнением genstrings. Вы можете тогда разность новые и старые версии для определения, какие строки были добавлены к (или изменился в) проект. Можно тогда использовать эту информацию уже, чтобы обновить любого локализованные версии строковых файлов, вместо того, чтобы заменить те файлы и локализовать их снова.

В единственном строковом файле каждый ключ должен быть уникальным. К счастью, genstrings инструмент достаточно умен для объединения любых двойных записей, которые он находит. Когда это обнаруживает строку ключа, используемую несколько раз в единственном строковом файле, инструмент объединяется, комментарии от отдельных записей в один комментарий представляют в виде строки, и генерирует предупреждение. (Можно подавить двойные записи, предупреждающие с -q опция.), Если та же строка ключа присваивается строкам в различных строковых файлах, никакое предупреждение не сгенерировано.

Для получения дополнительной информации об использовании genstrings инструмент, посмотрите genstrings страница справочника.

Создание строковых файлов вручную

Несмотря на то, что genstrings инструмент является наиболее удобным способом создать строковые файлы, можно также создать их вручную. Для создания строкового файла вручную создайте новый файл в TextEdit (или предпочтительное приложение редактирования текста) и сохраните его с помощью Unicode кодирование UTF-16. (Сохранив файлы, TextEdit обычно выбирает надлежащее кодирование по умолчанию. Для принуждения определенного кодирования необходимо изменить опции сохранения в установках приложения.) Содержание этого файла состоит из ряда пар ключ/значение вместе с дополнительными комментариями, описывающими цель каждой пары ключ/значение. Ключ и строки значения разделяются знаком «равно», и вся запись должна быть завершена с символом точки с запятой. Условно, комментарии включаются в разделителях комментария C-стиля (/* и */) и сразу помещаются перед записью они описывают.

Перечисление 2-2 показывает основной формат строкового файла. Записи в этом примере прибывают из английской версии Localizable.strings файл из приложения TextEdit. Строка на левой стороне каждого знака «равно» представляет ключ, и строка на правой стороне представляет значение. Общее соглашение, когда разработка приложений должна использовать ключевое имя, равняющееся значению на языке, раньше разрабатывало приложение. Поэтому, потому что TextEdit был разработан с помощью английского языка, английской версии Localizable.strings файл имеет ключи и значения то соответствие.

  Строки перечисления 2-2 локализуются для английского языка

/* Menu item to make the current document plain text */
"Make Plain Text" = "Make Plain Text";
/* Menu item to make the current document rich text */
"Make Rich Text" = "Make Rich Text";

Перечисление 2-3 показывает немецкий перевод тех же записей. Эти записи также живут в вызванном файле Localizable.strings, но эта версия файла расположена в немецком каталоге проекта языка приложения TextEdit. Заметьте, что ключи находятся все еще на английском языке, но значения, присвоенные тем ключам, находятся на немецком языке. Это вызвано тем, что строки ключа никогда не замечаются конечными пользователями. Они используются кодом для получения соответствующей строки значения, которая в этом случае находится на немецком языке.

  Строки перечисления 2-3 локализуются для немецкого языка

/* Menu item to make the current document plain text */
"Make Plain Text" = "In reinen Text umwandeln";
/* Menu item to make the current document rich text */
"Make Rich Text" = "In formatierten Text umwandeln";

Обнаружение нелокализуемых строк

Находящиеся в AppKit приложения могут использовать в своих интересах встроенную поддержку для обнаружения строк, которые не должны быть локализованы и те, которые должны быть локализованы, но в настоящее время не являются. Использовать эту встроенную поддержку, значения по умолчанию пользователя аппарата или добавить параметры запуска при выполнении приложения. Укажите булево значение, чтобы указать, должно ли пользовательское значение по умолчанию быть включено или отключено. Доступные пользовательские значения по умолчанию следующие:

  • NSShowNonLocalizableStrings пользовательское значение по умолчанию идентифицирует строки, которые не локализуемы. Строки регистрируются к оболочке в верхнем регистре. Эта опция иногда генерирует некоторые ложные положительные стороны, но все еще полезна в целом.

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

Например, для использования NSShowNonLocalizedStrings пользовательское значение по умолчанию с приложением TextEdit, введите следующее в Терминал:

/Applications/TextEdit.app/Contents/MacOS/TextEdit -NSShowNonLocalizedStrings YES

Загрузка строковых ресурсов в код

Базовые платформы Основы и Основы обеспечивают макросы для получения и локализованные и нелокализованные строки, сохраненные в строковых файлах. Несмотря на то, что основная цель их, которые макросы к строкам загрузки во время выполнения, они также, служит вторичной цели путем действия как маркеры что genstrings инструмент может использовать для определения местоположения строковых ресурсов приложения. Именно эта вторая цель объясняет, почему многие макросы позволяют Вам указать намного больше информации, чем обычно требовалось бы для загрузки строки. genstrings инструмент использует информацию, которую Вы предоставляете, чтобы создать или обновить строковые файлы Вашего приложения автоматически. Таблица 2-1 перечисляет типы информации, которую Вы можете указать для этих подпрограмм и описываете, как та информация используется genstrings инструмент.

Таблица 2-1  Общие параметры найдена в загружающих строку подпрограммах

Параметр

Описание

Ключ

Строка раньше искала соответствующее значение. Эта строка не должна содержать символы от расширенного набора символов ASCII, включающего версии с диакритическим знаком символов ASCII. Если Вы хотите, чтобы строка начального значения содержала расширенные символы ASCII, используйте подпрограмму, позволяющую Вам указать параметр значения по умолчанию. (Для получения информации о расширенном наборе символов ASCII см. соответствующую статью в Википедии.)

Имя таблицы

Имя строкового файла, в котором расположен указанный ключ. genstrings инструмент интерпретирует этот параметр как имя строкового файла, в который должна быть помещена строка. Если никакое имя таблицы не предоставлено, строка помещается в значение по умолчанию Localizable.strings файл. (При указании значения для этого параметра включайте имя файла без .strings расширение.)

A .strings файл, имя таблицы которого заканчивается .nocache— например, ErrorNames.nocache.strings— не будут кэшировать его содержание NSBundle.

Значение по умолчанию

Значение по умолчанию для соединения с данным ключом. Если никакое значение по умолчанию не указано, genstrings инструмент использует строку ключа в качестве начального значения. Строки значения по умолчанию могут содержать расширенные символы ASCII.

Комментарий

Перевод комментирует для включения со строкой. Можно использовать комментарии для давания представлений о команде перевода о том, как используется данная строка. genstrings инструмент помещает эти комментарии в строковый файл и включает их в разделители комментария C-стиля (/* и */) сразу выше связанной записи.

Пакет

NSBundle объект или CFBundleRef введите соответствие пакету, содержащему строковый файл. Можно использовать это для строк загрузки от пакетов кроме основного пакета приложения. Например, Вы могли бы использовать это для загрузки локализованных строк из платформы или плагина.

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

Для получения информации об интернационализации в целом и как создать специфичные для языка каталоги проекта, посмотрите Руководство по Интернационализации и Локализации. Для получения информации о структуре пакета и как файлы ресурсов выбраны из каталога пакета, см. Руководство по программированию Пакета.

Используя базовую платформу основы

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

Существует несколько причин использовать макросы вместо CFBundleCopyLocalizedString функция. Во-первых, макросы проще использовать для определенных общих падежей. Во-вторых, макросы позволили Вам связать строку комментария со строковой записью. В-третьих, макросы распознаны genstrings инструмент, но CFBundleCopyLocalizedString функция не.

Для получения информации о синтаксисе предыдущих макросов см. Ссылку CFBundle.

Используя платформу основы

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

Как с Базовой Основой, Apple рекомендует использовать макросы удобства Какао для загрузки строк. Основное преимущество для них, которые макросы - то, что они могут быть проанализированы genstrings инструмент и используемый для создания строковых файлов приложения. Они также более просты использовать и позволить Вам связать комментарии перевода с каждой записью.

Для получения информации о синтаксисе предыдущих макросов посмотрите Ссылку Функций Основы. Дополнительные методы для загрузки строк также определяются в Ссылке класса NSBundle.

Примеры получения строк

Следующие примеры демонстрируют основные методы для использования Основы и Базовых макросов Основы для получения строк. Каждый пример предполагает, что текущий пакет содержит строковый файл с именем Custom.strings это было переведено на французский язык. Этот переведенный файл включает следующие строки:

/* A comment */
"Yes" = "Oui";
"The same text in English" = "Le même texte en anglais";

Используя платформу Основы, можно получить значение “Yes” строка с помощью NSLocalizedStringFromTable макрос, как показано в следующем примере:

NSString* theString;
theString = NSLocalizedStringFromTable (@"Yes", @"Custom", @"A comment");

Используя Базовую платформу Основы, Вы могли получить ту же строку с помощью CFCopyLocalizedStringFromTable макрос, как показано в этом примере:

CFStringRef theString;
theString = CFCopyLocalizedStringFromTable(CFSTR("Yes"), CFSTR("Custom"), "A comment");

В обоих примерах код указывает ключ для получения, который является строкой «Да». Они также указывают строковый файл (или таблица), в котором можно искать ключ, который в этом случае является Custom.strings файл. Во время строкового извлечения проигнорирована строка комментария.

Усовершенствованные строковые подсказки по файлу

Следующие разделы обеспечивают некоторые дополнительные подсказки для работы со строковыми файлами и строковыми ресурсами.

Поиск Пользовательских Функций С genstrings

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

Если Вы хотите использовать genstrings с Вашими собственными функциями Ваши функции должны использовать именование и форматирование соглашений, используемых макросами Основы. Параметры для Ваших функций должны соответствовать параметры для соответствующих макросов точно. При вызове genstrings Вы указываете -s опция, сопровождаемая именем функции, соответствующей NSLocalizedString макрос. Ваши другие имена функций должны тогда создать из этого базового имени. Например, если Вы указали имя функции MyStringFunction, Ваши другие имена функций должны быть MyStringFunctionFromTable, MyStringFunctionFromTableInBundle, и MyStringFunctionWithDefaultValue. genstrings инструмент ищет эти функции и использует их для создания соответствующих строковых файлов.

Форматирование строковых ресурсов

Для некоторых строк Вы не можете хотеть к (или быть в состоянии к), кодируют всю строку в строковом ресурсе, потому что части строки могли бы измениться во время выполнения. Например, если строка содержит имя пользовательского документа, необходимо быть в состоянии вставить то название документа в строку динамично. При создании строковых ресурсов можно использовать любой из символов форматирования, которые Вы обычно использовали бы для обработки строковой замены в Основе и Базовых платформах Основы. Перечисление 2-4 показывает несколько строковых ресурсов, использующих основные символы форматирования:

  Строки перечисления 2-4 с символами форматирования

"Windows must have at least %d columns and %d rows." =
"Les fenêtres doivent être composes au minimum de %d colonnes et %d lignes.";
"File %@ not found." = "Le fichier %@ n’existe pas.";

Для замены символов форматирования фактическими значениями Вы используете stringWithFormat: метод NSString или CFStringCreateWithFormat функция, с помощью строкового ресурса в качестве строки формата. Основа и Базовая Основа поддерживают большинство стандартных символов форматирования, используемых в printf операторы. Кроме того, можно использовать %@ спецификатор, который, как показывают в предыдущем примере, вставил описательный текст, связался с произвольными объектами Objective C. Посмотрите Строковые Объекты Форматирования в Строковом Руководстве по программированию для полного списка спецификаторов.

Одна проблема, часто происходящая во время перевода, состоит в том, что переводчик, возможно, должен переупорядочить параметры в переведенных строках для учета различий во входных и выходных языках. Если строка содержит многократные параметры, переводчик может вставить специальные теги формы n$ (где n указывает позицию исходного параметра), промежуточный символы форматирования. Эти теги позволяют переводчику переупорядочить параметры, появляющиеся в исходной строке. Следующий пример показывает строку, два параметра которой инвертируются в переведенной строке:

/* Message in alert dialog when something fails */
"%@ Error! %@ failed!" = "%2$@ blah blah, %1$@ blah!";

Используя специальные символы в строковых ресурсах

Так же, как в C, некоторые символы должны быть снабжены префиксом наклонную черту влево, прежде чем можно будет включать их в строку. Эти символы включают двойные кавычки, сам символ наклонной черты влево и специальные управляющие символы, такие как перевод строки (\n) и возвраты каретки (\r).

"File \"%@\" cannot be opened" = " ... ";
"Type \"OK\" when done" = " ... ";

Можно включать произвольные символы Unicode в строку значения путем указания \U сопровождаемый сразу до четырех шестнадцатеричных цифр. Эти четыре цифры обозначают запись для желаемого символа Unicode; например, пробел представлен шестнадцатеричными 20 и таким образом был бы \U0020 когда указано как символ Unicode. Эта опция полезна, если строка должна включать символы Unicode, которые по некоторым причинам не могут быть введены. При использовании этой опции необходимо также передать -u опция к genstrings для шестнадцатеричных цифр, которые будут интерпретироваться правильно в файле получивших строк. genstrings инструмент предполагает, что Вашими строками является низкий ASCII по умолчанию, и только интерпретирует последовательности наклонной черты влево если -u опция указана.

Отладка строковых файлов

Если Вы сталкиваетесь с проблемами во время тестирования и находите, что функции и макросы для получения строк всегда возвращают тот же ключ (в противоположность переведенному значению), работайте /usr/bin/plutil инструмент на Вашем строковом файле. Строковый файл является по существу файлом списка свойств, отформатированным специальным способом. Выполнение plutil с -lint опция может раскрыть скрытые символы или другие ошибки, препятствующие тому, чтобы строки были получены правильно.