LINUX.ORG.RU

l10n+i18n и род.


0

0

Я сейчас пишу один проектик, и хочю чтобы можно было легко его локализовывать, причем мне нужна не столько возможность перевести все сообщения программы на другие языки, но и перевести некоторые термины, в зависимости от пожелания заказчика. Впринципе все понятно, умные дядьки придумали gettext(). Соответсвенно программу я пищу следующим образом: все выводы сообщений пишу через вызов функции _(), в коде программы сообщения на английском, и раз в неделю обновляю .po файл.

Все замечательно, но сообщения "Not selected", "Any" (используеться как один из варианты выбора в выпадающих списках) встречаются в программе часто, и в разных контестках, и хочется чтобы на русский передовились как "Не выбран" "Не выбрана" "Не выбрано", "Любой" "Любая" "Любое".

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

Либо, специальным образом метить контестно зависимые сообщения, тоесть например вместо _("Not selected") писать _("__Not selected (no file selected)") или _("__Not selected (no group selected)"), и на английский перевести только эти фраза, а остальные не трогать.

Есть ли другие варианты?

Re: l10n+i18n и род.

предпоследний вариант (с переводом на все языки) - правильный

всё прочее - от лукавого :)

MKuznetsov ★★★★★ ()
Ответ на: Re: l10n+i18n и род. от MKuznetsov

Re: l10n+i18n и род.

Обычно это делается при помощи контекстов, хотя в современном gettext 
они и так поддерживаются (есть функция pgettext)

для старых контекстов это делается так:

определяется перевод с контекстом:

#define _() dcgettext (...)
#define P_() strip_context (gcgettext (...))

extern char * strip_context (char *)

где функция strip_context отрезает, скажем, всё начало строки до символа
 |

Далее пишем в исходниках

#translators - this means any elka, everything before | will be stripped 
printf (P_("elka|Any"))
#translators - this means any ship, everything before | will be stripped
printf (P_("ship|Any"))

Соотвественно в po файле будут две разные строки

"elka|Any"
"ship|Any"

и переводчики могут перевести их по-разному

anonymous ()
Ответ на: Re: l10n+i18n и род. от anonymous

Re: l10n+i18n и род.

Огромное спасибо.
Именно так и поступлю.
P_() мне очень понравилось.

zhiltsov ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.