[dia/utsa/lang] prefrences: add language selector



commit 2104c56901c5e719d857b9e9ca7b34d8ae4a96f7
Author: Alexander Downey <alexander downey my utsa edu>
Date:   Tue May 12 22:02:56 2020 +0100

    prefrences: add language selector

 app/main.c                    |  13 ++++
 app/preferences.c             | 175 +++++++++++++++++++++++++++++++++++++++++-
 app/preferences.h             |   3 +
 data/ui/preferences-dialog.ui |  71 +++++++++++++++++
 4 files changed, 260 insertions(+), 2 deletions(-)
---
diff --git a/app/main.c b/app/main.c
index 967dd8d5..d2a4d365 100644
--- a/app/main.c
+++ b/app/main.c
@@ -20,9 +20,22 @@
 #include "app_procs.h"
 
 #include "interface.h"
+#include "persistence.h"
 
 int main(int argc, char *argv[])
 {
+  char *lang;
+  char *val;
+  persistence_load();
+  lang = persistence_register_string ("lang_lang", "");
+  val = getenv ("LANG");
+  if (val == NULL || lang != NULL && lang[0] != NULL && strcmp(val, lang) != 0) {
+      #ifdef G_OS_WIN32
+      _putenv_s("LANG", lang);
+      #else
+      setenv("LANG", lang, 1);
+      #endif
+  }
   app_init(argc, argv);
 
   if (!app_is_interactive())
diff --git a/app/preferences.c b/app/preferences.c
index 2487520f..c74151c4 100644
--- a/app/preferences.c
+++ b/app/preferences.c
@@ -65,6 +65,83 @@ struct _DiaPreferencesDialog {
 G_DEFINE_TYPE (DiaPreferencesDialog, dia_preferences_dialog, GTK_TYPE_DIALOG)
 
 
+static const char *langs[] = {
+       "en_US",
+       "am",
+       "ar",
+       "ast",
+       "az",
+       "be",
+       "bg",
+       "bs",
+       "ca",
+       "ca@valencia",
+       "cs",
+       "da",
+       "de",
+       "dz",
+       "el",
+       "en_CA",
+       "en_GB",
+       "eo",
+       "es",
+       "eu",
+       "fa",
+       "fi",
+       "fr",
+       "ga",
+       "gl",
+       "gu",
+       "he",
+       "hr",
+       "hu",
+       "id",
+       "is",
+       "it",
+       "ja",
+       "kk",
+       "kn",
+       "ko",
+       "lt",
+       "lv",
+       "mk",
+       "ml",
+       "mn",
+       "mr",
+       "ms",
+       "nb",
+       "ne",
+       "nl",
+       "nn",
+       "oc",
+       "pa",
+       "pl",
+       "pt",
+       "pt_BR",
+       "ro",
+       "ru",
+       "rw",
+       "sk",
+       "sl",
+       "sq",
+       "sr",
+       "sr@latin",
+       "sv",
+       "th",
+       "tr",
+       "uk",
+       "vi",
+       "zh_CN",
+       "zh_HK",
+       "zh_TW",
+       NULL
+};
+
+static const char * dia_lang_get_name(int i) {
+       return langs[i];
+}
+
+
 static void
 dia_preferences_dialog_response (GtkDialog *dialog, int response)
 {
@@ -279,6 +356,26 @@ dd_type_changed (GtkComboBox *combo,
   }
 }
 
+static void
+lang_changed (GtkComboBox *combo,
+                 gpointer     data)
+{
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  char *lang;
+
+  model = gtk_combo_box_get_model (combo);
+
+  if (gtk_combo_box_get_active_iter (combo, &iter)) {
+    gtk_tree_model_get (model, &iter, COL_NAME, &lang, -1);
+
+    g_clear_pointer (&prefs.lang.lang, g_free);
+    prefs.lang.lang = lang;
+
+    persistence_set_string ("lang_lang", lang);
+  }
+}
+
 
 static void
 dd_background_changed (DiaColorSelector *selector,
@@ -348,6 +445,40 @@ set_current_paper (GtkTreeModel *model,
 }
 
 
+
+struct SetCurrentLang {
+  const char *to_set;
+  GtkWidget  *combo;
+};
+
+
+static gboolean
+set_current_lang (GtkTreeModel *model,
+                   GtkTreePath  *path,
+                   GtkTreeIter  *iter,
+                   gpointer      data)
+{
+  struct SetCurrentLang *find = data;
+  char *lang;
+
+  gtk_tree_model_get (model, iter, COL_NAME, &lang, -1);
+  if (g_strcmp0 (lang, find->to_set) == 0) {
+    gtk_combo_box_set_active_iter (GTK_COMBO_BOX(find->combo), iter);
+
+    g_clear_pointer (&lang, g_free);
+
+    return TRUE;
+  }
+
+  g_clear_pointer (&lang, g_free);
+
+  return FALSE;
+}
+
+
+
+
+
 static void
 vd_width_value_changed (GtkSpinButton *spin,
                         gpointer       data)
@@ -709,6 +840,7 @@ dia_preferences_dialog_init (DiaPreferencesDialog *self)
   struct SetCurrentUnit find_unit;
   struct SetCurrentPaper find_paper;
   struct SetCurrentFilter find_filter;
+  struct SetCurrentLang find_lang;
   GtkWidget *dialog_vbox;
   DiaBuilder *builder;
   GtkWidget *content;
@@ -719,6 +851,7 @@ dia_preferences_dialog_init (DiaPreferencesDialog *self)
   GtkListStore *pss;
   GtkListStore *wmfs;
   GtkListStore *emfs;
+  GtkListStore *langStore;
   GtkWidget *ui_reset_tools;
   GtkAdjustment *ui_undo_spin_adj;
   GtkWidget *ui_reverse_drag;
@@ -758,9 +891,9 @@ dia_preferences_dialog_init (DiaPreferencesDialog *self)
   GtkAdjustment *gl_man_cvs_adj;
   GtkAdjustment *gl_man_rvs_adj;
   GtkAdjustment *gl_hex_size_adj;
+  GtkWidget *cbLanguages;
   int j = 0;
   const char *name;
-
   gtk_dialog_add_buttons (GTK_DIALOG (self),
                           _("_Done"), GTK_RESPONSE_OK,
                           NULL);
@@ -831,8 +964,9 @@ dia_preferences_dialog_init (DiaPreferencesDialog *self)
                    "gl_hex", &self->gl_hex,
                    "gl_hex_size", &self->gl_hex_size,
                    "gl_hex_size_adj", &gl_hex_size_adj,
+                   "cbLanguages", &cbLanguages,
+                   "langStore", &langStore,
                    NULL);
-
   for (DiaUnit unit = 0; unit < DIA_LAST_UNIT; unit++) {
     GtkTreeIter iter;
 
@@ -855,6 +989,22 @@ dia_preferences_dialog_init (DiaPreferencesDialog *self)
     j++;
   }
 
+  j = 0;
+  while ((name = dia_lang_get_name (j))) {
+    GtkTreeIter iter;
+
+    gtk_list_store_append (langStore, &iter);
+    gtk_list_store_set (langStore, &iter,
+                        COL_NAME, name,
+                        COL_UNIT, j,
+                        -1);
+
+    j++;
+  }
+
+
+
+
   fill_exporter_list (pngs, "PNG");
   fill_exporter_list (svgs, "SVG");
   fill_exporter_list (pss, "PS");
@@ -888,6 +1038,14 @@ dia_preferences_dialog_init (DiaPreferencesDialog *self)
   gtk_tree_model_foreach (GTK_TREE_MODEL (paper),
                           set_current_paper,
                           &find_paper);
+
+  find_lang.combo = cbLanguages;
+  find_lang.to_set = prefs.lang.lang;
+  gtk_tree_model_foreach (GTK_TREE_MODEL (langStore),
+                          set_current_lang,
+                          &find_lang);
+
+
   dia_color_selector_set_color (dd_background, &prefs.new_diagram.bg_color);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dd_compress),
                                 prefs.new_diagram.compress_save);
