Linux программирование в примерах - Страница 202

Изменить размер шрифта:

Переходя к созданию переводов, первым шагом является извлечение переводимых строк. Это осуществляется программой

xgettext
:

$ xgettext --keyword=_ --keyword=N_

> --default-domain=echodate ch13-echodate.с

Опции

--keyword
сообщает
xgettext
, что нужно искать макросы
_()
и
N_()
. Программа уже знает, как извлекать строки из
gettext()
и ее вариантов, а также из
gettext_noop()
.

Вывод

xgettext
называется переносимым объектным файлом. Имя файла по умолчанию
messages.ро
, что соответствует текстовому домену по умолчанию
"messages"
. Опция
--default-domain
обозначает текстовый домен для использования в имени выходного файла. В данном случае, файл назван
echodate.ро
. Вот его содержание:

# SOME DESCRIPTIVE TITLE. /* Шаблон, нужно отредактировать */

# Copyright (С) YEAR THE PACKAGE'S COPYRIGHT HOLDER

# This file is distributed under the same license as the PACKAGE package.

# FIRST AUTHOR <[email protected]>, YEAR.

#

#, fuzzy

msgid "" /* Подробная информация */

msgstr "" /* Заполняет каждый переводчик */

"Project-Id-Version: PACKAGE VERSIONn"

"Report-Msgid-Bugs-To: n"

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

"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONEn"

"Last-Translator: FULL NAME <[email protected]>n"

"Language-Team: LANGUAGE <[email protected]>n"

"MIME-Version: 1.0n"

"Content-Type: text/plain; charset=CHARSETn"

"Content-Transfer-Encoding: 8bitn"

#: ch13-echodate.c:19 /* Местоположение сообщения */

msgid "Enter a Date/time as YYYY/MM/DD HH:MM:SS : " /* Оригинальное

                                                       сообщение */

msgstr "" /* Здесь перевод */

#: ch13-echodate.с:32 /* To же самое для каждого сообщения */

#, с-format

msgid "Got: %s"

msgstr ""

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

.pot
(portable object template — переносимый объектный шаблон):

$ mv echodate.ро echodate.pot

He владея свободно несколькими языками, мы решили перевести сообщения на свинский латинский. Следующим шагом является создание перевода. Это осуществляется копированием файла шаблона и добавлением к новой копии перевода:

$ cp echodate.pot piglat.po

$ vi piglat.po /* Добавить переводы, используя любимый редактор */

Имя по соглашению должно быть

язык.po
, где
язык
является стандартным международным сокращением из двух или трех букв для обозначения языка. Иногда используется форма
язык_страна.po
: например,
pt_BR.po
для португальского в Бразилии. Поскольку свинский латинский не является настоящим языком, мы назвали файл
piglat.ро
.[147] Вот содержание после добавления перевода:

# echodate translations into pig Latin

# Copyright (C) 2004 Prentice-Hall

# This file is distributed under the same license as the echodate package.

# Arnold Robbins <[email protected]> 2004

#

#, fuzzy

msgid ""

msgstr ""

"Project-Id-Version: echodate 1.0n"

"Report-Msgid-Bugs-To: [email protected]n"

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

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

"Last-Translator: Arnold Robbins <[email protected]>n"

"Language-Team: Pig Latin <[email protected]>n"

"MIME-Version: 1.0n"

"Content-Type: text/plain; charset=ASCIIn"

"Content-Transfer-Encoding: 8bitn"

#: 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
, выдавая объектный файл сообщений:

Оригинальный текст книги читать онлайн бесплатно в онлайн-библиотеке Knigger.com