Разработка iPhone/iPod touch приложений: локализация приложения
Часто при разработке приложений возникает необходимость осуществить возможность изменения региональных настроек, языка графического интерфейса приложения в зависимости от системных настроек, другими словами, сделать приложение локализированным. Для этого iPhone SDK предоставляет широкий набор средств. О них и пойдет речь в этой статье.
Локализировать можно любые ресурсы приложения – от *.xib – файлов, до отдельных картинок. Также локализацию можно осуществлять программно и получать вручную ресурсы в зависимости от текущей локали окружения, в котором было запущено приложение. Но обо всем попорядку…
Чтобы сделать какой-нибудь ресурс локализируемым, открываем Info для него,
на вкладке General находим кнопку Make File Localizable.
После этого добавляем нужные локали при помощи кнопки Add Localization… Для того, чтобы одна из локалей, добавленных таким способом, была успешно сопоставлена с текущей системной локалью, нужно при добавлении указывать названия локализаций в соответствии со стандартами POSIX (например, en_EN).
Теперь рассмотрим, что происходит при этом в файловой системе. Когда добавляется новая локаль для ресурса, в папке, в которой он лежит, создается папка с именем “<имя_локали>.lproj”. В эту папку помещается копия файла локализируемого ресурса. Если, например, этим ресурсом является изображение, содержащее текст на английском языке, а вы добавили для него русскую локализацию (поместили его в папку с именем ru_RU.lproj), то его копию в этой папке следует заменить на изображение с русским текстом, который вы хотите использовать конкретно для этой локали. Теперь приложение будет автоматически брать файл изображения из той папки, имя которой успешно сопоставится с ситемной локализацией. Если же ни одна локализация ресурса не будет успешно сопоставлена с системной, то будет использоваться локализация по умолчанию.
Сплэшскрин (изображение Default.png) сдесь не является исключением. Этот файл так же является ресурсом проекта и подлежит локализации. При старте вашего приложения будет использоваться локализированный сплэшскрин.
Сложнее дело обстоит с *.xib-файлами. Они могут содержать множество строк (например в названиях меток, кнопок), которые должны быть переведены на другой язык. Для того, чтобы иметь возможность подключить переводчиков к процессу локализации, все эти строки нужно свести в файл, который можно было бы отдать на перевод. Это делается при помощи утилиты ibtool.
Ibtool – это утилита командной строки. Вот пример того, как можно получить файл строк по файлу MainMenu.xib при помощи этой утилиты:
ibtool –generate-strings-file MainMenu.strings en.lproj/MainMenu.xib
Теперь файл MainMenu.strings содержит строки в формате “<ключ>”=”<значение>”. Значения и нужно переводить.
Возможен также и обратный процесс. Допустим, после перевода необходимо сконструировать MainMenu.xib-файлы для других локализаций. Это можно сделать так. Поместите переведенный файл строк MainMenu.strings в папку с нужным именем локали (сдесь используется ru.lproj). Его имя, и имя *.xib-файла приемника должно совпадать с именем *.xib-файла источника (в нашем примере источник en.lproj/MainMenu.xib).
ibtool –strings-file ru.lproj/MainMenu.strings –write ru.lproj/MainMenu.xib en.lproj/MainMenu.xib
Ibtool также позволяет внедрять новые переведенные строки в *.xib-файл. Для этого используется опция -l. Более подробное описание опций в ibtool man (в командной строке man ibtool).
Теперь о программных способах локализации.
Допустим, необходимо выводить в TextView текст, который должен быть локализированным. Эту проблему уже нельзя решить при помощи локализации отдельных ресурсов. Для этого нужен специальный локализируемый ресурс, содержащий весь набор строк, которые вам будет нужно выводить локализированными – проще говоря, локализируемый словарь. Если вы хотите использовать словарь по умолчанию – за ним закреплено строго определенное имя – Localizable.strings.
Опишем порядок действий при создании такого ресурса:
- Создаем в каталоге проекта Resources пустой файл Localizable.strings
- Добавляем этот файл в проект. Открываем его в Xcode.
- Вносим в него строки, которые должны быть локализированы, в специальном формате “<ключ>”=”<значение>”.
Ключ – это также строка, по которой будет возвращаться значение. Ключи должны быть уникальными для каждого значения в файле, и быть семантически разборчивыми для того, чтобы ваш код был читабельным.
Теперь можно получать в коде значения по ключу, используя макрос NSLocalizedString(<ключ>,<комментарий>). Если файл строк не будет содержать значения по такому ключу, то в качестве значения будет возвращен сам ключ.
NSLocalizedString – это макрос, определенный в NSBundle.h следующим образом:
[sourcecode language='objc']
#define NSLocalizedString(key, comment)
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
[/sourcecode]
Как видно, сдесь в функции localizedStringForKey в качестве таблицы строк table указано значение nil, поэтому используется таблица по умолчанию.
Существуют еще и другие макросы:
[sourcecode language='objc']
//Получение локализованной строки из заданной таблицы строк
#define NSLocalizedStringFromTable(key, tbl, comment)
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]
//То же самое, но со своим bundle
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment)
[bundle localizedStringForKey:(key) value:(val) table:(tbl)]
[/sourcecode]
Как можно догадаться, в качестве параметра value для функции localizedStringForKey передается значение по умолчанию (используется, если локализованная строка по ключу не будет найдена в таблице либо если ключ равен nil).
В этой статье были рассмотрены основные приемы, при помощи которых можно быстро локализировать приложение. Также хорошей практикой является использование файлов строк даже в тех случаях, когда локализация не нужна. Это позволяет сосредоточить строки в одном месте и быстро изменить их, если потребуется.






Павел
в 17:56, 03.07.2009Спасибо! То что искал!
В принципе не сложнее чем локализовать обычный .app для OS X!
Olyashicks
в 13:05, 17.08.2010[b]Урок природоведения в первом классе. Учительница (Марь Иванна)
спрашивает:
- Дети, как разговаривают животные? Ну-ка, Маша, скажи?
- Коровка кричит “Муууууу”.
- Умница Маша, садись, пять. А что ты скажешь, Миша?
- Собачки говорят “Гав-гав”.
- Молодец, Миша, пять.
Вовочка тянет руку, аж со стула падает:
- Марь Иванна, Марь Иванна, а я знаю как МОРЖИ разговаривают!
- Ну и как же МОРЖИ разговаривают?
- ОЙ Б##ДЬ, а вода-то какая ХОЛОДНАЯААААААА! [/b]
Общество Мегаполиса Pi7.ru порадовала новым выходом очередного сборника нюансов.
Меня удивила скажем это “[url=http://www.2nt.ru/go/videoerotika.php]Порадовала свою киску отменным трахом [/url]” – Канечно вы можете встретить и для себя ворох интерестного
Ну а впрочем лучшее снадобье от скуки это анекдотец.
[url=http://my.pi7.ru/users/katya][IMG]http://www.my.pi7.ru/images/photos/medium/64f735e63125b1ca76589f43d1698d9a.jpg[/IMG][/url]