Changeset 257

Show
Ignore:
Timestamp:
04/05/03 13:02:57 (6 years ago)
Author:
jajcus
Message:

- i18n infrastructure seems complete. Now only testing, bugfixing and translations are needed.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/jggtrans.xml

    r235 r257  
    8888 </vCard> 
    8989 
     90 <!-- Default user locale (language).  
     91      Empty means system locale setting,  
     92      no (or commented-out) <default_locale> tag means no translations. --> 
     93 <!-- <default_locale>pl_PL</default_locale> --> 
     94 
    9095 <!-- Logger configuration.  
    9196      You may configure one logger of type "syslog" and/or one of type "file". 
  • trunk/jggtrans.xml.Pl

    r246 r257  
    9595 </vCard> 
    9696 
     97 <!-- domyślne locale (język) użytkownika.  
     98      Puste oznacza lokale systemowe, a brak to brak tłumaczeń --> 
     99 <default_locale>pl_PL</default_locale> 
     100 
    97101 <!--  
    98102      Konfiguracja logów.  
  • trunk/po/pl.po

    • Property svn:eol-style deleted
    • Property svn:keywords deleted
    r255 r257  
    66msgstr "" 
    77"Project-Id-Version: jabber-gg-transport 1.4.1\n" 
    8 "POT-Creation-Date: 2003-04-04 19:39+0200\n" 
     8"POT-Creation-Date: 2003-04-05 12:55+0200\n" 
    99"PO-Revision-Date: 2003-04-04 19:43+0200\n" 
    1010"Last-Translator: Jacek Konieczny <jajcus@pld.org.pl>\n" 
     
    5454msgstr "" 
    5555 
    56 #: src/main.c:280 
     56#: src/main.c:243 
     57msgid "Daemonizing..." 
     58msgstr "" 
     59 
     60#: src/main.c:245 
     61#, c-format 
     62msgid "Failed to fork(): %s" 
     63msgstr "" 
     64 
     65#: src/main.c:251 
     66#, c-format 
     67msgid "Daemon born, pid %i." 
     68msgstr "" 
     69 
     70#: src/main.c:273 
     71msgid "I am a daemon, I think." 
     72msgstr "" 
     73 
     74#: src/main.c:282 
    5775#, c-format 
    5876msgid "" 
     
    6179msgstr "" 
    6280 
    63 #: src/main.c:281 src/main.c:290 
     81#: src/main.c:283 src/main.c:292 
    6482msgid "\n" 
    6583msgstr "" 
    6684 
    67 #: src/main.c:282 
     85#: src/main.c:284 
    6886#, c-format 
    6987msgid "\tUsage: %s [OPTIONS]... [<config file>]\n" 
    7088msgstr "" 
    7189 
    72 #: src/main.c:283 
     90#: src/main.c:285 
    7391msgid "" 
    7492"\n" 
     
    7694msgstr "" 
    7795 
    78 #: src/main.c:284 
     96#: src/main.c:286 
    7997msgid "\t-h\t      This message\n" 
    8098msgstr "" 
    8199 
    82 #: src/main.c:285 
     100#: src/main.c:287 
    83101msgid "" 
    84102"\t-f\t      Run in foreground. Debug/error messages will be sent to stderr\n" 
    85103msgstr "" 
    86104 
    87 #: src/main.c:286 
    88 msgid "\t-d <n>      Log level (0(default) - normal, >0 more, <0 less)\n" 
    89 msgstr "" 
    90  
    91 #: src/main.c:287 
    92 msgid "\t-D <n>      libgg debug level (enables also -f)\n" 
    93 msgstr "" 
    94  
    95105#: src/main.c:288 
    96 msgid "\t-u <user>   Switch to uid of <user> on startup\n" 
     106msgid "\t-d <n>\tLog level (0(default) - normal, >0 more, <0 less)\n" 
    97107msgstr "" 
    98108 
    99109#: src/main.c:289 
    100 msgid "\t-g <group>  Switch to gid of <group> on startup\n" 
    101 msgstr "" 
    102  
    103 #: src/main.c:349 
     110msgid "\t-D <n>\tlibgg debug level (enables also -f)\n" 
     111msgstr "" 
     112 
     113#: src/main.c:290 
     114msgid "\t-u <user>\tSwitch to uid of <user> on startup\n" 
     115msgstr "" 
     116 
     117#: src/main.c:291 
     118msgid "\t-g <group>\tSwitch to gid of <group> on startup\n" 
     119msgstr "" 
     120 
     121#: src/main.c:351 
    104122msgid "Cannot change user." 
    105123msgstr "" 
    106124 
    107 #: src/main.c:353 
     125#: src/main.c:355 
    108126msgid "Cannot change group." 
    109127msgstr "" 
    110128 
    111 #: src/main.c:358 
     129#: src/main.c:360 
    112130#, c-format 
    113131msgid "Unknown command-line option: -%c.\n" 
    114132msgstr "Nieznana opcja: -%c.\n" 
    115133 
    116 #: src/main.c:360 
     134#: src/main.c:362 
    117135#, c-format 
    118136msgid "Unknown command-line option: -\\%03o.\n" 
    119137msgstr "Nieznana opcja: -\\%03o.\n" 
    120138 
    121 #: src/main.c:364 
     139#: src/main.c:366 
    122140msgid "Error while processing command line options" 
    123141msgstr "" 
    124142 
    125 #: src/main.c:370 
     143#: src/main.c:372 
    126144#, c-format 
    127145msgid "Unexpected argument: %s\n" 
    128146msgstr "" 
    129147 
    130 # vi: encoding=utf-8 
     148#: src/main.c:392 
     149msgid "Couldn't load config!" 
     150msgstr "" 
     151 
     152#: src/main.c:397 
     153#, c-format 
     154msgid "%s doesn't look like jggtrans config file." 
     155msgstr "" 
     156 
     157#: src/main.c:408 
     158msgid "Multiple syslog configs specified. Using only one." 
     159msgstr "" 
     160 
     161#: src/main.c:419 
     162#, c-format 
     163msgid "Unknown syslog facility: %s" 
     164msgstr "" 
     165 
     166#: src/main.c:422 
     167msgid "Multiple log files specified. Using only one." 
     168msgstr "" 
     169 
     170#: src/main.c:429 
     171#, c-format 
     172msgid "Ignoring unknown log type: %s" 
     173msgstr "" 
     174 
     175#: src/main.c:446 
     176msgid "jggtrans already running" 
     177msgstr "" 
     178 
     179#: src/main.c:448 
     180msgid "Stale pid file. Removing." 
     181msgstr "" 
     182 
     183#: src/main.c:452 
     184msgid "Invalid pid file." 
     185msgstr "" 
     186 
     187#: src/main.c:456 
     188#, c-format 
     189msgid "Couldn't open pidfile %s" 
     190msgstr "" 
     191 
     192#: src/main.c:463 
     193#, c-format 
     194msgid "Couldn't find group %s" 
     195msgstr "" 
     196 
     197#: src/main.c:468 
     198#, c-format 
     199msgid "Couldn't find user %s" 
     200msgstr "" 
     201 
     202#: src/main.c:471 
     203#, c-format 
     204msgid "Couldn't change group: %s" 
     205msgstr "" 
     206 
     207#: src/main.c:472 
     208#, c-format 
     209msgid "Couldn't init groups: %s" 
     210msgstr "" 
     211 
     212#: src/main.c:473 
     213#, c-format 
     214msgid "Couldn't change user: %s" 
     215msgstr "" 
     216 
     217#: src/main.c:475 
     218msgid "Refusing to run with uid=0" 
     219msgstr "" 
     220 
     221#: src/main.c:493 
     222#, c-format 
     223msgid "Couldn't open log file '%s': %s" 
     224msgstr "" 
     225 
     226#: src/main.c:525 
     227#, c-format 
     228msgid "Restarting in %i seconds.\n" 
     229msgstr "" 
     230 
     231#: src/main.c:546 
     232msgid "Exiting normally.\n" 
     233msgstr "" 
     234 
     235#: src/message.c:432 
     236msgid "" 
     237"\n" 
     238"Available commands (and abbreviations):" 
     239msgstr "" 
     240"\n" 
     241"Dost�e komendy (i skr�:" 
     242 
     243#: src/message.c:437 
     244msgid " EXPERIMENTAL!" 
     245msgstr "" 
     246 
     247#: src/message.c:439 
     248#, c-format 
     249msgid "" 
     250"%s\n" 
     251"Current settings:" 
     252msgstr "" 
     253 
     254#: src/message.c:440 
     255#, c-format 
     256msgid "" 
     257"%s\n" 
     258"  friends only: %s" 
     259msgstr "" 
     260 
     261#: src/message.c:440 src/message.c:441 
     262msgid "on" 
     263msgstr "" 
     264 
     265#: src/message.c:440 src/message.c:441 
     266msgid "off" 
     267msgstr "" 
     268 
     269#: src/message.c:441 
     270#, c-format 
     271msgid "" 
     272"%s\n" 
     273"  invisible: %s" 
     274msgstr "" 
  • trunk/src/ggtrans.h

    r255 r257  
    1 /* $Id: ggtrans.h,v 1.7 2003/04/04 17:59:32 jajcus Exp $ */ 
     1/* $Id: ggtrans.h,v 1.8 2003/04/05 11:02:57 jajcus Exp $ */ 
    22 
    33/* 
     
    3030 
    3131/* dummy gettext shortcut for translating error/debug messages after log handler is set */ 
    32 #define __(String) gettext (String) 
     32#define N_(String) gettext (String) 
    3333 
    3434extern GMainLoop *main_loop; 
  • trunk/src/iq.c

    r244 r257  
    1 /* $Id: iq.c,v 1.35 2003/03/25 07:43:45 jajcus Exp $ */ 
     1/* $Id: iq.c,v 1.36 2003/04/05 11:02:57 jajcus Exp $ */ 
    22 
    33/* 
     
    319319void jabber_iq(Stream *s,xmlnode x){ 
    320320char *type; 
     321char *from; 
     322User *u; 
    321323 
    322324        if (jabber_state!=JS_CONNECTED){ 
     
    324326                return; 
    325327        } 
     328 
     329        from=xmlnode_get_attrib(x,"from"); 
     330        if (from) u=user_get_by_jid(from); 
     331        else u=NULL; 
     332        user_load_locale(u); 
    326333 
    327334        type=xmlnode_get_attrib(x,"type"); 
  • trunk/src/main.c

    r256 r257  
    1 /* $Id: main.c,v 1.36 2003/04/05 10:24:50 jajcus Exp $ */ 
     1/* $Id: main.c,v 1.37 2003/04/05 11:02:57 jajcus Exp $ */ 
    22 
    33/* 
     
    220220                        const gchar *message, gpointer user_data){ 
    221221 
    222 char *lc_ctype,*lc_messages; 
    223  
     222char *lc_ctype,*lc_messages,*td_codeset; 
     223 
     224        td_codeset=bind_textdomain_codeset(PACKAGE,NULL); 
    224225        lc_ctype=setlocale(LC_CTYPE,NULL); 
    225226        lc_messages=setlocale(LC_MESSAGES,NULL); 
     
    232233        setlocale(LC_CTYPE,lc_ctype); 
    233234        setlocale(LC_MESSAGES,lc_ctype); 
     235        bind_textdomain_codeset(PACKAGE,td_codeset); 
    234236} 
    235237 
     
    239241int fd; 
    240242 
    241         debug(__("Daemonizing...")); 
     243        debug(N_("Daemonizing...")); 
    242244        pid=fork(); 
    243         if (pid==-1) g_error(__("Failed to fork(): %s"),g_strerror(errno)); 
     245        if (pid==-1) g_error(N_("Failed to fork(): %s"),g_strerror(errno)); 
    244246        if (pid){ 
    245247                if (pidfile){ 
     
    247249                        fclose(pidfile); 
    248250                } 
    249                 debug(__("Daemon born, pid %i."),pid); 
     251                debug(N_("Daemon born, pid %i."),pid); 
    250252                exit(0); 
    251253        } 
     
    269271        if (sid==-1) abort(); 
    270272        foreground=FALSE; 
    271         debug(__("I am a daemon, I think.")); 
     273        debug(N_("I am a daemon, I think.")); 
    272274        return; 
    273275} 
     
    384386        setlocale(LC_MESSAGES,"C"); 
    385387        setlocale(LC_CTYPE,"C"); 
     388        bind_textdomain_codeset(PACKAGE,"UTF-8"); 
    386389 
    387390        config=xmlnode_file(config_file); 
    388391        if (!config){ 
    389                 g_error(__("Couldn't load config!")); 
     392                g_error(N_("Couldn't load config!")); 
    390393                return 1; 
    391394        } 
    392395        str=xmlnode_get_name(config); 
    393396        if (!str || strcmp(str,"jggtrans")){ 
    394                 g_error(__("%s doesn't look like jggtrans config file."),config_file); 
     397                g_error(N_("%s doesn't look like jggtrans config file."),config_file); 
    395398                return 1; 
    396399        } 
     
    403406                if (!strcmp(log_type,"syslog")){ 
    404407                        if (log_facility!=-1){ 
    405                                 g_warning(__("Multiple syslog configs specified. Using only one.")); 
     408                                g_warning(N_("Multiple syslog configs specified. Using only one.")); 
    406409                                continue; 
    407410                        } 
     
    414417                                if (!strcmp(facilitynames[log_facility].name,str)) break; 
    415418                        if (!facilitynames[log_facility].name) 
    416                                  g_error(__("Unknown syslog facility: %s"),str); 
     419                                 g_error(N_("Unknown syslog facility: %s"),str); 
    417420                } 
    418421                else if (!strcmp(log_type,"file")){ 
    419                         if (log_filename) g_warning(__("Multiple log files specified. Using only one.")); 
     422                        if (log_filename) g_warning(N_("Multiple log files specified. Using only one.")); 
    420423                        else{ 
    421424                                data=xmlnode_get_data(tag); 
     
    424427                        } 
    425428                } 
    426                 else g_warning(__("Ignoring unknown log type: %s"),xmlnode2str(tag)); 
     429                else g_warning(N_("Ignoring unknown log type: %s"),xmlnode2str(tag)); 
    427430        } 
    428431 
     
    441444                        if (r==1 && pid>0){ 
    442445                                r=kill(pid,0); 
    443                                 if (!r || (r && errno!=ESRCH)) g_error(__("jggtrans already running")); 
     446                                if (!r || (r && errno!=ESRCH)) g_error(N_("jggtrans already running")); 
    444447                                if (r){ 
    445                                         g_warning(__("Stale pid file. Removing.")); 
     448                                        g_warning(N_("Stale pid file. Removing.")); 
    446449                                        unlink(pid_filename); 
    447450                                } 
    448451                        } 
    449                         else if (r!=EOF) g_error(__("Invalid pid file.")); 
     452                        else if (r!=EOF) g_error(N_("Invalid pid file.")); 
    450453                } 
    451454                pidfile=fopen(pid_filename,"w"); 
    452455                if (pidfile==NULL) 
    453                         g_error(__("Couldn't open pidfile %s"),pid_filename); 
     456                        g_error(N_("Couldn't open pidfile %s"),pid_filename); 
    454457        } 
    455458        else 
     
    458461        if (group){ 
    459462                grp=getgrnam(group); 
    460                 if (!grp) g_error(__("Couldn't find group %s"),group); 
     463                if (!grp) g_error(N_("Couldn't find group %s"),group); 
    461464                newgid=grp->gr_gid; 
    462465        } 
    463466        if (user){ 
    464467                pwd=getpwnam(user); 
    465                 if (!pwd) g_error(__("Couldn't find user %s"),user); 
     468                if (!pwd) g_error(N_("Couldn't find user %s"),user); 
    466469                if (newgid<=0) newgid=pwd->pw_gid; 
    467470                fchown(fileno(pidfile),pwd->pw_uid,newgid); 
    468                 if (setgid(newgid)) g_error(__("Couldn't change group: %s"),g_strerror(errno)); 
    469                 if (initgroups(user,newgid)) g_error(__("Couldn't init groups: %s"),g_strerror(errno)); 
    470                 if (setuid(pwd->pw_uid)) g_error(__("Couldn't change user: %s"),g_strerror(errno)); 
    471         } 
    472         else if (uid==0 && !restarting) g_error(__("Refusing to run with uid=0")); 
     471                if (setgid(newgid)) g_error(N_("Couldn't change group: %s"),g_strerror(errno)); 
     472                if (initgroups(user,newgid)) g_error(N_("Couldn't init groups: %s"),g_strerror(errno)); 
     473                if (setuid(pwd->pw_uid)) g_error(N_("Couldn't change user: %s"),g_strerror(errno)); 
     474        } 
     475        else if (uid==0 && !restarting) g_error(N_("Refusing to run with uid=0")); 
    473476 
    474477        main_loop=g_main_new(0); 
     
    488491        if (log_filename){ 
    489492                log_file=fopen(log_filename,"a"); 
    490                 if (!log_file) g_critical(__("Couldn't open log file '%s': %s"), 
     493                if (!log_file) g_critical(N_("Couldn't open log file '%s': %s"), 
    491494                                                log_filename,g_strerror(errno)); 
    492495                if (log_file) setvbuf(log_file,NULL,_IOLBF,0); 
     
    520523                int n; 
    521524 
    522                 g_message(__("Restarting in %i seconds.\n"),restart_timeout); 
     525                g_message(N_("Restarting in %i seconds.\n"),restart_timeout); 
    523526                if (restart_timeout>0) sleep(restart_timeout); 
    524527                if (saved_pwd) chdir(saved_pwd); 
     
    541544        } 
    542545 
    543         g_message(__("Exiting normally.\n")); 
     546        g_message(N_("Exiting normally.\n")); 
    544547 
    545548        g_log_remove_handler(NULL,lh); 
  • trunk/src/message.c

    r241 r257  
    1 /* $Id: message.c,v 1.22 2003/03/24 14:43:37 jajcus Exp $ */ 
     1/* $Id: message.c,v 1.23 2003/04/05 11:02:57 jajcus Exp $ */ 
    22 
    33/* 
     
    430430                } 
    431431        } 
    432         msg="\nAvailable commands (and abbreviations):"
     432        msg=_("\nAvailable commands (and abbreviations):")
    433433        for(i=0;msg_commands[i].command;i++){ 
    434434                msg=g_strdup_printf("%s\n  %s (%s)%s",msg, 
    435435                                msg_commands[i].command, 
    436436                                msg_commands[i].abr, 
    437                                 msg_commands[i].experimental?" EXPERIMENTAL!":""); 
    438         } 
    439         msg=g_strdup_printf("%s\nCurrent settings:",msg); 
    440         msg=g_strdup_printf("%s\n  friends only: %s",msg,user->friends_only?"on":"off"); 
    441         msg=g_strdup_printf("%s\n  invisible: %s",msg,user->invisible?"on":"off"); 
     437                                msg_commands[i].experimental?_(" EXPERIMENTAL!"):""); 
     438        } 
     439        msg=g_strdup_printf(_("%s\nCurrent settings:"),msg); 
     440        msg=g_strdup_printf(_("%s\n  friends only: %s"),msg,user->friends_only?_("on"):_("off")); 
     441        msg=g_strdup_printf(_("%s\n  invisible: %s"),msg,user->invisible?_("on"):_("off")); 
    442442        message_send(stream,to,from,1,msg,0); 
    443443        g_free(msg); 
     
    456456xmlnode body_n; 
    457457Session *s; 
     458User *u; 
    458459 
    459460        body_n=xmlnode_get_tag(tag,"body"); 
     
    467468        from=xmlnode_get_attrib(tag,"from"); 
    468469        to=xmlnode_get_attrib(tag,"to"); 
     470 
     471        if (from) u=user_get_by_jid(from); 
     472        else u=NULL; 
     473        user_load_locale(u); 
    469474 
    470475        type=xmlnode_get_attrib(tag,"type"); 
  • trunk/src/presence.c

    r203 r257  
    1 /* $Id: presence.c,v 1.24 2003/01/22 07:53:01 jajcus Exp $ */ 
     1/* $Id: presence.c,v 1.25 2003/04/05 11:02:57 jajcus Exp $ */ 
    22 
    33/* 
     
    380380char *show,*status; 
    381381int priority; 
     382User *u; 
    382383 
    383384        type=xmlnode_get_attrib(tag,"type"); 
    384385        from=xmlnode_get_attrib(tag,"from"); 
    385386        to=xmlnode_get_attrib(tag,"to"); 
     387 
     388        if (from) u=user_get_by_jid(from); 
     389        else u=NULL; 
     390        user_load_locale(u); 
    386391 
    387392        show_n=xmlnode_get_tag(tag,"show"); 
  • trunk/src/requests.c

    r253 r257  
    1 /* $Id: requests.c,v 1.22 2003/04/04 13:49:02 jajcus Exp $ */ 
     1/* $Id: requests.c,v 1.23 2003/04/05 11:02:57 jajcus Exp $ */ 
    22 
    33/* 
     
    6666int request_io_handler(GIOChannel *source,GIOCondition condition,gpointer data){ 
    6767Request *r; 
     68User *u; 
    6869int t; 
    6970GIOCondition cond; 
     
    7172        r=(Request *)data; 
    7273        g_assert(r!=NULL); 
     74 
     75        u=user_get_by_jid(r->from); 
     76        user_load_locale(u); 
     77 
    7378        switch(r->type){ 
    7479                case RT_CHANGE: 
  • trunk/src/sessions.c

    r236 r257  
    1 /* $Id: sessions.c,v 1.48 2003/03/24 13:46:49 jajcus Exp $ */ 
     1/* $Id: sessions.c,v 1.49 2003/04/05 11:02:57 jajcus Exp $ */ 
    22 
    33/* 
     
    175175        g_assert(data!=NULL); 
    176176        s=(Session *)data; 
     177        user_load_locale(s->user); 
    177178 
    178179        g_warning("Timeout for server %u", 
     
    297298 
    298299        s=(Session *)data; 
     300        user_load_locale(s->user); 
    299301        debug("Checking error conditions..."); 
    300302        if (condition&(G_IO_ERR|G_IO_NVAL)){ 
  • trunk/src/users.c

    r203 r257  
    1 /* $Id: users.c,v 1.25 2003/01/22 07:53:01 jajcus Exp $ */ 
     1/* $Id: users.c,v 1.26 2003/04/05 11:02:57 jajcus Exp $ */ 
    22 
    33/* 
     
    3232GHashTable *users_jid=NULL; 
    3333static char *spool_dir; 
     34static char *default_user_locale="C"; 
    3435 
    3536int users_init(){ 
    3637int r; 
     38 
     39        default_user_locale=config_load_string("default_locale"); 
    3740 
    3841        spool_dir=config_load_string("spool"); 
     
    109112        if (u->invisible) tag=xmlnode_insert_tag(xml,"invisible"); 
    110113        if (u->friends_only) tag=xmlnode_insert_tag(xml,"friendsonly"); 
     114        if (u->locale){ 
     115                tag=xmlnode_insert_tag(xml,"locale"); 
     116                xmlnode_insert_cdata(tag,u->locale,-1); 
     117        } 
    111118 
    112119        if (u->contacts){ 
     
    203210char *fn,*njid; 
    204211xmlnode xml,tag,t; 
    205 char *uin,*ujid,*name,*password,*email
     212char *uin,*ujid,*name,*password,*email,*locale
    206213int last_sys_msg=0,invisible=0,friends_only=0; 
    207214User *u; 
     
    253260        tag=xmlnode_get_tag(xml,"invisible"); 
    254261        if (tag!=NULL) invisible=1; 
     262        tag=xmlnode_get_tag(xml,"locale"); 
     263        if (tag!=NULL) locale=xmlnode_get_data(tag); 
     264        else locale=NULL; 
    255265        tag=xmlnode_get_tag(xml,"userlist"); 
    256266        contacts=NULL; 
     
    361371        u->friends_only=friends_only; 
    362372        u->invisible=invisible; 
     373        u->locale=locale; 
    363374        u->contacts=contacts; 
    364375        xmlnode_free(xml); 
     
    536547} 
    537548 
     549void user_load_locale(User *u){ 
     550 
     551        if (u && u->locale){ 
     552                setlocale(LC_MESSAGES,u->locale); 
     553                setlocale(LC_CTYPE,u->locale); 
     554        } 
     555        else{ 
     556                setlocale(LC_MESSAGES,default_user_locale); 
     557                setlocale(LC_CTYPE,default_user_locale); 
     558        } 
     559} 
     560 
    538561int users_probe_all(){ 
    539562DIR *dir; 
  • trunk/src/users.h

    r183 r257  
    1 /* $Id: users.h,v 1.15 2003/01/15 08:04:56 jajcus Exp $ */ 
     1/* $Id: users.h,v 1.16 2003/04/05 11:02:57 jajcus Exp $ */ 
    22 
    33/* 
     
    4949        int friends_only; 
    5050        int invisible; 
     51        char *locale; 
    5152 
    5253        int confirmed; 
     
    7273                                int more,uint32_t ip,uint16_t port,uint32_t version); 
    7374 
     75void user_load_locale(User *u); 
     76 
    7477void user_print(User *u,int indent); 
    7578int users_probe_all();