diff --git a/libgimp/gimpplugin.c b/libgimp/gimpplugin.c index 0034b74430..4cc901b468 100644 --- a/libgimp/gimpplugin.c +++ b/libgimp/gimpplugin.c @@ -898,15 +898,17 @@ _gimp_plug_in_set_i18n (GimpPlugIn *plug_in, } else { + gchar *utf8_catalog_dir = NULL; + use_gettext = GIMP_PLUG_IN_GET_CLASS (plug_in)->set_i18n (plug_in, procedure_name, gettext_domain, - catalog_dir); + &utf8_catalog_dir); if (use_gettext) { gboolean reserved = FALSE; - if (! (*gettext_domain)) + if (*gettext_domain == NULL) { *gettext_domain = g_strdup (plug_in->priv->translation_domain_name); } @@ -919,17 +921,34 @@ _gimp_plug_in_set_i18n (GimpPlugIn *plug_in, * set by the lib itself; devs must set NULL). See docs of * set_i18n() method. */ - if (*catalog_dir) - { - g_printerr ("[%s] Do not set a catalog directory with set_i18n() with reserved domain: %s\n", - procedure_name, *gettext_domain); - g_clear_pointer (catalog_dir, g_free); - } + if (utf8_catalog_dir != NULL) + g_printerr ("[%s] Do not set a catalog directory with set_i18n() with reserved domain: %s\n", + procedure_name, *gettext_domain); *catalog_dir = g_strdup (gimp_locale_directory ()); reserved = TRUE; } + if (utf8_catalog_dir != NULL && *catalog_dir == NULL) + { + GError *error = NULL; + + /* The passed-on catalog directory is in UTF-8 because this is + * usually hardcoded (in which case it's easier to request a + * specific encoding, chosen at development time, rather than the + * "OS encoding", depending on runtime). + * But now we want to transform it to the encoding used for + * filenames by GLib. + */ + *catalog_dir = g_filename_from_utf8 (utf8_catalog_dir, -1, NULL, NULL, &error); + + if (*catalog_dir == NULL) + g_printerr ("[%s] provided catalog directory is not proper UTF-8: %s\n", + procedure_name, error ? error->message : "(N/A)"); + + g_clear_error (&error); + } + if (*catalog_dir && ! reserved) { if (g_path_is_absolute (*catalog_dir)) @@ -982,6 +1001,8 @@ _gimp_plug_in_set_i18n (GimpPlugIn *plug_in, *catalog_dir = g_file_get_path (plug_in->priv->translation_domain_path); } } + + g_clear_pointer (&utf8_catalog_dir, g_free); } if (use_gettext && ! g_file_test (*catalog_dir, G_FILE_TEST_IS_DIR)) diff --git a/libgimp/gimpplugin.h b/libgimp/gimpplugin.h index fd054be367..687062920b 100644 --- a/libgimp/gimpplugin.h +++ b/libgimp/gimpplugin.h @@ -134,8 +134,8 @@ struct _GimpPlugInClass * @gettext_domain: (out) (nullable): Gettext domain. If %NULL, it * defaults to the plug-in name as determined by the * directory the binary is called from. - * @catalog_dir: (out) (nullable): relative path to a subdirectory - * of the plug-in folder containing the compiled + * @catalog_dir: (out) (nullable) (type utf8): relative path to a + * subdirectory of the plug-in folder containing the compiled * Gettext message catalogs. If %NULL, it defaults to * "locale/". * @@ -157,12 +157,12 @@ struct _GimpPlugInClass * simply set the method to %NULL, or possibly implement this method * to do something useful for your usage while returning %FALSE. * - * If you wish to tweak the @gettext_domain or the @localedir, return - * %TRUE and allocate appropriate @gettext_domain and/or @localedir + * If you wish to tweak the @gettext_domain or the @catalog_dir, return + * %TRUE and allocate appropriate @gettext_domain and/or @catalog_dir * (these use the default if set %NULL). * - * Note that @localedir must be a relative path, subdirectory of the - * directory of `gimp_get_progname()`. + * Note that @catalog_dir must be a relative path, encoded as UTF-8, + * subdirectory of the directory of `gimp_get_progname()`. * The domain names "gimp30-std-plug-ins", "gimp30-script-fu" and * "gimp30-python" are reserved and can only be used with a %NULL * @catalog_dir. These will use the translation catalogs installed for