diff -uNr xmms-1.2.3-orig/acconfig.h xmms-1.2.3/acconfig.h
--- xmms-1.2.3-orig/acconfig.h	Mon Feb 14 22:34:05 2000
+++ xmms-1.2.3/acconfig.h	Wed Sep 20 17:04:32 2000
@@ -13,3 +13,5 @@
 #undef HAVE_LC_MESSAGES
 #undef HAVE_STPCPY
 #undef DISABLE_STRICT_FPE
+/* Define if you use multibyte charactor */
+#undef I18N_MB
diff -uNr xmms-1.2.3-orig/configure xmms-1.2.3/configure
--- xmms-1.2.3-orig/configure	Wed Sep 20 06:30:29 2000
+++ xmms-1.2.3/configure	Wed Sep 20 17:04:32 2000
@@ -71,6 +71,8 @@
   --with-gnome-libs       Specify location of GNOME libs"
 ac_help="$ac_help
   --with-gnome            Specify prefix for GNOME files"
+ac_help="$ac_help
+  --enable-i18n	multibyte character support"
 
 # Initialize some variables set by options.
 # The variables have the same names as the options, with
@@ -4850,12 +4852,15 @@
 #include <sys/types.h>
 #include <fcntl.h>
 #include <sys/mman.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
 
 /* This mess was copied from the GNU getpagesize.h.  */
 #ifndef HAVE_GETPAGESIZE
-# ifdef HAVE_UNISTD_H
-#  include <unistd.h>
-# endif
 
 /* Assume that all systems that can run configure have sys/param.h.  */
 # ifndef HAVE_SYS_PARAM_H
@@ -4910,7 +4915,7 @@
 	/*
 	 * First, make a file with some known garbage in it.
 	 */
-	data = malloc(pagesize);
+	data = (char*)malloc(pagesize);
 	if (!data)
 		exit(1);
 	for (i = 0; i < pagesize; ++i)
@@ -4931,7 +4936,7 @@
 	fd = open("conftestmmap", O_RDWR);
 	if (fd < 0)
 		exit(1);
-	data2 = malloc(2 * pagesize);
+	data2 = (char*)malloc(2 * pagesize);
 	if (!data2)
 		exit(1);
 	data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
@@ -4949,7 +4954,7 @@
 	 */
 	for (i = 0; i < pagesize; ++i)
 		*(data2 + i) = *(data2 + i) + 1;
-	data3 = malloc(pagesize);
+	data3 = (char*)malloc(pagesize);
 	if (!data3)
 		exit(1);
 	if (read(fd, data3, pagesize) != pagesize)
@@ -7249,6 +7254,61 @@
 
 subdirs="libxmms"
 