@@ -1014,6 +1172,8 @@ dia_preferences_dialog_init (DiaPreferencesDialog *self)
                        "gl_man_rvs_value_changed", G_CALLBACK (gl_man_rvs_value_changed),
                        "gl_hex_size_value_changed", G_CALLBACK (gl_hex_size_value_changed),
                        "gl_update_sensitive", G_CALLBACK (gl_update_sensitive),
+                       /* Languages */
+                       "lang_changed", G_CALLBACK (lang_changed),
                        NULL);
 
   gtk_container_add (GTK_CONTAINER (dialog_vbox), content);
@@ -1044,6 +1204,7 @@ dia_preferences_dialog_show (void)
 void
 dia_preferences_init (void)
 {
+  char* val;
   GEnumClass *unit_class = g_type_class_ref (DIA_TYPE_UNIT);
   Color default_bg = { 1.0, 1.0, 1.0, 1.0 };
   Color break_bg = { 0.0, 0.0, 0.6, 1.0 };
@@ -1096,4 +1257,14 @@ dia_preferences_init (void)
   prefs.grid.vis_y = persistence_register_real ("grid_vis_y", 1);
   prefs.grid.hex = persistence_register_boolean ("grid_hex", FALSE);
   prefs.grid.hex_size = persistence_register_real ("grid_hex_size", 1);
+
+  prefs.lang.lang = persistence_register_string ("lang_lang", dia_lang_get_name(0));
+  val = getenv ("LANG");
+  if (val == NULL || strcmp(val, prefs.lang.lang) != 0) {
+      #ifdef G_OS_WIN32
+      _putenv_s("LANG", prefs.lang.lang);
+      #else
+      setenv("LANG", prefs.lang.lang, 1);
+      #endif
+  }
 }
