diff --git a/linphone/configure.in b/linphone/configure.in index cdab69b906bf6f2856a61eb2555dc238b75488ab..ff21474f865d15174375efd12259d418d7fd02f8 100644 --- a/linphone/configure.in +++ b/linphone/configure.in @@ -67,6 +67,7 @@ dnl Add the languages which your application supports here. PKG_PROG_PKG_CONFIG ALL_LINGUAS="fr it de ja es pl cs nl sv pt_BR hu ru" AC_SUBST(ALL_LINGUAS) +AC_DEFINE_UNQUOTED(LINPHONE_ALL_LANGS, "$ALL_LINGUAS", [All supported languages]) if test "$mingw_found" != "yes" ; then dnl gettext macro does not work properly under mingw. diff --git a/linphone/coreapi/misc.c b/linphone/coreapi/misc.c index 9f3b1b70ea3c00e6832db064960868c14c0cd800..22ed27852268a96b711847976bc4bf36ed852eaf 100644 --- a/linphone/coreapi/misc.c +++ b/linphone/coreapi/misc.c @@ -715,9 +715,9 @@ int linphone_core_wake_up_possible_already_running_instance(const char *config_f break; } #ifdef WIN32 - Sleep(10); + Sleep(100); #else - usleep(10000); + usleep(100000); #endif } }else ms_message("sendto() of WAKEUP request failed, nobody to wakeup."); diff --git a/linphone/gtk-glade/linphone.h b/linphone/gtk-glade/linphone.h index 755de2f222e02e8e4a600e980184f050a5fa5bf9..11d2eb6f425195b4774372ec2e4f5208b7ff0235 100644 --- a/linphone/gtk-glade/linphone.h +++ b/linphone/gtk-glade/linphone.h @@ -59,6 +59,7 @@ int linphone_gtk_get_ui_config_int(const char *key, int def); void linphone_gtk_open_browser(const char *url); void linphone_gtk_check_for_new_version(void); const char *linphone_gtk_get_lang(const char *config_file); +void linphone_gtk_set_lang(const char *code); SipSetupContext* linphone_gtk_get_default_sip_setup_context(void); void linphone_gtk_show_buddy_lookup_window(SipSetupContext *ctx); void * linphone_gtk_wait(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, const char *purpose, float progress); diff --git a/linphone/gtk-glade/parameters.glade b/linphone/gtk-glade/parameters.glade index 4e56f853722ea5dd731450da41b65d8124235d7f..56d02a486f2f4dd9426f78436cde16312c16362d 100644 --- a/linphone/gtk-glade/parameters.glade +++ b/linphone/gtk-glade/parameters.glade @@ -16,11 +16,11 @@ <property name="can_focus">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> - <widget class="GtkVBox" id="vbox2"> + <widget class="GtkVBox" id="network_tab"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> - <widget class="GtkFrame" id="frame1"> + <widget class="GtkFrame" id="transport_frame"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label_xalign">0</property> @@ -112,7 +112,7 @@ </packing> </child> <child> - <widget class="GtkFrame" id="frame2"> + <widget class="GtkFrame" id="ports_frame"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label_xalign">0</property> @@ -223,7 +223,7 @@ </packing> </child> <child> - <widget class="GtkFrame" id="frame6"> + <widget class="GtkFrame" id="nat_frame"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label_xalign">0</property> @@ -409,7 +409,7 @@ </packing> </child> <child> - <widget class="GtkVBox" id="vbox10"> + <widget class="GtkVBox" id="multimedia_tab"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> @@ -429,7 +429,7 @@ <property name="n_rows">6</property> <property name="n_columns">2</property> <child> - <widget class="GtkHBox" id="hbox19"> + <widget class="GtkHBox" id="ring_sound_box"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> @@ -466,7 +466,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label37"> + <widget class="GtkLabel" id="ring_sound_label"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes">Ring sound:</property> @@ -663,7 +663,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label8"> + <widget class="GtkLabel" id="video_size_label"> <property name="visible">True</property> <property name="label" translatable="yes">Prefered video resolution:</property> </widget> @@ -1508,6 +1508,80 @@ Video codecs</property> <property name="type">tab</property> </packing> </child> + <child> + <widget class="GtkVBox" id="vbox2"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <widget class="GtkFrame" id="lang_frame"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <child> + <widget class="GtkAlignment" id="alignment3"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <child> + <widget class="GtkComboBox" id="lang_combo"> + <property name="visible">True</property> + <property name="items" translatable="yes">C</property> + <signal name="changed" handler="linphone_gtk_lang_changed"/> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="lang_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Language</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="position">4</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox4"> + <property name="visible">True</property> + <child> + <widget class="GtkImage" id="image13"> + <property name="visible">True</property> + <property name="stock">gtk-properties</property> + <property name="icon-size">3</property> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="label" translatable="yes">User interface</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + <property name="type">tab</property> + </packing> + </child> </widget> <packing> <property name="position">0</property> @@ -1520,22 +1594,46 @@ Video codecs</property> <property name="layout_style">end</property> <child> <widget class="GtkButton" id="button5"> - <property name="label" translatable="yes">gtk-close</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="use_stock">True</property> <signal name="clicked" handler="linphone_gtk_parameters_closed"/> + <child> + <widget class="GtkHBox" id="hbox3"> + <property name="visible">True</property> + <child> + <widget class="GtkImage" id="image12"> + <property name="visible">True</property> + <property name="stock">gtk-apply</property> + <property name="icon-size">4</property> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="label" translatable="yes">Done</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> </widget> <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="padding">10</property> <property name="position">0</property> </packing> </child> </widget> <packing> + <property name="padding">5</property> <property name="position">1</property> </packing> </child> diff --git a/linphone/gtk-glade/propertybox.c b/linphone/gtk-glade/propertybox.c index 5c4774872b2eff3afe280ec1a3e63a845457b563..90ba7511dc005d7258d38f2e9efbcd69d96df557 100644 --- a/linphone/gtk-glade/propertybox.c +++ b/linphone/gtk-glade/propertybox.c @@ -611,6 +611,92 @@ void linphone_gtk_edit_proxy(GtkButton *button){ } } +typedef struct _LangCodes{ + const char *code; + const char *name; +}LangCodes; + +static LangCodes supported_langs[]={ + { "C" , N_("English") }, + { "fr" , N_("French") }, + { "sv" , N_("Swedish") }, + { "it" , N_("Italian") }, + { "es" , N_("Spanish") }, + { "pt_BR" , N_("Bresilian") }, + { "pl" , N_("Polish") }, + { "de" , N_("German") }, + { "ru" , N_("Russian") }, + { "ja" , N_("Japanese") }, + { "nl" , N_("Dutch") }, + { "hu" , N_("Hungarian") }, + { "cs" , N_("Czech") }, + { NULL , NULL } +}; + +static const char *lang_get_name(const char *code){ + LangCodes *p=supported_langs; + while(p->code!=NULL){ + if (strcmp(p->code,code)==0) return p->name; + p++; + } + return NULL; +} + +static gboolean lang_equals(const char *l1, const char *l2){ + return ((strncmp(l1,l2,5)==0 || strncmp(l1,l2,2)==0)); +} + +static void linphone_gtk_fill_langs(GtkWidget *pb){ + GtkWidget *combo=linphone_gtk_get_widget(pb,"lang_combo"); + char code[10]; + const char *all_langs="C " LINPHONE_ALL_LANGS; + const char *name; + int i=0,index=0; + int adv; + const char *cur_lang=getenv("LANG"); + int cur_lang_index=-1; + char text[256]={0}; + if (cur_lang==NULL) cur_lang="C"; + /* glade creates a combo box without list model and text renderer, + unless we fill it with a dummy text. + This dummy text needs to be removed first*/ + gtk_combo_box_remove_text(GTK_COMBO_BOX(combo),0); + while(sscanf(all_langs+i,"%s %n",code,&adv)>=1){ + i+=adv; + name=lang_get_name(code); + snprintf(text,sizeof(text)-1,"%s : %s",code,name!=NULL ? _(name) : code); + gtk_combo_box_append_text(GTK_COMBO_BOX(combo),text); + if (cur_lang_index==-1 && lang_equals(cur_lang,code)) + cur_lang_index=index; + index++; + } + gtk_combo_box_set_active(GTK_COMBO_BOX(combo),cur_lang_index); +} + +void linphone_gtk_lang_changed(GtkComboBox *combo){ + const char *selected=gtk_combo_box_get_active_text(combo); + char code[10]; + const char *cur_lang=getenv("LANG"); + if (selected!=NULL){ + sscanf(selected,"%s",code); + if (cur_lang==NULL) cur_lang="C"; + if (!lang_equals(cur_lang,code)){ + GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(combo))), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_CLOSE, + "%s", + (const gchar*)_("You need to restart linphone for the new language selection to take effect.")); + /* Destroy the dialog when the user responds to it (e.g. clicks a button) */ + g_signal_connect_swapped (G_OBJECT (dialog), "response", + G_CALLBACK (gtk_widget_destroy), + G_OBJECT (dialog)); + gtk_widget_show(dialog); + linphone_gtk_set_lang(code); + } + } +} + void linphone_gtk_show_parameters(void){ GtkWidget *pb=linphone_gtk_create_window("parameters"); LinphoneCore *lc=linphone_gtk_get_core(); @@ -688,5 +774,7 @@ void linphone_gtk_show_parameters(void){ linphone_core_get_download_bandwidth(lc)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"upload_bw")), linphone_core_get_upload_bandwidth(lc)); + + linphone_gtk_fill_langs(pb); gtk_widget_show(pb); } diff --git a/linphone/gtk-glade/support.c b/linphone/gtk-glade/support.c index 8463ae829dd621267d5bfddfe482ab83b2d54fed..6ed94c8225363bad8a4ba253e938d81e6404bcb6 100644 --- a/linphone/gtk-glade/support.c +++ b/linphone/gtk-glade/support.c @@ -124,6 +124,18 @@ const char *linphone_gtk_get_lang(const char *config_file){ return linphone_lang; } +void linphone_gtk_set_lang(const char *code){ + LpConfig *cfg=linphone_core_get_config(linphone_gtk_get_core()); + lp_config_set_string(cfg,"GtkUi","lang",code); +#ifdef WIN32 + char tmp[128]; + snprintf(tmp,sizeof(tmp),"LANG=%s",code); + _putenv(tmp); +#else + setenv("LANG",code,1); +#endif +} + const gchar *linphone_gtk_get_ui_config(const char *key, const char *def){ LinphoneCore *lc=linphone_gtk_get_core(); if (lc){