Локализация Cocoa-приложений

Статья написана по мотивам моего ограниченного опыта локализации хобби-проекта на Obj-C/Cocoa.

Итак, вы написали свое первое приложение на Objective-C/Cocoa. Например, такое:



LocalizaMe.zip (32Kb)

Теперь вы его хотите перевести, чтобы расширить потенциальную аудиторию. Для начала нужно определиться что именно мы будет переводить. Данные, которые видит пользователь этого “продукта” содержаться в двух типах файлов: файлах описания интерфейса (xib) и в исходниках (c/m/mm). Главное окно с кнопкой “Push me” описано в English.lproj/MainMenu.xib, а диалог вызывается из кода:

- (IBAction) pushme: (id) sender
{
    NSRunAlertPanel(@"Message",
                    @"A fish can't whistle and neither can I",
                    nil, nil, nil);

}

Начнем с кода. Подход здесь такой же как и в gettext или Qt. Строка оборачивается в функцию-переводчик, которая в замисимости от настроек системы возвращает строку-перевод. В gettext это gettext(), в Qt – функция tr(). В Cocoa это NSLocalizedString(NSStriung *key, NSString *comment). Второй параметр опциональный и мы вместо него будем ставить nil. После “обертывания” строк получим что-то вроде этого:

- (IBAction) pushme: (id) sender
{
    NSRunAlertPanel(NSLocalizedString(@"Message", nil),
                    NSLocalizedString(@"A fish can't whistle and neither can I", nil),
                    nil, nil, nil);

}

Откуда NSLocalizedString берет переводы? Из соотвествующей языку системы версии файла Localizable.strings. “Соответсвующей” значит, что этих файлов несколько, для каждого языка свой. Такие файлы в проекте Xcode называются localizable и размещены в каталогах $LANGUAGE.lproj (English.lproj, Russian.lproj). Добавляем Localizable.strings в проект:
Add → New File → Resource → Strings → Localizable.string

Теперь надо сказать Xcode, что у файла будут локализованые версии:
(Right click) Get Info → Tab General → Make file localizable


И добавить Russian
(Right click) Get Info → Add Localization → Russian

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

bash$ genstrings -o English.lproj *.m

Содержание English.lproj должно теперь быть таким (в UTF-16):

/* No comment provided by engineer. */
"A fish can't whistle and neither can I" = "A fish can't whistle and neither can I";

/* No comment provided by engineer. */
"Message" = "Message";

С xib-файлами похожая история. Только вместо списка строк из каталога в каталог таскается полная версия xib-а.
MainMenu.xib уже помечен как localizable поэтому надо только добавить локаль Russian так же как это было проделано для Localizable.strings. На этом первый этап закончен.

Если .strings файл еще можно переводить в любимом редакторе, то c xib это уже проблематично. Для автоматизации этого процесса есть куча утилит. Мне больше всего понравилась iLingual. Для некоммерческих проектов – бесплатная.

Запускаем, жмем иконку Add Files и выбираем Localizable.strings и MainMenu.xib в English.lproj. iLingual попросит указать предыдущие версии этих файлов, жмем Cancel. Получаем вот такое окно:


Справа список импортированых файлов, слева список строк в выбранном файле, посредине – рабочая область. Больше информации можно найти в документации iLingual. В .xib файле еще много строк кроме “Push me”, но мы их просто проигнорируем, переведем наши три строчки. После этого идем в меню Localize → Export all localized files и указываем Russian.lproj как каталог для экспорта.

Build, Run и voila:

Для следующего релиза “продукта” при импорте файла в iLingual нужно указывать предыдущую локализованную версию из Russian.lproj в качестве базы перевода. iLingual будет использовать уже готовые строки и останется перевести только новые.

На последнем скриншоте видно, что строка слегка не помещается в кнопку. Увы, элементы UI не меняют своего размера в зависимости от текста и русскую версию интерфейса пришлось слегка подправить вручную.

  • Digg
  • del.icio.us
  • Facebook
  • Twitter

3 Comments so far

  1. [...] Локализация Cocoa-приложений [...]

  2. taurus on July 5th, 2010

    и тайтл окна остался не локализированым… “LocalizeMe”

  3. gonzo on July 5th, 2010

    Это будет домашним заданием!

Leave a Reply