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 (libc5) Linux gencat отличается ключами командной строки и имеет дополнительные возможности (не XPG). В частности, используя символ # можно определять костанты для генерации *.h файлов. (см. tutorial ). Однако в GNU libc (libc6) все приведено в соответствие с XPG (см. glibc FAQ).

$ 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

Содержание "Locale AS IT IS"


Last change : 22-04-2003