This is the Frequently Asked Question list for Glade-Perl source generator especially those that relate to internationalisation (I18N) issues -------------------------------------------------------------------------- Q I wanted my real name and address in the files, so I added René to the project xml file but when inspecting the generated files, I found # Copyright (c) Date Sat Apr 1 13:21:33 CEST 2000 # Author RenÃf© Clearly glade2perl (or some module used herein) is doing something weird to the accented e in my name. A You guessed correctly - XML::Parser (which I use to read the options files as well as the Glade file) produces UTF8 encoded characters and these need to be converted from UTF8 to Latin1 in your case. Glade-Perl >= 0.53 should handle ISO-8859-1 characters correctly in both the Glade file and the project options files. If you want to use another encoding, you can edit Glade/PerlGenerate at or near line 76 to read: $Glade_Perl->{'options'}{'glade_encoding'} ||= 'ISO-8859-9'; so that Glade-Perl will default to another encoding (see XML::Parser docs). You can also specify a user option (either in glade2perl or in the project options file as ISO-8859-9 to read the user options file as Latin9 characters. In Glade-Perl 0.52 there are some commented lines that you can uncomment to handle Latin1 characters. If you always want to use European characters there are some changes that you can make to Glade/PerlXML.pm so that your characters will be handled correctly. This will also allow European characters in the UI. First download from CPAN and install perl module Unicode::String. Then uncomment PerlXML.pm line 23 to use() the module use Unicode::String qw(utf8 latin1); # To read ISO-8859-1 chars Comment out PerlXML line 181 and uncomment line 183 # Comment out the line below if you are using european characters # $np->{$self->[$count]} = $self->[$count+1][2]; # Uncomment the line below if you are using european characters $np->{$self->[$count]} = &utf8($self->[$count+1][2])->latin1; I am working on a proper solution that will allow Glade-Perl to handle all character encodings and I would greatly appreciate any advice :) -------------------------------------------------------------------------- Q How can I generate i18n apps? A Just generate the UI and app as normal :) If you want to gettext/translate strings in your signal handlers, surround them with a call like '_("Your text to translate")' and they will be translated when the app is run (if you have loaded a .mo file). You can edit the generated ProjectUI.pm file to specify a test .mo file but by default the app will look for a file called Project.mo (your project name) NB The only difference with Glade-Perl gettext and the original C gettext is that the empty string ('') is returned as '' and to get the .mo file header information you must call _('__MO_HEADER_INFO'). This stops widgets that are set to the empty string being translated to the .mo header info :) -------------------------------------------------------------------------- Q How do I find out which strings to translate (put in the Project.pot file). A Make a directory (eg ppo) to keep all the i18n stuff together There are two easy ways to find out which strings to translate, otherwise you have to read through all the source and copy them. 1) First of all, check (set ON) the project option 'Glade/User Option/LibGlade Options/Save Translatable Strings' Enter a filename in the 'File' to something eg ppo/xgettext.in and save the project. Use xgettext to generate a .pot (work) file for later editing by: xgettext -LC -ao ppo/Project.pot xgettext.in 2) Or insert 4 lines in your app (or uncomment them in the generated subclass). i) In the BEGIN sub insert the lines use Glade::PerlSource; @ISA = qw( Project Glade::PerlSource ); # use your project name ii) Just after you call '$class->load_translations('Project');' (see FAQ How do I test the translation file) insert the line '$class->start_checking_gettext_strings;' iii)Just after you call 'Gtk->main;' insert the line '$class->write_missing_gettext_strings;' Then when you run your app, go to every corner so that all the strings get loaded. Any that are still missing from any loaded .mo file are noted and written in .po format so that you can cut and paste them from the run log or disk file into your work ppo/Project.pot file. You can call $class->stop_checking_gettext_strings; at any time to stop logging the strings. You can merge the new strings in ppo/Project.pot into any existing ppo/fr.pot file by calling 'msgmerge ppo/fr.pot ppo/Project.pot' The order of the files is important - the first file gets updated. -------------------------------------------------------------------------- Q How do I make the ppo/fr.mo translation file A 1) copy ppo/Project.pot to file (eg ppo/fr.pot) and edit the translations Make sure that you have edited the all the strings in the header and when you are ready to try it out remove the msgfmt directive line #, fuzzy from just above the header info at the top of the ppo/fr.po file or the next step will fail (it means ignore the next definition). 2) When you want to try out the translations, copy ppo/fr.pot (temporary) to ppo/fr.po (final file) and use msgfmt to create a ppo/fr.mo file for use by gettext by calling: msgfmt -o ppo/fr.mo ppo/fr.po -------------------------------------------------------------------------- Q How do I test the translation file A 1) You can edit the Project->app_run() sub or wherever you call 'Gtk->init;' to specify your test src/fr.mo file with a line like: $class->load_translations('Project', 'test', undef, '/path/to/ppo/fr.mo'); Then run your program and see your UI in another language! Repeat the edit/test until you are happy with the translations. 2) Install /path/to/ppo/fr.mo to /usr/local/share/locale/LC_MESSAGES/fr/Project.mo (or wherever) Set your $LANG env variable to a language that you have translated and run your app (after removing the testing line from Project->app_run). ------------------------------------------------------------------------- Q Unicode::String 2.05 fails compilation under (default) Perl 5.6.0. A The maintainers have been notified and should fix this problem soon (17 Apr 2000) but if you are brave you can amend String.xs as below It dies because PERL_POLLUTE is disabled by default in 5.6 which includes these two lines (from embedvar.h): #define na PL_na #define dowarn PL_dowarn Adding those to the top of String.xs should cure any "'dowarn' undeclared/undefined (first use in this function)" messages when compiling Unicode::String. Thanks to Jay J for this temporary fix -------------------------------------------------------------------------