diff options
Diffstat (limited to 'source3/web')
-rw-r--r-- | source3/web/cgi.c | 20 | ||||
-rw-r--r-- | source3/web/neg_lang.c | 378 | ||||
-rw-r--r-- | source3/web/statuspage.c | 72 | ||||
-rw-r--r-- | source3/web/swat.c | 235 |
4 files changed, 571 insertions, 134 deletions
diff --git a/source3/web/cgi.c b/source3/web/cgi.c index 939b8f94cd..d2b30c49e9 100644 --- a/source3/web/cgi.c +++ b/source3/web/cgi.c @@ -20,6 +20,7 @@ #include "includes.h" #include "smb.h" +#include "webintl.h" #define MAX_VARIABLES 10000 @@ -447,6 +448,7 @@ static void cgi_download(char *file) char buf[1024]; int fd, l, i; char *p; + int nLangDesc; /* sanitise the filename */ for (i=0;file[i];i++) { @@ -460,7 +462,11 @@ static void cgi_download(char *file) cgi_setup_error("404 File Not Found","", "The requested file was not found"); } +#if I18N_SWAT + fd = sys_open(ln_get_pref_file(file, &st, &nLangDesc),O_RDONLY,0); +#else fd = sys_open(file,O_RDONLY,0); +#endif if (fd == -1) { cgi_setup_error("404 File Not Found","", "The requested file was not found"); @@ -478,7 +484,10 @@ static void cgi_download(char *file) } } printf("Expires: %s\r\n", http_timestring(time(NULL)+EXPIRY_TIME)); - +#if I18N_SWAT + if(ln_get_lang(nLangDesc)) + printf("Content-Language: %s\r\n", ln_get_lang(nLangDesc)); +#endif printf("Content-Length: %d\r\n\r\n", (int)st.st_size); while ((l=read(fd,buf,sizeof(buf)))>0) { fwrite(buf, 1, l, stdout); @@ -509,6 +518,11 @@ void cgi_setup(char *rootdir, int auth_required) /* Handle the possability we might be running as non-root */ sec_init(); +#if I18N_SWAT + if(getenv("HTTP_ACCEPT_LANGUAGE")) /* if running as a cgi program */ + ln_negotiate_language(getenv("HTTP_ACCEPT_LANGUAGE")); +#endif + /* maybe we are running under a web server */ if (getenv("CONTENT_LENGTH") || getenv("REQUEST_METHOD")) { if (auth_required) { @@ -543,6 +557,10 @@ void cgi_setup(char *rootdir, int auth_required) authenticated = cgi_handle_authorization(&line[15]); } else if (strncasecmp(line,"Content-Length: ", 16)==0) { content_length = atoi(&line[16]); +#if I18N_SWAT + } else if (strncasecmp(line,"Accept-Language: ", 17)==0) { + ln_negotiate_language(&line[17]); +#endif } /* ignore all other requests! */ } diff --git a/source3/web/neg_lang.c b/source3/web/neg_lang.c new file mode 100644 index 0000000000..8cb41a34ec --- /dev/null +++ b/source3/web/neg_lang.c @@ -0,0 +1,378 @@ +/* + Unix SMB/Netbios implementation. + Version 1.9. + Samba Web Administration Tool + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + Created by Ryo Kawahara <rkawa@lbe.co.jp> +*/ + +#include "includes.h" +/* #include "config.h" */ +#include "webintl.h" + +#if I18N_SWAT +/* constants. */ +/* it is ok to make them bigger.*/ +#define LN_PREFLANG_MAX 10 +#define LN_LNAME_LENGTH 8+1+8 + +#define LN_DEFAULT_LANG I18N_DEFAULT_LANG +#define LN_LANGDESC_DEFAULT -1 +#define LN_NO_AVAILABLE_LANG -1 + +/* ****************************************************************** + * macros for debugging. + ***************************************************************** */ +#ifdef LN_R_NODEBUG + +#else +/* + *#define LN_DEBUG_LOG "/tmp/lndebug.log" + *void ln_debug_error(const char *info, int nLine) + *{ + * FILE* fp; + * fp = sys_fopen(LN_DEBUG_LOG, "a"); + * fprintf(fp, "%s at %d.\n", info, nLine); + * fclose(fp); + *} + *void rassert_help(BOOL b, int l) + *{ + * if(!b) + * { + * ln_debug_error("language negotiation error.", l); + * exit(1); + * } + *} + */ +#endif /* LN_R_NODEBUG */ + +/* **************************************************************** + LNNegotiator struct. It contains... + [aPrefLang] + the array of strings. each string is the name of + languages ("ja", "ko"...), given by web browser. + [nPrefLang] + the number of the languages in aPrefLang. + [lOriginalLang] + == "en": indicates what language the default(original) files + are written with. +**************************************************************** */ +typedef char lnstring[LN_LNAME_LENGTH + 1]; +#define lnstrcpy(d,s) safe_strcpy((d),(s),sizeof(lnstring)-1) + +typedef struct tagLNNegotiator +{ + lnstring aPrefLang[LN_PREFLANG_MAX]; + int nPrefLang; + lnstring lOriginalLang; +}LNNegotiator; + +/* ************************************************************** + * some access functions & macros for LNNegotiator struct. + * ************************************************************ */ +#define ln_getPreflangCount(pLn) ((pLn)->nPrefLang) +#define ln_getOriginalLang(pLn) ((pLn)->lOriginalLang) +#define ln_getDefaultPrefLang(pLn) ((pLn)->lDefaultPrefLang) + +/* make it inline-expanded (or macro) to get better performance */ +static const char* ln_getPreflang(LNNegotiator* pLn, int i) +{ + rassert(i == LN_LANGDESC_DEFAULT + || (0 <= i && i < ln_getPreflangCount(pLn))); + + if(i == LN_LANGDESC_DEFAULT) + return NULL; + if(0 <= i && i < ln_getPreflangCount(pLn)) + return pLn->aPrefLang[i]; + return NULL; +} +/* initialize structures */ +static void ln_resetln(LNNegotiator* pLn) +{ + pLn->nPrefLang = 0; + /* using fixed memory.*/ +} +static BOOL ln_addPreflang(LNNegotiator* pLn, const char* pLang) +{ + int nPref = ln_getPreflangCount(pLn); + + if(nPref >= LN_PREFLANG_MAX) + return False; + + lnstrcpy(pLn->aPrefLang[nPref], pLang); + (pLn->nPrefLang)++; + return True; +} +static void ln_initln_help(LNNegotiator* pLn) +{ + ln_resetln(pLn); + lnstrcpy(pLn->lOriginalLang, I18N_ORIGINAL_LANG); + /* I18N_ORIGINAL_LANG = "en" is hardcoded in + webintl.h. */ + if (I18N_DEFAULT_PREF_LANG[0] != '\0') + ln_addPreflang(pLn, I18N_DEFAULT_PREF_LANG); + + /* this entry is used only when web browser didn't send + ACCEPT-LANGUAGE header. */ +} +/* **************************************************************** + * store acceptable languages into LNNegotiator object. + * [pstrLangarray] The arguments of "accept-language" http header, + * which is like "en-GB, es;q=0.5, ja". "q=0.5" is called quality value, + * but it is ignored now. wiled card "*" is also ignored. + ***************************************************************** */ +static BOOL ln_negotiate_language_help( LNNegotiator* pLn, const char* pstrLangarray ) +{ + char* pToken; + const char* pDelim = " \n\r\t,;"; + pstring strBuffer; + + rassert(pstrLangarray); + rassert(pLn); + + ln_resetln(pLn); + pstrcpy(strBuffer, pstrLangarray); + pToken = strtok(strBuffer, pDelim); + while(pToken != NULL) + { + if(strncmp(pToken, "q=", strlen("q=")) == 0) + { + pToken = strtok(NULL, pDelim); + continue; + } + if(!ln_addPreflang(pLn, pToken)) + break; + pToken = strtok(NULL, pDelim); + } + rassert(ln_getPreflangCount(pLn) != 0); + return (ln_getPreflangCount(pLn) != 0); +} +/* parse catalog file header and get encoding information.*/ +static BOOL parse_po_header(const char* pheader, pstring pencoding_name) +{ + const char *ap_i_v = "Project-Id-Version:"; + const char *acharset = "charset="; + char* penc; + int nenc; + + if(pencoding_name == NULL) return False; + if(pheader == NULL || *pheader == '\0') + { + /* error or catalog is not available. */ + pstrcpy(pencoding_name,""); + return False; + } + penc = strstr(pheader, acharset); + if(strncmp(pheader, ap_i_v, strlen(ap_i_v)) != 0 || penc == NULL) + { + /* catalog file exists, but header is not good.*/ + pstrcpy(pencoding_name, ""); + return True; + } + nenc = strcspn(penc + strlen(acharset), "\n"); + strncpy(pencoding_name, + penc + strlen(acharset), nenc); + return True; +} +/* ad-hoc mime charset -> samba encoding name converter. + character conversion is done when internal samba data, + such as paramters, open files, share names, are going to be displayed. + it is only valid for japanese encodings because samba-2.0.7 only has + these three character convertors. + so other .po file(catalog file) should be encoded with one which + samba can deal with (i.e same as DOS codepage). + + display-time conversion is deleted on this version because + all catalog files are encoded with samba internal encoding (DOS codepage). + + THIS FUNCTION is ALREADY obsolated and maybe removed soon, -- monyo +*/ +#define LN_SAMBA_ENCODINGS 3 +static const char* get_samba_enc(const char* penc) +{ + int i; + static const fstring fdefault = ""; + static const fstring fmimeenc[LN_SAMBA_ENCODINGS] = + { + "EUC-JP", "Shift_JIS", "ISO-2022-JP" + }; + static const fstring fsambaenc[LN_SAMBA_ENCODINGS] = + { + "euc", "sjis", "jis" + }; + for(i = 0; i < LN_SAMBA_ENCODINGS; i++) + { + if(strcasecmp(penc, fmimeenc[i]) == 0) + return fsambaenc[i]; + } + return fdefault; +} +/* ************************************************************ + find a better language. + if the language specified by web browser matches to a language + which is supported by the swat server, this function returns it. + *********************************************************** */ +static void set_a_language(const char* planguage) +{ + /* included gettext source is affected by + these env.variables without locale settings. + */ + /* + putenv(env) will not duplicate env argument + but smbw_setenv() does this. + */ + FILE *file; + smbw_setenv("LANGUAGE", planguage); + smbw_setenv("LANG", planguage); + bindtextdomain(I18N_PACKAGE, I18N_LOCALEDIR); + textdomain(I18N_PACKAGE); +} +static int ln_set_pref_language(LNNegotiator* pLn) +{ + int j; + pstring enc_name; + + for(j = 0; j < ln_getPreflangCount(pLn); j++) + { + set_a_language(ln_getPreflang(pLn, j)); + /* then check for _("") special entry which has + a lot of information about .po file. */ + if(parse_po_header(_(""), enc_name)) + { + /* the catalog file must exist and may have + encoding information .*/ + /* + but in this version, catalog files must be + written with samba-internal encoding (i.e. + dos encoding, dos codepage) + so there is no need to convert. + //ln_init_swat_encoding(get_samba_enc(enc_name)); + ln_init_swat_encoding(enc_name); + */ + return j; + } + } + return LN_NO_AVAILABLE_LANG; + /* no available or return the default? */ +} +/* ************************************************************** + initialize gettext. Before this, cgi_setup() should be done. + cgi_setup() calls ln_negotiate_language() if the user specifies + languages in web browser. Then, ln_set_pref_language() will work. + ************************************************************* */ +static BOOL ln_init_lang_env_help(LNNegotiator* pLn) +{ +#if I18N_GETTEXT + int nLang; + + nLang = ln_set_pref_language(pLn); + rstrace(getenv("LANGUAGE")); +#endif /* I18N_GETTEXT */ + return True; +} +/* ***************************************************************** + * This function searches for the "PrefLang" version of pFile. + * if not available, returns pFile. + * [pFile] the filename. + * [pst] the address of a struct. it will be filled with the information + * of the file. + * [pLangDesc] The address of an integer. a value which indicates the + * language of the returned value is written to the address. the value + * is used in ln_get_lang(). + * [return value] address of the name of the language version of the file. + * It is static object so it will be destroyed at the time ln_get_pref_file() + * is called. + **************************************************************** */ +static void ln_make_filename( pstring afname, const char* pFile, const char* pAdd ) +{ +#if LANG_PREFIX + /* LANG_PREFIX is already undefined, maybe removed soon */ + /* maybe, foo.html.ja */ + pstrcpy(afname, pFile); + pstrcat(afname, "."); + pstrcat(afname, pAdd); +#else + /* maybe, lang/ja/foo.html */ + pstrcpy(afname, "lang/"); + pstrcat(afname, pAdd); + pstrcat(afname, "/"); + pstrcat(afname, pFile); +#endif +} +static const char* ln_get_pref_file_help( + LNNegotiator* pLn, const char* pFile, + SMB_STRUCT_STAT* pst, int* pLangDesc) +{ + static pstring afname; + int i; + + for(i = 0; i < ln_getPreflangCount(pLn); i++) + { + if(strcmp(ln_getPreflang(pLn, i), ln_getOriginalLang(pLn)) + == 0) + break; + ln_make_filename(afname, pFile, ln_getPreflang(pLn, i)); + if(file_exist(afname, pst)) + { + *pLangDesc = i; + return afname; + } + } + pstrcpy(afname, pFile); + file_exist(afname, pst); + *pLangDesc = LN_LANGDESC_DEFAULT; + return afname; +} +/* ******************************************************************* + * file scope variables. this variable is not locked. + * (not multithread-safe) + ******************************************************************** */ +static LNNegotiator lnLanguagenegotiator; + +/* ******************************************************************* + * interfaces to the outside of this file. + ******************************************************************** */ +void ln_initln(void) +{ + ln_initln_help(&lnLanguagenegotiator); +} +BOOL ln_init_lang_env(void) +{ + return ln_init_lang_env_help(&lnLanguagenegotiator); +} +const char* ln_get_lang(int nLangDesc) +{ + return ln_getPreflang(&lnLanguagenegotiator, nLangDesc); +} +const char* ln_get_pref_file(const char* pFile, + SMB_STRUCT_STAT* pst, int* pLangDesc) +{ + return ln_get_pref_file_help( + &lnLanguagenegotiator, pFile, pst, pLangDesc); +} +BOOL ln_negotiate_language(const char* pstrLangarray) +{ + return ln_negotiate_language_help( + &lnLanguagenegotiator, pstrLangarray); +} +const char* ln_get_pref_file_n_o(const char* pFile) +{ + SMB_STRUCT_STAT st; + int nLangDesc; + return ln_get_pref_file(pFile, &st, &nLangDesc); +} +#endif /* I18N_SWAT */ diff --git a/source3/web/statuspage.c b/source3/web/statuspage.c index e930629eee..61bbf67a13 100644 --- a/source3/web/statuspage.c +++ b/source3/web/statuspage.c @@ -20,6 +20,7 @@ */ #include "includes.h" +#include "webintl.h" static pid_t smbd_pid; @@ -36,19 +37,19 @@ static void print_share_mode(share_mode_entry *e, char *fname) printf("<tr><td>%d</td>",(int)e->pid); printf("<td>"); switch ((e->share_mode>>4)&0xF) { - case DENY_NONE: printf("DENY_NONE"); break; - case DENY_ALL: printf("DENY_ALL "); break; - case DENY_DOS: printf("DENY_DOS "); break; - case DENY_READ: printf("DENY_READ "); break; - case DENY_WRITE:printf("DENY_WRITE "); break; + case DENY_NONE: printf(_("DENY_NONE")); break; + case DENY_ALL: printf(_("DENY_ALL ")); break; + case DENY_DOS: printf(_("DENY_DOS ")); break; + case DENY_READ: printf(_("DENY_READ ")); break; + case DENY_WRITE:printf(_("DENY_WRITE ")); break; } printf("</td>"); printf("<td>"); switch (e->share_mode&0xF) { - case 0: printf("RDONLY "); break; - case 1: printf("WRONLY "); break; - case 2: printf("RDWR "); break; + case 0: printf(_("RDONLY ")); break; + case 1: printf(_("WRONLY ")); break; + case 2: printf(_("RDWR ")); break; } printf("</td>"); @@ -56,15 +57,15 @@ static void print_share_mode(share_mode_entry *e, char *fname) if((e->op_type & (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) == (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) - printf("EXCLUSIVE+BATCH "); + printf(_("EXCLUSIVE+BATCH ")); else if (e->op_type & EXCLUSIVE_OPLOCK) - printf("EXCLUSIVE "); + printf(_("EXCLUSIVE ")); else if (e->op_type & BATCH_OPLOCK) - printf("BATCH "); + printf(_("BATCH ")); else if (e->op_type & LEVEL_II_OPLOCK) - printf("LEVEL_II "); + printf(_("LEVEL_II ")); else - printf("NONE "); + printf(_("NONE ")); printf("</td>"); printf("<td>%s</td><td>%s</td></tr>\n", @@ -107,7 +108,7 @@ static int traverse_fn2(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void* st printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td>\n", (int)crec.pid, - crec.machine,crec.addr, + crec.machine, crec.addr, tstring(crec.start)); if (geteuid() == 0) { printf("<td><input type=submit value=\"X\" name=\"kill_%d\"></td>\n", @@ -190,18 +191,18 @@ void status_page(void) tdb = tdb_open_log(lock_path("connections.tdb"), 0, TDB_DEFAULT, O_RDONLY, 0); if (tdb) tdb_traverse(tdb, traverse_fn1, NULL); - printf("<H2>Server Status</H2>\n"); + printf("<H2>%s</H2>\n", _("Server Status")); printf("<FORM method=post>\n"); if (!autorefresh) { - printf("<input type=submit value=\"Auto Refresh\" name=autorefresh>\n"); - printf("<br>Refresh Interval: "); + printf("<input type=submit value=\"%s\" name=autorefresh>\n", _("Auto Refresh")); + printf("<br>%s", _("Refresh Interval: ")); printf("<input type=text size=2 name=\"refresh_interval\" value=%d>\n", refresh_interval); } else { - printf("<input type=submit value=\"Stop Refreshing\" name=norefresh>\n"); - printf("<br>Refresh Interval: %d\n", refresh_interval); + printf("<input type=submit value=\"%s\" name=norefresh>\n", _("Stop Refreshing")); + printf("<br>%s%d\n", _("Refresh Interval: "), refresh_interval); printf("<input type=hidden name=refresh value=1>\n"); } @@ -215,40 +216,40 @@ void status_page(void) printf("<table>\n"); - printf("<tr><td>version:</td><td>%s</td></tr>",VERSION); + printf("<tr><td>%s</td><td>%s</td></tr>", _("version:"), VERSION); fflush(stdout); - printf("<tr><td>smbd:</td><td>%srunning</td>\n",smbd_running()?"":"not "); + printf("<tr><td>%s</td><td>%s</td>\n", _("smbd:"), smbd_running()?_("running"):_("not running")); if (geteuid() == 0) { if (smbd_running()) { - printf("<td><input type=submit name=\"smbd_stop\" value=\"Stop smbd\"></td>\n"); + printf("<td><input type=submit name=\"smbd_stop\" value=\"%s\"></td>\n", _("Stop smbd")); } else { - printf("<td><input type=submit name=\"smbd_start\" value=\"Start smbd\"></td>\n"); + printf("<td><input type=submit name=\"smbd_start\" value=\"%s\"></td>\n", _("Start smbd")); } - printf("<td><input type=submit name=\"smbd_restart\" value=\"Restart smbd\"></td>\n"); + printf("<td><input type=submit name=\"smbd_restart\" value=\"%s\"></td>\n", _("Restart smbd")); } printf("</tr>\n"); fflush(stdout); - printf("<tr><td>nmbd:</td><td>%srunning</td>\n",nmbd_running()?"":"not "); + printf("<tr><td>%s</td><td>%s</td>\n", _("nmbd:"), nmbd_running()?_("running"):_("not running")); if (geteuid() == 0) { if (nmbd_running()) { - printf("<td><input type=submit name=\"nmbd_stop\" value=\"Stop nmbd\"></td>\n"); + printf("<td><input type=submit name=\"nmbd_stop\" value=\"%s\"></td>\n", _("Stop nmbd")); } else { - printf("<td><input type=submit name=\"nmbd_start\" value=\"Start nmbd\"></td>\n"); + printf("<td><input type=submit name=\"nmbd_start\" value=\"%s\"></td>\n", _("Start nmbd")); } - printf("<td><input type=submit name=\"nmbd_restart\" value=\"Restart nmbd\"></td>\n"); + printf("<td><input type=submit name=\"nmbd_restart\" value=\"%s\"></td>\n", _("Restart nmbd")); } printf("</tr>\n"); printf("</table>\n"); fflush(stdout); - printf("<p><h3>Active Connections</h3>\n"); + printf("<p><h3>%s</h3>\n", _("Active Connections")); printf("<table border=1>\n"); - printf("<tr><th>PID</th><th>Client</th><th>IP address</th><th>Date</th>\n"); + printf("<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th>\n", _("PID"), _("Client"), _("IP address"), _("Date")); if (geteuid() == 0) { - printf("<th>Kill</th>\n"); + printf("<th>%s</th>\n", _("Kill")); } printf("</tr>\n"); @@ -256,17 +257,18 @@ void status_page(void) printf("</table><p>\n"); - printf("<p><h3>Active Shares</h3>\n"); + printf("<p><h3>%s</h3>\n", _("Active Shares")); printf("<table border=1>\n"); - printf("<tr><th>Share</th><th>User</th><th>Group</th><th>PID</th><th>Client</th><th>Date</th></tr>\n\n"); + printf("<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n\n", + _("Share"), _("User"), _("Group"), _("PID"), _("Client"), _("Date")); if (tdb) tdb_traverse(tdb, traverse_fn3, NULL); printf("</table><p>\n"); - printf("<h3>Open Files</h3>\n"); + printf("<h3>%s</h3>\n", _("Open Files")); printf("<table border=1>\n"); - printf("<tr><th>PID</th><th>Sharing</th><th>R/W</th><th>Oplock</th><th>File</th><th>Date</th></tr>\n"); + printf("<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n", _("PID"), _("Sharing"), _("R/W"), _("Oplock"), _("File"), _("Date")); locking_init(1); share_mode_forall(print_share_mode); diff --git a/source3/web/swat.c b/source3/web/swat.c index 9a7658e94f..664780995e 100644 --- a/source3/web/swat.c +++ b/source3/web/swat.c @@ -25,6 +25,7 @@ #include "includes.h" #include "smb.h" +#include "webintl.h" #define GLOBALS_SNUM -1 @@ -109,12 +110,14 @@ static char *make_parm_name(char *label) ****************************************************************************/ static int include_html(char *fname) { - FILE *f = sys_fopen(fname,"r"); + FILE *f; char buf[1024]; int ret; + f = sys_fopen((char*)LN_(fname), "r"); + if (!f) { - d_printf("ERROR: Can't open %s\n", fname); + d_printf(_("ERROR: Can't open %s\n"), fname); return 0; } @@ -144,6 +147,38 @@ static void print_header(void) } } +/* ******************************************************************* + show parameter label with translated name in the following form + because showing original and translated label in one line looks + too long, and showing translated label only is unusable for + heavy users. + ------------------------------- + HELP security [combo box][button] + SECURITY + ------------------------------- + (capital words are translated by gettext.) + if no translation is available, then same form as original is + used. + "i18n_translated_parm" class is used to change the color of the + translated parameter with CSS. + **************************************************************** */ +static const char* get_parm_translated( + const char* pAnchor, const char* pHelp, const char* pLabel) +{ + const char* pTranslated = _(pLabel); + static pstring output; + if(strcmp(pLabel, pTranslated) != 0) + { + snprintf(output, sizeof(output), + "<A HREF=\"/swat/help/smb.conf.5.html#%s\" target=\"docs\"> %s</A> %s <br><span class=\"i18n_translated_parm\">%s</span>", + pAnchor, pHelp, pLabel, pTranslated); + return output; + } + snprintf(output, sizeof(output), + "<A HREF=\"/swat/help/smb.conf.5.html#%s\" target=\"docs\"> %s</A> %s", + pAnchor, pHelp, pLabel); + return output; +} /**************************************************************************** finish off the page ****************************************************************************/ @@ -167,17 +202,13 @@ static void show_parameter(int snum, struct parm_struct *parm) ptr = lp_local_ptr(snum, ptr); } - str = stripspace(parm->label); - strupper (str); - d_printf("<tr><td><A HREF=\"/swat/help/smb.conf.5.html#%s\" target=\"docs\">Help</A> %s</td><td>", - str, parm->label); - + printf("<tr><td>%s</td><td>", get_parm_translated(stripspace(parm->label), _("Help"), parm->label)); switch (parm->type) { case P_CHAR: d_printf("<input type=text size=2 name=\"parm_%s\" value=\"%c\">", make_parm_name(parm->label), *(char *)ptr); - d_printf("<input type=button value=\"Set Default\" onClick=\"swatform.parm_%s.value=\'%c\'\">", - make_parm_name(parm->label),(char)(parm->def.cvalue)); + d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%c\'\">", + _("Set Default"), make_parm_name(parm->label),(char)(parm->def.cvalue)); break; case P_LIST: @@ -190,8 +221,8 @@ static void show_parameter(int snum, struct parm_struct *parm) } } d_printf("\">"); - d_printf("<input type=button value=\"Set Default\" onClick=\"swatform.parm_%s.value=\'", - make_parm_name(parm->label)); + d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'", + _("Set Default"), make_parm_name(parm->label)); if (parm->def.lvalue) { char **list = (char **)(parm->def.lvalue); for (; *list; list++) { @@ -205,16 +236,16 @@ static void show_parameter(int snum, struct parm_struct *parm) case P_USTRING: d_printf("<input type=text size=40 name=\"parm_%s\" value=\"%s\">", make_parm_name(parm->label), *(char **)ptr); - d_printf("<input type=button value=\"Set Default\" onClick=\"swatform.parm_%s.value=\'%s\'\">", - make_parm_name(parm->label),fix_backslash((char *)(parm->def.svalue))); + d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%s\'\">", + _("Set Default"), make_parm_name(parm->label),fix_backslash((char *)(parm->def.svalue))); break; case P_GSTRING: case P_UGSTRING: d_printf("<input type=text size=40 name=\"parm_%s\" value=\"%s\">", make_parm_name(parm->label), (char *)ptr); - d_printf("<input type=button value=\"Set Default\" onClick=\"swatform.parm_%s.value=\'%s\'\">", - make_parm_name(parm->label),fix_backslash((char *)(parm->def.svalue))); + d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%s\'\">", + _("Set Default"), make_parm_name(parm->label),fix_backslash((char *)(parm->def.svalue))); break; case P_BOOL: @@ -222,8 +253,8 @@ static void show_parameter(int snum, struct parm_struct *parm) d_printf("<option %s>Yes", (*(BOOL *)ptr)?"selected":""); d_printf("<option %s>No", (*(BOOL *)ptr)?"":"selected"); d_printf("</select>"); - d_printf("<input type=button value=\"Set Default\" onClick=\"swatform.parm_%s.selectedIndex=\'%d\'\">", - make_parm_name(parm->label),(BOOL)(parm->def.bvalue)?0:1); + d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.selectedIndex=\'%d\'\">", + _("Set Default"), make_parm_name(parm->label),(BOOL)(parm->def.bvalue)?0:1); break; case P_BOOLREV: @@ -231,20 +262,20 @@ static void show_parameter(int snum, struct parm_struct *parm) d_printf("<option %s>Yes", (*(BOOL *)ptr)?"":"selected"); d_printf("<option %s>No", (*(BOOL *)ptr)?"selected":""); d_printf("</select>"); - d_printf("<input type=button value=\"Set Default\" onClick=\"swatform.parm_%s.selectedIndex=\'%d\'\">", - make_parm_name(parm->label),(BOOL)(parm->def.bvalue)?1:0); + d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.selectedIndex=\'%d\'\">", + _("Set Default"), make_parm_name(parm->label),(BOOL)(parm->def.bvalue)?1:0); break; case P_INTEGER: d_printf("<input type=text size=8 name=\"parm_%s\" value=%d>", make_parm_name(parm->label), *(int *)ptr); - d_printf("<input type=button value=\"Set Default\" onClick=\"swatform.parm_%s.value=\'%d\'\">", - make_parm_name(parm->label),(int)(parm->def.ivalue)); + d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%d\'\">", + _("Set Default"), make_parm_name(parm->label),(int)(parm->def.ivalue)); break; case P_OCTAL: d_printf("<input type=text size=8 name=\"parm_%s\" value=%s>", make_parm_name(parm->label), octal_string(*(int *)ptr)); - d_printf("<input type=button value=\"Set Default\" onClick=\"swatform.parm_%s.value=\'%s\'\">", - make_parm_name(parm->label), + d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%s\'\">", + _("Set Default"), make_parm_name(parm->label), octal_string((int)(parm->def.ivalue))); break; @@ -256,8 +287,8 @@ static void show_parameter(int snum, struct parm_struct *parm) } } d_printf("</select>"); - d_printf("<input type=button value=\"Set Default\" onClick=\"swatform.parm_%s.selectedIndex=\'%d\'\">", - make_parm_name(parm->label),enum_index((int)(parm->def.ivalue),parm->enum_list)); + d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.selectedIndex=\'%d\'\">", + _("Set Default"), make_parm_name(parm->label),enum_index((int)(parm->def.ivalue),parm->enum_list)); break; case P_SEP: break; @@ -335,7 +366,7 @@ static void show_parameters(int snum, int allparameters, int advanced, int print if (printers && !(parm->flags & FLAG_PRINT)) continue; } if (heading && heading != last_heading) { - d_printf("<tr><td></td></tr><tr><td><b><u>%s</u></b></td></tr>\n", heading); + d_printf("<tr><td></td></tr><tr><td><b><u>%s</u></b></td></tr>\n", _(heading)); last_heading = heading; } show_parameter(snum, parm); @@ -460,20 +491,20 @@ static void show_main_buttons(void) char *p; if ((p = cgi_user_name()) && strcmp(p, "root")) { - d_printf("Logged in as <b>%s</b><p>\n", p); + d_printf(_("Logged in as <b>%s</b><p>\n"), p); } - image_link("Home", "", "images/home.gif"); + image_link(_("Home"), "", "images/home.gif"); if (have_write_access) { - image_link("Globals", "globals", "images/globals.gif"); - image_link("Shares", "shares", "images/shares.gif"); - image_link("Printers", "printers", "images/printers.gif"); + image_link(_("Globals"), "globals", "images/globals.gif"); + image_link(_("Shares"), "shares", "images/shares.gif"); + image_link(_("Printers"), "printers", "images/printers.gif"); } if (have_read_access) { - image_link("Status", "status", "images/status.gif"); - image_link("View Config", "viewconfig","images/viewconfig.gif"); + image_link(_("Status"), "status", "images/status.gif"); + image_link(_("View Config"), "viewconfig", "images/viewconfig.gif"); } - image_link("Password Management", "passwd", "images/passwd.gif"); + image_link(_("Password Management"), "passwd", "images/passwd.gif"); d_printf("<HR>\n"); } @@ -497,13 +528,13 @@ static void viewconfig_page(void) full_view = 1; } - d_printf("<H2>Current Config</H2>\n"); + d_printf("<H2>%s</H2>\n", _("Current Config")); d_printf("<form method=post>\n"); if (full_view) { - d_printf("<input type=submit name=\"normal_view\" value=\"Normal View\">\n"); + d_printf("<input type=submit name=\"normal_view\" value=\"%s\">\n", _("Normal View")); } else { - d_printf("<input type=submit name=\"full_view\" value=\"Full View\">\n"); + d_printf("<input type=submit name=\"full_view\" value=\"%s\">\n", _("Full View")); } d_printf("<p><pre>"); @@ -519,7 +550,7 @@ static void globals_page(void) { int advanced = 0; - d_printf("<H2>Global Variables</H2>\n"); + d_printf("<H2>%s</H2>\n", _("Global Variables")); if (cgi_variable("Advanced") && !cgi_variable("Basic")) advanced = 1; @@ -532,14 +563,16 @@ static void globals_page(void) d_printf("<FORM name=\"swatform\" method=post>\n"); if (have_write_access) { - d_printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n"); + d_printf("<input type=submit name=\"Commit\" value=\"%s\">\n", + _("Commit Changes")); } - d_printf("<input type=reset name=\"Reset Values\" value=\"Reset Values\">\n"); + d_printf("<input type=reset name=\"Reset Values\" value=\"%s\">\n", + _("Reset Values")); if (advanced == 0) { - d_printf("<input type=submit name=\"Advanced\" value=\"Advanced View\">\n"); + d_printf("<input type=submit name=\"Advanced\" value=\"%s\">\n", _("Advanced View")); } else { - d_printf("<input type=submit name=\"Basic\" value=\"Basic View\">\n"); + d_printf("<input type=submit name=\"Basic\" value=\"%s\">\n", _("Basic View")); } d_printf("<p>\n"); @@ -562,14 +595,14 @@ static void shares_page(void) { char *share = cgi_variable("share"); char *s; - int snum=-1; + int snum = -1; int i; int advanced = 0; if (share) snum = lp_servicenumber(share); - d_printf("<H2>Share Parameters</H2>\n"); + d_printf("<H2>%s</H2>\n", _("Share Parameters")); if (cgi_variable("Advanced") && !cgi_variable("Basic")) advanced = 1; @@ -598,7 +631,7 @@ static void shares_page(void) d_printf("<table>\n"); d_printf("<tr>\n"); - d_printf("<td><input type=submit name=selectshare value=\"Choose Share\"></td>\n"); + d_printf("<td><input type=submit name=selectshare value=\"%s\"></td>\n", _("Choose Share")); d_printf("<td><select name=share>\n"); if (snum < 0) d_printf("<option value=\" \"> \n"); @@ -612,14 +645,14 @@ static void shares_page(void) } d_printf("</select></td>\n"); if (have_write_access) { - d_printf("<td><input type=submit name=\"Delete\" value=\"Delete Share\"></td>\n"); + d_printf("<td><input type=submit name=\"Delete\" value=\"%s\"></td>\n", _("Delete Share")); } d_printf("</tr>\n"); d_printf("</table>"); d_printf("<table>"); if (have_write_access) { d_printf("<tr>\n"); - d_printf("<td><input type=submit name=createshare value=\"Create Share\"></td>\n"); + d_printf("<td><input type=submit name=createshare value=\"%s\"></td>\n", _("Create Share")); d_printf("<td><input type=text size=30 name=newshare></td></tr>\n"); } d_printf("</table>"); @@ -627,14 +660,14 @@ static void shares_page(void) if (snum >= 0) { if (have_write_access) { - d_printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n"); + d_printf("<input type=submit name=\"Commit\" value=\"%s\">\n", _("Commit Changes")); } - d_printf("<input type=reset name=\"Reset Values\" value=\"Reset Values\">\n"); + d_printf("<input type=reset name=\"Reset Values\" value=\"%s\">\n", _("Reset Values")); if (advanced == 0) { - d_printf("<input type=submit name=\"Advanced\" value=\"Advanced View\">\n"); + d_printf("<input type=submit name=\"Advanced\" value=\"%s\">\n", _("Advanced View")); } else { - d_printf("<input type=submit name=\"Basic\" value=\"Basic View\">\n"); + d_printf("<input type=submit name=\"Basic\" value=\"%s\">\n", _("Basic View")); } d_printf("<p>\n"); } @@ -664,7 +697,7 @@ static BOOL change_password(const char *remote_machine, char *user_name, pstring msg_str; if (demo_mode) { - d_printf("password change in demo mode rejected\n<p>"); + d_printf("%s<p>", _("password change in demo mode rejected\n")); return False; } @@ -703,7 +736,7 @@ static void chg_passwd(void) /* Make sure users name has been specified */ if (strlen(cgi_variable(SWAT_USER)) == 0) { - d_printf("<p> Must specify \"User Name\" \n"); + d_printf("<p>%s", _(" Must specify \"User Name\" \n")); return; } @@ -719,26 +752,26 @@ static void chg_passwd(void) */ if (((!am_root()) && (strlen( cgi_variable(OLD_PSWD)) <= 0)) || ((cgi_variable(CHG_R_PASSWD_FLAG)) && (strlen( cgi_variable(OLD_PSWD)) <= 0))) { - d_printf("<p> Must specify \"Old Password\" \n"); + d_printf("<p>%s", _(" Must specify \"Old Password\" \n")); return; } /* If changing a users password on a remote hosts we have to know what host */ if ((cgi_variable(CHG_R_PASSWD_FLAG)) && (strlen( cgi_variable(RHOST)) <= 0)) { - d_printf("<p> Must specify \"Remote Machine\" \n"); + d_printf("<p>%s", _(" Must specify \"Remote Machine\" \n")); return; } /* Make sure new passwords have been specified */ if ((strlen( cgi_variable(NEW_PSWD)) <= 0) || (strlen( cgi_variable(NEW2_PSWD)) <= 0)) { - d_printf("<p> Must specify \"New, and Re-typed Passwords\" \n"); + d_printf("<p>%s", _(" Must specify \"New, and Re-typed Passwords\" \n")); return; } /* Make sure new passwords was typed correctly twice */ if (strcmp(cgi_variable(NEW_PSWD), cgi_variable(NEW2_PSWD)) != 0) { - d_printf("<p> Re-typed password didn't match new password\n"); + d_printf("<p>%s", _(" Re-typed password didn't match new password\n")); return; } } @@ -766,10 +799,11 @@ static void chg_passwd(void) local_flags); if(local_flags == 0) { + d_printf("<p>"); if (rslt == True) { - d_printf("<p> The passwd for '%s' has been changed. \n", cgi_variable(SWAT_USER)); + d_printf(_(" The passwd for '%s' has been changed. \n"), cgi_variable(SWAT_USER)); } else { - d_printf("<p> The passwd for '%s' has NOT been changed. \n",cgi_variable(SWAT_USER)); + d_printf(_(" The passwd for '%s' has NOT been changed. \n"), cgi_variable(SWAT_USER)); } } @@ -793,7 +827,7 @@ static void passwd_page(void) if (!new_name) new_name = ""; - d_printf("<H2>Server Password Management</H2>\n"); + d_printf("<H2>%s</H2>\n", _("Server Password Management")); d_printf("<FORM name=\"swatform\" method=post>\n"); @@ -802,32 +836,32 @@ static void passwd_page(void) /* * Create all the dialog boxes for data collection */ - d_printf("<tr><td> User Name : </td>\n"); + d_printf("<tr><td>%s</td>\n", _(" User Name : ")); d_printf("<td><input type=text size=30 name=%s value=%s></td></tr> \n", SWAT_USER, new_name); if (!am_root()) { - d_printf("<tr><td> Old Password : </td>\n"); + d_printf("<tr><td>%s</td>\n", _(" Old Password : ")); d_printf("<td><input type=password size=30 name=%s></td></tr> \n",OLD_PSWD); } - d_printf("<tr><td> New Password : </td>\n"); + d_printf("<tr><td>%s</td>\n", _(" New Password : ")); d_printf("<td><input type=password size=30 name=%s></td></tr>\n",NEW_PSWD); - d_printf("<tr><td> Re-type New Password : </td>\n"); + d_printf("<tr><td>%s</td>\n", _(" Re-type New Password : ")); d_printf("<td><input type=password size=30 name=%s></td></tr>\n",NEW2_PSWD); d_printf("</table>\n"); /* * Create all the control buttons for requesting action */ - d_printf("<input type=submit name=%s value=\"Change Password\">\n", - CHG_S_PASSWD_FLAG); + d_printf("<input type=submit name=%s value=\"%s\">\n", + CHG_S_PASSWD_FLAG, _("Change Password")); if (demo_mode || am_root()) { - d_printf("<input type=submit name=%s value=\"Add New User\">\n", - ADD_USER_FLAG); - d_printf("<input type=submit name=%s value=\"Delete User\">\n", - DELETE_USER_FLAG); - d_printf("<input type=submit name=%s value=\"Disable User\">\n", - DISABLE_USER_FLAG); - d_printf("<input type=submit name=%s value=\"Enable User\">\n", - ENABLE_USER_FLAG); + d_printf("<input type=submit name=%s value=\"%s\">\n", + ADD_USER_FLAG, _("Add New User")); + d_printf("<input type=submit name=%s value=\"%s\">\n", + DELETE_USER_FLAG, _("Delete User")); + d_printf("<input type=submit name=%s value=\"%s\">\n", + DISABLE_USER_FLAG, _("Disable User")); + d_printf("<input type=submit name=%s value=\"%s\">\n", + ENABLE_USER_FLAG, _("Enable User")); } d_printf("<p></FORM>\n"); @@ -840,7 +874,7 @@ static void passwd_page(void) chg_passwd(); } - d_printf("<H2>Client/Server Password Management</H2>\n"); + d_printf("<H2>%s</H2>\n", _("Client/Server Password Management")); d_printf("<FORM name=\"swatform\" method=post>\n"); @@ -849,15 +883,15 @@ static void passwd_page(void) /* * Create all the dialog boxes for data collection */ - d_printf("<tr><td> User Name : </td>\n"); + d_printf("<tr><td>%s</td>\n", _(" User Name : ")); d_printf("<td><input type=text size=30 name=%s value=%s></td></tr>\n",SWAT_USER, new_name); - d_printf("<tr><td> Old Password : </td>\n"); + d_printf("<tr><td>%s</td>\n", _(" Old Password : ")); d_printf("<td><input type=password size=30 name=%s></td></tr>\n",OLD_PSWD); - d_printf("<tr><td> New Password : </td>\n"); + d_printf("<tr><td>%s</td>\n", _(" New Password : ")); d_printf("<td><input type=password size=30 name=%s></td></tr>\n",NEW_PSWD); - d_printf("<tr><td> Re-type New Password : </td>\n"); + d_printf("<tr><td>%s</td>\n", _(" Re-type New Password : ")); d_printf("<td><input type=password size=30 name=%s></td></tr>\n",NEW2_PSWD); - d_printf("<tr><td> Remote Machine : </td>\n"); + d_printf("<tr><td>%s</td>\n", _(" Remote Machine : ")); d_printf("<td><input type=text size=30 name=%s></td></tr>\n",RHOST); d_printf("</table>"); @@ -865,8 +899,8 @@ static void passwd_page(void) /* * Create all the control buttons for requesting action */ - d_printf("<input type=submit name=%s value=\"Change Password\">", - CHG_R_PASSWD_FLAG); + d_printf("<input type=submit name=%s value=\"%s\">", + CHG_R_PASSWD_FLAG, _("Change Password")); d_printf("<p></FORM>\n"); @@ -895,13 +929,13 @@ static void printers_page(void) if (share) snum = lp_servicenumber(share); - d_printf("<H2>Printer Parameters</H2>\n"); - - d_printf("<H3>Important Note:</H3>\n"); - d_printf("Printer names marked with [*] in the Choose Printer drop-down box "); - d_printf("are autoloaded printers from "); - d_printf("<A HREF=\"/swat/help/smb.conf.5.html#PRINTCAPNAME\" target=\"docs\">Printcap Name</A>.\n"); - d_printf("Attempting to delete these printers from SWAT will have no effect.\n"); + d_printf("<H2>%s</H2>\n", _("Printer Parameters")); + + d_printf("<H3>%s</H3>\n", _("Important Note:")); + d_printf(_("Printer names marked with [*] in the Choose Printer drop-down box ")); + d_printf(_("are autoloaded printers from ")); + d_printf("<A HREF=\"/swat/help/smb.conf.5.html#printcapname\" target=\"docs\">%s</A>\n", _("Printcap Name")); + d_printf(_("Attempting to delete these printers from SWAT will have no effect.\n")); if (cgi_variable("Advanced") && !cgi_variable("Basic")) advanced = 1; @@ -934,7 +968,7 @@ static void printers_page(void) d_printf("<FORM name=\"swatform\" method=post>\n"); d_printf("<table>\n"); - d_printf("<tr><td><input type=submit name=selectshare value=\"Choose Printer\"></td>\n"); + d_printf("<tr><td><input type=submit name=selectshare value=\"%s\"></td>\n", _("Choose Printer")); d_printf("<td><select name=share>\n"); if (snum < 0 || !lp_print_ok(snum)) d_printf("<option value=\" \"> \n"); @@ -953,14 +987,14 @@ static void printers_page(void) } d_printf("</select></td>"); if (have_write_access) { - d_printf("<td><input type=submit name=\"Delete\" value=\"Delete Printer\"></td>\n"); + d_printf("<td><input type=submit name=\"Delete\" value=\"%s\"></td>\n", _("Delete Printer")); } d_printf("</tr>"); d_printf("</table>\n"); if (have_write_access) { d_printf("<table>\n"); - d_printf("<tr><td><input type=submit name=createshare value=\"Create Printer\"></td>\n"); + d_printf("<tr><td><input type=submit name=createshare value=\"%s\"></td>\n", _("Create Printer")); d_printf("<td><input type=text size=30 name=newshare></td></tr>\n"); d_printf("</table>"); } @@ -968,13 +1002,13 @@ static void printers_page(void) if (snum >= 0) { if (have_write_access) { - d_printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n"); + d_printf("<input type=submit name=\"Commit\" value=\"%s\">\n", _("Commit Changes")); } - d_printf("<input type=reset name=\"Reset Values\" value=\"Reset Values\">\n"); + d_printf("<input type=reset name=\"Reset Values\" value=\"%s\">\n", _("Reset Values")); if (advanced == 0) { - d_printf("<input type=submit name=\"Advanced\" value=\"Advanced View\">\n"); + d_printf("<input type=submit name=\"Advanced\" value=\"%s\">\n", _("Advanced View")); } else { - d_printf("<input type=submit name=\"Basic\" value=\"Basic View\">\n"); + d_printf("<input type=submit name=\"Basic\" value=\"%s\">\n", _("Basic View")); } d_printf("<p>\n"); } @@ -1038,10 +1072,16 @@ static void printers_page(void) iNumNonAutoPrintServices = lp_numservices(); load_printers(); +#if I18N_SWAT + ln_initln(); + cgi_setup(SWATDIR, !demo_mode); + ln_init_lang_env(); +#else cgi_setup(SWATDIR, !demo_mode); +#endif print_header(); - + cgi_load_variables(); if (!file_exist(servicesf, NULL)) { @@ -1057,7 +1097,6 @@ static void printers_page(void) have_read_access = (access(servicesf,R_OK) == 0); } - show_main_buttons(); page = cgi_pathinfo(); |