Determine direction from language
authorMatthias Clasen <mclasen@redhat.com>
Mon, 2 Jan 2023 20:19:42 +0000 (15:19 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 2 Jan 2023 21:30:27 +0000 (16:30 -0500)
We can determine the direction to return here
without relying on translations, by using pango
and HarfBuzz apis to go
language -> script -> direction.

gtk/gtkmain.c

index 48bcb136fb843912c1d549cbcc58162a5211c562..eb0319a9176ce5de9ba8d938947b4bb4add48258 100644 (file)
@@ -48,6 +48,8 @@
 #undef STRICT
 #endif
 
+#include <hb-glib.h>
+
 #include <glib/gi18n-lib.h>
 
 #include "gtkbox.h"
@@ -781,20 +783,37 @@ gtk_is_initialized (void)
 GtkTextDirection
 gtk_get_locale_direction (void)
 {
-  /* Translate to default:RTL if you want your widgets
-   * to be RTL, otherwise translate to default:LTR.
-   * Do *not* translate it to "predefinito:LTR", if it
-   * it isn't default:LTR or default:RTL it will not work
-   */
-  char             *e   = _("default:LTR");
-  GtkTextDirection  dir = GTK_TEXT_DIR_LTR;
+  PangoLanguage *language;
+  const PangoScript *scripts;
+  int n_scripts;
+
+  language = gtk_get_default_language ();
+  scripts = pango_language_get_scripts (language, &n_scripts);
+
+  if (n_scripts > 0)
+    {
+      for (int i = 0; i < n_scripts; i++)
+        {
+          hb_script_t script;
 
-  if (g_strcmp0 (e, "default:RTL") == 0)
-    dir = GTK_TEXT_DIR_RTL;
-  else if (g_strcmp0 (e, "default:LTR") != 0)
-    g_warning ("Whoever translated default:LTR did so wrongly. Defaulting to LTR.");
+          script = hb_glib_script_to_script ((GUnicodeScript) scripts[i]);
+
+          switch (hb_script_get_horizontal_direction (script))
+            {
+            case HB_DIRECTION_LTR:
+              return GTK_TEXT_DIR_LTR;
+            case HB_DIRECTION_RTL:
+              return GTK_TEXT_DIR_RTL;
+            case HB_DIRECTION_TTB:
+            case HB_DIRECTION_BTT:
+            case HB_DIRECTION_INVALID:
+            default:
+              break;
+            }
+        }
+    }
 
-  return dir;
+  return GTK_TEXT_DIR_LTR;
 }
 
 /**