8 июн. 2009 г.

Русские строки в UI

Так уж получилось, что на данный момент Symbian OS является властительницей смартфоновских дум практически на всем земном шаре, в том числе и в России. А так как смартфоны в первую очередь подразумевают наличие на борту полезных программ и утилит, то без локализации UI никак не обойтись.

Конечно, при особом желании, и наличии весьма сомнительного изобретательства, своих клиентов можно пичкать такими "шедеврами" локализации как "BbIxo/\", или "BBE/\|/|TE /\AHHbIE", или, не мудрствуя лукаво, вместе с программой раздавать английские словарики. Однако если есть желание сделать нормальный UI, то следует в первую очередь воспользоваться инструментами локализации самой Symbian OS.

Unicode

Юникод, как это хорошо известно, имеет под собою благородный порыв стать домом всех не-ASCII-тичных символов. Однако с форматом у юникода дела обстоят примерно так же, как и у его предка - ASCII. Юникод на данный момент, имеет 8-ми, 16-ти, и 32-х битную версии. Для особых эстетов найдется даже 7-битная версия юникода. Однако для возможности использования русских букв и слов в строках мобильного пользовательского интерфейса в Symbian OS, будет совершенно достаточно кодировки UTF-8.

Файл .loc

То, что хранить строковые константы в теле программы - вселенское зло, вам объяснит любой грамотный программист. Symbian C++ в этом плане - не исключение, поэтому все строки локализации, с таким содержимым как "Выход", "Введите данные" или "Федя Пупкин Production", выносятся в текстовый файл с расширением loc. По большому счету, совершенно неважно какое расширение вы дадите файлу. Оно может быть и lok, и loh, и abc. Главное - это знать, что в данном файле хранятся все ваши локализованные строки.

Внутри своего loc-файла вы должны разместить не только строки в виде определений #define, но так же указать компилятору ресурсов в какой кодировке сохранен ваши строки, а равно - и сам loc-файл.

Для указания кодировки используется макрос CHARACTER_SET. Официальных параметров у макроса - всего два:

CHARACTER_SET UTF8 // ваши строки, понятное дело, в кодировке UTF-8
// или
CHARACTER_SET CP1252 // ваши строки в кодировке Windows Cp-1252

Для примера предположим, что у нас есть файл "application.loc", содержимое которого будет следующим:

// application.loc
CHARACTER_SET UTF8 // теперь компилятор в курсе, что мы используем UTF-8

#define about_fedya "Федя Пупкин Production"

В результате мы получили loc-файл с правильным содержимым. Дотошности ради стоит сообщить, что UTF-8, о котором мы говорим, на самом деле не так прост как кажется. Иногда Symbian OS не совсем правильно понимает все нюансы формата UTF-8, и поэтому у многих программистов возникают проблемы как с компилятором ресурсов, так и с текстовым редактором.

Однако файлы в "правильной" кодировке UTF-8, "понятные" для компилятора ресурсов Symbian OS, на самом деле очень легко создаются при помощи столь ненавистного многим компьютерщикам текстового редактора Windows Notepad. Да, вы не ослышались - Windows Notepad. Правда при сохранении вашего текстового loc-файла следует не зыбыть выбрать кодировку "UTF-8". После этого ни один компилятор ресурсов не плюнется вам в лицо гневными сообщениями о неправильных кодировках.

Файл .rss

Как правило, стоковые константы, определенные в loc-файле, находят свое применение в файле ресурсов приложения, носящее столь звонкое сейчас расширение - rss. Рассмотрим пример такого rss-файла, в котором будут определяться все элементы UI нашего приложения:

#include "application.loc" // подскажем компилятору где находятся наши строки

...

// теперь строковыми константами можно воспользоваться прямо в меню
MENU_ITEM
{
command = EShowInfoAboutAuthor;
txt = about_fedya;
},

...

// или просто в виде ресурсной строки
RESOURCE TBUF r_about_fedya { buf = about_fedya; }

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

Загружаем локализованную строку в программе

Как бы ни были удобны rss-файлы, порою нам нужно загрузить строку из файла ресурсов, и показать пользователю. Как это сделать в Symbian C++? На самом деле - проще пареной репы. Для приготовления такой "пареной репы" вам понадобится компонента под емким названием StringLoader. Эта замечательная утилита доступна для всех, кто работает на платформе S60. Впрочем, возможно и на других платформах есть подобные аналоги. Итак, чтобы загрузить нашу тестовую строку, следует выполнить следующий код:

// создать переменную для хранения строки
HBufC* aboutFedya;

// загрузить строку "r_about_fedya" из файла ресурсов
// обратите внимание, что тут мы должны исользовать только большие буквы
aboutFedya = StringLoader::LoadLC( R_ABOUT_FEDYA );

// сделать что-нибудь с полученной строкой

...

// освободить память, занятую строкой
CleanupStack::PopAndDestroy( aboutFedya );

В принципе, это все тонкости при переводе вашего приложения на русский, украинский, белорусский, киргизский или любые другие языки.