changeset 7724:613b20c69d2c

[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 <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Wed, 03 Dec 2003 13:21:55 +0000
parents 9235eecc9f74
children 15c7973b7fe8
files src/gaim-remote.c src/main.c
diffstat 2 files changed, 83 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- 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 <gaim-remote/remote.h>
 
+/* 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);
--- 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