Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

"POT-Creation-Date: 2003-07-14 18:46-0700\n"

"PO-Revision-Date: 2003-07-14 19:00+8\n"

"Last-Translator: Arnold Robbins <arnold@example.com>\n"

"Language-Team: Pig Latin <piglat@li.example.org>\n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=ASCII\n"

"Content-Transfer-Encoding: 8bit\n"

#: ch13-echodate.с:19

msgid "Enter a Date/time as YYYY/MM/DD HH:MM:SS : "

msgstr "Enteray A Ateday/imetay asay YYYY/MM/DD HH:MM:SS : "

#: ch13-echodate.c:32

#, c-format

msgid "Got: %s"

msgstr "Otgay: %s"

Хотя

можно было бы произвести линейный поиск в переносимом объектном файле, такой поиск был бы медленным. Например, в
gawk
имеется примерно 350 отдельных сообщений, а в GNU Coreutils — свыше 670. Линейный поиск в файле с сотнями сообщений был бы заметно медленным. Поэтому GNU
gettext
использует для быстрого поиска сообщений двоичный формат. Сравнение осуществляет
msgfmt
, выдавая объектный файл сообщений:

$ msgfmt piglat.po -о piglat.mo

При сопровождении программы изменяются строки, используемые программой: добавляются новые, другие удаляются или изменяются. По крайней мере, может измениться положение строки в исходном файле. Таким образом, файлы переводов

.ро
, вероятно, устареют. Программа
msgmerge
объединяет старые файлы переводов с новым файлом
.pot
. Затем результат может быть обновлен. Этот пример выполняет объединение и повторное компилирование:

$ msgmerge piglat.po echodate.pot -o piglat.new.po /* Объединить файлы */

$ mv piglat.new.po piglat.po /* Переименовать результат */

$ vi piglat.po /* Модернизировать перевод */

$ msgfmt piglat.po -o piglat.mo /* Восстановить файл .mo */

Откомпилированные файлы

.mo
помещаются в файл
base/locale/category/textdomain.mo
. На системах GNU/Linux
base
является
/usr/share/locale
.
locale
является обозначением языка, например, '
es
', '
fr
' и т.д.
category
является категорией локали; для сообщений это
LC_MESSAGES
.
textdomain
является текстовым доменом программы, в нашем случае это
echodate
. В качестве реального примера в
/usr/share/locale/es/LC_MESSAGES/coreutils.mo
находится перевод GNU Coreutils на испанский.

Функция

bindtextdomain
изменяет в местоположении часть
base
. В
ch13-echodate.c
мы меняем ее на '
.
'. Таким образом, нужно создать соответствующие каталоги и поместить туда перевод на свинский латинский:

$ mkdir -р en_US/LC_MESSAGES /* Нужно использовать реальную локаль */

$ cp piglat.mo en_US/LC_MESSAGES/echodate.mo /* Поместить файл в нужное место */

Должна использоваться реальная локаль [148] ; мы «притворяемся» использующими "

en_US
". Разместив перевод, устанавливаем соответствующим образом
LC_ALL
, скрещиваем пальцы и запускаем программу:

148

Мы тщетно потратили 30 или 45 минут, пытаясь использовать каталог

piglat/LC_MESSAGES
и установку
LC_ALL=piglat
' без всякого успеха, пока не выяснили это — Примеч. автора.

$ LC_ALL=en_US ch13-echodate /*
Запуск программы */

Enteray A Ateday/imetay asay YYYY/MM/DD HH:MM:SS : 2003/07/14 21:19:26

Otgay: Mon Jul 14 21:19:26 2003

Последнюю версию GNU

gettext
можно найти в каталоге дистрибутива GNU
gettext
. [149]

Этот раздел лишь слегка коснулся поверхности процесса локализации. GNU

gettext
предоставляет множество инструментов для работы с переводами, и в особенности для облегчения поддержания современности переводов по мере развития исходного кода программы. Процесс ручного обновления переводов осуществим, но утомителен. Эта задача легко автоматизируется с помощью
make
; в частности, GNU
gettext
хорошо интегрируется для обеспечения этой возможности с Autoconf и Automake, снимая с программиста значительный груз по разработке.

