Отправляет email-рассылки с помощью сервиса Sendsay

GNU gettext кодировки

Здравствуйте!

Каким образом можно изменить кодировку уже существующего *.po файла?
Дело в том, что у меня есть pot (*.po) файл в UTF-8, а хостеры эту кодировку

не поддерживают, им видите ли cp1251 подавай. Ведь не переписывать же весь
перевод заново.

Спасибо за внимание!

Ответить   Wed, 27 Jul 2005 23:07:01 +0400 (#408480)

 

Ответы:

В сообщении от 1122494821 секунд после начала Эпохи Vladimir B. Tsarkov
написал(а):

$ iconv -f UTF-8 -t cp1251 < старый.po > новый.po

А причем тут хостеры? Для чего им cp1251? Где они ее должны видеть?
Вообще к чему этот перевод?

Ответить   Konstantin Korikov Wed, 27 Jul 2005 22:40:44 +0300 (#408530)

 

Здравствуйте!

Спасибо всем откликнувшимся!

Спасибо, то что нужно!

Есть у меня PHP скрипт, использующий gettext. Когда я работаю с русским языком

у себя на машине, все нормально (использую UTF-8), а когда ставлю на сервер к

хостерам, русский шрифт становится нечитаемым. Как они говорят, умолчальная
кодировка у них "win-1251", а если что изменить надо, то им просят писать, в

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

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

P. S. Воспользовался советом и перекодировав pot файл в cp1251, создал на его

основе mo. Закачал изменения на сервер, прописал в нужных местах cp1251. И...

Не работает (кракозябры). Потом взял и прописал вместо cp1251, win-1251, хотя

это менее правильно, насколько я знаю. Потом зашел на страницу с программой и

установил кодировку обозревателя в win-1251. Не работает (кракозябры).
Установил кодировку koi8-r. Заработало. :) Как можно прокомментировать все
это?

Ответить   Fri, 29 Jul 2005 00:24:18 +0400 (#409189)

 

В сообщении от 1122585858 секунд после начала Эпохи Vladimir B. Tsarkov
написал(а):

По моему хостеры все делают правильно. Вить вы вправе указывать любую
кодировку какую захотите в заголовке HTTP-ответа. В PHP это выглядит
примерно:

header("Content-Type: text/html; charset=ваша_кодировка");

Если оригинальные строки (те что передаются функции gettext) вы пишите
на русском, то учтите, что если словарь с переводом не будет задан или
будет не найден, то функция gettext возвратит оригинальную строку в той
же кодировке (т.е. без преобразования).

po-файлы пишите в любой удобной вам кодировке, если оригинальные строки
на английском. Если оригинальные строки на русском, po-файлы должны
быть в той же кодировке что и оригинальные строки. Независимо от того в
какой кодировке вы пишите po-файлы, в их заголовках должна быть
правильно указана их кодировка.

Как я уже говорил, указывайте правильную кодировку в заголовке
HTTP-ответа, а также в заголовке HTML-документа.

Для того чтобы на результат функции gettext не повлияло возможно не
подходящее вам окружение сервера, используйте:

bind_textdomain_codeset(домен, нужная_кодировка);

нужная_кодировка - это кодировка, которая указана в в заголовке
HTTP-ответа и в заголовке HTML-документа, и если оригинальные строки у
вас на русском, то это всё должна быть одна кодировка - та, в которой
оригинальные строки.

Ответить   Konstantin Korikov Fri, 29 Jul 2005 02:02:22 +0300 (#409234)

 

Здравствуйте!

Оригинальные строки у меня на английском. Испробовал все, что только можно. Не

получается, сплошные кракозябры. Разве что, может быть, надо было
bind_textdomain_codeset(); прописать после вызова bindtextdomain().

Ответить   Fri, 29 Jul 2005 12:44:13 +0400 (#409454)

 

В сообщении от 1122630253 секунд после начала Эпохи Vladimir B. Tsarkov
написал(а):

Значит не судьба...

bindtextdomain(домен, каталог);
textdomain(домен);
bind_textdomain_codeset(домен, кодировка);

Советую почитать

$ info gettext

Ответить   Konstantin Korikov Fri, 29 Jul 2005 16:05:25 +0300 (#409618)

 

On Wed, 27 Jul 2005 23:07:01 +0400
"Vladimir B. Tsarkov" <bv***@l*****.ru> wrote:

А вы уверены в корявости выводимых сообщений?
Вообще то gettext должен перегонять кодировку сообщений в системную на
лету. Есть в pot строка
"Content-Type: text/plain; charset=KOI8-U\n"?
Но если практика показывает обратное, то читаем:
# info "(gettext)Charset conversion"
File: gettext.info, Node: Charset conversion, Next: Plural forms, Prev: Locating
Catalogs, Up: gettext

How to specify the output character set `gettext' uses
`gettext' not only looks up a translation in a message catalog. It
also converts the translation on the fly to the desired output character
set. This is useful if the user is working in a different character set
than the translator who created the message catalog, because it avoids
distributing variants of message catalogs which differ only in the
character set.

The output character set is, by default, the value of `nl_langinfo
(CODESET)', which depends on the `LC_CTYPE' part of the current locale.
But programs which store strings in a locale independent way (e.g.
UTF-8) can request that `gettext' and related functions return the
translations in that encoding, by use of the `bind_textdomain_codeset'
function.

Note that the MSGID argument to `gettext' is not subject to
character set conversion. Also, when `gettext' does not find a
translation for MSGID, it returns MSGID unchanged - independently of
the current output character set. It is therefore recommended that all
MSGIDs be US-ASCII strings.

- Function: char * bind_textdomain_codeset (const char *DOMAINNAME,
const char *CODESET)
The `bind_textdomain_codeset' function can be used to specify the
output character set for message catalogs for domain DOMAINNAME.
The CODESET argument must be a valid codeset name which can be used
for the `iconv_open' function, or a null pointer.

If the CODESET parameter is the null pointer,
`bind_textdomain_codeset' returns the currently selected codeset
for the domain with the name DOMAINNAME. It returns `NULL' if no
codeset has yet been selected.

The `bind_textdomain_codeset' function can be used several times.
If used multiple times with the same DOMAINNAME argument, the
later call overrides the settings made by the earlier one.

The `bind_textdomain_codeset' function returns a pointer to a
string containing the name of the selected codeset. The string is
allocated internally in the function and must not be changed by the
user. If the system went out of core during the execution of
`bind_textdomain_codeset', the return value is `NULL' and the
global variable ERRNO is set accordingly.

Т. е. или тупо забиваем кодировку вызовом ф-ции, или, что более культурно,
получаем ее значение из переменных окружения. Каких? Не знаю ;).
Пусть кто-то подскажет.

Ответить   Matvey Thu, 28 Jul 2005 00:18:09 +0300 (#408546)

 

В сообщении от 1122499089 секунд после начала Эпохи Matvey написал(а):

LANG

Ответить   Konstantin Korikov Thu, 28 Jul 2005 03:08:58 +0300 (#408582)

 

On Thu, 28 Jul 2005 03:08:58 +0300
Konstantin Korikov <lostcl***@u*****.fm> wrote:

$ echo $LANG
uk_UA
?

]$ set|grep -i koi
KBCHARSET=koi8-u
MPAGE=-CKOI8-U
RPM_INSTALL_LANG=ru_RU.KOI8-R:uk_UA:uk:en_US:en

Мне почему-то не внушает доверия ни одна из них. Может,
не в окружении надо смотреть? Никогда не задумывался над
этой проблемой.

Ответить   Matvey Thu, 28 Jul 2005 09:15:06 +0300 (#408667)

 

В сообщении от 1122531306 секунд после начала Эпохи Matvey написал(а):

$ LANG=uk_UA locale charmap

?

$ LANG=ru_RU locale charmap

?

$ LANG=en_US locale charmap

?

$ LANG=uk_UA.UTF-8 locale charmap

?

LANG задает используемую локаль. Кодировка - одно из свойств локали.

Ответить   Konstantin Korikov Thu, 28 Jul 2005 15:16:21 +0300 (#408981)

 

On Thu, 28 Jul 2005 15:16:21 +0300
Konstantin Korikov <lostcl***@u*****.fm> wrote:

KOI8-U
.....
Ну и дальше по тексту. Идею понял.

Но если LC_* - переменные окружения, то почему их не отдал set?

Ответить   Matvey Thu, 28 Jul 2005 20:17:07 +0300 (#409490)

 

В сообщении от 1122571027 секунд после начала Эпохи Matvey написал(а):

Это не переменные окружения, это категории локали (Locale Category).
Эти категории можно переопределять используя одноименные переменные
окружения, или используя вызов setlocale() в программах на C c
соответствующими аргументами.

Ответить   Konstantin Korikov Fri, 29 Jul 2005 16:10:35 +0300 (#409616)

 

On Fri, 29 Jul 2005 16:10:35 +0300
Konstantin Korikov <lostcl***@u*****.fm> wrote:

$ man locale
.....
ENVIRONMENT VARIABLES
LC_CTYPE

Character classification and case conversion.

LC_COLLATE

Collation order.

LC_TIME

Date and time formats.

LC_NUMERIC

Non-monetary numeric formats.

LC_MONETARY

Monetary formats.

LC_MESSAGES

Formats of informative and diagnostic messages and
interactive responses.

?????

Ответить   Matvey Sat, 30 Jul 2005 00:08:00 +0300 (#409874)

 

В сообщении от 1122671280 секунд после начала Эпохи Matvey написал(а):

Скажу точнее, это не только переменные окружения. Переменные окружения
могут быть и не установлены, но ту или иную категорию можно определить
всегда. Эти категории составляют локаль.

Ответить   Konstantin Korikov Sat, 30 Jul 2005 02:21:11 +0300 (#409904)