Ранее уже упоминалась возможность получения сообщений и работы с программой на родном языке. Такая возможность существует, и даннное средство называется NLS (National (или Native) Language Support).
"Национализация" в действительности включает в себя несколько аспектов :
Чтобы организовать работу с сообщениями программы и дать возможность переводить их на другие языки, было введено такое понятие, как message catalog ( каталог сообщений ). Каталог сообщений хранится отдельно от программы. Естественно, каждая программа может ( и должна ! ) вести свой собственный каталог сообщений, а система NLS предоставляет средства для поддержки корректной работы. Большинство программ, а также системные библиотеки (libc и т.д.) используют NLS и их сообщения могу быть переключены на другой язык.
Message catalog - это фактически база данных, выборка из которой происходит по ключам :
В результате, на выходе, мы получаем строку конкретного сообщения конкретной программы на нужном нам языке.
Система NLS предоставляет набор стандартных библиотечных вызовов для работы с каталогами сообщений и набор утилит для создания и поддержания этих каталогов (базы).
В настоящее время существут две основных реализации NLS :
В наиболее широко распространенной реализации XPG4 всем сообщениям программы присваивается определенный номер, который служит индексом для поиска текстовой строки в message catalog-е. Кроме того может существовать несколько наборов (sets) сообщений внутри одного каталога.
Для поиска самих message catalog-ов от данной программы используется переменная окружения NLSPATH .
Данный пример демонстрирует три этапа получения сообщения из каталога:
example.msg file:
$quote " $ every message catalog should have a beginning set number. $set 1 This is the set 1 of messages 1 "Hello world\n" 2 "Good Morning\n" 3 "example: 1000.220 Read permission is denied for the file %s.\n" $set 2 1 "Howdy\n" |
Полученный файл обрабатывается утилитой gencat для получения файла каталога .msg .
ПРИМЕЧАНИЕ: Здесь рассматривается исходная XPG4 версия, однако входящая в состав Linux libc Linux gencat отличается ключами командной строки и имеет дополнительные возможности (не POSIX). В частности, используя символ # можно определять костанты для генерации *.h файлов. (см. tutorial )
$ gencat example.cat example.msg
/* X/Open XPG4 message catalog test */ #include <locale.h> #include <nl_types.h> char *MF_EXAMPLE = "example.cat"; main() { nl_catd catd; int error; (void)setlocale(LC_ALL, ""); catd = catopen(MF_EXAMPLE, 0); /* Get the message number 1 from the first set.*/ printf( catgets(catd,1,1,"Hello world\n") ); /* Get the message number 1 from the second set.*/ printf( catgets(catd, 2, 1,"Howdy\n") ); /* Display an error message. No message 4 in set 1.*/ printf( catgets(catd, 1, 4,"example: 100.220 Permission is denied to read the file %s.\n"), MF_EXAMPLE); catclose(catd); }
$ cc -o example example.c
$ export NLSPATH=%N
-- (не забыть поменять назад)
$ ./example