149

ftp://ftp.gnu.org/gnu/gettext
Примеч. автора.

Рекомендуем прочесть документацию GNU

gettext
, чтобы больше узнать как об этих проблемах в частности, так и о GNU
gettext
в общем.

13.4. Не могли бы вы произнести это для меня по буквам?

В самые ранние дни вычислительной техники различные системы назначали различные соответствия между числовыми значениями и глифами (glyphs) — символами, такими, как буквы, цифры и знаки пунктуации, используемыми для общения с людьми. В конечном счете появились два широко использующихся стандарта: кодировка EBCDIC, используемая IBM и подобными ей мэйнфреймами, и ASCII, использующаяся для всего остального. Сегодня, за исключением мэйнфреймов, ASCII является основой для всех других использующихся наборов символов.

Оригинальный семиразрядный набор символов ASCII достаточен для американского английского и большинства знаков пунктуации и специальных символов (таких, как

$
, но нет символа для «цента»). Однако, имеется много языков и много стран, которым нужны другие наборы символов. ASCII не оперирует версиями романских символов с надстрочными значками, использующимися в Европе, а во многих азиатских языках тысячи символов. Для устранения этих недостатков были разработаны новые технологии.

Литература по интернационализации изобилует ссылками на три фундаментальных термина. Определив их и взаимоотношения между ними, мы сможем представить общее описание соответствующих функций API С.

Набор символов (character set)

Определение значений, присваиваемых различным целым величинам; например того, что A равно 65. Любой набор символов, использующий более восьми битов на символ, называется многобайтным набором символов.

Представление набора символов (character set encoding)

ASCII использует для представления символов один байт. Таким образом, целое значение хранится само по себе, непосредственно в дисковых файлах. Более современные наборы символов, особенно различные версии Unicode [150] , используют для представления символов 16-разрядные или даже 32-разрядные целые значения. Для большинства определенных символов один, два или даже три старших байта целого значения равны нулю, что делает непосредственное хранение таких значений на диске неэффективным. Представление набора символов описывает механизм для преобразования 16- или 32-разрядных значений в последовательности от одного до шести байтов для сохранения на диске таким образом, что в целом наблюдается значительная экономия дисковой памяти.

150

http://www.unicode.org
Примеч. автора.

Поделиться:
Популярные книги

(Противо)показаны друг другу

Юнина Наталья
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
(Противо)показаны друг другу

Школа Семи Камней

Жгулёв Пётр Николаевич
10. Real-Rpg
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Школа Семи Камней

Кодекс Охотника. Книга XXVI

Винокуров Юрий
26. Кодекс Охотника
Фантастика:
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXVI

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Не грози Дубровскому! Том V

Панарин Антон
5. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том V

Я не князь. Книга XIII

Дрейк Сириус
13. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я не князь. Книга XIII

Машенька и опер Медведев

Рам Янка
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Машенька и опер Медведев

Деспот

Шагаева Наталья
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Деспот

6 Секретов мисс Недотроги

Суббота Светлана
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
6 Секретов мисс Недотроги

Возвращение

Жгулёв Пётр Николаевич
5. Real-Rpg
Фантастика:
боевая фантастика
рпг
альтернативная история
6.80
рейтинг книги
Возвращение

Идущий в тени 8

Амврелий Марк
8. Идущий в тени
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Идущий в тени 8

Неудержимый. Книга XVIII

Боярский Андрей
18. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVIII

Идеальный мир для Социопата 2

Сапфир Олег
2. Социопат
Фантастика:
боевая фантастика
рпг
6.11
рейтинг книги
Идеальный мир для Социопата 2

Заставь меня остановиться 2

Юнина Наталья
2. Заставь меня остановиться
Любовные романы:
современные любовные романы
6.29
рейтинг книги
Заставь меня остановиться 2