# HG changeset patch # User Luke Schierer # Date 1070457715 0 # Node ID 613b20c69d2c0a3412de707c83eeecbf5ff3c3f5 # Parent 9235eecc9f745912ce5345c644e820f722118685 [gaim-migrate @ 8369] this didn't cause me any problems yesterday, and it compiles, and bug fixing is a good thing. "Some month ago I introduced translatable texts for "gaim --help" and "gaim-remote --help". Unfortunately the output of the translated text is often unreadable. The problem is, that Gaim's *.po files have the UTF-8 locale (because this is the default charset for GTK+ 2.0). But the users may have configured other locales. For instance my SuSE Linux 9.0 system is configured with LANG=de_DE@euro. "euro" is ISO-8859-1 (Western character set, 8 Bit, with the Euro currency symbol). Lots of UTF-8 characters are unreadable if they are displayed in a 8 Bit charset without conversion. Only the 7 Bit chars are displayed right. There are two possible solutions: 1) Make the console texts untranslatable. This isn't very clever. 2) Convert the texts from UTF-8 to user's locale. I choose the second solution. The conversion cannot be made during the translation, because gettext does not allow a mix of different character sets in one po-file. My patch converts the console strings from UTF-8 to users locale. Normally this works right, because most users have a locale which is compatible with their language. The case where a user uses a language (for instance German: LANG=de_DE) with an incompatible character set (for instance the 7Bit charset LC_CTYPE=C) is also handled. The user then sees a warning and the original UTF-8 message. At first I tried to make a new UTF-8 function in src/util.c. But the function is needed 5 times in src/gaim-remote.c and 2 times in src/main.c. gaim-remote is not linked against util.o. Also there are a lot of dependencies from util.o to other files, so I will introduce a lot of trouble to link gaim-remote against util.o. So I only wrote a function in src/gaim-remote.c and used the UTF-8 conversion inline in src/main.c." --Bjoern Voigt committer: Tailor Script diff -r 9235eecc9f74 -r 613b20c69d2c src/gaim-remote.c --- a/src/gaim-remote.c Wed Dec 03 07:38:43 2003 +0000 +++ b/src/gaim-remote.c Wed Dec 03 13:21:55 2003 +0000 @@ -28,9 +28,42 @@ #include +/* writes a message 'text' to screen + * message tries to convert 'text' from utf-8 to user's locale and + * uses the original message 'text' as a fallback + * + * if channel is 1, the message is printed to stdout + * if channel is 2, the message is printed to stderr + */ +void message(char *text,int channel) +{ + char *text_conv=NULL,*text_output; + GError *error=NULL; + + text_conv=g_locale_from_utf8(text,-1,NULL,NULL,&error); + + if(!text_conv) { + g_warning("%s\n", error->message); + g_error_free(error); + } + + text_output=(text_conv ? text_conv : text); + + switch(channel) { + case 1: puts(text_output); break; + case 2: fputs(text_output, stderr); break; + default: break; + } + + if(text_conv) + g_free(text_conv); +} + void show_remote_usage(char *name) { - printf(_("Usage: %s command [OPTIONS] [URI]\n\n" + char *text=NULL; + + text=g_strdup_printf(_("Usage: %s command [OPTIONS] [URI]\n\n" " COMMANDS:\n" " uri Handle AIM: URI\n" @@ -38,6 +71,10 @@ " OPTIONS:\n" " -h, --help [commmand] Show help for command\n"), name); + + message(text,1); + g_free(text); + return; } @@ -130,13 +167,12 @@ return 0; } - int command_uri() { int fd = 0; GaimRemotePacket *p = NULL; fd = gaim_remote_session_connect(0); if (fd<0) { - fprintf(stderr, _("Gaim not running (on session 0)\n")); + message(_("Gaim not running (on session 0)\n"),2); return 1; } p = gaim_remote_packet_new(CUI_TYPE_REMOTE, CUI_REMOTE_URI); @@ -152,7 +188,7 @@ GaimRemotePacket *p = NULL; fd = gaim_remote_session_connect(0); if (fd<0) { - fprintf(stderr, _("Gaim not running (on session 0)\n")); + message(_("Gaim not running (on session 0)\n"),2); return 1; } p = gaim_remote_packet_new(CUI_TYPE_META, CUI_META_QUIT); @@ -162,29 +198,29 @@ return 0; } -void show_longhelp_uri( char *name, char *command){ +void show_longhelp_uri( char *name, char *command) +{ if(!strcmp(command, "uri")) { - printf (_("\n" - "Using AIM: URIs:\n" - "Sending an IM to a screenname:\n" - " gaim-remote uri 'aim:goim?screenname=Penguin&message=hello+world'\n" - "In this case, 'Penguin' is the screenname we wish to IM, and 'hello world'\n" - "is the message to be sent. '+' must be used in place of spaces.\n" - "Please note the quoting used above - if you run this from a shell the '&'\n" - "needs to be escaped, or the command will stop at that point.\n" - "Also,the following will just open a conversation window to a screenname,\n" - "with no message:\n" - " gaim-remote uri aim:goim?screenname=Penguin\n\n" - "Joining a chat:\n" - " gaim-remote uri aim:gochat?roomname=PenguinLounge\n" - "...joins the 'PenguinLounge' chat room.\n\n" - "Adding a buddy to your buddy list:\n" - " gaim-remote uri aim:addbuddy?screenname=Penguin\n" - "...prompts you to add 'Penguin' to your buddy list.\n") - ); + message(_("\n" + "Using AIM: URIs:\n" + "Sending an IM to a screenname:\n" + " gaim-remote uri 'aim:goim?screenname=Penguin&message=hello+world'\n" + "In this case, 'Penguin' is the screenname we wish to IM, and 'hello world'\n" + "is the message to be sent. '+' must be used in place of spaces.\n" + "Please note the quoting used above - if you run this from a shell the '&'\n" + "needs to be escaped, or the command will stop at that point.\n" + "Also,the following will just open a conversation window to a screenname,\n" + "with no message:\n" + " gaim-remote uri 'aim:goim?screenname=Penguin'\n\n" + "Joining a chat:\n" + " gaim-remote uri 'aim:gochat?roomname=PenguinLounge'\n" + "...joins the 'PenguinLounge' chat room.\n\n" + "Adding a buddy to your buddy list:\n" + " gaim-remote uri 'aim:addbuddy?screenname=Penguin'\n" + "...prompts you to add 'Penguin' to your buddy list.\n"), 1); } else if(!strcmp(command, "quit")) { - printf (_("\nClose running copy of Gaim\n")); + message(_("\nClose running copy of Gaim\n"), 1); } else { show_remote_usage(name); diff -r 9235eecc9f74 -r 613b20c69d2c src/main.c --- a/src/main.c Wed Dec 03 07:38:43 2003 +0000 +++ b/src/main.c Wed Dec 03 13:21:55 2003 +0000 @@ -546,9 +546,11 @@ static void show_usage(int mode, const char *name) { + char *text=NULL; + switch (mode) { case 0: /* full help text */ - printf(_("Gaim %s\n" + text=g_strdup_printf(_("Gaim %s\n" "Usage: %s [OPTION]...\n\n" " -a, --acct display account editor window\n" " -w, --away[=MESG] make away on signon (optional argument MESG specifies\n" @@ -563,9 +565,28 @@ " -h, --help display this help and exit\n"), VERSION, name); break; case 1: /* short message */ - printf(_("Gaim %s. Try `%s -h' for more information.\n"), VERSION, name); + text=g_strdup_printf(_("Gaim %s. Try `%s -h' for more information.\n"), VERSION, name); break; } + + if(text) { + char *text_conv; + GError *error=NULL; + + /* tries to convert 'text' to users locale */ + text_conv=g_locale_from_utf8(text,-1,NULL,NULL,&error); + if(text_conv) { + puts(text_conv); + g_free(text_conv); + } + /* use 'text' as a fallback */ + else { + g_warning("%s\n", error->message); + g_error_free(error); + puts(text); + } + g_free(text); + } } #ifdef HAVE_STARTUP_NOTIFICATION