gettext on win32 issue



Hi all,

I am having an issue using gettext to translate a GTKmm application in
win32 (it works fine on Linux). My build environment is based on MSYS
and I've tried to build the app with both the GTKmm 2.16 and GTKmm
2.20 installers I've found here:
http://ftp.gnome.org/pub/GNOME/binaries/win32/gtkmm/

Basically when I run the app (in Windows), gettext works fine for the
following strings:
 + Custom gtk objects, like default buttons (OK or cancel) or default
menus (archive, new exit, etc)
 + Strings that are translated at execution time with a call to _()
(both in console or in the GUI)

But it fails when the string is static and marked as translatable with
N() but my application never calls to _() explicitely. Basically there
are 2 kinds of strings that are not translated:
 + Those included in the GOptionEntry list, which show the available
options that can be passed to the program through command line
 + Strings included in the .glade file that never change during the
execution of the application, for example a menu called "Game", or a
label that contains the word "rotate"

It looks like I'm missing something that somehow gets done on Linux
automatically, but that is necessary on Windows. Here's the offending
code related to the issue (a bit cleaned up so it can be "easily"
read):


/* ... */
static GOptionEntry g_cmdEntries[] =
{
    { "version", 0, 0, G_OPTION_ARG_NONE, &g_version,
      N_("Prints current version of the software and exists"),
      NULL },

    /* and much more that are declared in the same way */

    { NULL }
};

/* ... */

static GOptionContext* g_cmdContext = NULL;

/* ... */

int main(int argc, char **argv)
{
    GError* error = NULL;
    char    errorStringBuffer[ERROR_STRING_BUFFER_SIZE];

    // I've tested the following with no luck:
    // + calling to setlocale (LC_ALL, ""); alone,
    // + calling to gtk_set_locale(); without calling previusly to
gtk_disable_setlocale ();
    // + And the code already present here (which looked to me the
most correct reading the doc)
    gtk_disable_setlocale ();
    gtk_set_locale();
    //setlocale (LC_ALL, "");

    // i18n initialisation
    // make sure first that the message catalog can be found
    if (bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR) != NULL)
    {
        // UTF-8 chosen as codeset
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
        // initialise the message catalog
        textdomain (GETTEXT_PACKAGE);
    }
    else
    {
        // if the locale could not be set, trying to localise this string
        // doesn't make a lot of sense
        std::cerr << "Error while setting the locale" << std::endl;
    }

    // This string is correctly translated. Note it calls _(), so it's
translated at running time
    g_cmdContext = g_option_context_new (_("- The GNU polyominoes board game"));

    g_option_context_add_main_entries (g_cmdContext, g_cmdEntries,
GETTEXT_PACKAGE);

    g_option_context_set_translation_domain (g_cmdContext, GETTEXT_PACKAGE);

    GOptionGroup* grp = gtk_get_option_group (TRUE);

    g_option_context_add_group (g_cmdContext, grp);

    g_option_group_set_translation_domain (grp, GETTEXT_PACKAGE);
    if (!g_option_context_parse (g_cmdContext, &argc, &argv, &error))
    {
        std::stringstream errMessage;
        errMessage << _("Error parsing command line")
                   << ": "
                   << error->message;

        FatalError(argv[0], errMessage.str().c_str(), COMMAND_LINE_PARSING_ERR);
    }

    /* some code handling the command line options parsed by gtk */

    /* ... If the user chose to show the GUI ... */
    Gtk::Main::init_gtkmm_internals();
    if(!g_thread_supported())
        g_thread_init(NULL);

    Gtk::Main kit(argc, argv);
    Glib::RefPtr<Gtk::Builder> gtkBuilder = Gtk::Builder::create();
    gtkBuilder->set_translation_domain(GETTEXT_PACKAGE);

    // retrieve the glade definitions from the object mebedded in the .exe file
    gtkBuilder->add_from_string(
                    reinterpret_cast<const char *>(__BIN_GUI_GLADE_START__),
                    reinterpret_cast<long int>(__BIN_GUI_GLADE_SIZE__))

    MainWindow *pMainWindow = NULL;
    gtkBuilder->get_widget_derived(GUI_MAIN_WINDOW_NAME, pMainWindow);

    if (pMainWindow  != NULL)
        kit.run(*pMainWindow);


Can anybody see what is happening? I've tried everything I've found on
the internet, but no luck so far translating those "static" strings.

Thanks


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