Одна из причин, ограничивающих применение компьютеров Apple в России, — малое число программ с русским интерфейсом. Профессионалы издательского дела этого практически не ощущают, поскольку предпочитают нелокализованные версии. А вот большинство пользователей домашних и школьных компьютеров хотели бы общаться с ними на родном языке. Между тем Mac OS еще в «классические» времена была весьма неплохо приспособлена как для работы с различными языками вообще, так и для локализации в частности. Так что сделать русскую версию приложения (если автор учел рекомендации Apple) было ненамного сложнее, чем перевести текст1. Некоторые программы даже предоставляли возможность выбора языка интерфейса. В Mac OS X же для этого появился стандартный системный механизм SBML2. Открыв паспорт приложения, мы зачастую видим целый список языков. К сожалению, русский (Russian или ru) в нем пока встречается не так часто, как хотелось бы. Что же делать?
Паспорт программы |
Если вы достаточно хорошо владеете английским (или каким-либо другим из уже имеющихся в программе) и, что не менее важно, русским3 языком, то можете попробовать себя в роли локализатора. Поверьте, зачастую это вовсе не так сложно, как кажется.
В данной статье мы подробно рассмотрим наиболее простую задачу: создание русского интерфейса для Cocoa-приложения. В качестве примера используем небольшую бесплатную утилиту Дэвида Адамсона DragonDrop, которую можно загрузить по адресу: http://cs.oberlin.edu/~dadamson/DragonDrop.
Готовим инструменты
Контекстное меню приложения |
На первый раз вполне можно обойтись стандартными средствами разработки, входящими в Mac OS X, если у вас коробочная версия, либо загружаемыми бесплатно4 с сайта Apple: http://developer.apple.com. Из всего пакета Xcode Tools5 для локализации абсолютно необходима только одна программа — Interface Builder.
Второй инструмент — обычный текстовый редактор. Единственное условие: он должен работать с кодировкой Unicode (UTF-16). Выбор таких программ для Mac OS X (в том числе бесплатных и условно-бесплатных) весьма велик. Но поскольку решено обходиться стандартными средствами, используем редактор, встроенный в Xcode6.
Разберемся, как все устроено
Работа с объектом окна |
В Mac OS X то, что внешне, из графического интерфейса Finder, выглядит как файл, на самом деле вполне может оказаться целым набором вложенных каталогов — так называемым пакетом (package). Именно такой пакет со строго определенной структурой представляет собой и любая Cocoa-программа. Чтобы увидеть, что же скрывается за значком DragonDrop, воспользуемся командой Show Package Contents («Показать содержимое пакета») контекстного меню.
Мы видим два служебных файла, помогающих ОС правильно работать с пакетом, — Info.plist и PkgInfo; папку MacOS с исходным текстом приложения и еще один каталог — Resources. В нем, как следует из названия, находятся всевозможные ресурсы, используемые программой: графические элементы, тексты, значки и т.п.
Структура пакета приложения |
Что же и где нужно изменить, чтобы дополнить приложение еще одним языком интерфейса? Как нетрудно догадаться, языковые ресурсы находятся в папках с расширением lproj (language project). Вот с ними нам и предстоит работать. Выберите папку English.lproj (либо French, German), скопируйте ее и переименуйте копию в ru.lproj. Теперь в паспорте программы в списке языков появился и русский. Хотя, разумеется, интерфейс от этого сам собой не перевелся7.
Откройте вновь созданную папку. В нашем случае здесь находятся два текстовых файла — Localizable. strings и InfoPlist.strings, а также несколько пакетов *.nib8 с XML-описаниями элементов интерфейса. Их-то и предстоит перевести. (Языковые ресурсы могут также включать различные текстовые, RTF-и HTML-файлы: справочники, лицензионные соглашения и т.п. Встречаются, хотя и реже, файлы других типов.)
Сначала — простой текст
Структура папки *.lproj |
Рассмотрим файл InfoPlist.strings. Здесь находятся пары ключ — значение, подменяющие соответствующие строки XML-файла Info.plist. В большинстве случаев это:
- CFBundleName — имя, под которым программа видна в Finder9;
- CFBundleShortVersionString — краткие сведения о версии;
- CFBundleGetInfoString — информация о версии, выводящаяся в паспорте программы;
- NSHumanReadableCopyright — данные об авторских правах, которые показываются в окне «О программе».
Здесь же могут быть названия типов файлов, распознаваемых программой, в понятной пользователю форме.
Переводить эти строки или нет — решать локализатору. Обычно ограничиваются минимумом: по-русски пишут слово «версия» и, если нужно, приводят к принятой в России форме информацию об авторском праве. (Строку CFBundleShortVersionString в соответствии с указаниями Apple нужно оставить такой же, как в английской версии, либо вообще удалить.)
Вид окна до и после перевода |
Гораздо более важен и требует существенных затрат времени второй текстовый файл — Localizable.strings. В нем хранятся все строки, используемые программой для вывода разнообразных сообщений, построения «на лету» меню и других элементов интерфейса. Откроем его.
Структура файла чрезвычайно проста. Его синтаксис показан в листинге 1.
Листинг 1
/* Комментарий */ <<<выделить составные символы ?/*? и ?*/?>
?ключ? = ?локализованная строка?; <<<выделить символы ?=? и ?;?>
Вид файла Info.plist в редакторе Xcode |
Комментарии (редактор Xcode по умолчанию выделяет их зеленым) — это произвольный пояснительный текст. Как и в любом языке программирования, компьютером при исполнении приложения он не воспринимается. Так что при необходимости комментарии можно удалять, добавлять и изменять как угодно.
Ключ — тот текст, по которому программа находит нужную строку10. Обычно это соответствующая строка (реже ее сокращенный вариант или условное обозначение) на английском языке. Работая с Localizable.strings, будьте внимательны — ключ ни в коем случае менять нельзя!
После знака равенства должна следовать строка на целевом языке. Пока же у нас все эти строки на английском (или другом языке, ресурсы которого были скопированы). Предстоит перевести их на русский. По ходу дела не мешает запустить копию программы — далеко не всегда (особенно при отсутствии толковых комментариев) можно догадаться, какой из вариантов перевода многозначного слова нужно использовать в каждом конкретном случае. Часто в этой ситуации немалую помощь оказывает и документация к приложению. Приходится учитывать и еще один факт: английские слова в среднем раза в полтора короче русских. Поэтому нередко бывает необходимо подходить к переводу творчески — иначе текст может просто не уместиться в предназначенное для него место.
Обратите внимание: в некоторых строчках встречается особая комбинация символов — %@. Она указывает на то, что здесь будет подставляться некий переменный фрагмент11. Эту последовательность знаков нужно перенести в локализуемую строку.
Переменных элементов в строке может быть и несколько. Неужели в таких случаях приходится строить фразу с «английским» порядком слов? Отнюдь нет. Предусмотрена возможность изменить порядок вставок в локализованной строке, указав номер аргумента (листинг 2).
Листинг 2
?A file named ?%@? already exists in the folder ?%@?.? = ?В папке ?%2$@? уже существует файл ?%1$@?. ?
Файл Localizable.strings |
Для некоторых символов по той или иной причине используют особые обозначения: прямые кавычки обозначают как ?, переход на новую строку — 12. Кроме того, любой символ Unicode можно обозначить его четырехзначным шестнадцатеричным кодом, которому предшествует комбинация U.
Важное замечание: для корректной работы с языками, использующими алфавиты, отличные от латинского, файл Localizable. strings должен быть сохранен в кодировке Unicode (UTF-16). В редакторе Xcode ее можно установить, воспользовавшись меню Format?File Encodings.
Перестраиваем интерфейс
Меню кодировок |
Следующий этап работы — перевод nib-файлов. Их количество может быть самым различным. Однако как минимум присутствует описание главного меню и, если программа документно-ориентированная (т.е. поддерживает работу с несколькими документами одновременно), то — главного окна. В нашем примере имеется целых два разных варианта такого окна: FileViewer Small.nib и FileViewer.nib. Кроме того, в отдельные файлы вынесены описания двух диалогов: action dialogue.nib и Rename.nib.
Откроем файл Dragon MainMenu.nib.
Среди имеющихся элементов при локализации нужны только те, что помечены картинками «меню» и «окно» (в nib-файле их совсем необязательно будет по одной, как в данном случае). Элемент, как обычно, открывается двойным щелчком. Начнем с MainMenu. Все очень просто: перед нами меню, разворачивающееся точно так же, как и любое другое. Единственное отличие — оно ничем не управляет, зато каждый пункт можно редактировать. Все наглядно, в любой момент виден результат работы.
Окно документа Interface Builder |
По окончании перевода меню нужно открыть следующий элемент — Window. В данном случае это окно настройки параметров программы. Работа с ним так же наглядна, как и с меню, хотя и несколько сложнее. Здесь размеры и положение элементов иногда придется подгонять вручную.
Выполняемые действия очень похожи на операции в векторном графическом редакторе. Двойной щелчок на элементе позволяет отредактировать его текст (для выпадающего меню первый двойной щелчок разворачивает само меню, после чего можно будет работать с его элементами). Если нужно изменить размер объекта, то он выделяется одинарным щелчком. Затем его границы несложно переместить, захватывая мышью метки. Весь же объект в целом двигается не только мышью, но и клавишами со стрелками.
Полезная особенность программы Interface Builder заключается в том, что она помогает выровнять элементы, а также соблюдать установленные правилами оформления интерфейса расстояния между ними. Обратите внимание: когда вы двигаете элемент или его границу, в некоторых местах контур «прилипает» к появляющимся в нужный момент синим пунктирным линиям. Казалось бы, мелочь, однако благодаря этому работать намного приятнее (и, конечно, быстрее).
Но не все можно сделать непосредственно в самом окне. Следующее (и последнее) средство Interface Builder, необходимое в работе локализатора, — инспектор (окно свойств объекта). Если оно еще не открыто, то воспользуйтесь командой Tools?Show Info («Инструменты?Показать информацию»). С помощью выпадающего меню в верхней части окна можно выбрать одну из восьми страниц. Для нашей задачи важны две. Во-первых, Attributes. Переключитесь на нее.
Снимите выделение со всех элементов окна, щелкнув на его свободном участке. Тогда инспектор будет показывать свойства самого объекта «окно». Единственное из них, которое необходимо перевести, — имя (Window Title). Больше в нашем случае со страницей Attributes делать нечего. А вот если окно помимо кнопок и переключателей содержит объекты «статический текст», то здесь же может быть изменено его выравнивание. В некоторых ситуациях это бывает очень полезно.
Вторая нужная нам страница — Help. Единственный пункт этой страницы Tool Tip — текст всплывающей подсказки, который появляется, если задержать указатель мыши над тем или иным элементом интерфейса.
Редактирование меню в Interface Builder |
Естественно, все эти тексты тоже необходимо перевести. Будьте внимательны, постарайтесь ничего не пропустить.
По окончании обработки всех файлов папки ru.lproj остается запустить программу и полюбоваться на творение своих рук. Скорее всего не все вам понравится, поэтому придется внимательно проверить каждое меню, каждое окно, каждый диалог, а затем вернуться к редактированию того или иного файла.
Ложка дегтя
К сожалению, не всегда все бывает так хорошо, как в описанном примере. Например, вполне может случиться, что разработчик выполнил не все рекомендации Apple по «интернационализации»13 приложения. При этом перевести часть (иногда весьма существенную) интерфейса не удастся. Встречаются также ситуации, когда приложение вообще некорректно работает с кириллицей14. В обоих случаях помочь может только обращение к автору.
Работа с текстом всплывающей подсказки |
Но, допустим, все удалось, локализация выполнена, на ваш взгляд, идеально. Тут самое время вспомнить о существовании авторских прав. Не стоит их нарушать, лучше связаться с разработчиком и узнать его отношение к вашему труду. Возможных вариантов немного.
- Автор заинтересован в локализации своего продукта и включает созданные вами русские ресурсы в официальный дистрибутив. В случае, если программа условно-бесплатная (shareware), локализатор при этом получает некоторое количество регистрационных кодов.
- Разработчик не желает поддерживать русский язык, но не возражает, если кто-то будет распространять неофициальную локализованную версию. К сожалению, этот подход наиболее распространен среди производителей условно-бесплатного ПО, и не без причины — часто ли мы покупаем такие продукты?15
- Наконец, не исключен случай, когда автор категорически возражает против любых покушений на его произведение. Что ж, это его право, которое нужно уважать.
Несколько слов о Carbon
Как известно, чтобы облегчить перенос в систему Mac OS X прикладных программ, долгое время существовавших под управлением Mac OS, наряду с пришедшим из сред NeXTstep/OpenStep программным интерфейсом приложений (API) Cocoa в нее был включен модифицированный вариант классического API — Carbon. В программах, написанных с его использованием, языковые ресурсы могут находиться либо в ресурсной ветви файла (в этом случае у приложения только один вариант интерфейса и список языков в его паспорте будет пустым), либо в ресурсном файле Localizable.rsrc16. Для работы с ними рекомендуется использовать редактор ресурсов Resorcerer (разработчик: Mathemaesthetics, Inc., http://www.mathemaesthetics.com). Разбор же приемов локализации выходит далеко за рамки данной статьи.
Интерфейс программы после локализации |
* * *
Конечно, описанный процесс годится только для первых опытов в области локализации. При серьезной работе не обойтись без дополнительных инструментов. Основное назначение таких программ — во-первых, отделить перевод текста от подгонки элементов интерфейса (соответственно уже нет нужды быть и переводчиком, и дизайнером в одном лице), а во-вторых, и это самое главное, — использовать существующие наработки, а не начинать локализацию каждой новой версии программы с нуля. О некоторых подобных средствах рассказывается во врезке «В помощь мастеру». А ссылки на уже локализованные программы опубликованы здесь: http://kitfirst.narod.ru.
ОБ АВТОРЕ
Михаил Крекин — преподаватель информационных технологий школы №415 г. Москвы, e-mail: mkrekin@krekin.mccme.ru.
Познакомиться с программами, которые он локализовал, можно по адресу: http://rusmac.narod.ru.
В помощь мастеру
AppleGlot
Разработчик: Apple Computer, Inc. — http://developer.apple.com/intl/localization/tools.html.
Условия распространения: бесплатно.
Программа извлекает строки из файлов *.string, *.nib, а также ресурсов Carbon-приложений и строит из них так называемый рабочий словарь в формате XML. Этот словарь переводчик открывает любым текстовым редактором и вписывает соответствующие фразы на русском языке. Полученный результат используется программой, чтобы сформировать локализованные файлы.
Применять AppleGlot особенно полезно, если нужно поддерживать регулярно обновляющееся приложение. В этом случае происходит так называемая инкрементальная локализация. Программа при построении рабочего словаря предварительно сравнивает свежую версию приложения с предыдущей и предлагает для перевода только новые и измененные строки.
К сожалению, координаты элементов интерфейса не учитываются, поэтому всю подгонку необходимо каждый раз выполнять заново.
Существенный недостаток программы состоит в том, что переводчик работает с текстовым файлом, содержащим массу служебной информации. Мало того, что эти строки отвлекают внимание, так еще есть риск случайно исказить их.
PowerGlot
Разработчик: PowerGlot Software, www.powerglot.com.
Условия распространения: условно-бесплатно (199 долл.).
Наиболее популярное средство для локализации со времен «классической» Mac OS. Как и AppleGlot, оно поддерживает не только Cocoa-, но и Carbon-программы. Однако имеется ряд преимуществ:
- при работе вместо сложной структуры папок создается единственный файл проекта;
- для перевода часто встречающихся строк (OK — «Продолжить», Cut — «Вырезать» и т.п.) можно использовать заранее подготовленный или сформированный на основе уже обработанного материала словарь;
- редактирование производится непосредственно в PowerGlot;
- запоминается положение и размеры многих элементов интерфейса и др.
Mushroom
Разработчик: Жюльен Дюфо (Julien Dufour; входит в группу независимых разработчиков Inferiis), www.inferiis.com.
Условия распространения: условно-бесплатно (20 долл.).
Эта утилита предназначена для изменения файлов *.strings. В отличие от других программ обзора, она работает не только с готовыми приложениями, но и с проектами Xcode. Благодаря этому разработчик может отслеживать соответствие между строками, содержащимися в Localizable.strings, и их использованием в исходном тексте программы. Переводчику же предлагается удобный редактор с возможностью видеть не только пару ключ — значение строки для своего языка, но и при необходимости имеющиеся ее переводы на другие языки.
Необычно решен вопрос с nib-файлами. В комплекте с основной идет вспомогательная программа — NIB Helper. Она просто извлекает из всех (или только выбранных) nib-файлов строки и строит на их основе словари в формате strings, которые уже могут быть обработаны Mushroom. По окончании перевода та же вспомогательная программа копирует строки на нужное место.
iLocalize
Разработчик: Arizona Software, www.ilocalize.com.
Условия распространения: условно-бесплатно (49 долл., версия Pro — 149 долл.).
Функционально программа во многом подобна PowerGlot, однако предназначена для работы исключительно с Cocoa-приложениями. Несколько более удобный интерфейс. Все проекты организуются в единую структуру каталогов, причем в нее включаются как локальные словари, так и глобальный. Предусмотрены средства переноса данных из AppleGlot. Возможна работа с несколькими языками в рамках одного проекта.
Еще одна интересная особенность iLocalize — наличие нескольких языков интерфейса, включая русский. Документация, правда, существует только на английском и французском.
blue:tec Localization Suite
Разработчик: The Blue Technologies Group, www.blue-tec.com.
Условия распространения: бесплатно.
Пакет из двух простейших утилит. Первая, Localization Manager, извлекает строки из заданных файлов (обрабатываются только *.strings и *.nib) и создает на их базе рабочий словарь в особом формате. Затем с помощью второй программы пакета, Localizer, производится перевод, на основе которого строятся локализованные файлы. Проект, как и в iLocalize, может включать несколько языков.
К сожалению, функциональность программ весьма ограниченная. Главный недостаток (по словам разработчиков, в следующей версии он может быть исправлен) — невозможность импортирования перевода из предыдущей версии. Повторно используются только результаты, сохраненные в словаре Localization Manager. Поэтому пакет можно рекомендовать разве что для проектов, начинаемых с нуля.
1Надо заметить, что далеко не каждый программист следовал рекомендациям.
2Single Binary Multiple Language, в переводе с английского — один исполяемый файл — много языков.
3Это не шутка. Ошибки в правописании или употреблении русских слов мешают использованию программы почти так же, как и неправильный перевод текста — его пониманию.
4Внимание: объем образа диска превышает 600 Мбайт.
5В версиях, предшествовавших Mac OS X 10.3 Panther, он назывался Developer Tools.
6В ранних версиях пакета — Project Builder.
7Напомним: какой из языков интерфейса будет использован, определяется настройками раздела International панели System Preferences. «Лишние» языки можно отключить в паспорте программы.
8Расширение напоминает об одном из предков Mac OS X, операционной системе NeXTStep, и расшифровывается как NeXTStep Interface Builder.
9Если вы пользовались локализованной версией Mac OS X, то, наверное, обращали внимание, что при смене предпочтительного языка интерфейса меняются названия некоторых программ, например Address Book на «Адресная книга».
10Замечание для программистов: ключ передается как параметр функции NSLocalizedString, которую рекомендуется использовать вместо явного указания строковой константы внутри программы.
11Комбинация %@ обозначает объект-строку. Могут встречаться и другие сочетания символов, хорошо знакомые программистам на Си как обозначения формата в функции вывода: %d, %1.1f.
12Си-программистов это тоже не удивит.
13Интернационализация (internationalization), по определению Apple, — такие проектирование и разработка программы, которые способствуют ее локализации.
14В основном такое бывает при конвертировании текста в 8-битовую кодировку и из нее, например в программах, автоматически генерирующих веб-страницы.
15Именно поэтому прекращена поддержка русского интерфейса в замечательной программе iView MediaPro.
16Могут иметься также и файлы, аналогичные используемым в Cocoa.