diff --git a/demos/gtk-demo/font_features.c b/demos/gtk-demo/font_features.c index 7c5693b2dc..2f6760b47a 100644 --- a/demos/gtk-demo/font_features.c +++ b/demos/gtk-demo/font_features.c @@ -23,6 +23,8 @@ #include "open-type-layout.h" #include "fontplane.h" +#include "script-names.h" +#include "language-names.h" #define MAKE_TAG(a,b,c,d) (unsigned int)(((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) @@ -315,52 +317,6 @@ get_pango_font (void) return pango_context_load_font (context, desc); } -static struct { const char *name; hb_script_t script; } script_names[] = { - { "Common", HB_SCRIPT_COMMON }, - { "Inherited", HB_SCRIPT_INHERITED }, - { "Unknown", HB_SCRIPT_UNKNOWN }, - { "Arabic", HB_SCRIPT_ARABIC }, - { "Armenian", HB_SCRIPT_ARMENIAN }, - { "Bengali", HB_SCRIPT_BENGALI }, - { "Cyrillic", HB_SCRIPT_CYRILLIC }, - { "Devanagari", HB_SCRIPT_DEVANAGARI }, - { "Georgian", HB_SCRIPT_GEORGIAN }, - { "Greek", HB_SCRIPT_GREEK }, - { "Gujarati", HB_SCRIPT_GUJARATI }, - { "Gurmukhi", HB_SCRIPT_GURMUKHI }, - { "Hangul", HB_SCRIPT_HANGUL }, - { "Han", HB_SCRIPT_HAN }, - { "Hebrew", HB_SCRIPT_HEBREW }, - { "Hiragana", HB_SCRIPT_HIRAGANA }, - { "Kannada", HB_SCRIPT_KANNADA }, - { "Katakana", HB_SCRIPT_KATAKANA }, - { "Lao", HB_SCRIPT_LAO }, - { "Latin", HB_SCRIPT_LATIN }, - { "Malayalam", HB_SCRIPT_MALAYALAM }, - { "Oriya", HB_SCRIPT_ORIYA }, - { "Tamil", HB_SCRIPT_TAMIL }, - { "Telugu", HB_SCRIPT_TELUGU }, - { "Thai", HB_SCRIPT_THAI }, - { "Tibetan", HB_SCRIPT_TIBETAN }, - { "Bopomofo", HB_SCRIPT_BOPOMOFO } - /* FIXME: complete */ -}; - -static struct { const char *name; hb_tag_t tag; } language_names[] = { - { "Arabic", HB_TAG ('A','R','A',' ') }, - { "Romanian", HB_TAG ('R','O','M',' ') }, - { "Skolt Sami", HB_TAG ('S','K','S',' ') }, - { "Northern Sami", HB_TAG ('N','S','M',' ') }, - { "Kildin Sami", HB_TAG ('K','S','M',' ') }, - { "Moldavian", HB_TAG ('M','O','L',' ') }, - { "Turkish", HB_TAG ('T','R','K',' ') }, - { "Azerbaijani", HB_TAG ('A','Z','E',' ') }, - { "Crimean Tatar", HB_TAG ('C','R','T',' ') }, - { "Serbian", HB_TAG ('S','R','B',' ') }, - { "German", HB_TAG ('D','E','U',' ') } - /* FIXME: complete */ -}; - typedef struct { hb_tag_t script_tag; hb_tag_t lang_tag; @@ -410,7 +366,7 @@ update_script_combo (void) { GtkListStore *store; hb_font_t *hb_font; - gint i, j, k, l; + gint i, j, k; FT_Face ft_face; PangoFont *pango_font; GHashTable *tags; @@ -483,48 +439,30 @@ update_script_combo (void) char langbuf[5]; char *name; + hb_tag_to_string (pair->script_tag, scriptbuf); + scriptbuf[4] = 0; + + hb_tag_to_string (pair->lang_tag, langbuf); + langbuf[4] = 0; + if (pair->script_tag == HB_OT_TAG_DEFAULT_SCRIPT) scriptname = "Default"; else if (pair->script_tag == HB_TAG ('m','a','t','h')) scriptname = "Math"; else - { - hb_script_t script; + scriptname = get_script_name_for_tag (pair->script_tag); - hb_tag_to_string (pair->script_tag, scriptbuf); - scriptbuf[4] = 0; - scriptname = scriptbuf; + if (!scriptname) + scriptname = scriptbuf; - script = hb_script_from_iso15924_tag (pair->script_tag); - for (k = 0; k < G_N_ELEMENTS (script_names); k++) - { - if (script == script_names[k].script) - { - scriptname = script_names[k].name; - break; - } - } - } + langname = get_language_name_for_tag (pair->lang_tag); + if (!langname) + langname = langbuf; if (pair->lang_tag == HB_OT_TAG_DEFAULT_LANGUAGE) name = g_strdup_printf ("%s Script", scriptname); else - { - hb_tag_to_string (pair->lang_tag, langbuf); - langbuf[4] = 0; - langname = langbuf; - - for (l = 0; l < G_N_ELEMENTS (language_names); l++) - { - if (pair->lang_tag == language_names[l].tag) - { - langname = language_names[l].name; - break; - } - } - - name = g_strdup (langname); - } + name = g_strdup (langname); gtk_list_store_insert_with_values (store, NULL, -1, 0, name, diff --git a/demos/gtk-demo/language-names.c b/demos/gtk-demo/language-names.c new file mode 100644 index 0000000000..2d433cff06 --- /dev/null +++ b/demos/gtk-demo/language-names.c @@ -0,0 +1,233 @@ +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "language-names.h" + +#define ISO_CODES_PREFIX "/usr" +#define ISO_CODES_DATADIR ISO_CODES_PREFIX "/share/xml/iso-codes" +#define ISO_CODES_LOCALESDIR ISO_CODES_PREFIX "/share/locale" + +static GHashTable *language_map; + +static char * +get_first_item_in_semicolon_list (const char *list) +{ + char **items; + char *item; + + items = g_strsplit (list, "; ", 2); + + item = g_strdup (items[0]); + g_strfreev (items); + + return item; +} + +static char * +capitalize_utf8_string (const char *str) +{ + char first[8] = { 0 }; + + if (!str) + return NULL; + + g_unichar_to_utf8 (g_unichar_totitle (g_utf8_get_char (str)), first); + + return g_strconcat (first, g_utf8_offset_to_pointer (str, 1), NULL); +} + +static char * +get_display_name (const char *language) +{ + const char *translated; + char *tmp; + char *name; + + translated = dgettext ("iso_639", language); + + tmp = get_first_item_in_semicolon_list (translated); + name = capitalize_utf8_string (tmp); + g_free (tmp); + + return name; +} + +static void +languages_parse_start_tag (GMarkupParseContext *ctx, + const char *element_name, + const char **attr_names, + const char **attr_values, + gpointer user_data, + GError **error) +{ + const char *ccode_longB; + const char *ccode_longT; + const char *ccode; + const char *ccode_id; + const char *lang_name; + char *display_name; + + if (!(g_str_equal (element_name, "iso_639_entry") || + g_str_equal (element_name, "iso_639_3_entry")) || + attr_names == NULL || + attr_values == NULL) + return; + + ccode = NULL; + ccode_longB = NULL; + ccode_longT = NULL; + ccode_id = NULL; + lang_name = NULL; + + while (*attr_names && *attr_values) + { + if (g_str_equal (*attr_names, "iso_639_1_code")) + { + if (**attr_values) + { + if (strlen (*attr_values) != 2) + return; + ccode = *attr_values; + } + } + else if (g_str_equal (*attr_names, "iso_639_2B_code")) + { + if (**attr_values) + { + if (strlen (*attr_values) != 3) + return; + ccode_longB = *attr_values; + } + } + else if (g_str_equal (*attr_names, "iso_639_2T_code")) + { + if (**attr_values) + { + if (strlen (*attr_values) != 3) + return; + ccode_longT = *attr_values; + } + } + else if (g_str_equal (*attr_names, "id")) + { + if (**attr_values) + { + if (strlen (*attr_values) != 2 && + strlen (*attr_values) != 3) + return; + ccode_id = *attr_values; + } + } + else if (g_str_equal (*attr_names, "name")) + { + lang_name = *attr_values; + } + + ++attr_names; + ++attr_values; + } + + if (lang_name == NULL) + return; + + display_name = get_display_name (lang_name); + + if (ccode != NULL) + g_hash_table_insert (language_map, + pango_language_from_string (ccode), + g_strdup (display_name)); + + if (ccode_longB != NULL) + g_hash_table_insert (language_map, + pango_language_from_string (ccode_longB), + g_strdup (display_name)); + + if (ccode_longT != NULL) + g_hash_table_insert (language_map, + pango_language_from_string (ccode_longT), + g_strdup (display_name)); + + if (ccode_id != NULL) + g_hash_table_insert (language_map, + pango_language_from_string (ccode_id), + g_strdup (display_name)); + + g_free (display_name); +} + +static void +languages_variant_init (const char *variant) +{ + gboolean res; + gsize buf_len; + g_autofree char *buf = NULL; + g_autofree char *filename = NULL; + g_autoptr (GError) error = NULL; + + bindtextdomain (variant, ISO_CODES_LOCALESDIR); + bind_textdomain_codeset (variant, "UTF-8"); + + error = NULL; + filename = g_strconcat (ISO_CODES_DATADIR, "/", variant, ".xml", NULL); + res = g_file_get_contents (filename, &buf, &buf_len, &error); + if (res) + { + g_autoptr (GMarkupParseContext) ctx = NULL; + GMarkupParser parser = { languages_parse_start_tag, NULL, NULL, NULL, NULL }; + + ctx = g_markup_parse_context_new (&parser, 0, NULL, NULL); + + error = NULL; + res = g_markup_parse_context_parse (ctx, buf, buf_len, &error); + + if (!res) + g_warning ("Failed to parse '%s': %s\n", filename, error->message); + } + else + g_warning ("Failed to load '%s': %s\n", filename, error->message); +} + +static void +languages_init (void) +{ + if (language_map) + return; + + language_map = g_hash_table_new_full (NULL, NULL, NULL, g_free); + languages_variant_init ("iso_639"); + languages_variant_init ("iso_639_3"); +} + +const char * +get_language_name (PangoLanguage *language) +{ + languages_init (); + + return (const char *) g_hash_table_lookup (language_map, language); +} + +const char * +get_language_name_for_tag (guint32 tag) +{ + hb_language_t lang; + const char *s; + + lang = hb_ot_tag_to_language (tag); + s = hb_language_to_string (lang); + + return get_language_name (pango_language_from_string (s)); +} diff --git a/demos/gtk-demo/language-names.h b/demos/gtk-demo/language-names.h new file mode 100644 index 0000000000..562f7ae2f8 --- /dev/null +++ b/demos/gtk-demo/language-names.h @@ -0,0 +1,13 @@ +#ifndef LANGUAGE_NAMES_H +#define LANGUAGE_NAMES_H + +#include + +G_BEGIN_DECLS + +const char * get_language_name (PangoLanguage *language); +const char * get_language_name_for_tag (guint32 tag); + +G_END_DECLS + +#endif diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build index acd0c6a94a..f4c3613215 100644 --- a/demos/gtk-demo/meson.build +++ b/demos/gtk-demo/meson.build @@ -94,7 +94,7 @@ gtkdemo_resources = gnome.compile_resources('gtkdemo_resources', source_dir: '.') executable('gtk4-demo', - 'main.c', 'gtkfishbowl.c', 'fontplane.c', demos, demos_h, gtkdemo_resources, + 'main.c', 'gtkfishbowl.c', 'fontplane.c', 'script-names.c', 'language-names.c', demos, demos_h, gtkdemo_resources, c_args: gtkdemo_args, dependencies: gtkdemo_deps, include_directories: confinc, diff --git a/demos/gtk-demo/script-names.c b/demos/gtk-demo/script-names.c new file mode 100644 index 0000000000..5049c34d0b --- /dev/null +++ b/demos/gtk-demo/script-names.c @@ -0,0 +1,184 @@ +#include "config.h" +#include +#include +#include + +#include "script-names.h" + +static struct { + GUnicodeScript script; + hb_script_t hb_script; + const char *name; +} scripts[] = +{ + { G_UNICODE_SCRIPT_COMMON, HB_SCRIPT_COMMON, NULL }, + { G_UNICODE_SCRIPT_INHERITED, HB_SCRIPT_INHERITED, NULL }, + { G_UNICODE_SCRIPT_ARABIC, HB_SCRIPT_ARABIC, NC_("Script", "Arabic") }, + { G_UNICODE_SCRIPT_ARMENIAN, HB_SCRIPT_ARMENIAN, NC_("Script", "Armenian") }, + { G_UNICODE_SCRIPT_BENGALI, HB_SCRIPT_BENGALI, NC_("Script", "Bengali") }, + { G_UNICODE_SCRIPT_BOPOMOFO, HB_SCRIPT_BOPOMOFO, NC_("Script", "Bopomofo") }, + { G_UNICODE_SCRIPT_CHEROKEE, HB_SCRIPT_CHEROKEE, NC_("Script", "Cherokee") }, + { G_UNICODE_SCRIPT_COPTIC, HB_SCRIPT_COPTIC, NC_("Script", "Coptic") }, + { G_UNICODE_SCRIPT_CYRILLIC, HB_SCRIPT_CYRILLIC, NC_("Script", "Cyrillic") }, + { G_UNICODE_SCRIPT_DESERET, HB_SCRIPT_DESERET, NC_("Script", "Deseret") }, + { G_UNICODE_SCRIPT_DEVANAGARI, HB_SCRIPT_DEVANAGARI, NC_("Script", "Devanagari") }, + { G_UNICODE_SCRIPT_ETHIOPIC, HB_SCRIPT_ETHIOPIC, NC_("Script", "Ethiopic") }, + { G_UNICODE_SCRIPT_GEORGIAN, HB_SCRIPT_GEORGIAN, NC_("Script", "Georgian") }, + { G_UNICODE_SCRIPT_GOTHIC, HB_SCRIPT_GOTHIC, NC_("Script", "Gothic") }, + { G_UNICODE_SCRIPT_GREEK, HB_SCRIPT_GREEK, NC_("Script", "Greek") }, + { G_UNICODE_SCRIPT_GUJARATI, HB_SCRIPT_GUJARATI, NC_("Script", "Gujarati") }, + { G_UNICODE_SCRIPT_GURMUKHI, HB_SCRIPT_GURMUKHI, NC_("Script", "Gurmukhi") }, + { G_UNICODE_SCRIPT_HAN, HB_SCRIPT_HAN, NC_("Script", "Han") }, + { G_UNICODE_SCRIPT_HANGUL, HB_SCRIPT_HANGUL, NC_("Script", "Hangul") }, + { G_UNICODE_SCRIPT_HEBREW, HB_SCRIPT_HEBREW, NC_("Script", "Hebrew") }, + { G_UNICODE_SCRIPT_HIRAGANA, HB_SCRIPT_HIRAGANA, NC_("Script", "Hiragana") }, + { G_UNICODE_SCRIPT_KANNADA, HB_SCRIPT_KANNADA, NC_("Script", "Kannada") }, + { G_UNICODE_SCRIPT_KATAKANA, HB_SCRIPT_KATAKANA, NC_("Script", "Katakana") }, + { G_UNICODE_SCRIPT_KHMER, HB_SCRIPT_KHMER, NC_("Script", "Khmer") }, + { G_UNICODE_SCRIPT_LAO, HB_SCRIPT_LAO, NC_("Script", "Lao") }, + { G_UNICODE_SCRIPT_LATIN, HB_SCRIPT_LATIN, NC_("Script", "Latin") }, + { G_UNICODE_SCRIPT_MALAYALAM, HB_SCRIPT_MALAYALAM, NC_("Script", "Malayalam") }, + { G_UNICODE_SCRIPT_MONGOLIAN, HB_SCRIPT_MONGOLIAN, NC_("Script", "Mongolian") }, + { G_UNICODE_SCRIPT_MYANMAR, HB_SCRIPT_MYANMAR, NC_("Script", "Myanmar") }, + { G_UNICODE_SCRIPT_OGHAM, HB_SCRIPT_OGHAM, NC_("Script", "Ogham") }, + { G_UNICODE_SCRIPT_OLD_ITALIC, HB_SCRIPT_OLD_ITALIC, NC_("Script", "Old Italic") }, + { G_UNICODE_SCRIPT_ORIYA, HB_SCRIPT_ORIYA, NC_("Script", "Oriya") }, + { G_UNICODE_SCRIPT_RUNIC, HB_SCRIPT_RUNIC, NC_("Script", "Runic") }, + { G_UNICODE_SCRIPT_SINHALA, HB_SCRIPT_SINHALA, NC_("Script", "Sinhala") }, + { G_UNICODE_SCRIPT_SYRIAC, HB_SCRIPT_SYRIAC, NC_("Script", "Syriac") }, + { G_UNICODE_SCRIPT_TAMIL, HB_SCRIPT_TAMIL, NC_("Script", "Tamil") }, + { G_UNICODE_SCRIPT_TELUGU, HB_SCRIPT_TELUGU, NC_("Script", "Telugu") }, + { G_UNICODE_SCRIPT_THAANA, HB_SCRIPT_THAANA, NC_("Script", "Thaana") }, + { G_UNICODE_SCRIPT_THAI, HB_SCRIPT_THAI, NC_("Script", "Thai") }, + { G_UNICODE_SCRIPT_TIBETAN, HB_SCRIPT_TIBETAN, NC_("Script", "Tibetan") }, + { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, HB_SCRIPT_CANADIAN_ABORIGINAL, NC_("Script", "Canadian Aboriginal") }, + { G_UNICODE_SCRIPT_YI, HB_SCRIPT_YI, NC_("Script", "Yi") }, + { G_UNICODE_SCRIPT_TAGALOG, HB_SCRIPT_TAGALOG, NC_("Script", "Tagalog") }, + { G_UNICODE_SCRIPT_HANUNOO, HB_SCRIPT_HANUNOO, NC_("Script", "Hanunoo") }, + { G_UNICODE_SCRIPT_BUHID, HB_SCRIPT_BUHID, NC_("Script", "Buhid") }, + { G_UNICODE_SCRIPT_TAGBANWA, HB_SCRIPT_TAGBANWA, NC_("Script", "Tagbanwa") }, + { G_UNICODE_SCRIPT_BRAILLE, HB_SCRIPT_BRAILLE, NC_("Script", "Braille") }, + { G_UNICODE_SCRIPT_CYPRIOT, HB_SCRIPT_CYPRIOT, NC_("Script", "Cypriot") }, + { G_UNICODE_SCRIPT_LIMBU, HB_SCRIPT_LIMBU, NC_("Script", "Limbu") }, + { G_UNICODE_SCRIPT_OSMANYA, HB_SCRIPT_OSMANYA, NC_("Script", "Osmanya") }, + { G_UNICODE_SCRIPT_SHAVIAN, HB_SCRIPT_SHAVIAN, NC_("Script", "Shavian") }, + { G_UNICODE_SCRIPT_LINEAR_B, HB_SCRIPT_LINEAR_B, NC_("Script", "Linear B") }, + { G_UNICODE_SCRIPT_TAI_LE, HB_SCRIPT_TAI_LE, NC_("Script", "Tai Le") }, + { G_UNICODE_SCRIPT_UGARITIC, HB_SCRIPT_UGARITIC, NC_("Script", "Ugaritic") }, + { G_UNICODE_SCRIPT_NEW_TAI_LUE, HB_SCRIPT_NEW_TAI_LUE, NC_("Script", "New Tai Lue") }, + { G_UNICODE_SCRIPT_BUGINESE, HB_SCRIPT_BUGINESE, NC_("Script", "Buginese") }, + { G_UNICODE_SCRIPT_GLAGOLITIC, HB_SCRIPT_GLAGOLITIC, NC_("Script", "Glagolitic") }, + { G_UNICODE_SCRIPT_TIFINAGH, HB_SCRIPT_TIFINAGH, NC_("Script", "Tifinagh") }, + { G_UNICODE_SCRIPT_SYLOTI_NAGRI, HB_SCRIPT_SYLOTI_NAGRI, NC_("Script", "Syloti Nagri") }, + { G_UNICODE_SCRIPT_OLD_PERSIAN, HB_SCRIPT_OLD_PERSIAN, NC_("Script", "Old Persian") }, + { G_UNICODE_SCRIPT_KHAROSHTHI, HB_SCRIPT_KHAROSHTHI, NC_("Script", "Kharoshthi") }, + { G_UNICODE_SCRIPT_UNKNOWN, HB_SCRIPT_UNKNOWN, NC_("Script", "Unknown") }, + { G_UNICODE_SCRIPT_BALINESE, HB_SCRIPT_BALINESE, NC_("Script", "Balinese") }, + { G_UNICODE_SCRIPT_CUNEIFORM, HB_SCRIPT_CUNEIFORM, NC_("Script", "Cuneiform") }, + { G_UNICODE_SCRIPT_PHOENICIAN, HB_SCRIPT_PHOENICIAN, NC_("Script", "Phoenician") }, + { G_UNICODE_SCRIPT_PHAGS_PA, HB_SCRIPT_PHAGS_PA, NC_("Script", "Phags-pa") }, + { G_UNICODE_SCRIPT_NKO, HB_SCRIPT_NKO, NC_("Script", "N'Ko") }, + { G_UNICODE_SCRIPT_KAYAH_LI, HB_SCRIPT_KAYAH_LI, NC_("Script", "Kayah Li") }, + { G_UNICODE_SCRIPT_LEPCHA, HB_SCRIPT_LEPCHA, NC_("Script", "Lepcha") }, + { G_UNICODE_SCRIPT_REJANG, HB_SCRIPT_REJANG, NC_("Script", "Rejang") }, + { G_UNICODE_SCRIPT_SUNDANESE, HB_SCRIPT_SUNDANESE, NC_("Script", "Sundanese") }, + { G_UNICODE_SCRIPT_SAURASHTRA, HB_SCRIPT_SAURASHTRA, NC_("Script", "Saurashtra") }, + { G_UNICODE_SCRIPT_CHAM, HB_SCRIPT_CHAM, NC_("Script", "Cham") }, + { G_UNICODE_SCRIPT_OL_CHIKI, HB_SCRIPT_OL_CHIKI, NC_("Script", "Ol Chiki") }, + { G_UNICODE_SCRIPT_VAI, HB_SCRIPT_VAI, NC_("Script", "Vai") }, + { G_UNICODE_SCRIPT_CARIAN, HB_SCRIPT_CARIAN, NC_("Script", "Carian") }, + { G_UNICODE_SCRIPT_LYCIAN, HB_SCRIPT_LYCIAN, NC_("Script", "Lycian") }, + { G_UNICODE_SCRIPT_LYDIAN, HB_SCRIPT_LYDIAN, NC_("Script", "Lydian") }, + { G_UNICODE_SCRIPT_AVESTAN, HB_SCRIPT_AVESTAN, NC_("Script", "Avestan") }, + { G_UNICODE_SCRIPT_BAMUM, HB_SCRIPT_BAMUM, NC_("Script", "Bamum") }, + { G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, HB_SCRIPT_EGYPTIAN_HIEROGLYPHS, NC_("Script", "Egyptian Hieroglpyhs") }, + { G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, HB_SCRIPT_IMPERIAL_ARAMAIC, NC_("Script", "Imperial Aramaic") }, + { G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, HB_SCRIPT_INSCRIPTIONAL_PAHLAVI, NC_("Script", "Inscriptional Pahlavi") }, + { G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, HB_SCRIPT_INSCRIPTIONAL_PARTHIAN, NC_("Script", "Inscriptional Parthian") }, + { G_UNICODE_SCRIPT_JAVANESE, HB_SCRIPT_JAVANESE, NC_("Script", "Javanese") }, + { G_UNICODE_SCRIPT_KAITHI, HB_SCRIPT_KAITHI, NC_("Script", "Kaithi") }, + { G_UNICODE_SCRIPT_LISU, HB_SCRIPT_LISU, NC_("Script", "Lisu") }, + { G_UNICODE_SCRIPT_MEETEI_MAYEK, HB_SCRIPT_MEETEI_MAYEK, NC_("Script", "Meetei Mayek") }, + { G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, HB_SCRIPT_OLD_SOUTH_ARABIAN, NC_("Script", "Old South Arabian") }, + { G_UNICODE_SCRIPT_OLD_TURKIC, HB_SCRIPT_OLD_TURKIC, NC_("Script", "Old Turkic") }, + { G_UNICODE_SCRIPT_SAMARITAN, HB_SCRIPT_SAMARITAN, NC_("Script", "Samaritan") }, + { G_UNICODE_SCRIPT_TAI_THAM, HB_SCRIPT_TAI_THAM, NC_("Script", "Tai Tham") }, + { G_UNICODE_SCRIPT_TAI_VIET, HB_SCRIPT_TAI_VIET, NC_("Script", "Tai Viet") }, + { G_UNICODE_SCRIPT_BATAK, HB_SCRIPT_BATAK, NC_("Script", "Batak") }, + { G_UNICODE_SCRIPT_BRAHMI, HB_SCRIPT_BRAHMI, NC_("Script", "Brahmi") }, + { G_UNICODE_SCRIPT_MANDAIC, HB_SCRIPT_MANDAIC, NC_("Script", "Mandaic") }, + { G_UNICODE_SCRIPT_CHAKMA, HB_SCRIPT_CHAKMA, NC_("Script", "Chakma") }, + { G_UNICODE_SCRIPT_MEROITIC_CURSIVE, HB_SCRIPT_MEROITIC_CURSIVE, NC_("Script", "Meroitic Cursive") }, + { G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, HB_SCRIPT_MEROITIC_HIEROGLYPHS, NC_("Script", "Meroitic Hieroglyphs") }, + { G_UNICODE_SCRIPT_MIAO, HB_SCRIPT_MIAO, NC_("Script", "Miao") }, + { G_UNICODE_SCRIPT_SHARADA, HB_SCRIPT_SHARADA, NC_("Script", "Sharada") }, + { G_UNICODE_SCRIPT_SORA_SOMPENG, HB_SCRIPT_SORA_SOMPENG, NC_("Script", "Sora Sompeng") }, + { G_UNICODE_SCRIPT_TAKRI, HB_SCRIPT_TAKRI, NC_("Script", "Takri") }, + { G_UNICODE_SCRIPT_BASSA_VAH, HB_SCRIPT_BASSA_VAH, NC_("Script", "Bassa") }, + { G_UNICODE_SCRIPT_CAUCASIAN_ALBANIAN, HB_SCRIPT_CAUCASIAN_ALBANIAN, NC_("Script", "Caucasian Albanian") }, + { G_UNICODE_SCRIPT_DUPLOYAN, HB_SCRIPT_DUPLOYAN, NC_("Script", "Duployan") }, + { G_UNICODE_SCRIPT_ELBASAN, HB_SCRIPT_ELBASAN, NC_("Script", "Elbasan") }, + { G_UNICODE_SCRIPT_GRANTHA, HB_SCRIPT_GRANTHA, NC_("Script", "Grantha") }, + { G_UNICODE_SCRIPT_KHOJKI, HB_SCRIPT_KHOJKI, NC_("Script", "Kjohki") }, + { G_UNICODE_SCRIPT_KHUDAWADI, HB_SCRIPT_KHUDAWADI, NC_("Script", "Khudawadi, Sindhi") }, + { G_UNICODE_SCRIPT_LINEAR_A, HB_SCRIPT_LINEAR_A, NC_("Script", "Linear A") }, + { G_UNICODE_SCRIPT_MAHAJANI, HB_SCRIPT_MAHAJANI, NC_("Script", "Mahajani") }, + { G_UNICODE_SCRIPT_MANICHAEAN, HB_SCRIPT_MANICHAEAN, NC_("Script", "Manichaean") }, + { G_UNICODE_SCRIPT_MENDE_KIKAKUI, HB_SCRIPT_MENDE_KIKAKUI, NC_("Script", "Mende Kikakui") }, + { G_UNICODE_SCRIPT_MODI, HB_SCRIPT_MODI, NC_("Script", "Modi") }, + { G_UNICODE_SCRIPT_MRO, HB_SCRIPT_MRO, NC_("Script", "Mro") }, + { G_UNICODE_SCRIPT_NABATAEAN, HB_SCRIPT_NABATAEAN, NC_("Script", "Nabataean") }, + { G_UNICODE_SCRIPT_OLD_NORTH_ARABIAN, HB_SCRIPT_OLD_NORTH_ARABIAN, NC_("Script", "Old North Arabian") }, + { G_UNICODE_SCRIPT_OLD_PERMIC, HB_SCRIPT_OLD_PERMIC, NC_("Script", "Old Permic") }, + { G_UNICODE_SCRIPT_PAHAWH_HMONG, HB_SCRIPT_PAHAWH_HMONG, NC_("Script", "Pahawh Hmong") }, + { G_UNICODE_SCRIPT_PALMYRENE, HB_SCRIPT_PALMYRENE, NC_("Script", "Palmyrene") }, + { G_UNICODE_SCRIPT_PAU_CIN_HAU, HB_SCRIPT_PAU_CIN_HAU, NC_("Script", "Pau Cin Hau") }, + { G_UNICODE_SCRIPT_PSALTER_PAHLAVI, HB_SCRIPT_PSALTER_PAHLAVI, NC_("Script", "Psalter Pahlavi") }, + { G_UNICODE_SCRIPT_SIDDHAM, HB_SCRIPT_SIDDHAM, NC_("Script", "Siddham") }, + { G_UNICODE_SCRIPT_TIRHUTA, HB_SCRIPT_TIRHUTA, NC_("Script", "Tirhuta") }, + { G_UNICODE_SCRIPT_WARANG_CITI, HB_SCRIPT_WARANG_CITI, NC_("Script", "Warang Citi") }, + { G_UNICODE_SCRIPT_AHOM, HB_SCRIPT_AHOM, NC_("Script", "Ahom") }, + { G_UNICODE_SCRIPT_ANATOLIAN_HIEROGLYPHS, HB_SCRIPT_ANATOLIAN_HIEROGLYPHS, NC_("Script", "Anatolian Hieroglyphs") }, + { G_UNICODE_SCRIPT_HATRAN, HB_SCRIPT_HATRAN, NC_("Script", "Hatran") }, + { G_UNICODE_SCRIPT_MULTANI, HB_SCRIPT_MULTANI, NC_("Script", "Multani") }, + { G_UNICODE_SCRIPT_OLD_HUNGARIAN, HB_SCRIPT_OLD_HUNGARIAN, NC_("Script", "Old Hungarian") }, + { G_UNICODE_SCRIPT_SIGNWRITING, HB_SCRIPT_SIGNWRITING, NC_("Script", "Signwriting") }, + { G_UNICODE_SCRIPT_ADLAM, HB_SCRIPT_ADLAM, NC_("Script", "Adlam") }, + { G_UNICODE_SCRIPT_BHAIKSUKI, HB_SCRIPT_BHAIKSUKI, NC_("Script", "Bhaiksuki") }, + { G_UNICODE_SCRIPT_MARCHEN, HB_SCRIPT_MARCHEN, NC_("Script", "Marchen") }, + { G_UNICODE_SCRIPT_NEWA, HB_SCRIPT_NEWA, NC_("Script", "Newa") }, + { G_UNICODE_SCRIPT_OSAGE, HB_SCRIPT_OSAGE, NC_("Script", "Osage") }, + { G_UNICODE_SCRIPT_TANGUT, HB_SCRIPT_TANGUT, NC_("Script", "Tangut") }, + { G_UNICODE_SCRIPT_MASARAM_GONDI, HB_SCRIPT_INVALID, NC_("Script", "Masaram Gondi") }, + { G_UNICODE_SCRIPT_NUSHU, HB_SCRIPT_INVALID, NC_("Script", "Nushu") }, + { G_UNICODE_SCRIPT_SOYOMBO, HB_SCRIPT_INVALID, NC_("Script", "Soyombo") }, + { G_UNICODE_SCRIPT_ZANABAZAR_SQUARE, HB_SCRIPT_INVALID, NC_("Script", "Zanabazar Square") }, +}; + +const char * +get_script_name (GUnicodeScript script) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS (scripts); i++) + { + if (scripts[i].script == script) + return g_dpgettext2 (GETTEXT_PACKAGE, "Script", scripts[i].name); + } + + return NULL; +} + +const char * +get_script_name_for_tag (guint32 tag) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS (scripts); i++) + { + if (scripts[i].hb_script == hb_script_from_iso15924_tag (tag)) + return g_dpgettext2 (GETTEXT_PACKAGE, "Script", scripts[i].name); + } + + return NULL; +} diff --git a/demos/gtk-demo/script-names.h b/demos/gtk-demo/script-names.h new file mode 100644 index 0000000000..3036c05b56 --- /dev/null +++ b/demos/gtk-demo/script-names.h @@ -0,0 +1,13 @@ +#ifndef SCRIPT_NAMES_H +#define SCRIPT_NAMES_H + +#include + +G_BEGIN_DECLS + +const char * get_script_name (GUnicodeScript script); +const char * get_script_name_for_tag (guint32 tag); + +G_END_DECLS + +#endif