--- gftp-2.0.19/lib/parse-dir-listing.c.orig	2008-12-09 11:58:27.338209964 +0900
+++ gftp-2.0.19/lib/parse-dir-listing.c	2008-12-09 12:06:12.492612579 +0900
@@ -97,7 +97,7 @@ parse_time (char *str, char **endpos)
 {
   struct tm curtime, *loctime;
   time_t t, ret;
-  char *tmppos;
+  char *tmppos, *format;
   size_t slen;
   int i, num;
 
@@ -131,7 +131,18 @@ parse_time (char *str, char **endpos)
 
       if (strchr (str, ':') != NULL)
         {
+#ifndef __sun
           tmppos = strptime (str, "%h %d %H:%M", &curtime);
+#else
+#  if ENABLE_NLS
+          format = dcgettext ("SUNW_OST_OSCMD", " %b %e %H:%M", LC_TIME);
+          if (format && *format == ' ')
+            format++;
+          tmppos = strptime (str, format, &curtime);
+#  else
+          tmppos = strptime (str, "%b %e %H:%M", &curtime);
+#  endif
+#endif
           t = time (NULL);
           loctime = localtime (&t);
 
@@ -141,7 +152,20 @@ parse_time (char *str, char **endpos)
             curtime.tm_year = loctime->tm_year;
         }
       else
-        tmppos = strptime (str, "%h %d %Y", &curtime);
+        {
+#ifndef __sun
+          tmppos = strptime (str, "%h %d %Y", &curtime);
+#else
+#  if ENABLE_NLS
+          format = dcgettext ("SUNW_OST_OSCMD", " %b %e  %Y", LC_TIME);
+          if (format && *format == ' ')
+            format++;
+          tmppos = strptime (str, format, &curtime);
+#  else
+          tmppos = strptime (str, "%b %e  %Y", &curtime);
+#  endif
+#endif
+        }
     }
 
   if (tmppos != NULL)
@@ -387,6 +411,7 @@ gftp_parse_ls_unix (gftp_request * reque
                     gftp_file * fle)
 {
   char *endpos, *startpos, *pos, *attribs;
+  char *backup_lc_time, *remote_lc_time;
   int cols;
 
   /* If there is no space between the attribs and links field, just make one */
@@ -494,7 +519,17 @@ gftp_parse_ls_unix (gftp_request * reque
   while (*startpos == ' ')
     startpos++;
 
+#if ENABLE_NLS
+  backup_lc_time = setlocale (LC_TIME, NULL);
+  gftp_lookup_request_option (request, "remote_lc_time", &remote_lc_time);
+  if (backup_lc_time && remote_lc_time != NULL && *remote_lc_time != '\0')
+    setlocale (LC_TIME, remote_lc_time);
+#endif
   fle->datetime = parse_time (startpos, &startpos);
+#if ENABLE_NLS
+  if (backup_lc_time && remote_lc_time != NULL && *remote_lc_time != '\0')
+    setlocale (LC_TIME, backup_lc_time);
+#endif
 
   /* Skip the blanks till we get to the next entry */
   startpos = goto_next_token (startpos);
--- gftp-2.0.19/lib/protocols.c.orig	2008-12-09 11:42:25.720946263 +0900
+++ gftp-2.0.19/lib/protocols.c	2008-12-09 14:18:02.831821587 +0900
@@ -362,12 +362,13 @@ gftp_stat_filename (gftp_request * reque
 int
 gftp_list_files (gftp_request * request)
 {
-  char *remote_lc_time, *locret;
-  int fd;
+  char *backup_lc_time, *remote_lc_time, *locret;
+  int fd, ret;
 
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
 #if ENABLE_NLS
+  backup_lc_time = setlocale (LC_TIME, NULL);
   gftp_lookup_request_option (request, "remote_lc_time", &remote_lc_time);
   if (remote_lc_time != NULL && *remote_lc_time != '\0')
     locret = setlocale (LC_TIME, remote_lc_time);
@@ -394,6 +395,9 @@ gftp_list_files (gftp_request * request)
 
       request->cachefd = fd;
       request->cached = 1;
+#if ENABLE_NLS
+      setlocale (LC_TIME, backup_lc_time);
+#endif
       return (0);
     }
   else if (request->use_cache)
@@ -407,9 +411,18 @@ gftp_list_files (gftp_request * request)
     }
 
   if (request->list_files == NULL)
-    return (GFTP_EFATAL);
+    {
+#if ENABLE_NLS
+      setlocale (LC_TIME, backup_lc_time);
+#endif
+      return (GFTP_EFATAL);
+    }
 
-  return (request->list_files (request));
+  ret = request->list_files (request);
+#if ENABLE_NLS
+  setlocale (LC_TIME, backup_lc_time);
+#endif
+  return (ret);
 }
 
 
@@ -795,6 +808,12 @@ gftp_set_account (gftp_request * request
 int
 gftp_set_directory (gftp_request * request, const char *directory)
 {
+  mode_t st_mode;
+  off_t linksize;
+  char *locale_directory = NULL;
+  int fd;
+  size_t dest_len;
+
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
   g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
@@ -809,6 +828,29 @@ gftp_set_directory (gftp_request * reque
         }
       return (0);
     }
+  else if (request->url_prefix && !strcmp (request->url_prefix, "file"))
+    {
+      st_mode = 0;
+      linksize = 0;
+      gftp_stat_filename (request, directory, &st_mode, &linksize);
+      if (!S_ISDIR (st_mode))
+        {
+          locale_directory = gftp_filename_from_utf8 (request, directory, &dest_len);
+          if (locale_directory != NULL &&
+              (fd = gftp_fd_open (request, locale_directory, O_RDONLY, 0)) != -1)
+            {
+              close (fd);
+              request->directory = g_strdup (directory);
+            }
+          else if ((fd = gftp_fd_open (request, directory, O_RDONLY, 0)) != -1)
+            {
+              close (fd);
+              request->directory = g_strdup (directory);
+            }
+          g_free (locale_directory);
+          return (0);
+        }
+    }
   else if (request->chdir == NULL)
     return (GFTP_EFATAL);
   return (request->chdir (request, directory));