diff --git a/app/preferences.h b/app/preferences.h
index d7bae005..8b13e685 100644
--- a/app/preferences.h
+++ b/app/preferences.h
@@ -79,6 +79,9 @@ struct DiaPreferences {
   int guides_visible;   /** Whether guides are visible. */
   int guides_snap;      /** Whether to snap to guides. */
   guint snap_distance;  /** The snapping distance for guides. */
+  struct {
+         char *lang;
+  } lang;
 };
 
 extern struct DiaPreferences prefs;
diff --git a/data/ui/preferences-dialog.ui b/data/ui/preferences-dialog.ui
index d9825035..6d425cf2 100644
--- a/data/ui/preferences-dialog.ui
+++ b/data/ui/preferences-dialog.ui
@@ -46,6 +46,14 @@
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
+  <object class="GtkListStore" id="langStore">
+    <columns>
+      <!-- column-name name -->
+      <column type="gchararray"/>
+      <!-- column-name language -->
+      <column type="gint"/>
+    </columns>
+  </object>
   <object class="GtkListStore" id="paper">
     <columns>
       <!-- column-name name -->
@@ -1586,6 +1594,69 @@
         <property name="tab_fill">False</property>
       </packing>
     </child>
+    <child>
+      <object class="GtkVBox" id="vbox8">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <child>
+          <object class="GtkTable" id="table7">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="n_columns">2</property>
+            <child>
+              <object class="GtkLabel" id="label7">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Languages</property>
+              </object>
+              <packing>
+                <property name="y_options">GTK_EXPAND</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkComboBox" id="cbLanguages">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="model">langStore</property>
+                <signal name="changed" handler="lang_changed" swapped="no"/>
+                <child>
+                  <object class="GtkCellRendererText" id="cellrenderertext9"/>
+                  <attributes>
+                    <attribute name="text">0</attribute>
+                  </attributes>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+      </object>
+      <packing>
+        <property name="position">5</property>
+      </packing>
+    </child>
+    <child type="tab">
+      <object class="GtkLabel" id="label6">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Languages</property>
+      </object>
+      <packing>
+        <property name="position">5</property>
+        <property name="tab_fill">False</property>
+      </packing>
+    </child>
   </object>
   <object class="GtkSizeGroup" id="sizegroup1">
     <property name="mode">both</property>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]