[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека |
Юридическая информация |
Поиск ]
Программирование: Разработка и отладка программ
Краткий справочник по NLS может
послужить начальным руководством по локализации программ. В следующих
разделах приведены советы и практические рекомендации по созданию программ с
NLS:
Ниже перечислены основные
рекомендации по поддержке NLS. Главная цель этого раздела -
предотвратить появление характерных ошибок при разработке программ, не
зависящих от локали. Дополнительная информация приведена в разделе Глава 16, Поддержка национальных языков.
- Все пользовательские
сообщения и сообщения об ошибках должны храниться отдельно от
программы. Для этого рекомендуется создавать каталоги сообщений.
Приложения X Window могут сохранять сообщения для каждой локали в файле
ресурсов. Дополнительная информация приведена в разделе Средства работы с сообщениями - Информация для программистов.
- Для создания переносимых
программ рекомендуется использовать стандартные функции X/Open, ISO/ANSI C и
POSIX. Дополнительная информация об этом приведена в разделе "Обзор
функций NLS" (Функции для поддержки национальных языков - Обзор).
- При создании приложений
X Windows, не зависящих от кодового набора, применяйте спецификации набора
шрифтов.
- Используйте виджеты
библиотеки Xm (Motif) для создания приложений, работающих с двунаправленным
текстом и применяющих перерисовку символов. Сведения об этом можно
найти в разделе "Layout (Bidirectional) Support in Xm
(Motif) Library" книги AIX 5L Version 5.1 AIXwindows
Programming Guide. Для ввода и вывода двунаправленного текста и
динамически формируемых символов применяются виджеты XmText и
XmTextField.
- Не накладывайте
ограничение на размер символа, считая, что он равен 1 байту (8 бит).
Код символа может занимать 1, 2, 3, 4 и более байт. Дополнительная
информация приведена в разделах Функции преобразования кода многобайтовых и широких символов и Кодовые наборы - Обзор.
- Не делайте никаких
предположений о кодировке символов в каком-либо кодовом наборе.
Дополнительная информация приведена в разделе Кодовые наборы - Обзор.
- Не задавайте имена
кодовых наборов, локалей и шрифтов в тексте программы - это может негативно
сказаться на ее переносимости. Дополнительная информация по этому
вопросу приведена в разделе Глава 16, Поддержка национальных языков.
- Не применяйте
конструкцию p++ для увеличения значения указателя на строку многобайтовых
символов. В качестве приращения используйте длину символа, которую
можно узнать с помощью функции mblen.
- Не делайте
предварительных предположений о том, какая физическая клавиатура
используется. Для обработки ввода с клавиатуры применяйте метод ввода,
учитывающий текущее значение локали. Дополнительная информация
приведена в разделе Методы ввода - Обзор.
- Не создавайте
собственных функций преобразования, если в этом нет крайней
необходимости. Дополнительная информация приведена в разделе Функции преобразования - Информация для программистов.
- Не делайте допущений по
поводу того, является тип char знаковым или беззнаковым. Это
зависит от платформы. Если в программе тип char будет
определен как знаковый, сравнение с 8-разрядными значениями даст
неверный результат. Так как для кодирования символов применяются все 8
разрядов байта, при необходимости объявляйте char как unsigned
char. Также учтите, что при использовании значения signed
char в качестве индекса массива можно получить неверный
результат. Для того чтобы программы были переносимыми, объявляйте
однобайтовые символы как unsigned char.
- Не применяйте функции
начертания текста из библиотеки libi18n.a, если основной
задачей вашего приложения не является визуальное представление данных.
Большая часть приложений работает с логически упорядоченным текстом.
Дополнительная информация по этому вопросу приведена в разделе Обзор функций библиотеки визуального представления текста.
Эта справочная таблица позволяет
проверить, зависит ли программа от особенностей национальных языков.
Ответив на вопросы таблицы вы сможете узнать, нужно ли применять функции NLS в
вашей программе. Эта операцию рекомендуется выполнять как при создании
программы, так и при тестировании. Если вы обнаружите, что программа
зависит от некоторых свойств NLS, разработайте соответствующую стратегию
тестирования. Это общий подход для тестирования всех программ.
При создании таблицы были учтены
все основные параметры NLS. Однако она не позволяет выполнить полную
проверку. Эта таблица содержит не все вопросы, связанные с NLS.
Дополнительная информация приведена в разделе Глава 16, Поддержка национальных языков. Краткая сводка рекомендаций по работе с NLS
приведена в разделе Рекомендации по поддержке национальных языков.
- Программа, напрямую или
посредством других функций, выводит сообщения, которые могут быть переведены
на другие языки? Примером сообщений, выводимых другими функциями, могут
служить сообщения из каталога.
Если да:
- В программе применяется
сравнение строк текста?
Если да:
- Строки сравниваются
только на равенство?
Если да:
- Строки сравниваются
согласно правилам сортировки текущей локали?
Если да:
- Программа выполняет
разбор путей к файлам?
Если да:
- При поиске косой черты
(/) применяйте функцию strchr.
- При поиске других
символов учтите, что имена файлов могут содержать многобайтовые
символы. В таких случаях перед вызовом функций поиска вызовите функцию
setlocale указанным ниже образом:
setlocale(LC_ALL, "")
- В программе используются
системные имена, такие как имена узлов, пользователей, принтеров и очередей?
Если да:
- Системные имена могут
содержать многобайтовые символы.
- Для идентификации
многобайтовых символов перед вызовом требуемых библиотечных функций вызовите
setlocale указанным ниже образом:
setlocale(LC_ALL, "")
- В программе используются
символы из определенного набора, такие как символы верхнего или нижнего
регистра, либо символы алфавита?
Если да:
- Вызовите функцию setlocale следующим образом:
setlocale(LC_ALL, "")
- Не делайте
предварительных предположений о принадлежности символов к одному из
наборов. Для проверки свойств символов применяйте соответствующие
системные функции.
- Все символы, с которыми
работает программа, относятся к однобайтовому набору?
Если да:
- В программе выполняется
преобразование регистра символов?
Если да:
- Вызовите функцию setlocale следующим образом:
setlocale(LC_ALL, "")
- Все символы, с которыми
работает программа, относятся к однобайтовому набору?
Если да:
- Используйте следующие
функции conv: _tolower,
_toupper,tolower, и toupper.
Если нет, то в тексте могут присутствовать многобайтовые символы:
- Программа отслеживает
движение курсора терминала tty?
Если да:
- Вызовите функцию setlocale следующим образом:
setlocale(LC_ALL, "")
- Вам может потребоваться
ширина столбцов символов. Воспользуйтесь функцией wcwidth или wcswidth.
- В программе применяются
функции посимвольного ввода-вывода?
Если да:
- Вызовите функцию setlocale следующим образом:
setlocale(LC_ALL, "")
- Все символы, с которыми
работает программа, относятся к однобайтовому набору?
Если да:
- Используйте следующие
функции:
Если нет:
- Используйте следующие
функции:
- Программа обрабатывает
массивы символов?
Если да:
- Все элементы массива
относятся к однобайтовому набору?
Если да:
- Не нужно вызывать
функцию setlocale(LC_ALL, "")
- Если p - указатель на
массив однобайтовых символов, для перехода к следующему элементу применяйте
оператор p++.
Если нет:
- В программе применяется
информация о максимальном размере кода символа набора?
Если да:
- В программе
форматируются числовые значения даты и времени?
Если да:
- В программе
форматируются числовые значения?
Если да:
- Программа форматирует
денежные значения?
Если да:
- В программе выполняется
поиск символов и строк?
Если да:
- Выполняется поиск
однобайтовых символов в тексте с однобайтовой кодировкой?
- Не нужно вызывать
функцию setlocale(LC_ALL, "")
- Для выполнения задачи
используйте стандартные функции работы со строками из библиотеки
libc, такие как strchr.
- Выполняется поиск
символов из диапазона 0x00-0x3F (набор уникальных кодовых знаков)
?
- Выполняется поиск
символов из диапазона 0x00-0xFF?
- Вызовите функцию setlocale следующим образом:
setlocale(LC_ALL, "")
- Существует два способа
решения задачи:
Используйте функцию mblen для пропуска многобайтовых
символов. При обнаружении однобайтовых символов проверяйте их на
совпадение с искомыми. См. пункт 2 таблицы.
или
Преобразуйте искомые символы и
строку, в которой выполняется поиск, в широкие символы и применяйте функции
поиска широких символов. Дополнительная информация об этом приведена в
разделах "Функции преобразования многобайтовых и широких символов" (Функции преобразования кода многобайтовых и широких символов) и Функции поиска в строках широких символов.
- Программа выполняет
сравнение строк с шаблонами регулярных выражений?
Если да:
- Программа запрашивает у
пользователя подтверждение или отказ?
Если да:
- В программе применяются
символы псевдографики?
Если да:
- Не используйте символы
какого-то определенного кодового набора, например, IBM-850.
- Вместо этого применяйте
символы и атрибуты, перечисленные в файле terminfo.
- Программа выполняет
обработку данных с учетом национальных языков, не описанную в этой таблице?
Если да:
- Сделайте все модули,
связанные с конкретными параметрами локали, внешними. Не включайте их в
исполняемую программу.
- Загружайте модули на
этапе выполнения с помощью таких системных функций, как load.
- Если средства
динамической загрузки модулей отсутствуют, применяйте статическую компоновку,
но организуйте подобные элементы программы в виде независимых модулей.
Остальные разделы справочной
таблицы относятся только к AIXwindows.
- Ваша клиентская
программа применяет метки, кнопки и другие виджеты для вывода сообщений,
которые могут быть переведены?
Если да:
- Ваша клиентская
программа использует файлы ресурсов AIXwindows для определения текста меток,
кнопок или текстовых виджетов?
Если да:
- Разместите все ресурсы,
которые требуется перевести, в одном каталоге.
- Для строк текста могут
применяться каталоги сообщений. Дополнительная информация приведена в
разделе Средства работы с сообщениями - Информация для программистов.
- Не используйте
переведенные названия цветов, так как они определены только для текущей
кодировки. Переносимые названия определены в переносимом наборе
символов.
- Поместите файлы
переведенных ресурсов в каталоги /usr/lib/X11/%L/app-defaults/%N,
где %L - имя локали, такое как fr_FR, а %N - имя
клиента.
- Определяется ли в
программе язык ввода с клавиатуры?
Если да:
- Вызовите функцию
*XtSetLanguageProc следующим образом:
XtSetLanguageProc(NULL, NULL, NULL);
- Для работы со всем
вводимым текстом используйте виджеты XmText и
XmTextField.
Некоторые аргументы виджета
XmText зависят от длины символа, а не от числа байт. Позиция
курсора соответствует позиции символа, а не позиции байта.
- Для локализации ввода
применяется виджет XmDrawingArea?
- Для обработки ввода на
разных языках используйте функции методов ввода. Дополнительная
информация приведена в разделе Методы ввода - Обзор и описании функции IMAuxDraw.
- В клиентском приложении
применяются списки переведенных текстовых меток, которые считываются из
отдельного файла, а не из файла ресурсов?
Если да:
- Программа включает
функции представления (рисование с использованием Xlib, печать, форматирование
и редактирование) двунаправленного текста?
Если да:
- Используйте виджеты
XmText и XmTextField из библиотеки Xm (Motif).
Они обеспечивают поддержку двунаправленного текста. Сведения об этом
можно найти в разделе "Layout (Bidirectional) Support in Xm
(Motif) Library" книги AIX 5L Version 5.1 AIXwindows
Programming Guide.
- Если библиотека Xm
недоступна, используйте функции начертания для переупорядочения и перерисовки
текста. Дополнительная информация об этом приведена в разделе Обзор функций библиотеки визуального представления текста.
- Сохраняйте и
обрабатывайте текст в неявной (логической) форме. Некоторые утилиты
(например, aixterm) поддерживают визуальную форму двунаправленного
текста, но большая часть функций NLS ее не поддерживает.
Если ни на один вопрос таблицы вы
не ответили положительно, то, скорее всего, программа не зависит от параметров
локали. В этом случае вы можете не вызывать функцию установки локали setlocale и функции работы с каталогами сообщений
catopen и catgets.
Ниже приведены рекомендации по
созданию информативных и кратких сообщений:
- Планируйте перевод всех
сообщений, включая те, которые выводятся на панелях.
- Храните сообщения
отдельно от приложения.
- Всегда предусматривайте
сообщения по умолчанию.
- Задавайте все сообщения
в файле сообщений целиком. Составление сообщений путем объединения
частей
затрудняет их перевод.
- Применяйте в исходном
файле сообщений директиву $len для управления максимальной длиной
текста сообщения. (Директива $len применяется в средствах
работы с сообщениями.)
- Предоставьте достаточную
область экрана для вывода переведенных сообщений. Переведенные
сообщения чаще оказываются длинней, чем исходные. В среднем после
перевода сообщения его длина увеличивается на 20-30%, хотя иногда оно
оказывается в два раза длиннее.
- Применяйте символьные
идентификаторы наборов и сообщений. Программы должны ссылаться на
сообщения с помощью этих идентификаторов, а не с помощью их реальных
номеров. (Символьные идентификаторы используются в рамках средств
работы с сообщениями.)
- Обеспечьте возможность
изменения порядка переменных %s путем их
нумерации. Это позволит переводчику строить предложения, используя
естественный порядок слов. Например, если для вывода сообщения на
английском языке вида The file %s is referenced in
%s две строки могут передаваться следующим образом:
printf(message_pointer, name1, name2)
В английском сообщении переменные %s пронумерованы
следующим образом:
The file %1$s is referenced in %2$s\n
При переводе порядок переменных может быть изменен:
%2$s содержит ссылку на файл %1$s\n
- Не используйте
sys_errlist[errno] для получения сообщений об ошибках. Это
противоречит требованию изоляции сообщений. Массив
sys_errlist[] содержит сообщения на английском языке. Вместо
этого вызывайте функцию strerror(errno)
, которая считывает сообщения из каталогов.
- Не используйте
sys_siglist[signo] для получения сообщений об ошибках. Это
противоречит требованию изоляции сообщений. Массив
sys_siglist[] содержит сообщения на английском языке. Вместо
этого, вызывайте функцию psignal()
, которая считывает сообщения из каталогов.
- Для упрощения
последующего изменения и перевода сообщений задавайте комментарии к
сообщениям.
- В общем случае для
каждой команды и утилиты рекомендуется создавать свой исходный файл или
каталог сообщений.
- Для описания синтаксиса команд
применяйте конструкцию "Формат:". Например, сообщение о
синтаксисе команды rm выглядит так:
Формат: rm [-firRe] [--] файл ...
- Выделяйте названия параметров
(например, файл, каталог, строка) в описании
формата вызова команды.
- Не сокращайте названия
параметров в командной строке: Например, параметр Num,
указанный какNumber, будет проще перевести.
- В сообщениях о формате команд
применяйте только следующие ограничительные символы:
[]
| Заключает необязательный параметр.
|
{}
| Заключает несколько параметров, один из которых должен быть указан
обязательно.
|
|
| Разделяет варианты значений параметра. Например, [a|b]
указывает, что вы можете выбрать a, b,
или ни a, ни b, а {a|b} указывает, что
необходимо задать a или b .
|
...
| Указывает, что последний параметр может повторяться. Перед
многоточием должен быть пробел.
|
-
| Обозначает стандартный ввод.
|
- Не заключайте в скобки
единственный обязательный параметр команды. Например:
banner Строка
- Если флаги в команде должны
разделяться, отделите их друг от друга пробелами и в описании формата
команды. Например:
unget [-n] [-rSID] [-s] {Файл|-}
- Не разделяйте флаги, которые
могут использоваться совместно. Например:
wc [-cwl] {Файл ...|-}
- Если порядок флагов не важен,
перечисляйте их в алфавитном порядке. Флаги в нижнем регистре
размещайте перед флагами в верхнем регистре. Например:
get -aAijlmM
- Разбивайте описание формата
команды на строки небольшой длины. Ниже приведен пример слишком длинной
строки:
Формат: get [-e|-k] [-cCutoff] [-iList] [-rSID] [-wString] [-xList] [-b] [-gmnpst] [-l[p]] File ...
Для того чтобы сообщения были
точно переведены, они должны быть простыми и ясными. Приведенные ниже
рекомендации по созданию сообщений затрагивают вопросы, связанные с
терминологией, пунктуацией, наклонением, залогом, временем, применением
заглавных букв, форматированием и т.д.
- Сообщения должны быть
краткими. Рекомендуется, чтобы сообщения укладывались в одно
предложение.
- Используйте законченные
предложения.
- В английском тексте на
забывайте правильно расставлять артикли (a, an, the).
- Начинайте предложение с
большой буквы и заканчивайте его точкой.
- Все сообщения должны быть в
настоящем времени. Не используйте будущее время. Например, лучше
писать
Команда cal показывает календарь.
вместо
Команда cal покажет календарь.
- Не используйте сообщения от
первого лица (я, мы).
- Старайтесь не использовать
второе лицо (вы), за исключением справок и текстов диалога.
- Используйте действительный
залог. Ниже приведен пример предложения в страдательном залоге, которое
может быть записано в действительном:
Страдательный: месяц и год должны быть заданы в числовом формате.
Действительный: задайте месяц и год в числовом формате.
- Используйте повелительное
наклонение и глаголы в активной форме, например: задайте, используйте,
проверьте, выберите, подождите.
- Формулируйте сообщения в
позитивной форме. Ниже показан пример сообщения с отрицанием, которое
можно записать в позитивной форме:
Негативное: не используйте опцию f более одного раза.
Позитивное: укажите флаг -f только один раз.
- Используйте слова только в
тех формах, которые указаны в словаре. Если сказано, что слово -
существительное, не используйте его как глагол.
- Не используйте приставки и
суффиксы. Слова с приставками пере-, пре-,
де- и не- могут быть неправильно поняты переводчиком, и
переведенное сообщение утратит исходный смысл. Исключение составляют
приставки, входящие в широко используемые слова. Например, допустимы
слова разблокировать и несущественный, но не слово
перекомпиляция.
- Не используйте скобки для
обозначения единственного и множественного числа, например,
ошибка(ки), так как такие конструкции сложно переводить.
Если нужно подчеркнуть, что возможно и единственное, и множественное число,
пишите ошибка или ошибки. Другой способ - выводить различные
сообщения для единственного и множественного числа.
- Не используйте
сокращения.
- Не используйте кавычки, как
одинарные, так и двойные. Не заключайте в кавычки команды и переменные,
такие как %s, %c и
%d. Пользователи не всегда правильно
интерпретируют кавычки.
- Не переносите слова в
сообщениях.
- Не пользуйтесь стандартными
способами выделения слов в сообщениях вместо выделения заглавными
буквами. (К стандартным способам относится выделение команд полужирным
шрифтом, переменных и параметров - курсивом, а примеров - непропорциональным
шрифтом.)
- Не применяйте конструкцию
"и/или". В ряде языков ее не существует. Обычно лучше
сказать или, чтобы показать, что не обязательно выполнять оба
действия.
- Указывайте время в 24-часовом
формате. Не записывайте время в 12-часовом формате с уточнением "утра"
или "вечера". Например, вместо 7:00 вечера
напишите 19:00.
- Избегайте сокращений.
Применяйте сокращение только в том случае, когда оно известно лучше, чем
полная версия названия. Не образовывайте множественное число от
сокращений. Перед использованием сокращения убедитесь, что оно не
является товарным знаком.
- Не используйте составные
сообщения. Для динамического формирования сообщения применяйте флаги и
другие способы передачи данных.
- Не применяйте
статический текст в качестве значения переменной %s в
сообщении.
- Заканчивайте последнюю строку
сообщения символом \n (перевод строки). Это также
относится к однострочным сообщениям.
- Начинайте вторую и все
последующие строки сообщения с символа \t
(табуляция).
- Заканчивайте все остальные
строки символом \n\ (перевод строки).
- Явно указывайте символ
новой строки между словами для форматирования текста длинных сообщений.
Функция printf не выполняет переноса строк по словам, разбивая
текст по ширине окна - при этом слово может оказать разбитым на две
части.
- Если по какой-либо причине
сообщение не должно оканчиваться символом новой строки, запишите это в
комментарии.
- В начале каждого сообщения
указывайте имя команды, которая его отправила, с двоеточием. Ниже
приведен пример сообщения, содержащего имя команды:
OPIE "foo: Выполняется открытие файла."
- Если требуется, чтобы
пользователь нажал определенную клавишу, используйте сообщения вида
Нажмите клавишу ------ с указанием требуемой
клавиши. Например:
Нажмите клавишу Ctrl-D
- Не пользуйтесь
сообщениями типа Повторите операцию позже, за исключением ситуаций,
в которых система перегружена. Необходимость повтора операции обычно
понятна из сообщения.
- Слово "параметр" должно
обозначать текст в командной строке, "значение" - числовые данные, а
"командная строка" - команду со всеми параметрами.
- Не используйте
разделители порядков. Например, пишите1000 вместо
1.000.
- Если нужно выделить
сообщение с помощью символов * (звездочка), поставьте две звездочки
в начале сообщения и две - в конце. Например:
** Итого **
- Используйте глагольные
конструкции для обозначения входа в систему и выхода из системы.
Например:
Войдите в систему, введите данные и выйдите из системы.
- Используйте
существительные для обозначения идентификаторов пользователей, групп и
приглашения для входа в систему. Например:
Имя пользователя: sam.
Имя группы: staff.
Каталог входа в систему: /u/sam.
- Не используйте термин
"суперпользователь". Имейте в виду, что пользователь root может не
обладать всеми правами доступа.
- По возможности
используйте стандартные сообщения из следующей таблицы:
Стандартное сообщение
| Нежелательный вариант
|
Невозможно найти или
открыть файл.
| Не могу открыть файл.
|
Файл не существует или
недоступен.
| Нет доступа к файлу
|
Параметр содержит
синтаксическую ошибку.
| ошибка синтаксиса
|
Глава 16, Поддержка национальных языков . Обзор локалей, Изменение языковой среды и Изменение
локали в книге Руководство по управлению системой AIX 5L версии
5.1: Операционная система и устройства.
Кодовые наборы - Обзор
Поддержка национальных языков в книге Руководство
по управлению системой AIX 5L версии 5.1: Операционная система и
устройства.
Команды chlang, dspcat, dspmsg,
gencat, localedef, lslpp, mkcatdefs и runcat в книге AIX 5L Version 5.1
Commands Reference.
Стратегия кодовых наборов в руководстве AIX 5L Version 5.1 Kernel
Extensions and Device Support Programming Concepts.
Character Set Description (charmap) source file
format, Locale Definition source file format в книге
AIX 5L Version 5.1 Files Reference.
Файл environment в книге AIX 5L
Version 5.1 Files Reference.
[ Страница назад | Страница вперед | Содержание | Индекс |
Библиотека |
Юридическая информация |
Поиск ]