Online Documentation Server
 ПОИСК
ods.com.ua Web
 КАТЕГОРИИ
Home
Programming
Net technology
Unixes
Security
RFC, HOWTO
Web technology
Data bases
Other docs

 

 ПОДПИСКА

 О КОПИРАЙТАХ
Вся предоставленная на этом сервере информация собрана нами из разных источников. Если Вам кажется, что публикация каких-то документов нарушает чьи-либо авторские права, сообщите нам об этом.




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

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

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

  • Перевод сообщений программы на национальный язык.
  • Присвоение значения категории локализации LC_MESSAGES и/или переменной LANG.
  • Перевод описания программы для man.

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

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

  • выбранный пользователем язык сообщений,
  • имя исполняемой программы,
  • конкретное сообщение в программе.

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

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

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

  • X/Open XPG3/XPG4 (с функцииями catopen(), catgets(),catclose() и утилитой gencat)
  • SUN XView (с функциями gettext(), textdomain() ) См. статью и пример реализации GNU gettext.

В наиболее широко распространенной реализации 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



With any suggestions or questions please feel free to contact us