+
+echo $ac_n "checking for _Xsetlocale in -lX11""... $ac_c" 1>&6
+echo "configure:7202: checking for _Xsetlocale in -lX11" >&5
+ac_lib_var=`echo X11'_'_Xsetlocale | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lX11  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 7210 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char _Xsetlocale();
+
+int main() {
+_Xsetlocale()
+; return 0; }
+EOF
+if { (eval echo configure:7221: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  CFLAGS="$CFLAGS -DX_LOCALE"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Check whether --enable-i18n or --disable-i18n was given.
+if test "${enable_i18n+set}" = set; then
+  enableval="$enable_i18n"
+  I18N_MB=$enableval
+else
+  I18N_MB=yes
+fi
+
+if test "$I18N_MB" = "yes"; then
+	cat >> confdefs.h <<\EOF
+#define I18N_MB 1
+EOF
+
+fi
 
 
 
diff -uNr xmms-1.2.3-orig/configure.in xmms-1.2.3/configure.in
--- xmms-1.2.3-orig/configure.in	Wed Sep 20 06:22:16 2000
+++ xmms-1.2.3/configure.in	Wed Sep 20 17:04:32 2000
@@ -326,6 +326,14 @@
 
 AC_CONFIG_SUBDIRS(libxmms)
 
+AC_CHECK_LIB(X11, _Xsetlocale, CFLAGS="$CFLAGS -DX_LOCALE",,)
+AC_ARG_ENABLE(i18n,
+[  --enable-i18n	multibyte character support],
+		I18N_MB=$enableval, I18N_MB=yes)
+if test "$I18N_MB" = "yes"; then
+	AC_DEFINE(I18N_MB)
+fi
+
 AC_SUBST(xmmsdir)
 AC_SUBST(plugindir)
 
diff -uNr xmms-1.2.3-orig/po/ko.po xmms-1.2.3/po/ko.po
--- xmms-1.2.3-orig/po/ko.po	Wed Sep 20 06:32:14 2000
+++ xmms-1.2.3/po/ko.po	Thu Sep 21 00:49:49 2000
@@ -2340,7 +2340,7 @@
 #: xmms/main.c:264
 #, fuzzy
 msgid "/Play Directory"
-msgstr "µð·ºÅÍ¸®:"
+msgstr "/µð·ºÅÍ¸®"
 
 #: xmms/main.c:265
 msgid "/Play Location"
@@ -2859,7 +2859,7 @@
 
 #: xmms/prefswin.c:827
 msgid "Use fontsets (Enable for multi-byte charset support)"
-msgstr ""
+msgstr "ÆùÆ®¼Â »ç¿ë (¸ÖÆ¼¹ÙÀÌÆ® ¹®ÀÚÀÇ »ç¿ëÀ» À§ÇØ)"
 
 #: xmms/prefswin.c:1018 xmms/prefswin.c:1048
 msgid " (enabled)"
@@ -3274,23 +3274,23 @@
 #~ msgid "Add file(s) to playlist"
 #~ msgstr "¿¬ÁÖ¸ñ·Ï¿¡ ÆÄÀÏ Ãß°¡"
 
-#~ msgid "Select playinfo extra font:"
-#~ msgstr "¿¬ÁÖÁ¤º¸ È®Àå ±Û²Ã ¼±ÅÃ:"
+msgid "Select playinfo extra font:"
+msgstr "¿¬ÁÖÁ¤º¸ È®Àå ±Û²Ã ¼±ÅÃ:"
 
-#~ msgid "Playinfo Options"
-#~ msgstr "¿¬ÁÖÁ¤º¸ ¿É¼Ç"
+msgid "Playinfo Options"
+msgstr "¿¬ÁÖÁ¤º¸ ¿É¼Ç"
 
-#~ msgid "Use X11 font anyway"
-#~ msgstr "X11 ±Û²Ã¸¸ »ç¿ë"
+msgid "Use X11 font anyway"
+msgstr "X11 ±Û²Ã¸¸ »ç¿ë"
 
-#~ msgid "Playinfo Extra font"
-#~ msgstr "¿¬ÁÖÁ¤º¸ È®Àå ±Û²Ã"
+msgid "Playinfo Extra font"
+msgstr "¿¬ÁÖÁ¤º¸ È®Àå ±Û²Ã"
 
-#~ msgid "NOTE: This take effect next time you restart XMMS."
-#~ msgstr "°æ°í: ÀÌ ¼³Á¤Àº XMMS¸¦ Àç½ÃÀÛÇÒ ¶§ºÎÅÍ Àû¿ëµË´Ï´Ù."
+msgid "NOTE: This take effect next time you restart XMMS."
+msgstr "°æ°í: ÀÌ ¼³Á¤Àº XMMS¸¦ Àç½ÃÀÛÇÒ ¶§ºÎÅÍ Àû¿ëµË´Ï´Ù."
 
-#~ msgid "Font height arrange:"
-#~ msgstr "±Û²Ã ³ôÀÌ Á¶Á¤:"
+msgid "Font height arrange:"
+msgstr "±Û²Ã ³ôÀÌ Á¶Á¤:"
 
-#~ msgid "Extra options"
-#~ msgstr "È®Àå ¿É¼Ç"
+msgid "Extra options"
+msgstr "È®Àå ¿É¼Ç"
diff -uNr xmms-1.2.3-orig/xmms/bmp.c xmms-1.2.3/xmms/bmp.c
--- xmms-1.2.3-orig/xmms/bmp.c	Sun May 21 04:22:41 2000
+++ xmms-1.2.3/xmms/bmp.c	Wed Sep 20 17:04:32 2000
@@ -32,6 +32,9 @@
 #define BI_BITFIELDS  3L
 
 static GdkGC *bmp_gc = NULL;
+#ifdef I18N_MB
+static GdkColor *textfg = NULL, *textbg = NULL;
+#endif
 
 int read_le_short(FILE * file, guint16 * ret)
 {
@@ -64,6 +67,100 @@
 static void read_24b_rgb(guint8 *input, gint input_size, guint8 *output, guint32 w, guint32 h);
 
 
+#ifdef I18N_MB
+GdkColor *get_textfg_frombmp()
+{
+       GdkColor *fg = NULL;
+       GdkColormap *cm = gdk_colormap_get_system();
+
+       if (textfg)
+               fg = g_malloc(6 * sizeof(GdkColor));
+       if (fg)
+       {
+               gint i;
+               memcpy(fg, textfg, 6 * sizeof(GdkColor));
+               for (i = 0; i < 6; i++)
+                       gdk_color_alloc(gdk_colormap_get_system(), &fg[i]);
+       }
+       return fg;
+}
+
+GdkColor *get_textbg_frombmp()
+{
+       GdkColor *bg = NULL;
+       GdkColormap *cm = gdk_colormap_get_system();
+       if (textbg)
+               bg = g_malloc(6 * sizeof(GdkColor));
+       if (bg)
+       {
+               gint i;
+               memcpy(bg, textbg, 6 * sizeof(GdkColor));
+               for (i = 0; i < 6; i++)
+                       gdk_color_alloc(gdk_colormap_get_system(), &bg[i]);
+       }
+       return bg;
+}
+
+/*
+ * detect text foreground and backgrond in every raster.
+ */
+void search_textbg_or_textfg(guchar * data, int w, int h)
+{
+       gint i, d;
+       if (textfg)
+       {
+               g_free(textfg);
+               textfg = NULL;
+       }
+       if (textbg)
+       {
+               g_free(textbg);
+               textbg = NULL;
+       }
+       textbg = g_malloc(sizeof(GdkColor) * 6);
+       textfg = g_malloc(sizeof(GdkColor) * 6);
+
+       if ((!textbg) || (!textfg))
+               return;
+
+       for (i = 0; i < 6; i++)
+       {
+               gint red, green, blue;
+               gint maxd = -1;
+               gint x, y, k = 0;
+
+               textbg[i].red = (data[(i * w + w - 1) * 3] << 8) | 0xff;
+               textbg[i].green = (data[(i * w + w - 1) * 3 + 1] << 8) | 0xff;
+               textbg[i].blue = (data[(i * w + w - 1) * 3 + 2] << 8) | 0xff;
+
+               while (maxd < 4 && (i + k) >= 0 && (i + k) < 6)
+               {
+                       for (x = 0; x < w; x++)
+                       {
+
+                               red = data[((i + k) * w + x) * 3];
+                               green = data[((i + k) * w + x) * 3 + 1];
+                               blue = data[((i + k) * w + x) * 3 + 2];
+                               d = abs(red - ((unsigned int) textbg[i].red >> 8))
+                                       + abs(green - ((unsigned int) textbg[i].green >> 8))
+                                       + abs(blue - ((unsigned int) textbg[i].blue >> 8));
+                               if (d > maxd)
+                               {
+                                       textfg[i].red = (red << 8) | 0xff;
+                                       textfg[i].green = (green << 8) | 0xff;
+                                       textfg[i].blue = (blue << 8) | 0xff;
+                                       maxd = d;
+                               }
+                       }
+                       if (i < 3)
+                               k++;
+                       else
+                               k--;
+               }
+       }
+}
+#endif
+
 GdkPixmap *read_bmp(gchar * filename)
 {
 	FILE *file;
@@ -182,6 +279,12 @@
 		read_24b_rgb(buffer, imgsize, data, w, h);
 	else
 		g_warning("read_bmp(): Unsupported bitdepth: %d", bitcount);
+
+
+#ifdef I18N_MB
+	if (g_strcasecmp(basename(filename), "text.bmp") == 0)
+		search_textbg_or_textfg(data,w,h);
+#endif
 
 	ret = gdk_pixmap_new(mainwin->window, w, h, gdk_rgb_get_visual()->depth);
 
diff -uNr xmms-1.2.3-orig/xmms/bmp.h xmms-1.2.3/xmms/bmp.h
--- xmms-1.2.3-orig/xmms/bmp.h	Thu Feb 17 06:05:55 2000
+++ xmms-1.2.3/xmms/bmp.h	Wed Sep 20 17:04:32 2000
@@ -20,5 +20,7 @@
 #define BMP_H
 
 GdkPixmap *read_bmp(char *file);
+GdkColor *get_textfg_frombmp();
+GdkColor *get_textbg_frombmp();
 
 #endif
diff -uNr xmms-1.2.3-orig/xmms/main.c xmms-1.2.3/xmms/main.c
--- xmms-1.2.3-orig/xmms/main.c	Fri Sep 15 22:36:10 2000
+++ xmms-1.2.3/xmms/main.c	Wed Sep 20 23:49:21 2000
@@ -333,6 +333,9 @@
 	cfg.no_playlist_advance = FALSE;
 	cfg.smooth_title_scroll = TRUE;
 	cfg.random_skin_on_play = FALSE;
+#ifdef I18N_MB
+	cfg.use_fontsets = TRUE;
+#endif
 
 	cfg.playlist_x = 295;
 	cfg.playlist_y = 20;
@@ -409,6 +412,11 @@
 		xmms_cfg_read_boolean(cfgfile, "xmms", "playlist_shaded", &cfg.playlist_shaded);
 		xmms_cfg_read_boolean(cfgfile, "xmms", "playlist_visible", &cfg.playlist_visible);
 		xmms_cfg_read_string(cfgfile, "xmms", "playlist_font", &cfg.playlist_font);
+#ifdef I18N_MB
+		xmms_cfg_read_string(cfgfile, "xmms", "playinfo_font", &cfg.playinfo_font);
+		xmms_cfg_read_boolean(cfgfile, "xmms", "playinfo_font_use_X11font", &cfg.playinfo_font_use_x11font);
+		xmms_cfg_read_int(cfgfile, "xmms", "playinfo_font_arrange", &cfg.playinfo_font_arrange);
+#endif
 		xmms_cfg_read_boolean(cfgfile, "xmms", "use_fontsets", &cfg.use_fontsets);
 		xmms_cfg_read_int(cfgfile, "xmms", "playlist_position", &cfg.playlist_position);
 		xmms_cfg_read_int(cfgfile, "xmms", "equalizer_x", &cfg.equalizer_x);
@@ -460,7 +468,14 @@
 	}
 
 	if (cfg.playlist_font == NULL)
+#ifndef I18N_MB
 		cfg.playlist_font = g_strdup("-adobe-helvetica-bold-r-*-*-10-*");
+#else
+		cfg.playlist_font = g_strdup("-*-helvetica-medium-r-*-*-12-*,-*-gulim-medium-r-*--12-*,-*-*-medium-r-*--12-*,*");
+	if (cfg.playinfo_font == NULL)
+		cfg.playinfo_font = g_strdup("-*-helvetica-medium-r-*-*-10-*,-*-gulim-medium-r-*--10-*,-*-*-medium-r-*--10-*,-*-*-medium-r-*--12-*,*");
+#endif
+
 	if (cfg.outputplugin == NULL)
 	{
 #if defined(HAVE_SYS_SOUNDCARD_H) || defined(HAVE_MACHINE_SOUNDCARD_H)
@@ -576,6 +591,11 @@
 	xmms_cfg_write_boolean(cfgfile, "xmms", "pause_between_songs", cfg.pause_between_songs);
 	xmms_cfg_write_int(cfgfile, "xmms", "pause_between_songs_time", cfg.pause_between_songs_time);
 	xmms_cfg_write_int(cfgfile, "xmms", "mouse_wheel_change", cfg.mouse_change);
+#ifdef I18N_MB
+	xmms_cfg_write_string(cfgfile, "xmms", "playinfo_font", cfg.playinfo_font);
+	xmms_cfg_write_boolean(cfgfile, "xmms", "playinfo_font_use_X11font", cfg.playinfo_font_use_x11font);
+	xmms_cfg_write_int(cfgfile, "xmms", "playinfo_font_arrange", cfg.playinfo_font_arrange);
+#endif
  	xmms_cfg_write_string(cfgfile, "xmms", "eqpreset_default_file", cfg.eqpreset_default_file);
  	xmms_cfg_write_string(cfgfile, "xmms", "eqpreset_extension", cfg.eqpreset_extension);
 	for (i = 0; i < 10; i++)
@@ -2644,7 +2664,11 @@
 	mainwin_pl = create_tbutton(&mainwin_wlist, mainwin_bg, mainwin_gc, 242, 58, 23, 12, 23, 61, 69, 61, 23, 73, 69, 73, mainwin_pl_pushed, SKIN_SHUFREP);
 	tbutton_set_toggled(mainwin_pl, cfg.playlist_visible);
 
+#ifndef I18N_MB
 	mainwin_info = create_textbox(&mainwin_wlist, mainwin_bg, mainwin_gc, 112, 27, 153, 1, SKIN_TEXT);
+#else
+	mainwin_info = create_mbtextbox(&mainwin_wlist, mainwin_bg, mainwin_gc, 112, 27, 153, 1, SKIN_TEXT);
+#endif
 	textbox_set_scroll(mainwin_info, cfg.autoscroll);
 	mainwin_rate_text = create_textbox(&mainwin_wlist, mainwin_bg, mainwin_gc, 111, 43, 15, 0, SKIN_TEXT);
 	mainwin_freq_text = create_textbox(&mainwin_wlist, mainwin_bg, mainwin_gc, 156, 43, 10, 0, SKIN_TEXT);
diff -uNr xmms-1.2.3-orig/xmms/main.h xmms-1.2.3/xmms/main.h
--- xmms-1.2.3-orig/xmms/main.h	Wed Aug 30 03:18:19 2000
+++ xmms-1.2.3/xmms/main.h	Wed Sep 20 17:04:32 2000
@@ -58,6 +58,12 @@
 	gint pause_between_songs_time;
 	gboolean pause_between_songs;
 	gint mouse_change;
+#ifdef I18N_MB
+	gchar *playinfo_font;
+	gint playinfo_font_arrange;
+	gboolean playinfo_font_use_x11font;
+#endif
+
 }
 Config;
 
diff -uNr xmms-1.2.3-orig/xmms/playlistwin.c xmms-1.2.3/xmms/playlistwin.c
--- xmms-1.2.3-orig/xmms/playlistwin.c	Fri Sep 15 22:36:10 2000
+++ xmms-1.2.3/xmms/playlistwin.c	Wed Sep 20 17:04:32 2000
@@ -446,7 +446,11 @@
 			cfg.playlist_height = nh;
 			resize_widget(playlistwin_list, cfg.playlist_width - 31, cfg.playlist_height - 58);
 			move_widget(playlistwin_slider, cfg.playlist_width - 15, 20);
+#ifndef I18N_MB
 			resize_widget(playlistwin_sinfo, cfg.playlist_width - 35, 14);
+#else
+			resize_widget(playlistwin_sinfo, cfg.playlist_width - 35, playlistwin_sinfo->tb_widget.height);
+#endif
 			playlistwin_update_sinfo();
 			move_widget(playlistwin_shade, cfg.playlist_width - 21, 3);
 			move_widget(playlistwin_close, cfg.playlist_width - 11, 3);
@@ -1471,7 +1475,11 @@
 	playlistwin_create_mask();
 	playlistwin_gc = gdk_gc_new(playlistwin->window);
 
+#ifndef I18N_MB
 	playlistwin_sinfo = create_textbox(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, 4, 4, cfg.playlist_width - 35, FALSE, SKIN_TEXT);
+#else
+	playlistwin_sinfo = create_mbtextbox(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, 4, 4, cfg.playlist_width - 35, FALSE, SKIN_TEXT);
+#endif
 	if (!cfg.playlist_shaded)
 		hide_widget(playlistwin_sinfo);
 	if (cfg.playlist_shaded)
diff -uNr xmms-1.2.3-orig/xmms/prefswin.c xmms-1.2.3/xmms/prefswin.c
--- xmms-1.2.3-orig/xmms/prefswin.c	Tue Sep 12 22:26:38 2000
+++ xmms-1.2.3/xmms/prefswin.c	Thu Sep 21 00:20:59 2000
@@ -60,6 +60,16 @@
 GtkWidget *prefswin_options_font_frame, *prefswin_options_font_hbox;
 GtkWidget *prefswin_options_font_vbox;
 GtkWidget *prefswin_options_font_entry, *prefswin_options_font_browse;
+#ifdef I18N_MB
+GtkWidget *prefswin_pi_options_frame, *prefswin_pi_options_vbox, *prefswin_pi_options_table;
+GtkWidget *prefswin_pi_options_uxf;
+GtkWidget *prefswin_pi_options_font_frame, *prefswin_pi_options_font_vbox;
+GtkWidget *prefswin_pi_options_font_label;
+GtkWidget *prefswin_pi_options_font_hbox;
+GtkWidget *prefswin_pi_options_font_entry, *prefswin_pi_options_font_browse;
+GtkWidget *prefswin_pi_options_fontar_hbox, *prefswin_pi_options_fontar;
+GtkWidget *prefswin_pi_options_fontar_entry, *prefswin_pi_options_fontar_label;
+#endif
 GtkWidget *prefswin_options_fontsel, *prefswin_options_fontset;
 GtkWidget *prefswin_vbox, *prefswin_hbox, *prefswin_ok, *prefswin_cancel,
          *prefswin_apply;
@@ -298,6 +308,10 @@
 void prefswin_apply_changes(void)
 {
 	g_free(cfg.playlist_font);
+#ifdef I18N_MB
+	g_free(cfg.playinfo_font);
+#endif
+
 	cfg.allow_multiple_instances = GTK_TOGGLE_BUTTON(prefswin_options_ami)->active;
 	cfg.always_show_cb = GTK_TOGGLE_BUTTON(prefswin_options_asc)->active;
 	cfg.convert_underscore = GTK_TOGGLE_BUTTON(prefswin_options_cus)->active;
@@ -328,6 +342,11 @@
 	set_current_output_plugin(selected_oplugin);
 	set_current_effect_plugin(selected_eplugin);
 
+#ifdef I18N_MB
+	cfg.playinfo_font = g_strdup(gtk_entry_get_text(GTK_ENTRY(prefswin_pi_options_font_entry)));
+	cfg.playinfo_font_use_x11font = GTK_TOGGLE_BUTTON(prefswin_pi_options_uxf)->active;
+	sscanf(gtk_entry_get_text(GTK_ENTRY(prefswin_pi_options_fontar_entry)), "%u", &cfg.playinfo_font_arrange);
+#endif
 	equalizerwin_set_doublesize(cfg.doublesize && cfg.eq_doublesize_linked);
 
 	if (cfg.dim_titlebar)
@@ -482,6 +501,21 @@
 	gtk_clist_select_row(GTK_CLIST(prefswin_audio_ilist), sel, 0);
 }
 
+#ifdef I18N_MB
+void prefswin_i18n_mb_font_browse_cb(GtkWidget * w, gpointer data)
+{
+	if (!prefswin_options_fontsel)
+	{
+		prefswin_options_fontsel = gtk_font_selection_dialog_new("Select playinfo extra font:");
+		gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(prefswin_options_fontsel), cfg.playinfo_font);
+		gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(prefswin_options_fontsel)->ok_button), "clicked", GTK_SIGNAL_FUNC(prefswin_font_browse_ok), NULL);
+		gtk_signal_connect_object(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(prefswin_options_fontsel)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(prefswin_options_fontsel));
+		gtk_signal_connect(GTK_OBJECT(prefswin_options_fontsel), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &prefswin_options_fontsel);
+		gtk_widget_show(prefswin_options_fontsel);
+	}
+}
+#endif
+
 void create_prefs_window(void)
 {
 	GtkWidget *scrolled_win;
@@ -829,6 +863,59 @@
 
 	gtk_notebook_append_page(GTK_NOTEBOOK(prefswin_notebook), prefswin_options_vbox, gtk_label_new(_("Options")));
 
+#ifdef I18N_MB
+       /*
+        * I18N MB Options page
+        */
+	prefswin_pi_options_vbox = gtk_vbox_new(FALSE, 0);
+	prefswin_pi_options_frame = gtk_frame_new(_("Playinfo Options"));
+	gtk_box_pack_start(GTK_BOX(prefswin_pi_options_vbox), prefswin_pi_options_frame, FALSE, FALSE, 0);
+	gtk_container_border_width(GTK_CONTAINER(prefswin_pi_options_frame), 5);
+	prefswin_pi_options_table = gtk_table_new(2, 7, FALSE);
+	gtk_container_add(GTK_CONTAINER(prefswin_pi_options_frame), prefswin_pi_options_table);
+	gtk_container_border_width(GTK_CONTAINER(prefswin_pi_options_table), 5);
+
+
+	prefswin_pi_options_uxf = gtk_check_button_new_with_label(_("Use X11 font anyway"));
+	gtk_table_attach_defaults(GTK_TABLE(prefswin_pi_options_table), prefswin_pi_options_uxf, 0, 1, 0, 1);
+
+
+	prefswin_pi_options_font_frame = gtk_frame_new(_("Playinfo Extra font"));
+	gtk_container_set_border_width(GTK_CONTAINER(prefswin_pi_options_font_frame), 5);
+	gtk_box_pack_start(GTK_BOX(prefswin_pi_options_vbox), prefswin_pi_options_font_frame, FALSE, FALSE, 0);
+	prefswin_pi_options_font_vbox = gtk_vbox_new(FALSE, 5);
+	gtk_container_border_width(GTK_CONTAINER(prefswin_pi_options_font_vbox), 5);
+	gtk_container_add(GTK_CONTAINER(prefswin_pi_options_font_frame), prefswin_pi_options_font_vbox);
+
+	prefswin_pi_options_font_label = gtk_label_new(_("NOTE: This take effect next time you restart XMMS."));
+	gtk_container_add(GTK_CONTAINER(prefswin_pi_options_font_vbox), prefswin_pi_options_font_label);
+
+	prefswin_pi_options_font_hbox = gtk_hbox_new(FALSE, 5);
+	gtk_container_border_width(GTK_CONTAINER(prefswin_pi_options_font_hbox), 5);
+	gtk_container_add(GTK_CONTAINER(prefswin_pi_options_font_vbox), prefswin_pi_options_font_hbox);
+
+	prefswin_pi_options_font_entry = gtk_entry_new();
+	gtk_box_pack_start(GTK_BOX(prefswin_pi_options_font_hbox), prefswin_pi_options_font_entry, TRUE, TRUE, 0);
+	prefswin_pi_options_font_browse = gtk_button_new_with_label(_("Browse"));
+	gtk_signal_connect(GTK_OBJECT(prefswin_pi_options_font_browse), "clicked", GTK_SIGNAL_FUNC(prefswin_i18n_mb_font_browse_cb), NULL);
+	gtk_widget_set_usize(prefswin_pi_options_font_browse, 85, 17);
+	gtk_box_pack_start(GTK_BOX(prefswin_pi_options_font_hbox), prefswin_pi_options_font_browse, FALSE, TRUE, 0);
+
+	prefswin_pi_options_fontar_hbox = gtk_hbox_new(FALSE, 5);
+	gtk_container_border_width(GTK_CONTAINER(prefswin_pi_options_fontar_hbox), 5);
+	gtk_container_add(GTK_CONTAINER(prefswin_pi_options_font_vbox), prefswin_pi_options_fontar_hbox);
+	prefswin_pi_options_fontar = gtk_label_new(_("Font height arrange:"));
+	gtk_box_pack_start(GTK_BOX(prefswin_pi_options_fontar_hbox), prefswin_pi_options_fontar, FALSE, FALSE, 0);
+	prefswin_pi_options_fontar_entry = gtk_entry_new_with_max_length(2);
+	gtk_widget_set_usize(prefswin_pi_options_fontar_entry, 20, -1);
+	gtk_box_pack_start(GTK_BOX(prefswin_pi_options_fontar_hbox), prefswin_pi_options_fontar_entry, FALSE, FALSE, 0);
+	prefswin_pi_options_fontar_label = gtk_label_new(_("pixels"));
+	gtk_box_pack_start(GTK_BOX(prefswin_pi_options_fontar_hbox), prefswin_pi_options_fontar_label, FALSE, FALSE, 0);
+
+
+	gtk_notebook_append_page(GTK_NOTEBOOK(prefswin_notebook), prefswin_pi_options_vbox, gtk_label_new(_("Extra options")));
+#endif 
+
 	/* 
 	 * Ok, Cancel & Apply 
 	 */
@@ -1132,6 +1219,13 @@
 	gtk_entry_set_text(GTK_ENTRY(prefswin_options_pbs_entry), temp);
 
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prefswin_egplugins_euse_cbox), cfg.use_eplugins);
+
+#ifdef I18N_MB
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prefswin_pi_options_uxf), cfg.playinfo_font_use_x11font);
+	gtk_entry_set_text(GTK_ENTRY(prefswin_pi_options_font_entry), cfg.playinfo_font);
+	sprintf(temp, "%u", cfg.playinfo_font_arrange);
+	gtk_entry_set_text(GTK_ENTRY(prefswin_pi_options_fontar_entry), temp);
+#endif
 
  	gtk_widget_show_all(prefswin);
 	gtk_widget_grab_default(prefswin_ok);
diff -uNr xmms-1.2.3-orig/xmms/skin.c xmms-1.2.3/xmms/skin.c
--- xmms-1.2.3-orig/xmms/skin.c	Fri Sep 15 22:36:10 2000
+++ xmms-1.2.3/xmms/skin.c	Wed Sep 20 17:04:32 2000
@@ -136,6 +136,14 @@
 		skin->vis_color[i][1] = skin_default_viscolor[i][1];
 		skin->vis_color[i][2] = skin_default_viscolor[i][2];
 	}
+
+#ifdef I18N_MB
+	for (i = 0; i < 6; i++)
+	{
+		skin->def_textfg[i] = skin->def_pledit_normal;
+		skin->def_textbg[i] = skin->def_pledit_normalbg;
+	}
+#endif
 	skin->def_mask = create_default_mask(mainwin->window, 275, 116);
 	skin->def_mask_ds = create_default_mask(mainwin->window, 550, 232);
 	skin->def_mask_shade = create_default_mask(mainwin->window, 275, 14);
@@ -432,11 +440,21 @@
 		g_free(skin->pledit_normalbg);
 	if (skin->pledit_selectedbg)
 		g_free(skin->pledit_selectedbg);
+#ifdef I18N_MB
+	if (skin->textfg)
+		g_free(skin->textfg);
+	if (skin->textbg)
+		g_free(skin->textbg);
+#endif
 
 	skin->pledit_normal = NULL;
 	skin->pledit_current = NULL;
 	skin->pledit_normalbg = NULL;
 	skin->pledit_selectedbg = NULL;
+#ifdef I18N_MB
+	skin->textfg = NULL;
+	skin->textbg = NULL;
+#endif
 	for (i = 0; i < 24; i++)
 	{
 		skin->vis_color[i][0] = skin_default_viscolor[i][0];
@@ -533,6 +551,10 @@
 		skin->pledit_current = load_skin_color(path, "pledit.txt", "text", "current");
 		skin->pledit_normalbg = load_skin_color(path, "pledit.txt", "text", "normalbg");
 		skin->pledit_selectedbg = load_skin_color(path, "pledit.txt", "text", "selectedbg");
+#ifdef I18N_MB
+		skin->textbg = get_textbg_frombmp();
+		skin->textfg = get_textfg_frombmp();
+#endif
 		skin->mask_main = skin_create_transparent_mask(path, "region.txt", "Normal", mainwin->window, 275, 116, FALSE);
 		skin->mask_main_ds = skin_create_transparent_mask(path, "region.txt", "Normal", mainwin->window, 550, 232, TRUE);
 		skin->mask_shade = skin_create_transparent_mask(path, "region.txt", "WindowShade", mainwin->window, 275, 14, FALSE);
@@ -714,6 +736,18 @@
 			if (!ret)
 				ret = &skin->def_pledit_selectedbg;
 			break;
+#ifdef I18N_MB
+		case SKIN_TEXTFG:
+			ret = skin->textfg;
+			if (!ret)
+				ret = skin->def_textfg;
+			break;
+		case SKIN_TEXTBG:
+			ret = skin->textbg;
+			if (!ret)
+				ret = skin->def_textbg;
+			break;
+#endif
 	}
 	return ret;
 }
diff -uNr xmms-1.2.3-orig/xmms/skin.h xmms-1.2.3/xmms/skin.h
--- xmms-1.2.3-orig/xmms/skin.h	Sat Aug  5 23:10:37 2000
+++ xmms-1.2.3/xmms/skin.h	Wed Sep 20 17:04:32 2000
@@ -23,6 +23,9 @@
 	SKIN_MAIN, SKIN_CBUTTONS, SKIN_TITLEBAR, SKIN_SHUFREP, SKIN_TEXT, SKIN_VOLUME,
 	SKIN_BALANCE, SKIN_MONOSTEREO, SKIN_PLAYPAUSE, SKIN_NUMBERS, SKIN_POSBAR,
 	SKIN_PLEDIT, SKIN_EQMAIN, SKIN_EQ_EX,
+#ifdef I18N_MB
+	SKIN_TEXTFG, SKIN_TEXTBG
+#endif
 } SkinIndex;
 
 typedef enum
@@ -69,6 +72,10 @@
 	GdkColor *pledit_normalbg, def_pledit_normalbg;
 	GdkColor *pledit_selectedbg, def_pledit_selectedbg;
 	guchar vis_color[24][3];
+#ifdef I18N_MB
+	GdkColor *textfg,def_textfg[6];
+	GdkColor *textbg,def_textbg[6];
+#endif
 	GdkBitmap *def_mask, *def_mask_ds;
 	GdkBitmap *def_mask_shade, *def_mask_shade_ds;
 	GdkBitmap *mask_main, *mask_main_ds;
diff -uNr xmms-1.2.3-orig/xmms/textbox.c xmms-1.2.3/xmms/textbox.c
--- xmms-1.2.3-orig/xmms/textbox.c	Sat Aug  5 23:10:38 2000
+++ xmms-1.2.3/xmms/textbox.c	Wed Sep 20 19:33:56 2000
@@ -21,6 +21,33 @@
 
 void textbox_generate_pixmap(TextBox * tb);
 
+#ifdef I18N_MB
+gint mbtext_width(GdkFont * font, gchar * text, gint length)
+{
+	gint i, len, width;
+
+	if (!font)
+		width = length * 5;
+	else if (cfg.playinfo_font_use_x11font)
+		width = gdk_text_width(font, text, length);
+	else
+	{
+		for (i = 0, width = 0; i < length; i++)
+		{
+			len = mblen(&text[i], MB_CUR_MAX);
+			if (len > 1)
+			{
+				width += gdk_text_width(font, &text[i], len);
+				i += len - 1;
+			}
+			else
+				width += 5;
+		}
+	}
+	return width;
+}
+#endif
+
 void textbox_draw(Widget * w)
 {
 	TextBox *tb = (TextBox *) w;
@@ -55,9 +82,17 @@
 		cw = tb->tb_pixmap_width - tb->tb_offset;
 		if (cw > tb->tb_widget.width)
 			cw = tb->tb_widget.width;
+#ifndef I18N_MB
 		gdk_draw_pixmap(obj, tb->tb_widget.gc, src, tb->tb_offset, 0, tb->tb_widget.x, tb->tb_widget.y, cw, 6);
+#else
+		gdk_draw_pixmap(obj, tb->tb_widget.gc, src, tb->tb_offset, 0, tb->tb_widget.x, tb->tb_widget.y, cw, tb->tb_widget.height);
+#endif
 		if (cw < tb->tb_widget.width)
+#ifndef I18N_MB
 			gdk_draw_pixmap(obj, tb->tb_widget.gc, src, 0, 0, tb->tb_widget.x + cw, tb->tb_widget.y, tb->tb_widget.width - cw, 6);
+#else
+			gdk_draw_pixmap(obj, tb->tb_widget.gc, src, 0, 0, tb->tb_widget.x + cw, tb->tb_widget.y, tb->tb_widget.width-cw, tb->tb_widget.height);
+#endif
 	}
 }
 
@@ -157,16 +192,28 @@
 	if (wl * 5 != tb->tb_widget.width)
 		wl++;
 
+#ifdef I18N_MB
+	if (mbtext_width(tb->font, text, length) < tb->tb_widget.width)
+#else
 	if (length <= wl)
+#endif
 	{
 		tb->tb_is_scrollable = FALSE;
+#ifdef I18N_MB
+		pad = (tb->tb_widget.width - mbtext_width(tb->font, text, length)) / mbtext_width(tb->font, " ", 1);
+#else
 		pad = wl - length;
+#endif
 		tb->tb_text = (gchar *) g_realloc(tb->tb_text, length + pad + 1);
 		for (i = 0; i < pad; i++)
 			strcat(tb->tb_text, " ");
 		length += pad;		
 	}
+#ifdef I18N_MB
+	else if (mbtext_width(tb->font, text, length) > tb->tb_widget.width && tb->tb_scroll_allowed)
+#else
 	else if (length * 5 > tb->tb_widget.width && tb->tb_scroll_allowed)
+#endif
 	{
 		tb->tb_is_scrollable = TRUE;
 		length += 7;
@@ -182,6 +229,10 @@
 {
 	gint length, i, x, y;
 	GdkGC *gc;
+#ifdef I18N_MB
+	gint xx, yy;
+	GdkPixmap *tmp_pixmap;
+#endif
 
 	if (tb->tb_pixmap)
 		gdk_pixmap_unref(tb->tb_pixmap);
@@ -211,13 +262,40 @@
 	}
 	
 
+#ifndef I18N_MB
 	tb->tb_pixmap_width = length * 5;
 	tb->tb_pixmap = gdk_pixmap_new(mainwin->window, tb->tb_pixmap_width, 6, gdk_rgb_get_visual()->depth);
+#else
+	tb->tb_pixmap_width=mbtext_width(tb->font, tb->tb_text, length);
+	if(tb->tb_pixmap_width < tb->tb_widget.width)
+		tb->tb_pixmap_width=tb->tb_widget.width;
+	tb->tb_pixmap=gdk_pixmap_new(mainwin->window,tb->tb_pixmap_width,
+		tb->tb_widget.height,gdk_visual_get_best_depth());
+#endif
 	gc = tb->tb_widget.gc;
 
+#ifdef I18N_MB
+	xx = 0;
+	if (tb->font)
+		yy = abs((int) ((double) (tb->tb_widget.height - 6) / 2 + 1));
+	else
+		yy = 0;
+	tmp_pixmap = gdk_pixmap_new(mainwin->window, tb->tb_pixmap_width,
+					1, gdk_visual_get_best_depth());
+	/* Draw default background */
+	for (y = 0; y < tb->tb_widget.height; y++)
+	{
+		gdk_gc_set_foreground(gc, &(get_skin_color(SKIN_TEXTBG)[5 * y / (tb->tb_widget.height - 1)]));
+		gdk_draw_rectangle(tb->tb_pixmap, gc, 1, 0, y, tb->tb_pixmap_width, 1);
+	}
+#endif
 	for (i = 0; i < length; i++)
 	{
 		x = y = -1;
+#ifdef I18N_MB
+		if ((!tb->font) || (!cfg.playinfo_font_use_x11font))
+		{
+#endif
 		tb->tb_text[i] = toupper(tb->tb_text[i]);
 		if (tb->tb_text[i] >= 'A' && tb->tb_text[i] <= 'Z')
 		{
@@ -315,6 +393,7 @@
 					x = 150;
 					y = 6;
 					break;
+#ifndef I18N_MB
 				case 'å':
 				case 'Å':
 					x = 0;
@@ -335,6 +414,7 @@
 					x = 100;
 					y = 0;
 					break;
+#endif
 				case '?':
 					x = 15;
 					y = 12;
@@ -343,14 +423,49 @@
 					x = 20;
 					y = 12;
 					break;
+#ifdef I18N_MB
+				case ' ':
+#else
 				default:
+#endif
 					x = 145;
 					y = 0;
 					break;
 			}
 		}
+#ifdef I18N_MB
+		}
+		if (x < 0 && tb->font)
+		{				/* draw multibyte charactor with gradiation */
+			gint len, y, w, h;
+			len = mblen(&tb->tb_text[i], MB_CUR_MAX);
+			if (len > 0)
+			{
+				w = gdk_text_width(tb->font, &tb->tb_text[i], len);	
+				h = tb->tb_widget.height;
+				for (y = 0; y < h; y++)
+				{
+					gdk_draw_pixmap(tmp_pixmap, gc, tb->tb_pixmap, xx, y, 0, 0, w, h);
+					gdk_gc_set_foreground(gc, &(get_skin_color(SKIN_TEXTFG)[5 * y / (h - 1)]));
+					gdk_draw_text(tmp_pixmap, tb->font, gc, 0, tb->font->ascent + cfg.playinfo_font_arrange - 2 - y, &tb->tb_text[i], len);
+					gdk_draw_pixmap(tb->tb_pixmap, gc, tmp_pixmap, 0, 0, xx, y, w, 1);
+				}
+				xx += w;
+				i += len - 1;
+			}
+		}
+		else
+		{					/* draw single charactor with  skin's font */
+			skin_draw_pixmap(tb->tb_pixmap, gc, tb->tb_skin_index, x, y, xx, yy, 5, 6);
+			xx += 5;
+		}
+#else
 		skin_draw_pixmap(tb->tb_pixmap, gc, tb->tb_skin_index, x, y, i * 5, 0, 5, 6);
+#endif
 	}
+#ifdef I18N_MB
+	gdk_pixmap_unref(tmp_pixmap);
+#endif
 
 	
 }
@@ -383,6 +498,9 @@
 	TextBox *tb;
 
 	tb = (TextBox *) g_malloc0(sizeof (TextBox));
+#ifdef I18N_MB
+	tb->font = NULL;
+#endif
 	tb->tb_widget.parent = parent;
 	tb->tb_widget.gc = gc;
 	tb->tb_widget.x = x;
@@ -400,6 +518,32 @@
 	add_widget(wlist, tb);
 	return tb;
 }
+
+#ifdef I18N_MB
+TextBox *create_mbtextbox(GList ** wlist, GdkPixmap * parent, GdkGC * gc, gint x, gint y, gint w, gboolean allow_scroll, SkinIndex si)
+{
+	TextBox *tb;
+	GdkFont *font;
+	gint height;
+
+	tb = create_textbox(wlist, parent, gc, x, y, w, allow_scroll, si);
+
+	if (strlen(cfg.playinfo_font))
+		font = gdk_fontset_load(cfg.playinfo_font);
+
+	if (font)
+	{
+		tb->font = font;
+		height = font->ascent + font->descent - 2 + cfg.playinfo_font_arrange;
+		if (height > 6)
+			tb->tb_widget.y -= (height - 6) / 2;
+		else
+			height = 6;
+		tb->tb_widget.height = height;
+	}
+	return tb;
+}
+#endif
 
 void free_textbox(TextBox * tb)
 {
diff -uNr xmms-1.2.3-orig/xmms/textbox.h xmms-1.2.3/xmms/textbox.h
--- xmms-1.2.3-orig/xmms/textbox.h	Thu Feb 17 06:05:59 2000
+++ xmms-1.2.3/xmms/textbox.h	Wed Sep 20 17:04:32 2000
@@ -33,6 +33,9 @@
 	         tb_is_dragging;
 	gint tb_timeout_tag, tb_drag_x, tb_drag_off;
 	SkinIndex tb_skin_index;
+#ifdef I18N_MB
+	GdkFont *font;
+#endif
 }
 TextBox;
 
@@ -40,5 +43,8 @@
 void textbox_set_scroll(TextBox * tb, gboolean s);
 TextBox *create_textbox(GList ** wlist, GdkPixmap * parent, GdkGC * gc, gint x, gint y, gint w, gboolean allow_scroll, SkinIndex si);
 void free_textbox(TextBox * tb);
+#ifdef I18N_MB
+TextBox *create_mbtextbox(GList **wlist,GdkPixmap *parent,GdkGC *gc,gint x,gint y,gint w,gboolean allow_scroll,SkinIndex si);
+#endif
 
 #endif
diff -uNr xmms-1.2.3-orig/xmms/xmms.h xmms-1.2.3/xmms/xmms.h
--- xmms-1.2.3-orig/xmms/xmms.h	Thu Jun  1 11:56:20 2000
+++ xmms-1.2.3/xmms/xmms.h	Wed Sep 20 17:04:32 2000
@@ -18,6 +18,8 @@
 #ifndef XMMS_H
 #define XMMS_H
 
+#include "config.h"
+
 #include <gtk/gtk.h>
 #include <gdk/gdkx.h>
 #include <gdk/gdkkeysyms.h>
@@ -82,7 +84,5 @@
 #include "sm.h"
 #include "dnd.h"
 #include "urldecode.h"
-
-#include "config.h"
 
 #endif
