Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 [ 75 ] 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

Ниже описаны классы, непосредственно реализующие перевод строк сообще-

ний.

NullTranslations( [fp])

Этот класс реализует основной интерфейс, и используется в качестве базового класса для остальных классов-переводчиков. При инициализации устанавливает "защищенные" атрибуты info и charset созданного экземпляра равными None и, если задан и не равен None аргумент fp, вызывает метод parse( fp) , который должен быть переопределен в производных классах.

Экземпляры NullTranslations имеют следующие методы:

parse( fp)

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

find( domain [, localedir [, languages]])

Эта функция реализует стандартный алгоритм поиска .mo-файлов для домена domain в каталоге localedir для языков, перечисленных в строке languages (по умолчанию используется значение одной из переменных окружения: LANGUAGE, LC ALL, LC MESSAGES или LANG). Строка languages (или одна из перечисленных переменных окружения) должна содержать список через двоеточие кодов языков в порядке убывания их приоритета. Функция find() возвращает путь к .mo-файлу, из которого следует брать перевод сообщения. Если ни один из файлов не найден, возвращает None.

translation( domain [, localedir [, languages [, class ]]])

Catalog( domain [, localedir [, languages [, class ]]])

Возвращает объект, реализующий перевод сообщений. Аргументы domain, localedir и languages передаются функции find() для поиска нужного .mo-файла. Возвращаемый объект является экземпляром класса class (по умолчанию используется GNUTranslations). Конструктор класса вызывается с одним аргументом - файловым объектом, реализующим доступ к .mo-файлу. Если .mo-файл не найден, генерируется исключение IOError. Функция translation() кэширует созданные объекты и использует их при повторных запросах объекта для того же .mo-файла.

Имя Catalog() определено для совместимости с версией модуля gettext, которую использует GNOME.

install( domain [, localedir [, unicode]])

Эквивалентно вызову translation(domain, localedir).install(unicode) . Эта функция предоставляет самый простой способ установить функцию () , реализующую перевод сообщений. Для удобства () устанавливается в пространство встроенных имен и, таким образом, доступна во всех модулях, используемых приложением.



17.2. gettext - выдача сообщений на родном языке 243

gettext( message)

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

ugettext( message)

В базовом классе возвращает сообщение message в виде строки Unicode. В производных классах должен возвращать перевод сообщения в виде строки Unicode.

info()

Возвращает значение "защищенного" атрибута info (метаданные каталога в виде словаря).

charset()

Возвращает значение "защищенного" атрибута charset (кодировка перевода сообщений в каталоге).

install( [unicode])

Если аргумент unicode опущен или является ложью, устанавливает собственный метод gettext() в пространство встроенных имен под именем () , в противном случае устанавливает собственный метод ugettext() .

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

def gettext(message): return message

import builtin

if hasattr( builtin , psl):

# Используется интерактивный режим

= gettext elif not hasattr( builtin , ):

builtin . = gettext

Это также позволит обеспечить корректную работу (без перевода сообщений) при импортировании модуля в интерактивном режиме.

Модуль gettext также определяет класс GNUTranslations, производный от NullTranslations . Этот класс переопределяет метод parse() , обеспечивая чтение .mo -файлов в формате GNU gettext (как big-endian, так и little-endian). Он также анализирует метаданные каталога и сохраняет их в "защищенном" атрибуте экземпляра info. Если каталог содержит запись с ключом Content-Type, то указанная в ней кодировка сохраняется в "защищенном" атрибуте charset.

Если .mo оказывается поврежденным, при инициализации экземпляра GNUTranslations будет сгенерировано исключение IOError.



17.2.3 Изготовление каталога переведенных сообщений

Для того, чтобы подготовить код на языке Python к интернационализации, необходимо взглянуть на строки в Вашем файле. Все строки, подлежащие переводу, должны быть записаны литерально и использоваться в качестве аргумента функции () . Например:

filename = mylog.txt

message = (writing a log message)

fp = open(filename, w)

fp.write(message)

fp.closeO

Здесь строка writing a log message помечена как подлежащая переводу, в то время как mylog.txt и w -нет.

В стандартную поставку Python включена утилита pygettext, которая извлекает строки, подлежащие переводу, из файла с исходным кодом и помещает их в .pot-файл4. Именно с этим файлом работает человек, выполняющий перевод. С помощью утилит пакета GNU gettext Вы можете изготовить .mo-файл, который читается экземплярами класса GNUTranslations.

Аналогичную работу выполняет программа xpot, доступная в пакете po-utils по адресу http: www.iro.umontreal.ca/contrib/po-utils/HTML.

Класс GNUTranslations также переопределяет методы gettext() и ugettext(). Последний передает атрибут charset встроенной функции unicode() для получения строки Unicode.

ОС Solaris определяет собственный формат .mo-файлов, который в настоящее время не поддерживается.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 [ 75 ] 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145