Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [GTK3]Изменение языка моей программы, Локализация gtk программы 
:(
    Опции темы
cann
Дата 2.12.2015, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.8.2010

Репутация: нет
Всего: нет



Пытаюсь реализовать возможность изменения языка программы через функцию setlocale. Проблема в том, что функция setlocale не работает. Прошу подсказать в чем может быть причина. Установлена Ubuntu 15.10. Файл переводов создал gtk_test.mo и расположил его в каталоге ./locale/ru/LC_MESSAGES

Код программы:
Код

#include <gtk/gtk.h>
#include <libintl.h>
#include <locale.h>
#include <stdio.h>

#define _(String) gettext(String)
#define GETTEXT_PACKAGE "gtk_test"
#define LOCALEDIR "./locale"

GtkWidget *window = NULL;
GtkWidget *vbox = NULL;

void init_main();
void clear_workspace();
void create_main();
void language_selected(GtkWidget *item, gchar *lang);

void clear_workspace() {
        gtk_widget_destroy(vbox);
        printf("All destroyed\n");
}

void create_main() {
 
 GtkWidget *label = NULL;
 GtkWidget *button = NULL;
 
 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
 gtk_container_add(GTK_CONTAINER(window), vbox);
 
 label = gtk_label_new(_("Hello, world!")); 
 
 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 1);
 
 button = gtk_button_new_with_label(_("Translate"));
 
 gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 1);
 
 g_signal_connect(button, "clicked", G_CALLBACK(language_selected), NULL);
 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

 gtk_widget_show(label);
 gtk_widget_show(button);    
 gtk_widget_show(vbox);        
}

void language_selected(GtkWidget *item, gchar *lang) {
        setlocale(LC_ALL, "ru_RU.UTF-8");
        clear_workspace();
        create_main();
}

int main(int argc, char **argv)
{
    
 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
 textdomain(GETTEXT_PACKAGE);
 
 gtk_init(&argc, &argv);
 
 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
 gtk_window_set_default_size(GTK_WINDOW(window), 250, 250);
 gtk_window_set_title(GTK_WINDOW(window), "gtk_test");
 
 create_main();
 
 gtk_widget_show(window);
 
 gtk_main();
 
 return 0;
}

PM MAIL   Вверх
tzirechnoy
Дата 2.12.2015, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Попробуйте для начала проверять коды возврата функцый и писать ошыбки в случае чего.

Ещё потыкайте в это strace/ltrace, возможно, поймёте что случилось.

PS Нет, я не знаю, вроде всё логично написано, собирать и проверять лень.
PM MAIL   Вверх
cann
Дата 25.12.2015, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.8.2010

Репутация: нет
Всего: нет



Спасибо за ответ. Буду думать в чем может причина.


Это сообщение отредактировал(а) cann - 25.12.2015, 11:30
PM MAIL   Вверх
ss
Дата 14.1.2016, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



может в последних версиях что-то поменялось ?! в Qt всегда для мультиязычности использовалась функ. tr() в параметрах якорь к которому привязывается текст

qDebug()<< tr("hello ");

а после написания кода заходим в утилиту Qt linguist ( инструменты/внешние/linguist) там делаем файл с переводом.

Но мне было проще сделать свой маленький класс который занимался переводом. В файле хранить строки ключ - значение. Загрузить файл в QMap и через ключ у мапы получать строку с переводом
а локаль использовать для выбора файла перевода.

Это сообщение отредактировал(а) ss - 14.1.2016, 00:31
PM MAIL   Вверх
cann
Дата 18.1.2016, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.8.2010

Репутация: нет
Всего: нет



Цитата(ss @ 14.1.2016,  00:13)
может в последних версиях что-то поменялось ?!

Так и есть, в Ubuntu 15.10 что-то изменилось и в данный момент не работает, но в 15.04, до этого, код работал. На днях, на второй компьютер поставил Fedora 23, собрал там эту программу и все работает. Что магло, в ubuntu 15.10, поменяться после апгрейта, даже не знаю. Попробую установить Ubuntu 15.10 из образа может все заработает. 
PM MAIL   Вверх
math64
Дата 19.1.2016, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Проверь соответствие версий библиотек. Нужно использовать ту, для которой компиллировалось.
В gtk_init() происходит проверка, но она не всегда может обнаружить несоответствие.
PM   Вверх
cann
Дата 24.1.2016, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.8.2010

Репутация: нет
Всего: нет



Цитата(math64 @ 19.1.2016,  08:39)
Проверь соответствие версий библиотек. Нужно использовать ту, для которой компиллировалось.

Как можно узнать под какую версию библиотеки компилировалась программа?

На данный момент у меня установлена и используется моей программой GTK+3 библиотека версии 3.16.7

Узнаем, где расположена библиютека: 
Код

ldd gtk_test | grep libgtk-3
libgtk-3.so.0 => /usr/lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007f69ae0a1000)

Узнаем версию библиотеки:
Код

ls -l /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
lrwxrwxrwx 1 root root 20 окт.  16 15:47 /usr/lib/x86_64-linux-gnu/libgtk-3.so.0 -> libgtk-3.so.0.1600.7

т.е. отсюда сделал вывод, что используется библиотека версии 3.16.7

Узнаем, какая библиотека установлена в Ubuntu 15.10:

Код

dpkg -l '*libgtk-3-0*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                          Version             Architecture        Description
+++-=============================-===================-===================-================================================================
ii  libgtk-3-0:amd64              3.16.7-0ubuntu3     amd64               GTK+ graphical user interface library
 

т.е. установлена версия 3.16.7

PM MAIL   Вверх
cann
Дата 24.1.2016, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.8.2010

Репутация: нет
Всего: нет



Проблема все-таки в Ubuntu 15.10.

На втором компьютере, с установленной Fedora 23, провел следующий эксперимент. 

1. Просмотрел настройки локали, выполнил команду:

Код

locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=


2. Запустил программу Geany (у нее есть файл переводов на русский) из командной строки, явно прописав с какой локалью нужно запустится:

Код

LANG="ru_RU.UTF-8" geany


и программа Geany открылась с русским интерфейсом.

Тоже самое проделал на Ubuntu 15.10. Интерфейс как и был на английском так и остался.

Вывод команды locale на Ubuntu 15.10:

Код

locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=ru_RU.UTF-8
LC_TIME=ru_RU.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=ru_RU.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=ru_RU.UTF-8
LC_NAME=ru_RU.UTF-8
LC_ADDRESS=ru_RU.UTF-8
LC_TELEPHONE=ru_RU.UTF-8
LC_MEASUREMENT=ru_RU.UTF-8
LC_IDENTIFICATION=ru_RU.UTF-8
LC_ALL=


Может кто знает какие пакеты нужно переустановить, что исправить эту проблему или надо переставлять Ubuntu 15.10 полностью?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0744 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.