LINUX.ORG.RU

Не могу осилить Gettext

 , , ,


1

2

main.c

#include <ncurses.h>
#include <locale.h>
#include <wchar.h>
#include <wctype.h>
#include <libintl.h>

#define _(String) gettext (String)

int main()
{
	setlocale(LC_ALL,"");
	bindtextdomain("main","/usr/share/locale");
	textdomain("main");

	initscr();
	keypad(stdscr, true);

	printw(_("Hello World\n"));
	refresh();
	getch();
	endwin();
	return 0;
}

Пытался сделать по гайду с FedoraProject. Английский так и остался. ЧЯДНТ?

UPD0: Можно ли через gettext инициализацировать массив wchar_t?

Deleted

Последнее исправление: YanGus (всего исправлений: 2)

Локаль при запуске меняли?
MO файл куда надо копировали?

Я давно по этому же источнику тестировал gettext и все корректно работало.
Я бы порекомендовал еще раз пройти по порядку все шаги и проверить, где сбуратинили:)

uglym8
()

Странно, в PHP всё работает, как по маслу.

Может быть сначала пых-пых потренируетесь, прототипчик напишете на нем? ))

Infra_HDC ★★★★★
()

bind_textdomain_codeset выставляет кодировку для iconv. Можно указать UCS4 и использовать

#define _u(Text) (uint32_t*)gettext(Text)

Но я не пробовал.

rymis ★★
()

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

"Language-Team: Russian\n"
"Language: ru\n"
Но все также. Запускаю программу так:
 LANG=ru ./a.out 

Deleted
()
Ответ на: комментарий от Deleted

Должна в итоге получиться такая файловая структура:

├── helloworld
├── helloworld.c
├── Makefile
└── po
    ├── helloworld.pot
    └── ru
        ├── helloworld.mo
        └── helloworld.po


Затем радостно копируем helloworld.mo в /usr/share/locale/ru/LC_MESSAGES/

Проверяем результат:

[xxx@xxxx gtcheck]$ echo $LANG
en_US.UTF-8
[xxx@xxxx gtcheck]$ ./helloworld 
Hello World
[xxx@xxxx gtcheck]$ LANG=ru_RU.UTF8 ./helloworld 
Привет, мир

uglym8
()
Ответ на: комментарий от uglym8

hello.c

#include <stdio.h>
#include <stdlib.h>

#include <libintl.h>
#include <locale.h>

#define _(STRING) gettext(STRING)

int main()
{
  /* Setting the i18n environment */
  setlocale (LC_ALL, "");
  bindtextdomain ("hello", getenv("PWD"));
  textdomain ("hello");

  /* Example of i18n usage */
  printf(_("Hello World\n"));

  return EXIT_SUCCESS;
}
hello.po
# Russian translations for Hello package.
# Copyright (C) 2017 THE Hello'S COPYRIGHT HOLDER
# This file is distributed under the same license as the Hello package.
# Yan Gus <xxxxxxgmail.com>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Hello 1.0\n"
"Report-Msgid-Bugs-To: xxxxxx@gmail.com\n"
"POT-Creation-Date: 2017-06-26 16:35+0300\n"
"PO-Revision-Date: 2017-06-26 16:36+0300\n"
"Last-Translator: Yan Gus <xxxxxx@gmail.com>\n"
"Language-Team: Russian\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#. Example of i18n usage
#: hello.c:17
#, c-format
msgid "Hello World\n"
msgstr "Привет Мир\n"

Файл hello.mo в /usr/share/locale/ru/LC_MESSAGES/. Права доступа в норме.

Компиляция

gcc hello.c --std=c89  -o hello  -W -Wall -Wextra -pedantic
Запуск
LANG=ru_RU.UTF8 ./hello 
Кодировка дефолт с установки Дебиана.
~$ echo $LANG
ru_RU.utf8

Файловая структура такая же, только без makefile.

Deleted
()
Последнее исправление: YanGus (всего исправлений: 1)
Ответ на: комментарий от Deleted

Я еще раз повторю свой совет:
сделайте по шагам.
Точно как написано.
Вносить изменения будете после того, как база заработает.

//bindtextdomain ("hello", getenv("PWD"));
bindtextdomain ("hello", "/usr/share/locale));
uglym8
()
Ответ на: комментарий от uglym8
yangus@debian:~/Код/hello$ LANG=ru_RU.UTF8 ./hello 
Привет Мир
yangus@debian:~/Код/hello$ LANG=en_US.UTF-8 ./hello 
Hello World

Спасибо. Тема закрыта.

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