NLS. Сообщения на родном языке.

Ранее уже упоминалась возможность получения сообщений и работы с программой на родном языке. Такая возможность существует, и даннное средство называется NLS (National (или Native) Language Support).

"Национализация" в действительности включает в себя несколько аспектов :


Чтобы организовать работу с сообщениями программы и дать возможность переводить их на другие языки, было введено такое понятие, как message catalog ( каталог сообщений ). Каталог сообщений хранится отдельно от программы. Естественно, каждая программа может ( и должна ! ) вести свой собственный каталог сообщений, а система NLS предоставляет средства для поддержки корректной работы. Большинство программ, а также системные библиотеки (libc и т.д.) используют NLS и их сообщения могу быть переключены на другой язык.

Message catalog - это фактически база данных, выборка из которой происходит по ключам :

В результате, на выходе, мы получаем строку конкретного сообщения конкретной программы на нужном нам языке.

Система NLS предоставляет набор стандартных библиотечных вызовов для работы с каталогами сообщений и набор утилит для создания и поддержания этих каталогов (базы).

В настоящее время существут две основных реализации NLS :

В наиболее широко распространенной реализации XPG4 всем сообщениям программы присваивается определенный номер, который служит индексом для поиска текстовой строки в message catalog-е. Кроме того может существовать несколько наборов (sets) сообщений внутри одного каталога.

Для поиска самих message catalog-ов от данной программы используется переменная окружения NLSPATH .


Пример (XPG4):

Данный пример демонстрирует три этапа получения сообщения из каталога:

  1. Исходный текст message catalog-a
  2. Компиляция message catalog-а
  3. Использование message catalog-a

1. Исходный текст message catalog-a:

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"

 

2. Компиляция message catalog-а :

Полученный файл обрабатывается утилитой gencat для получения файла каталога .msg .

ПРИМЕЧАНИЕ: Здесь рассматривается исходная XPG4 версия, однако входящая в состав Linux libc Linux gencat отличается ключами командной строки и имеет дополнительные возможности (не POSIX). В частности, используя символ # можно определять костанты для генерации *.h файлов. (см. tutorial )

$ gencat example.cat example.msg

3. Пример использования message catalog-a :

/* 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