Mark required input fields with a star

Message ID 5570C39C.3070403@web.de
State Superseded, archived
Headers

Message

Lars Schuhmacher June 5, 2015, 7:31 a.m. UTC
  Mark required input fields with a star as nowadays this is
the de-facto default. Before, it was the other way around and
optional fields were marked.

Fixes bug 10847.

Signed-off-by: Lars Schuhmacher <larsen007@web.de>
---
 html/cgi-bin/connscheduler.cgi      | 10 ++---
 html/cgi-bin/dhcp.cgi               | 51 ++++++++++++------------
 html/cgi-bin/dnsforward.cgi         |  8 ++--
 html/cgi-bin/hosts.cgi              | 10 ++---
 html/cgi-bin/mac.cgi                | 12 +++---
 html/cgi-bin/modem.cgi              | 17 ++++----
 html/cgi-bin/ovpnmain.cgi           | 73 +++++++++++++++++-----------------
 html/cgi-bin/pppsetup.cgi           | 38 +++++++++---------
 html/cgi-bin/proxy.cgi              | 78 ++++++++++++++++++-------------------
 html/cgi-bin/qos.cgi                |  6 +--
 html/cgi-bin/time.cgi               |  6 +--
 html/cgi-bin/tor.cgi                | 18 ++++-----
 html/cgi-bin/updatexlrator.cgi      |  4 +-
 html/cgi-bin/urlfilter.cgi          | 48 +++++++++++------------
 html/cgi-bin/vpnmain.cgi            | 63 +++++++++++++++---------------
 html/cgi-bin/wakeonlan.cgi          |  6 +--
 html/cgi-bin/wireless.cgi           |  8 ++--
 langs/de/cgi-bin/de.pl              |  2 +-
 langs/en/cgi-bin/en.pl              |  2 +-
 langs/es/cgi-bin/es.pl              |  2 +-
 langs/fr/cgi-bin/fr.pl              |  2 +-
 langs/it/cgi-bin/it.pl              |  2 +-
 langs/nl/cgi-bin/nl.pl              |  2 +-
 langs/pl/cgi-bin/pl.pl              |  2 +-
 langs/ru/cgi-bin/ru.pl              |  2 +-
 langs/tr/cgi-bin/tr.pl              |  2 +-
 src/squid-accounting/accounting.cgi | 44 ++++++++++-----------
 27 files changed, 253 insertions(+), 265 deletions(-)
  

Comments

Lars Schuhmacher June 5, 2015, 7:46 a.m. UTC | #1
PS: Need help with the TODOs in that patch as I am now web developer
and where I don´t know how to use an if-clause.

I already noticed the problem with the translation for
"required field" where I have put in the English translation in the
other languages. Developed this patch before the other patch where I
was told not to do so and forgot to fix it here =)


Lars
  
Michael Tremer June 6, 2015, 12:43 a.m. UTC | #2
Hi,

first of all, the patch applies except some conflicts in the language
files and pppsetup.cgi. I guess these are proper conflicts but I have
not investigated any further.

More comments are inline. In summary: Looking good.

On Thu, 2015-06-04 at 23:31 +0200, Larsen wrote:
> Mark required input fields with a star as nowadays this is
> the de-facto default. Before, it was the other way around and
> optional fields were marked.
> 
> Fixes bug 10847.
> 
> Signed-off-by: Lars Schuhmacher <larsen007@web.de>
> ---
>  html/cgi-bin/connscheduler.cgi      | 10 ++---
>  html/cgi-bin/dhcp.cgi               | 51 ++++++++++++------------
>  html/cgi-bin/dnsforward.cgi         |  8 ++--
>  html/cgi-bin/hosts.cgi              | 10 ++---
>  html/cgi-bin/mac.cgi                | 12 +++---
>  html/cgi-bin/modem.cgi              | 17 ++++----
>  html/cgi-bin/ovpnmain.cgi           | 73 +++++++++++++++++-----------------
>  html/cgi-bin/pppsetup.cgi           | 38 +++++++++---------
>  html/cgi-bin/proxy.cgi              | 78 ++++++++++++++++++-------------------
>  html/cgi-bin/qos.cgi                |  6 +--
>  html/cgi-bin/time.cgi               |  6 +--
>  html/cgi-bin/tor.cgi                | 18 ++++-----
>  html/cgi-bin/updatexlrator.cgi      |  4 +-
>  html/cgi-bin/urlfilter.cgi          | 48 +++++++++++------------
>  html/cgi-bin/vpnmain.cgi            | 63 +++++++++++++++---------------
>  html/cgi-bin/wakeonlan.cgi          |  6 +--
>  html/cgi-bin/wireless.cgi           |  8 ++--
>  langs/de/cgi-bin/de.pl              |  2 +-
>  langs/en/cgi-bin/en.pl              |  2 +-
>  langs/es/cgi-bin/es.pl              |  2 +-
>  langs/fr/cgi-bin/fr.pl              |  2 +-
>  langs/it/cgi-bin/it.pl              |  2 +-
>  langs/nl/cgi-bin/nl.pl              |  2 +-
>  langs/pl/cgi-bin/pl.pl              |  2 +-
>  langs/ru/cgi-bin/ru.pl              |  2 +-
>  langs/tr/cgi-bin/tr.pl              |  2 +-
>  src/squid-accounting/accounting.cgi | 44 ++++++++++-----------
>  27 files changed, 253 insertions(+), 265 deletions(-)
> 
> diff --git a/html/cgi-bin/connscheduler.cgi b/html/cgi-bin/connscheduler.cgi
> index c3bd0bc..90aae52 100644
> --- a/html/cgi-bin/connscheduler.cgi
> +++ b/html/cgi-bin/connscheduler.cgi
> @@ -275,7 +275,7 @@ print <<END
>  <form method='post' name='addevent' action='$ENV{'SCRIPT_NAME'}'>
>  <table width='100%' border='0' cellspacing='6' cellpadding='0'>
>  <tr>
> -<td width='15%' class='base'>$Lang::tr{'ConnSched time'}</td>
> +<td width='15%' class='base'>$Lang::tr{'ConnSched time'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  <td><select name='ACTION_HOUR'>
>  END
>  ;
> @@ -308,7 +308,7 @@ for ($minute = 0; $minute <= 55; $minute += 5)
>  print <<END
>  </select></td></tr>
>  <tr><td colspan='2'><br><br></td></tr>
> -<tr><td width='15%' class='base'>$Lang::tr{'ConnSched action'}</td><td>
> +<tr><td width='15%' class='base'>$Lang::tr{'ConnSched action'}&nbsp;<img src='/blob.gif' alt='*' /></td><td>
>  <input type='radio' value='CONNECT' name='ACTION_ACTION' $checked_connect />&nbsp;<select name='ACTION_CONNECT'>
>  <option value='reconnect' $selected{'reconnect'}>$Lang::tr{'ConnSched reconnect'}</option>
>  <option value='dial' $selected{'dial'}>$Lang::tr{'ConnSched dial'}</option>
> @@ -336,7 +336,7 @@ for ($i = 1; $i <= $CONNSCHED::maxprofiles; $i++)
>  print <<END
>  </select></td></tr>
>  <tr><td colspan='2'><br><br></td></tr>
> -<tr><td width='15%' class='base'>$Lang::tr{'ConnSched days'}</td>
> +<tr><td width='15%' class='base'>$Lang::tr{'ConnSched days'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  <td><input type='radio' value='DAYS' name='ACTION_DAYSTYPE' $checked_days />&nbsp;<select name='ACTION_DAYSTART'>
>  END
>  ;
> @@ -376,13 +376,13 @@ print <<END
>  &nbsp;&nbsp;<input type='checkbox' name='Sun' $checked_sun />$Lang::tr{'sunday'}
>  </td></tr>
>  <tr><td colspan='2'><br></td></tr>
> -<tr><td width='15%' class='base'>$Lang::tr{'remark title'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +<tr><td width='15%' class='base'>$Lang::tr{'remark title'}</td>
>  <td><input type='text' name='ACTION_COMMENT' size='40' value='$comment' /></td></tr></table>
>  <br>
>  <hr>
>  <table width='100%'><tr>
>    <td class='base' valign='top'><img src='/blob.gif' alt='*' /></td>
> -  <td width='55%' class='base'>$Lang::tr{'this field may be blank'}</td>
> +  <td width='55%' class='base'>$Lang::tr{'required field'}</td>
>    <td width='40%' align='right'><input type='submit' name='SUBMIT' value='$buttontext' />
>    <input type='hidden' name='ACTION' value='$hiddenvalue' /></td>
>    <input type='hidden' name='UPDATE_ID' value='$cgiparams{'ID'}' /></td>
> diff --git a/html/cgi-bin/dhcp.cgi b/html/cgi-bin/dhcp.cgi
> index e75207a..29a71e4 100644
> --- a/html/cgi-bin/dhcp.cgi
> +++ b/html/cgi-bin/dhcp.cgi
> @@ -544,39 +544,39 @@ print <<END
>      <input type='checkbox' name='ENABLE_${itf}' $checked{'ENABLE'}{'on'} /></td>
>      <td width='25%' class='base'>$Lang::tr{'ip address'}<br />$Lang::tr{'netmask'}:</td><td><b>$netsettings{"${itf}_ADDRESS"}<br />$netsettings{"${itf}_NETMASK"}</b></td>
>  </tr><tr>
> -    <td width='25%' class='base'>$Lang::tr{'start address'}</td>
> +    <td width='25%' class='base'>$Lang::tr{'start address'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td width='25%'><input type='text' name='START_ADDR_${itf}' value='$dhcpsettings{"START_ADDR_${itf}"}' /></td>
> -    <td width='25%' class='base'>$Lang::tr{'end address'}</td>
> +    <td width='25%' class='base'>$Lang::tr{'end address'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td width='25%'><input type='text' name='END_ADDR_${itf}' value='$dhcpsettings{"END_ADDR_${itf}"}' /></td>
>  </tr><tr>
> -    <td class='base'>$Lang::tr{'default lease time'}</td>
> +    <td class='base'>$Lang::tr{'default lease time'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td><input type='text' name='DEFAULT_LEASE_TIME_${itf}' value='$dhcpsettings{"DEFAULT_LEASE_TIME_${itf}"}' /></td>
> -    <td class='base'>$Lang::tr{'max lease time'}</td>
> +    <td class='base'>$Lang::tr{'max lease time'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td><input type='text' name='MAX_LEASE_TIME_${itf}' value='$dhcpsettings{"MAX_LEASE_TIME_${itf}"}' /></td>
>  </tr><tr>
> -    <td class='base'>$Lang::tr{'domain name suffix'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>$Lang::tr{'domain name suffix'}</td>
>      <td><input type='text' name='DOMAIN_NAME_${itf}' value='$dhcpsettings{"DOMAIN_NAME_${itf}"}' /></td>
>      <td>$Lang::tr{'dhcp allow bootp'}:</td>
>      <td><input type='checkbox' name='ENABLEBOOTP_${itf}' $checked{'ENABLEBOOTP'}{'on'} /></td>
>  </tr><tr>
> -    <td class='base'>$Lang::tr{'primary dns'}</td>
> +    <td class='base'>$Lang::tr{'primary dns'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td><input type='text' name='DNS1_${itf}' value='$dhcpsettings{"DNS1_${itf}"}' /></td>
> -    <td class='base'>$Lang::tr{'secondary dns'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>$Lang::tr{'secondary dns'}</td>
>      <td><input type='text' name='DNS2_${itf}' value='$dhcpsettings{"DNS2_${itf}"}' /></td>
>  </tr><tr>
> -    <td class='base'>$Lang::tr{'primary ntp server'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>$Lang::tr{'primary ntp server'}:</td>
>      <td><input type='text' name='NTP1_${itf}' value='$dhcpsettings{"NTP1_${itf}"}' /></td>
> -    <td class='base'>$Lang::tr{'secondary ntp server'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>$Lang::tr{'secondary ntp server'}:</td>
>      <td><input type='text' name='NTP2_${itf}' value='$dhcpsettings{"NTP2_${itf}"}' /></td>
>  </tr><tr>
> -    <td class='base'>$Lang::tr{'primary wins server address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>$Lang::tr{'primary wins server address'}:</td>
>      <td><input type='text' name='WINS1_${itf}' value='$dhcpsettings{"WINS1_${itf}"}' /></td>
> -    <td class='base'>$Lang::tr{'secondary wins server address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>$Lang::tr{'secondary wins server address'}:</td>
>      <td><input type='text' name='WINS2_${itf}' value='$dhcpsettings{"WINS2_${itf}"}' /></td>
>  </tr><tr>
> -    <td class='base'>next-server:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>next-server:</td>
>      <td><input type='text' name='NEXT_${itf}' value='$dhcpsettings{"NEXT_${itf}"}' /></td>
> -    <td class='base'>filename:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>filename:</td>
>      <td><input type='text' name='FILE_${itf}' value='$dhcpsettings{"FILE_${itf}"}' /></td>
>  </tr>
>  </table>

There are some hard-coded strings here. These are not newly introduced
but still we should fix them in an other patch later. I am sure you have
come across a couple of them.

> @@ -588,7 +588,7 @@ END
>  print <<END
>  <table width='100%'>
>  <tr>
> -    <td class='base' width='25%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td>
> +    <td class='base' width='25%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'required field'}</td>
>      <td class='base' width='30%'>$warnNTPmessage</td>
>      <td width='40%' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
>  </tr>
> @@ -622,13 +622,13 @@ if ($opt ne '') {
>  }
>  print <<END
>  <tr>
> -    <td class='base'>$Lang::tr{'dhcp advopt name'}:</td>
> +    <td class='base'>$Lang::tr{'dhcp advopt name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td><input type='text' name='ADVOPT_NAME' value='$dhcpsettings{'ADVOPT_NAME'}' size='18' /></td>
> -    <td class='base'>$Lang::tr{'dhcp advopt value'}:</td>
> +    <td class='base'>$Lang::tr{'dhcp advopt value'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td><input type='text' name='ADVOPT_DATA' value='$dhcpsettings{'ADVOPT_DATA'}' size='40' /></td>
>  </tr>$opt<tr>
>      <td class='base'>$Lang::tr{'enabled'}</td><td><input type='checkbox' name='ADVOPT_ENABLED' $checked{'ADVOPT_ENABLED'}{'on'} /></td>
> -    <td class='base'>$Lang::tr{'dhcp advopt scope'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>$Lang::tr{'dhcp advopt scope'}:</td>
>      <td>
>  END
>  ;
> @@ -649,7 +649,7 @@ print <<END
>  <hr />
>  <table width='100%'>
>  <tr>
> -    <td class='base' width='50%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'dhcp advopt scope help'}</td>
> +    <td class='base' width='50%'>$Lang::tr{'dhcp advopt scope help'}</td>
>      <td width='50%' align='right'>
>      <input type='hidden' name='ACTION' value='$Lang::tr{'add'}1' />
>      <input type='submit' name='SUBMIT' value='$buttontext' />
> @@ -827,29 +827,29 @@ if ($dhcpsettings{'KEY2'} ne '') {
>  }
>  print <<END
>  <tr>
> -    <td class='base'>$Lang::tr{'mac address'}:</td>
> +    <td class='base'>$Lang::tr{'mac address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td><input type='text' name='FIX_MAC' value='$dhcpsettings{'FIX_MAC'}' size='18' /></td>
> -    <td class='base'>$Lang::tr{'ip address'}:</td>
> +    <td class='base'>$Lang::tr{'ip address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td><input type='text' name='FIX_ADDR' value='$dhcpsettings{'FIX_ADDR'}' size='18' /></td>
> -    <td class='base'>$Lang::tr{'remark'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>$Lang::tr{'remark'}:</td>
>      <td><input type='text' name='FIX_REMARK' value='$dhcpsettings{'FIX_REMARK'}' size='18' /></td>
>  </tr><tr>
>      <td class='base'>$Lang::tr{'enabled'}</td><td><input type='checkbox' name='FIX_ENABLED' $checked{'FIX_ENABLED'}{'on'} /></td>
>  </tr><tr>
>      <td colspan = '3'><b>$Lang::tr{'dhcp bootp pxe data'}</b></td>
>  </tr><tr>
> -    <td class='base'>next-server:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>next-server:</td>
>      <td><input type='text' name='FIX_NEXTADDR' value='$dhcpsettings{'FIX_NEXTADDR'}' size='18' /></td>
> -    <td class='base'>filename:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>filename:</td>
>      <td><input type='text' name='FIX_FILENAME' value='$dhcpsettings{'FIX_FILENAME'}' size='18' /></td>
> -    <td class='base'>root path:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>root path:</td>
>      <td><input type='text' name='FIX_ROOTPATH' value='$dhcpsettings{'FIX_ROOTPATH'}' size='18' /></td>
>  </tr>
>  </table>
>  <hr />
>  <table width='100%'>
>  <tr>
> -    <td class='base' width='50%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td>
> +    <td class='base' width='50%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'required field'}</td>
>      <td width='50%' align='right'>
>  	<input type='hidden' name='ACTION' value='$Lang::tr{'add'}2' />
>  	<input type='submit' name='SUBMIT' value='$buttontext' />
> @@ -857,7 +857,6 @@ print <<END
>  </tr>
>  </table>
>  </form>
> -<hr />
>  END
>  ;
>  #Edited line number (KEY2) passed until cleared by 'save' or 'remove' or 'new sort order'
> diff --git a/html/cgi-bin/dnsforward.cgi b/html/cgi-bin/dnsforward.cgi
> index b66fa46..1afc55f 100644
> --- a/html/cgi-bin/dnsforward.cgi
> +++ b/html/cgi-bin/dnsforward.cgi
> @@ -207,20 +207,20 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'edit'}) {
>  print <<END
>  <table width='100%'>
>  	<tr>
> -		<td width='20%' class='base'>$Lang::tr{'dnsforward zone'}:</td>
> +		<td width='20%' class='base'>$Lang::tr{'dnsforward zone'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td><input type='text' name='ZONE' value='$cgiparams{'ZONE'}' size='24' /></td>
>  		<td width='30%' class='base'>$Lang::tr{'enabled'}<input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>
>  	</tr>
>  
>  	<tr>
> -		<td width='20%' class='base'>$Lang::tr{'dnsforward forward_server'}:</td>
> +		<td width='20%' class='base'>$Lang::tr{'dnsforward forward_server'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td><input type='text' name='FORWARD_SERVER' value='$cgiparams{'FORWARD_SERVER'}' size='24' /></td>
>  	</tr>
>  </table>
>  
>  <table width='100%'>
>  	<tr>
> -		<td width ='20%' class='base'>$Lang::tr{'remark'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +		<td width ='20%' class='base'>$Lang::tr{'remark'}:</td>
>  		<td><input type='text' name='REMARK' value='$cgiparams{'REMARK'}' size='40' maxlength='50' /></td>
>  	</tr>
>  </table>
> @@ -229,7 +229,7 @@ print <<END
>  
>  <table width='100%'>
>  	<tr>
> -		<td class='base' width='55%'><img src='/blob.gif' alt ='*' align='top' />&nbsp;$Lang::tr{'this field may be blank'}</td>
> +		<td class='base' width='55%'><img src='/blob.gif' alt ='*' align='top' />&nbsp;$Lang::tr{'required field'}</td>
>  		<td width='40%' align='right'>
>  			<input type='hidden' name='ACTION' value='$Lang::tr{'add'}' />
>  			<input type='submit' name='SUBMIT' value='$buttontext' />
> diff --git a/html/cgi-bin/hosts.cgi b/html/cgi-bin/hosts.cgi
> index bb7df1f..e3463d1 100644
> --- a/html/cgi-bin/hosts.cgi
> +++ b/html/cgi-bin/hosts.cgi
> @@ -223,7 +223,7 @@ if ($errormessage) {
>  #<table width='100%'>
>  #<hr />
>  #<tr>
> -#    <td class='base' width='25%'><!--<img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td>-->
> +#    <td class='base' width='25%'><!--<img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'required field'}</td>-->
>  #    <td class='base' width='25%'>$warnmessage</td>
>  #    <td width='50%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' disabled='disabled' /></td>
>  #</tr>
> @@ -253,12 +253,12 @@ print <<END
>  <input type='hidden' name='KEY1' value='$settings{'KEY1'}' />
>  <table width='100%'>
>  <tr>
> -    <td class='base'>$Lang::tr{'host ip'}:&nbsp;</td>
> +    <td class='base'>$Lang::tr{'host ip'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td><input type='text' name='IP' value='$settings{'IP'}' /></td>
> -    <td class='base'>$Lang::tr{'hostname'}:</td>
> +    <td class='base'>$Lang::tr{'hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>      <td><input type='text' name='HOST' value='$settings{'HOST'}' /></td>
>  </tr><tr>
> -    <td class='base'>$Lang::tr{'domain name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <td class='base'>$Lang::tr{'domain name'}:</td>
>      <td><input type='text' name='DOM' value='$settings{'DOM'}' /></td>
>      <td class='base'>$Lang::tr{'enabled'}</td>
>      <td><input type='checkbox' name='EN' $checked{'EN'}{'on'} /></td>
> @@ -268,7 +268,7 @@ print <<END
>  <hr />
>  <table width='100%'>
>  <tr>
> -    <td class='base' width='50%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td>
> +    <td class='base' width='50%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'required field'}</td>
>      <td width='50%' align='right'><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /><input type='submit' name='SUBMIT' value='$buttontext' /></td>
>  </tr>
>  </table>
> diff --git a/html/cgi-bin/mac.cgi b/html/cgi-bin/mac.cgi
> index 1d34363..161be34 100644
> --- a/html/cgi-bin/mac.cgi
> +++ b/html/cgi-bin/mac.cgi
> @@ -134,7 +134,7 @@ print <<END
>      <td colspan="2">&nbsp;</td>
>    </tr>
>    <tr>
> -    <td width="25%"><font class='base'>$Lang::tr{'mac new'}&nbsp;</font></td><td>
> +    <td width="25%"><font class='base'>$Lang::tr{'mac new'}&nbsp;<img src='/blob.gif' alt='*' /></font></td><td>
>  END
>  ;
>  if ($macsettings{'ACTION'} eq $Lang::tr{'delete'} ) {
> @@ -159,12 +159,12 @@ END
>  ;
>  if ($macsettings{'ACTION'} eq $Lang::tr{'delete'} ) {
>  print <<END 
> -      <input type="text" name="MAC1" maxlength="17" value=''/><img src='/blob.gif' alt='*' /></td>
> +      <input type="text" name="MAC1" maxlength="17" value=''/></td>
>  END
>  ;
>  } else {   
>  print <<END
> -      <input type="text" name="MAC1" maxlength="17" value='$macsettings{"MAC1"}'/><img src='/blob.gif' alt='*' /></td>
> +      <input type="text" name="MAC1" maxlength="17" value='$macsettings{"MAC1"}'/></td>
>  END
>  ;  
>  } 
> @@ -179,12 +179,12 @@ END
>  ;
>  if ($macsettings{'ACTION'} eq $Lang::tr{'delete'} ) {
>  print <<END 
> -      <input type="text" name="MAC2" maxlength="17" value=''/><img src='/blob.gif' alt='*' /></td>
> +      <input type="text" name="MAC2" maxlength="17" value=''/></td>
>  END
>  ;
>  } else {   
>  print <<END
> -      <input type="text" name="MAC2" maxlength="17" value='$macsettings{"MAC2"}'/><img src='/blob.gif' alt='*' /></td>
> +      <input type="text" name="MAC2" maxlength="17" value='$macsettings{"MAC2"}'/></td>
>  END
>  ;  
>  } 
> @@ -195,7 +195,7 @@ print <<END
>      <td colspan="2"><br><hr /></td>
>    </tr>
>    <tr>
> -    <td align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td><div align="right"></td>
> +    <td align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'required field'}</td><div align="right"></td>
>      <td align='right'>
>  END
>  ;
> diff --git a/html/cgi-bin/modem.cgi b/html/cgi-bin/modem.cgi
> index 48d1260..a13f8b2 100644
> --- a/html/cgi-bin/modem.cgi
> +++ b/html/cgi-bin/modem.cgi
> @@ -78,25 +78,25 @@ print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
>  print <<END
>  <table width='100%'>
>  <tr>
> -	<td width='25%' class='base'>$Lang::tr{'init string'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td width='25%' class='base'>$Lang::tr{'init string'}</td>
>  	<td width='25%'><input type='text' name='INIT' value='$modemsettings{'INIT'}' /></td>
> -	<td width='25%' class='base'>$Lang::tr{'hangup string'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td width='25%' class='base'>$Lang::tr{'hangup string'}</td>
>  	<td width='25%'><input type='text' name='HANGUP' value='$modemsettings{'HANGUP'}' /></td>
>  </tr>
>  <tr>
> -	<td class='base'>$Lang::tr{'speaker on'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'speaker on'}</td>
>  	<td><input type='text' name='SPEAKER_ON' value='$modemsettings{'SPEAKER_ON'}' /></td>
> -	<td class='base'>$Lang::tr{'speaker off'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'speaker off'}</td>
>  	<td><input type='text' name='SPEAKER_OFF' value='$modemsettings{'SPEAKER_OFF'}' /></td>
>  </tr>
>  <tr>
> -	<td class='base'>$Lang::tr{'tone dial'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'tone dial'}</td>
>  	<td><input type='text' name='TONE_DIAL' value='$modemsettings{'TONE_DIAL'}' /></td>
> -	<td class='base'>$Lang::tr{'pulse dial'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'pulse dial'}</td>
>  	<td><input type='text' name='PULSE_DIAL' value='$modemsettings{'PULSE_DIAL'}' /></td>
>  </tr>
>  <tr>
> -	<td class='base'>$Lang::tr{'connect timeout'}</td>
> +	<td class='base'>$Lang::tr{'connect timeout'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td><input type='text' name='TIMEOUT' value='$modemsettings{'TIMEOUT'}' /></td>
>  	<td class='base'>&nbsp;</td>
>  	<td>&nbsp;</td>
> @@ -107,8 +107,7 @@ print <<END
>  <hr />
>  <tr>
>  	<td width='33%'>
> -		<img src='/blob.gif' align='top' alt='*' />&nbsp;
> -		<font class='base'>$Lang::tr{'this field may be blank'}</font>
> +		<img src='/blob.gif' align='top' alt='*' />&nbsp;<font class='base'>$Lang::tr{'required field'}</font>
>  	</td>
>  	<td width='33%' align='center'>
>  		<input type='submit' name='ACTION' value='$Lang::tr{'restore defaults'}' />
> diff --git a/html/cgi-bin/ovpnmain.cgi b/html/cgi-bin/ovpnmain.cgi
> index fb52e68..9e252a9 100644
> --- a/html/cgi-bin/ovpnmain.cgi
> +++ b/html/cgi-bin/ovpnmain.cgi
> @@ -1956,22 +1956,22 @@ END
>  	print <<END;
>  	<form method='post' enctype='multipart/form-data'>
>  	<table width='100%' border='0' cellspacing='1' cellpadding='0'>
> -	<tr><td width='30%' class='base'>$Lang::tr{'organization name'}:</td>
> +	<tr><td width='30%' class='base'>$Lang::tr{'organization name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	    <td width='35%' class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_ORGANIZATION' value='$cgiparams{'ROOTCERT_ORGANIZATION'}' size='32' /></td>
>  	    <td width='35%' colspan='2'>&nbsp;</td></tr>
> -	<tr><td class='base'>$Lang::tr{'ipfires hostname'}:</td>
> +	<tr><td class='base'>$Lang::tr{'ipfires hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_HOSTNAME' value='$cgiparams{'ROOTCERT_HOSTNAME'}' size='32' /></td>
>  	    <td colspan='2'>&nbsp;</td></tr>
> -	<tr><td class='base'>$Lang::tr{'your e-mail'}:&nbsp;<img src='/blob.gif' alt'*' /></td>
> +	<tr><td class='base'>$Lang::tr{'your e-mail'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_EMAIL' value='$cgiparams{'ROOTCERT_EMAIL'}' size='32' /></td>
>  	    <td colspan='2'>&nbsp;</td></tr>
> -	<tr><td class='base'>$Lang::tr{'your department'}:&nbsp;<img src='/blob.gif' alt'*' /></td>
> +	<tr><td class='base'>$Lang::tr{'your department'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_OU' value='$cgiparams{'ROOTCERT_OU'}' size='32' /></td>
>  	    <td colspan='2'>&nbsp;</td></tr>
> -	<tr><td class='base'>$Lang::tr{'city'}:&nbsp;<img src='/blob.gif' alt'*' /></td>
> +	<tr><td class='base'>$Lang::tr{'city'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_CITY' value='$cgiparams{'ROOTCERT_CITY'}' size='32' /></td>
>  	    <td colspan='2'>&nbsp;</td></tr>
> -	<tr><td class='base'>$Lang::tr{'state or province'}:&nbsp;<img src='/blob.gif' alt'*' /></td>
> +	<tr><td class='base'>$Lang::tr{'state or province'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_STATE' value='$cgiparams{'ROOTCERT_STATE'}' size='32' /></td>
>  	    <td colspan='2'>&nbsp;</td></tr>
>  	<tr><td class='base'>$Lang::tr{'country'}:</td>
> @@ -2002,7 +2002,7 @@ END
>  	    <td><input type='submit' name='ACTION' value='$Lang::tr{'generate root/host certificates'}' /></td>
>  	    <td>&nbsp;</td><td>&nbsp;</td></tr> 
>  	<tr><td class='base' colspan='4' align='left'>
> -	    <img src='/blob.gif' valign='top' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
> +	    <img src='/blob.gif' valign='top' alt='*' />&nbsp;$Lang::tr{'required field'}</td></tr>
>  	<tr><td colspan='2'><br></td></tr>
>  	<table width='100%'>
>  	<tr>
> @@ -2018,17 +2018,17 @@ END
>  
>  	<table width='100%'>
>  	<tr><td colspan='4'><hr></td></tr>
> -	<tr><td class='base' nowrap='nowrap'>$Lang::tr{'upload p12 file'}:</td>
> +	<tr><td class='base' nowrap='nowrap'>$Lang::tr{'upload p12 file'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	    <td nowrap='nowrap'><input type='file' name='FH' size='32'></td>
>  	    <td colspan='2'>&nbsp;</td></tr>
> -	<tr><td class='base'>$Lang::tr{'pkcs12 file password'}:&nbsp;<img src='/blob.gif' alt='*' ></td>
> +	<tr><td class='base'>$Lang::tr{'pkcs12 file password'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='password' name='P12_PASS' value='$cgiparams{'P12_PASS'}' size='32' /></td>
>              <td colspan='2'>&nbsp;</td></tr>
>  	<tr><td>&nbsp;</td>
>  	    <td><input type='submit' name='ACTION' value='$Lang::tr{'upload p12 file'}' /></td>
>              <td colspan='2'>&nbsp;</td></tr>
>  	<tr><td class='base' colspan='4' align='left'>
> -	    <img src='/blob.gif' valign='top' al='*' >&nbsp;$Lang::tr{'this field may be blank'}</td>
> +	    <img src='/blob.gif' valign='top' alt='*' >&nbsp;$Lang::tr{'required field'}</td>
>  	</tr>
>  	</form></table>
>  END
> @@ -3101,11 +3101,10 @@ if ( -s "${General::swroot}/ovpn/settings") {
>    		<tr><td><input type='radio' name='TYPE' value='net2net' /></td>		
>  		<td class='base'>$Lang::tr{'net to net vpn'} (Upload Client Package)</td></tr>
>  	  <tr><td>&nbsp;</td><td class='base'><input type='file' name='FH' size='30'></td></tr>
> -	  <tr><td>&nbsp;</td><td>Import Connection Name <img src='/blob.gif' /></td></tr>
> +	  <tr><td>&nbsp;</td><td>Import Connection Name</td></tr>
>      <tr><td>&nbsp;</td><td class='base'><input type='text' name='n2nname' size='30'>$Lang::tr{'openvpn default'}: Client Packagename</td></tr>
>  	  <tr><td colspan='3'><hr /></td></tr>
>      <tr><td align='right' colspan='3'><input type='submit' name='ACTION' value='$Lang::tr{'add'}' /></td></tr>
> -	  <tr><td class='base' colspan='3' align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
>  	    </form></table>
>  END
>  	;
> @@ -4487,7 +4486,7 @@ if ($cgiparams{'TYPE'} eq 'net') {
>  	&Header::openbox('100%', 'LEFT', "$Lang::tr{'connection'}:");
>  	print "<table width='100%'  border='0'>\n";
>  
> -	print "<tr><td width='14%' class='boldbase'>$Lang::tr{'name'}: </td>";
> +	print "<tr><td width='14%' class='boldbase'>$Lang::tr{'name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>";
>  	
>  	if ($cgiparams{'TYPE'} eq 'host') {
>  	    if ($cgiparams{'KEY'}) {
> @@ -4526,14 +4525,14 @@ if ($cgiparams{'TYPE'} eq 'net') {
>  		<td><input type='TEXT' name='REMOTE' value='$cgiparams{'REMOTE'}' /></td>
>  	</tr>
>  
> -	<tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'local subnet'}</td>
> +	<tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'local subnet'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td><input type='TEXT' name='LOCAL_SUBNET' value='$cgiparams{'LOCAL_SUBNET'}' /></td>
>  
> -		<td class='boldbase' nowrap='nowrap'>$Lang::tr{'remote subnet'}</td>
> +		<td class='boldbase' nowrap='nowrap'>$Lang::tr{'remote subnet'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td><input type='text' name='REMOTE_SUBNET' value='$cgiparams{'REMOTE_SUBNET'}' /></td>
>  	</tr>
>  
> -	<tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn subnet'}</td>
> +	<tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn subnet'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td><input type='TEXT' name='OVPN_SUBNET' value='$cgiparams{'OVPN_SUBNET'}' /></td>
>  
>  		<td class='boldbase' nowrap='nowrap'>$Lang::tr{'protocol'}</td>
> @@ -4543,10 +4542,10 @@ if ($cgiparams{'TYPE'} eq 'net') {
>  	</tr>
>  	
>  	<tr>
> -		<td class='boldbase'>$Lang::tr{'destination port'}:</td>
> +		<td class='boldbase'>$Lang::tr{'destination port'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td><input type='TEXT' name='DEST_PORT' value='$cgiparams{'DEST_PORT'}' size='5' /></td>
>  
> -		<td class='boldbase' nowrap='nowrap'>Management Port ($Lang::tr{'openvpn default'}: <span class="base">$Lang::tr{'destination port'}): &nbsp;<img src='/blob.gif' /></td>
> +		<td class='boldbase' nowrap='nowrap'>Management Port ($Lang::tr{'openvpn default'}: <span class="base">$Lang::tr{'destination port'}):</td>
>  		<td> <input type='TEXT' name='OVPN_MGMT' VALUE='$cgiparams{'OVPN_MGMT'}'size='5' /></td>
>  	</tr>
>  
> @@ -4556,22 +4555,22 @@ if ($cgiparams{'TYPE'} eq 'net') {
>  		<td class'base'><b>$Lang::tr{'MTU settings'}</b></td>
>  	</tr>
>  
> -        <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}&nbsp;<img src='/blob.gif' /></td>
> +        <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}</td>
>  		<td><input type='TEXT' name='MTU' VALUE='$cgiparams{'MTU'}'size='5' /></td>
>  		<td colspan='2'>$Lang::tr{'openvpn default'}: udp/tcp <span class="base">1500/1400</span></td>
>  	</tr>
>  
> -	<tr><td class='boldbase' nowrap='nowrap'>fragment &nbsp;<img src='/blob.gif' /></td>
> +	<tr><td class='boldbase' nowrap='nowrap'>fragment:</td>
>  		<td><input type='TEXT' name='FRAGMENT' VALUE='$cgiparams{'FRAGMENT'}'size='5' /></td>
>  		<td>$Lang::tr{'openvpn default'}: <span class="base">1300</span></td>
>  	</tr>
>  
> -	<tr><td class='boldbase' nowrap='nowrap'>mssfix &nbsp;<img src='/blob.gif' /></td>
> +	<tr><td class='boldbase' nowrap='nowrap'>mssfix:</td>
>  		<td><input type='checkbox' name='MSSFIX' $checked{'MSSFIX'}{'on'} /></td>
>  		<td>$Lang::tr{'openvpn default'}: <span class="base">on</span></td>
>  	</tr>
>  
> -        <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'} &nbsp;<img src='/blob.gif'</td>
> +        <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'}</td>
>  		<td><input type='checkbox' name='COMPLZO' $checked{'COMPLZO'}{'on'} /></td>
>  	</tr>
>  
> @@ -4622,7 +4621,7 @@ END
>  ;
>  	}
>  #jumper
> -	print "<tr><td class='boldbase'>$Lang::tr{'remark title'}&nbsp;<img src='/blob.gif' /></td>";
> +	print "<tr><td class='boldbase'>$Lang::tr{'remark title'}</td>";
>  	print "<td colspan='3'><input type='text' name='REMARK' value='$cgiparams{'REMARK'}' size='55' maxlength='50' /></td></tr></table>";
>  	
>  	if ($cgiparams{'TYPE'} eq 'host') {
> @@ -4689,12 +4688,12 @@ if ($cgiparams{'TYPE'} eq 'host') {
>        <tr><td colspan='3'><hr /></td></tr>
>        <tr><td colspan='3'>&nbsp;</td></tr>
>  	    <tr><td><input type='radio' name='AUTH' value='certgen' $checked{'AUTH'}{'certgen'} $cakeydisabled /></td><td class='base'>$Lang::tr{'generate a certificate'}</td><td>&nbsp;</td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users fullname or system hostname'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_NAME' value='$cgiparams{'CERT_NAME'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users email'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_EMAIL' value='$cgiparams{'CERT_EMAIL'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users department'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_OU' value='$cgiparams{'CERT_OU'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'organization name'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_ORGANIZATION' value='$cgiparams{'CERT_ORGANIZATION'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'city'}:&nbsp;<img src='/blob.gif'></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_CITY' value='$cgiparams{'CERT_CITY'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'state or province'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_STATE' value='$cgiparams{'CERT_STATE'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users fullname or system hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_NAME' value='$cgiparams{'CERT_NAME'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users email'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_EMAIL' value='$cgiparams{'CERT_EMAIL'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users department'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_OU' value='$cgiparams{'CERT_OU'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'organization name'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_ORGANIZATION' value='$cgiparams{'CERT_ORGANIZATION'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'city'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_CITY' value='$cgiparams{'CERT_CITY'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'state or province'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_STATE' value='$cgiparams{'CERT_STATE'}' SIZE='32' $cakeydisabled /></td></tr>
>  	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'country'}:</td><td class='base'><select name='CERT_COUNTRY' $cakeydisabled>
>  END
>  ;
> @@ -4709,12 +4708,12 @@ END
>  	    <table width='100%' cellpadding='0' cellspacing='5' border='0'>
>        
>  	    <tr><td><input type='radio' name='AUTH' value='certgen' $checked{'AUTH'}{'certgen'} $cakeydisabled /></td><td class='base'>$Lang::tr{'generate a certificate'}</td><td>&nbsp;</td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users fullname or system hostname'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_NAME' value='$cgiparams{'CERT_NAME'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users email'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_EMAIL' value='$cgiparams{'CERT_EMAIL'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users department'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_OU' value='$cgiparams{'CERT_OU'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'organization name'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_ORGANIZATION' value='$cgiparams{'CERT_ORGANIZATION'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'city'}:&nbsp;<img src='/blob.gif'></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_CITY' value='$cgiparams{'CERT_CITY'}' SIZE='32' $cakeydisabled /></td></tr>
> -	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'state or province'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_STATE' value='$cgiparams{'CERT_STATE'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users fullname or system hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_NAME' value='$cgiparams{'CERT_NAME'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users email'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_EMAIL' value='$cgiparams{'CERT_EMAIL'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users department'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_OU' value='$cgiparams{'CERT_OU'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'organization name'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_ORGANIZATION' value='$cgiparams{'CERT_ORGANIZATION'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'city'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_CITY' value='$cgiparams{'CERT_CITY'}' SIZE='32' $cakeydisabled /></td></tr>
> +	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'state or province'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_STATE' value='$cgiparams{'CERT_STATE'}' SIZE='32' $cakeydisabled /></td></tr>
>  	    <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'country'}:</td><td class='base'><select name='CERT_COUNTRY' $cakeydisabled>
>            
>        
> @@ -4750,7 +4749,7 @@ if ($cgiparams{'TYPE'} eq 'host') {
>  		<td class='base' nowrap='nowrap'><input type='password' name='CERT_PASS2' value='$cgiparams{'CERT_PASS2'}' size='32' $cakeydisabled /></td></tr>
>  		<tr><td colspan='3'>&nbsp;</td></tr>
>  		<tr><td colspan='3'><hr /></td></tr>
> -		<tr><td class='base' colspan='3' align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
> +		<tr><td class='base' colspan='3' align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'required field'}</td></tr>
>  	</table>
>  END
>  }else{
> @@ -4761,7 +4760,7 @@ END
>  		<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
>  		<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
>  		<tr><td colspan='3'><hr /></td></tr>
> -		<tr><td class='base' colspan='3' align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
> +		<tr><td class='base' colspan='3' align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'required field'}</td></tr>
>         </table>
>   
>  END
> diff --git a/html/cgi-bin/pppsetup.cgi b/html/cgi-bin/pppsetup.cgi
> index 33f521e..72be46e 100644
> --- a/html/cgi-bin/pppsetup.cgi
> +++ b/html/cgi-bin/pppsetup.cgi
> @@ -693,7 +693,7 @@ END
>  ;
>                  }
>                  if ($pppsettings{'TYPE'} =~ /^(modem)$/ ) {
> -                        print "<tr><td colspan='3' width='75%'>$Lang::tr{'number'}</td>\n";
> +                        print "<tr><td colspan='3' width='75%'>$Lang::tr{'number'}&nbsp;<img src='/blob.gif' alt='*' /></td>\n";
>                          print "<td width='25%'><input type='text' name='TELEPHONE' value='$pppsettings{'TELEPHONE'}'></td><tr>\n";
>                          if ($pppsettings{'TYPE'} eq 'modem' ) {
>                                  print "<tr><td colspan='3' width='75%'>$Lang::tr{'modem speaker on'}</td>\n";
> @@ -711,15 +711,15 @@ END
>          </select></td>
>  </tr>
>  <tr>
> -        <td colspan='3' width='75%'>$Lang::tr{'optional at cmd'}&nbsp;1&nbsp;<img src='/blob.gif' alt='*' /></td>
> +        <td colspan='3' width='75%'>$Lang::tr{'optional at cmd'}&nbsp;1</td>
>          <td width='25%'><input type='text' name='ADD_AT1' value='$pppsettings{'ADD_AT1'}'></td>
>  </tr>
>  <tr>
> -        <td colspan='3' width='75%'>$Lang::tr{'optional at cmd'}&nbsp;2&nbsp;<img src='/blob.gif' alt='*' /></td>
> +        <td colspan='3' width='75%'>$Lang::tr{'optional at cmd'}&nbsp;2</td>
>          <td width='25%'><input type='text' name='ADD_AT2' value='$pppsettings{'ADD_AT2'}'></td>
>  </tr>
>  <tr>
> -        <td colspan='3' width='75%'>$Lang::tr{'optional at cmd'}&nbsp;3&nbsp;<img src='/blob.gif' alt='*' /></td>
> +        <td colspan='3' width='75%'>$Lang::tr{'optional at cmd'}&nbsp;3</td>
>          <td width='25%'><input type='text' name='ADD_AT3' value='$pppsettings{'ADD_AT3'}'></td>
>  </tr>
>  <tr>
> @@ -732,7 +732,7 @@ END
>  
>  print <<END
>  <tr>
> -        <td colspan='3' width='75%'>$Lang::tr{'idle timeout'}</td>
> +        <td colspan='3' width='75%'>$Lang::tr{'idle timeout'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td width='25%'><input type='text' name='TIMEOUT' value='$pppsettings{'TIMEOUT'}' /></td>
>  </tr>
>   <tr>
> @@ -774,11 +774,11 @@ print <<END
>    <td width='25%'><input type='checkbox' name='DIALONDEMANDDNS' $checked{'DIALONDEMANDDNS'}{'on'} /></td>
>  </tr>
>  <tr>
> -        <td colspan='3' width='75%'>$Lang::tr{'holdoff'}:</td>
> +        <td colspan='3' width='75%'>$Lang::tr{'holdoff'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td width='25%'><input type='text' name='HOLDOFF' value='$pppsettings{'HOLDOFF'}' /></td>
>  </tr>
>  <tr>
> -        <td colspan='3' width='75%'>$Lang::tr{'maximum retries'}</td>
> +        <td colspan='3' width='75%'>$Lang::tr{'maximum retries'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td width='25%'><input type='text' name='MAXRETRIES' value='$pppsettings{'MAXRETRIES'}' /></td>
>  </tr>
>  END
> @@ -793,15 +793,15 @@ print <<END
>          <td colspan='4' width='100%' bgcolor='$color{'color20'}'><b>$Lang::tr{'pptp settings'}</b></td>
>  </tr>
>  <tr>
> -        <td width='25%'>Peer</td>
> +        <td width='25%'>Peer:&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td colspan='3'><input size=50 type='text' name='PPTP_PEER' value='$pppsettings{'PPTP_PEER'}' /></td>
>  </tr>
>  <tr>
> -        <td width='25%'>My Netconfig</td>
> +        <td width='25%'>My Netconfig:&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td colspan='3'><input size=50 type='text' name='PPTP_NICCFG' value='$pppsettings{'PPTP_NICCFG'}' /></td>
>  </tr>
>  <tr>
> -        <td width='25%'>PPTP Route&nbsp;<img src='/blob.gif' alt='*' /></td>
> +        <td width='25%'>PPTP Route:</td>
>          <td colspan='3'><input size=50 type='text' name='PPTP_ROUTE' value='$pppsettings{'PPTP_ROUTE'}' /></td>
>  </tr>
>  
> @@ -889,12 +889,12 @@ print <<END
>          <td colspan='4' width='100%' bgcolor='$color{'color20'}'><b>$Lang::tr{'pppoe settings'}</b></td>
>  </tr>
>  <tr>
> -        <td width='25%'>$Lang::tr{'service name'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +        <td width='25%'>$Lang::tr{'service name'}</td>
>          <td colspan='2' width='50%'></td>
>          <td width='25%'><input type='text' name='SERVICENAME' value='$pppsettings{'SERVICENAME'}' /></td>
>  </tr>
>  <tr>
> -        <td width='25%'>$Lang::tr{'concentrator name'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +        <td width='25%'>$Lang::tr{'concentrator name'}</td>
>          <td colspan='2' width='50%'></td>
>          <td width='25%'><input type='text' name='CONCENTRATORNAME' value='$pppsettings{'CONCENTRATORNAME'}' /></td>
>  </tr>
> @@ -909,11 +909,11 @@ print <<END
>  </tr>
>  <tr>
>  <tr>
> -        <td width='25%'>MTU&nbsp;<img src='/blob.gif' alt='*' /></td>
> +        <td width='25%'>MTU:</td>
>          <td width='25%'><input type='text' name='MTU' value='$pppsettings{'MTU'}' /></td>
>  </tr>
>  <tr>
> -        <td width='25%'>MRU&nbsp;<img src='/blob.gif' alt='*' /></td>
> +        <td width='25%'>MRU:</td>
>          <td width='25%'><input type='text' name='MRU' value='$pppsettings{'MRU'}' /></td>
>  </tr>
>  END
> @@ -925,9 +925,9 @@ print <<END
>          <td bgcolor='$color{'color20'}' colspan='4' width='100%'><b>$Lang::tr{'authentication'}</b></td>
>  </tr>
>  <tr>
> -        <td width='25%'>$Lang::tr{'username'}</td>
> +        <td width='25%'>$Lang::tr{'username'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td width='25%'><input type='text' name='USERNAME' value='$pppsettings{'USERNAME'}' /></td>
> -        <td width='25%'>$Lang::tr{'password'}</td>
> +        <td width='25%'>$Lang::tr{'password'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td width='25%'><input type='password' name='PASSWORD' value='$pppsettings{'PASSWORD'}' /></td>
>  </tr>
>  <tr>
> @@ -948,7 +948,7 @@ END
>  }
>  print <<END
>          </select></td>
> -        <td width='25%'>$Lang::tr{'script name'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +        <td width='25%'>$Lang::tr{'script name'}</td>
>          <td width='25%'><input type='text' name='LOGINSCRIPT' value='$pppsettings{'LOGINSCRIPT'}' /></td>
>  </tr>
>  <tr><td colspan='4' width='100%'><br></br></td></tr>
> @@ -969,7 +969,7 @@ print <<END
>  </tr>
>  <tr><td colspan='4' width='100%'><br></br><hr></hr><br></br></td></tr>
>  <tr>
> -        <td width='25%'>$Lang::tr{'profile name'}</td>
> +        <td width='25%'>$Lang::tr{'profile name'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td width='25%'><input type='text' name='PROFILENAME' value='$pppsettings{'PROFILENAME'}'>
>          <td colspan='2' width='50%'></td>
>  </tr>
> @@ -978,7 +978,7 @@ print <<END
>  </tr>
>  <tr>
>          <td colspan='2' width='50%'>$Lang::tr{'legend'}:</td>
> -        <td colspan='2' width='50%'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td>
> +        <td colspan='2' width='50%'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'required field'}</td>
>  </tr>
>  </table>
>  END
> diff --git a/html/cgi-bin/proxy.cgi b/html/cgi-bin/proxy.cgi
> index ba2455a..6c4e2b0 100644
> --- a/html/cgi-bin/proxy.cgi
> +++ b/html/cgi-bin/proxy.cgi
> @@ -969,13 +969,13 @@ print <<END
>  <tr>
>  	<td width='25%' class='base'>$Lang::tr{'advproxy enabled on'} <font color="$Header::colourgreen">Green</font>:</td>
>  	<td width='20%'><input type='checkbox' name='ENABLE' $checked{'ENABLE'}{'on'} /></td>
> -	<td width='25%' class='base'>$Lang::tr{'advproxy proxy port'}:</td>
> +	<td width='25%' class='base'>$Lang::tr{'advproxy proxy port'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td width='30%'><input type='text' name='PROXY_PORT' value='$proxysettings{'PROXY_PORT'}' size='5' /></td>
>  </tr>
>  <tr>
>  	<td class='base'>$Lang::tr{'advproxy transparent on'} <font color="$Header::colourgreen">Green</font>:</td>
>  	<td><input type='checkbox' name='TRANSPARENT' $checked{'TRANSPARENT'}{'on'} /></td>
> -	<td width='25%' class='base'>$Lang::tr{'advproxy proxy port transparent'}:</td>
> +	<td width='25%' class='base'>$Lang::tr{'advproxy proxy port transparent'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td width='30%'><input type='text' name='TRANSPARENT_PORT' value='$proxysettings{'TRANSPARENT_PORT'}' size='5' /></td>
>  </tr>
>  <tr>
> @@ -988,7 +988,7 @@ if ($netsettings{'BLUE_DEV'}) {
>  	print "<td colspan='2'>&nbsp;</td>";
>  }
>  print <<END
> -	<td class='base'>$Lang::tr{'advproxy visible hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'advproxy visible hostname'}:</td>
>  	<td><input type='text' name='VISIBLE_HOSTNAME' value='$proxysettings{'VISIBLE_HOSTNAME'}' /></td>
>  </tr>
>  <tr>
> @@ -1035,7 +1035,7 @@ print <<END
>  <hr size='1'>
>  <table width='100%'>
>  <tr><td class='base' colspan='4'><b>$Lang::tr{'advproxy redirector children'}</b></td></tr>
> -<tr><td class='base' >$Lang::tr{'processes'}<input type='text' name='CHILDREN' value='$proxysettings{'CHILDREN'}' size='5' /></td>
> +<tr><td class='base' >$Lang::tr{'processes'}:&nbsp;<img src='/blob.gif' alt='*' /><input type='text' name='CHILDREN' value='$proxysettings{'CHILDREN'}' size='5' /></td>
>  END
>  ;
>  my $count = `ip n| wc -l`;
> @@ -1071,19 +1071,19 @@ print <<END
>  <tr>
>  	<td width='25%' class='base'>$Lang::tr{'advproxy via forwarding'}:</td>
>  	<td width='20%'><input type='checkbox' name='FORWARD_VIA' $checked{'FORWARD_VIA'}{'on'} /></td>
> -	<td width='25%' class='base'>$Lang::tr{'advproxy upstream proxy host:port'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td width='25%' class='base'>$Lang::tr{'advproxy upstream proxy host:port'}:</td>
>  	<td width='30%'><input type='text' name='UPSTREAM_PROXY' value='$proxysettings{'UPSTREAM_PROXY'}' /></td>
>  </tr>
>  <tr>
>  	<td class='base'>$Lang::tr{'advproxy client IP forwarding'}:</td>
>  	<td><input type='checkbox' name='FORWARD_IPADDRESS' $checked{'FORWARD_IPADDRESS'}{'on'} /></td>
> -	<td class='base'>$Lang::tr{'advproxy upstream username'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'advproxy upstream username'}:</td>
>  	<td><input type='text' name='UPSTREAM_USER' value='$proxysettings{'UPSTREAM_USER'}' /></td>
>  </tr>
>  <tr>
>  	<td class='base'>$Lang::tr{'advproxy username forwarding'}:</td>
>  	<td><input type='checkbox' name='FORWARD_USERNAME' $checked{'FORWARD_USERNAME'}{'on'} /></td>
> -	<td class='base'>$Lang::tr{'advproxy upstream password'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'advproxy upstream password'}:</td>
>  	<td><input type='password' name='UPSTREAM_PASSWORD' value='$proxysettings{'UPSTREAM_PASSWORD'}' /></td>
>  </tr>
>  <tr>
> @@ -1119,28 +1119,28 @@ print <<END
>  <tr>
>  	<td class='base'>$Lang::tr{'proxy cachemgr'}:</td>
>  	<td><input type='checkbox' name='CACHEMGR' $checked{'CACHEMGR'}{'on'} /></td>
> -	<td class='base'>$Lang::tr{'advproxy admin mail'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'advproxy admin mail'}:</td>
>  	<td><input type='text' name='ADMIN_MAIL_ADDRESS' value='$proxysettings{'ADMIN_MAIL_ADDRESS'}' /></td>
>  </tr>
>  <tr>
> -	<td class='base'>$Lang::tr{'proxy filedescriptors'}:</td>
> +	<td class='base'>$Lang::tr{'proxy filedescriptors'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td><input type='text' name='FILEDESCRIPTORS' value='$proxysettings{'FILEDESCRIPTORS'}' size='5' /></td>
> -	<td class='base'>$Lang::tr{'proxy admin password'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'proxy admin password'}:</td>
>  	<td><input type='text' name='ADMIN_PASSWORD' value='$proxysettings{'ADMIN_PASSWORD'}' /></td>
>  </tr>
>  <tr>
>  	<td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
>  </tr>
>  <tr>
> -	<td class='base'>$Lang::tr{'advproxy ram cache size'}:</td>
> +	<td class='base'>$Lang::tr{'advproxy ram cache size'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td><input type='text' name='CACHE_MEM' value='$proxysettings{'CACHE_MEM'}' size='5' /></td>
> -	<td class='base'>$Lang::tr{'advproxy hdd cache size'}:</td>
> +	<td class='base'>$Lang::tr{'advproxy hdd cache size'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td><input type='text' name='CACHE_SIZE' value='$proxysettings{'CACHE_SIZE'}' size='5' /></td>
>  </tr>
>  <tr>
> -	<td class='base'>$Lang::tr{'advproxy min size'}:</td>
> +	<td class='base'>$Lang::tr{'advproxy min size'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td><input type='text' name='MIN_SIZE' value='$proxysettings{'MIN_SIZE'}' size='5' /></td>
> -	<td class='base'>$Lang::tr{'advproxy max size'}:</td>
> +	<td class='base'>$Lang::tr{'advproxy max size'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td><input type='text' name='MAX_SIZE' value='$proxysettings{'MAX_SIZE'}' size='5' /></td>
>  </tr>
>  <tr>
> @@ -1158,7 +1158,7 @@ print <<END
>  				<!-- intentionally left empty -->
>  			</tr>
>  			<tr>
> -			<td>$Lang::tr{'advproxy no cache sites'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +			<td>$Lang::tr{'advproxy no cache sites'}:</td>
>  			</tr>
>  			<tr>
>  				<!-- intentionally left empty -->
> @@ -1218,8 +1218,8 @@ print <<END
>  	<td width='25%' align='center'></td> <td width='20%' align='center'></td><td width='25%' align='center'></td><td width='30%' align='center'></td>
>  </tr>
>  <tr>
> -	<td colspan='2' class='base'>$Lang::tr{'advproxy standard ports'}:</td>
> -	<td colspan='2' class='base'>$Lang::tr{'advproxy ssl ports'}:</td>
> +	<td colspan='2' class='base'>$Lang::tr{'advproxy standard ports'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td colspan='2' class='base'>$Lang::tr{'advproxy ssl ports'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  </tr>
>  <tr>
>  	<td colspan='2'><textarea name='PORTS_SAFE' cols='32' rows='6' wrap='off'>
> @@ -1247,7 +1247,7 @@ print <<END
>  	<td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
>  </tr>
>  <tr>
> -	<td colspan='4' class='base'>$Lang::tr{'advproxy allowed subnets'}:</td>
> +	<td colspan='4' class='base'>$Lang::tr{'advproxy allowed subnets'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  </tr>
>  <tr>
>  	<td colspan='2' rowspan='4'><textarea name='SRC_SUBNETS' cols='32' rows='3' wrap='off'>
> @@ -1300,8 +1300,8 @@ print <<END
>  	<td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
>  </tr>
>  <tr>
> -	<td colspan='2' class='base'>$Lang::tr{'advproxy unrestricted ip clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> -	<td colspan='2' class='base'>$Lang::tr{'advproxy unrestricted mac clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td colspan='2' class='base'>$Lang::tr{'advproxy unrestricted ip clients'}:</td>
> +	<td colspan='2' class='base'>$Lang::tr{'advproxy unrestricted mac clients'}:</td>
>  </tr>
>  <tr>
>  	<td colspan='2'><textarea name='SRC_UNRESTRICTED_IP' cols='32' rows='3' wrap='off'>
> @@ -1327,8 +1327,8 @@ print <<END
>  	<td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
>  </tr>
>  <tr>
> -	<td colspan='2' class='base'>$Lang::tr{'advproxy banned ip clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> -	<td colspan='2' class='base'>$Lang::tr{'advproxy banned mac clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td colspan='2' class='base'>$Lang::tr{'advproxy banned ip clients'}:</td>
> +	<td colspan='2' class='base'>$Lang::tr{'advproxy banned mac clients'}:</td>
>  </tr>
>  <tr>
>  	<td colspan='2'><textarea name='SRC_BANNED_IP' cols='32' rows='3' wrap='off'>
> @@ -1373,12 +1373,12 @@ END
>  ;
>  if ($proxysettings{'CLASSROOM_EXT'} eq 'on'){
>  print <<END
> -	<td class='base'>$Lang::tr{'advproxy supervisor password'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'advproxy supervisor password'}:</td>
>  	<td><input type='password' name='SUPERVISOR_PASSWORD' value='$proxysettings{'SUPERVISOR_PASSWORD'}' size='12' /></td>
>  </tr>
>  <tr>
>  	<td colspan='2' class='base'>$Lang::tr{'advproxy cre group definitions'}:</td>
> -	<td colspan='2' class='base'>$Lang::tr{'advproxy cre supervisors'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td colspan='2' class='base'>$Lang::tr{'advproxy cre supervisors'}:</td>
>  END
>  ;
>  }
> @@ -1512,9 +1512,9 @@ print <<END
>  	<td colspan='4'><b>$Lang::tr{'advproxy transfer limits'}</b></td>
>  </tr>
>  <tr>
> -	<td width='25%' class='base'>$Lang::tr{'advproxy max download size'}:</td>
> +	<td width='25%' class='base'>$Lang::tr{'advproxy max download size'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td width='20%'><input type='text' name='MAX_INCOMING_SIZE' value='$proxysettings{'MAX_INCOMING_SIZE'}' size='5' /></td>
> -	<td width='25%' class='base'>$Lang::tr{'advproxy max upload size'}:</td>
> +	<td width='25%' class='base'>$Lang::tr{'advproxy max upload size'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td width='30%'><input type='text' name='MAX_OUTGOING_SIZE' value='$proxysettings{'MAX_OUTGOING_SIZE'}' size='5' /></td>
>  </tr>
>  </table>
> @@ -1619,7 +1619,7 @@ END
>  if ( $proxysettings{'ENABLE_MIME_FILTER'} eq 'on' ){
>  print <<END
>  <tr>
> -	<td  colspan='2' class='base'>$Lang::tr{'advproxy MIME block types'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td  colspan='2' class='base'>$Lang::tr{'advproxy MIME block types'}:</td>
>  	<td>&nbsp;</td>
>  	<td>&nbsp;</td>
>  </tr>
> @@ -1683,8 +1683,8 @@ print <<END
>  	<td><b>$Lang::tr{'advproxy privacy'}</b></td>
>  </tr>
>  <tr>
> -	<td class='base'>$Lang::tr{'advproxy fake useragent'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> -	<td class='base'>$Lang::tr{'advproxy fake referer'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'advproxy fake useragent'}:</td>
> +	<td class='base'>$Lang::tr{'advproxy fake referer'}:</td>
>  </tr>
>  <tr>
>  	<td><input type='text' name='FAKE_USERAGENT' value='$proxysettings{'FAKE_USERAGENT'}' size='40%' /></td>
> @@ -1742,7 +1742,7 @@ if (!($proxysettings{'AUTH_METHOD'} eq 'none')) { if (!($proxysettings{'AUTH_MET
>  	<td colspan='2' rowspan= '6' valign='top' class='base'>
>  		<table cellpadding='0' cellspacing='0'>
>  			<tr>
> -			<td class='base'>$Lang::tr{'advproxy AUTH realm'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +			<td class='base'>$Lang::tr{'advproxy AUTH realm'}:</td>
>  			</tr>
>  			<tr>
>  				<!-- intentionally left empty -->
> @@ -1760,7 +1760,7 @@ if (!($proxysettings{'AUTH_METHOD'} eq 'none')) { if (!($proxysettings{'AUTH_MET
>  				<!-- intentionally left empty -->
>  			</tr>
>  			<tr>
> -			<td>$Lang::tr{'advproxy AUTH no auth'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +			<td>$Lang::tr{'advproxy AUTH no auth'}:</td>
>  			</tr>
>  			<tr>
>  				<!-- intentionally left empty -->
> @@ -1786,7 +1786,7 @@ print <<END
>  	<td><input type='text' name='AUTH_CACHE_TTL' value='$proxysettings{'AUTH_CACHE_TTL'}' size='5' /></td>
>  </tr>
>  <tr>
> -	<td class='base'>$Lang::tr{'advproxy AUTH limit of IP addresses'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'advproxy AUTH limit of IP addresses'}:</td>
>  	<td><input type='text' name='AUTH_MAX_USERIP' value='$proxysettings{'AUTH_MAX_USERIP'}' size='5' /></td>
>  </tr>
>  <tr>
> @@ -1856,7 +1856,7 @@ print <<END
>  </tr>
>  <tr>
>  	<td colspan='2' class='base'>$Lang::tr{'advproxy IDENT aware hosts'}:</td>
> -	<td colspan='2' class='base'>$Lang::tr{'advproxy AUTH no auth'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td colspan='2' class='base'>$Lang::tr{'advproxy AUTH no auth'}:</td>
>  </tr>
>  <tr>
>  	<td colspan='2'><textarea name='IDENT_HOSTS' cols='32' rows='6' wrap='off'>
> @@ -1942,7 +1942,7 @@ print <<END
>  	<td><input type='text' name='NTLM_DOMAIN' value='$proxysettings{'NTLM_DOMAIN'}' size='15' /></td>
>  	<td class='base'>$Lang::tr{'advproxy NTLM PDC hostname'}:</td>
>  	<td><input type='text' name='NTLM_PDC' value='$proxysettings{'NTLM_PDC'}' size='14' /></td>
> -	<td class='base'>$Lang::tr{'advproxy NTLM BDC hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'advproxy NTLM BDC hostname'}:</td>
>  	<td><input type='text' name='NTLM_BDC' value='$proxysettings{'NTLM_BDC'}' size='14' /></td>
>  </tr>
>  </table>
> @@ -2020,7 +2020,7 @@ if ($proxysettings{'AUTH_METHOD'} eq 'ntlm-auth') {
>  				<td colspan='4'><b>$Lang::tr{'advproxy group access control'}</b></td>
>  			</tr>
>  			<tr>
> -				<td width='20%' class='base'>$Lang::tr{'advproxy group required'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +				<td width='20%' class='base'>$Lang::tr{'advproxy group required'}:</td>
>  				<td width='40%'><input type='text' name='NTLM_AUTH_GROUP' value='$proxysettings{'NTLM_AUTH_GROUP'}' size='37' /></td>
>  				<td>&nbsp;</td>
>  				<td>&nbsp;</td>
> @@ -2076,7 +2076,7 @@ print <<END
>  	<td colspan='4'><b>$Lang::tr{'advproxy LDAP group access control'}</b></td>
>  </tr>
>  <tr>
> -	<td width='20%' class='base'>$Lang::tr{'advproxy LDAP group required'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td width='20%' class='base'>$Lang::tr{'advproxy LDAP group required'}:</td>
>  	<td width='40%'><input type='text' name='LDAP_GROUP' value='$proxysettings{'LDAP_GROUP'}' size='37' /></td>
>  	<td>&nbsp;</td>
>  	<td>&nbsp;</td>
> @@ -2103,7 +2103,7 @@ print <<END
>  	<td width='30%'><input type='text' name='RADIUS_PORT' value='$proxysettings{'RADIUS_PORT'}' size='3' /></td>
>  </tr>
>  <tr>
> -	<td class='base'>$Lang::tr{'advproxy RADIUS identifier'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'advproxy RADIUS identifier'}:</td>
>  	<td><input type='text' name='RADIUS_IDENTIFIER' value='$proxysettings{'RADIUS_IDENTIFIER'}' size='14' /></td>
>  	<td class='base'>$Lang::tr{'advproxy RADIUS secret'}:</td>
>  	<td><input type='password' name='RADIUS_SECRET' value='$proxysettings{'RADIUS_SECRET'}' size='14' /></td>
> @@ -2259,9 +2259,7 @@ print <<END
>  <br />
>  <table width='100%'>
>  <tr>
> -	<td><img src='/blob.gif' align='top' alt='*' />&nbsp;
> -	<font class='base'>$Lang::tr{'this field may be blank'}</font>
> -	</td>
> +	<td><img src='/blob.gif' align='top' alt='*' />&nbsp;<font class='base'>$Lang::tr{'required field'}</font></td>
>  	<td align='right'>&nbsp;</td>
>  </tr>
>  </table>
> diff --git a/html/cgi-bin/qos.cgi b/html/cgi-bin/qos.cgi
> index 5542f65..39c3ed8 100644
> --- a/html/cgi-bin/qos.cgi
> +++ b/html/cgi-bin/qos.cgi
> @@ -938,7 +938,7 @@ END
>  		<tr><td width='33%' align='right'>$Lang::tr{'guaranteed bandwith'}:
>  		    <td width='33%' align='left'><input type='text' size='20' name='MINBWDTH' maxlength='8' required='1' value="$qossettings{'MINBWDTH'}" />
>  		    <td width='33%' align='center'>&nbsp;
> -		<tr><td width='33%' align='right'>$Lang::tr{'max bandwith'}:
> +		<tr><td width='33%' align='right'>$Lang::tr{'max bandwith'}&nbsp;<img src='/blob.gif' alt='*' />:
>  		    <td width='33%' align='left'><input type='text' size='20' name='MAXBWDTH' maxlength='8' required='1' value="$qossettings{'MAXBWDTH'}" />
>  		    <td width='33%' align='center'>&nbsp;
>  		<tr><td width='33%' align='right'>Burst:
> @@ -960,8 +960,8 @@ print <<END
>  				<option value='1' $selected{'TOS'}{'1'}>$Lang::tr{'min costs'} (1)</option></select>
>  		    <td width='33%' align='center'>&nbsp;
>  		<tr><td width='33%' align='right'>$Lang::tr{'remark'}:
> -		    <td width='66%' colspan='2' align='left'><input type='text' name='REMARK' size='40' maxlength='40' value="$qossettings{'REMARK'}" /> <img alt="" alt='blob' src='/blob.gif' />
> -		<tr><td width='33%' align='right'>&nbsp;
> +		    <td width='66%' colspan='2' align='left'><input type='text' name='REMARK' size='40' maxlength='40' value="$qossettings{'REMARK'}" />
> +		<tr><td width='33%' align='right'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'required field'}
>  		    <td width='33%' align='left'>&nbsp;
>  		    <td width='33%' align='center'><input type='submit' name='DOCLASS' value='$Lang::tr{'save'}' />&nbsp;<input type='reset' value='$Lang::tr{'reset'}' />
>  		</table></form>
> diff --git a/html/cgi-bin/time.cgi b/html/cgi-bin/time.cgi
> index 39d71f8..8363b99 100644
> --- a/html/cgi-bin/time.cgi
> +++ b/html/cgi-bin/time.cgi
> @@ -263,9 +263,9 @@ print <<END
>  </td></tr>
>  <tr>
>  	<td>&nbsp;</td>
> -	<td width='25%' class='base'>$Lang::tr{'primary ntp server'}:</td>
> +	<td width='25%' class='base'>$Lang::tr{'primary ntp server'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td width='25%'><input type='text' name='NTP_ADDR_1' value='$timesettings{'NTP_ADDR_1'}' /></td>
> -	<td width='25%' class='base'>$Lang::tr{'secondary ntp server'}: &nbsp;<img src='/blob.gif' align='top' alt='*' /></td>
> +	<td width='25%' class='base'>$Lang::tr{'secondary ntp server'}:</td>
>  	<td width='25%'><input type='text' name='NTP_ADDR_2' value='$timesettings{'NTP_ADDR_2'}' /></td>
>  </tr>
>  <tr>
> @@ -319,7 +319,7 @@ print <<END
>  <hr />
>  <table width='100%'>
>  <tr>
> -	<td width='30%'><img src='/blob.gif' alt='*' /> $Lang::tr{'this field may be blank'}</td>
> +	<td width='30%'><img src='/blob.gif' alt='*' /> $Lang::tr{'required field'}</td>
>  	<td width='65%' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'set time now'}' /></td>
>  	<td width='5%' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
>  </tr>
> diff --git a/html/cgi-bin/tor.cgi b/html/cgi-bin/tor.cgi
> index e00bc5f..91f4b45 100644
> --- a/html/cgi-bin/tor.cgi
> +++ b/html/cgi-bin/tor.cgi
> @@ -266,7 +266,7 @@ if ( ($memory != 0) && (@pid[0] ne "///") ){
>  			<tr>
>  				<td width='25%' class='base'>$Lang::tr{'tor enabled'}:</td>
>  				<td width='30%'><input type='checkbox' name='TOR_ENABLED' $checked{'TOR_ENABLED'}{'on'} /></td>
> -				<td width='25%' class='base'>$Lang::tr{'tor socks port'}:</td>
> +				<td width='25%' class='base'>$Lang::tr{'tor socks port'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td width='20%'><input type='text' name='TOR_SOCKS_PORT' value='$settings{'TOR_SOCKS_PORT'}' size='5' /></td>
>  			</tr>
>  			<tr>
> @@ -386,17 +386,17 @@ END
>  						<option value='private-bridge' $selected{'TOR_RELAY_MODE'}{'private-bridge'}>$Lang::tr{'tor relay mode private bridge'}</option>
>  					</select>
>  				</td>
> -				<td width='25%' class='base'>$Lang::tr{'tor relay nickname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +				<td width='25%' class='base'>$Lang::tr{'tor relay nickname'}:</td>
>  				<td width='20%'>
>  					<input type='text' name='TOR_RELAY_NICKNAME' value='$settings{'TOR_RELAY_NICKNAME'}' maxlength='19' />
>  				</td>
>  			</tr>
>  			<tr>
> -				<td width='25%' class='base'>$Lang::tr{'tor relay address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +				<td width='25%' class='base'>$Lang::tr{'tor relay address'}:</td>
>  				<td width='30%'>
>  					<input type='text' name='TOR_RELAY_ADDRESS' value='$settings{'TOR_RELAY_ADDRESS'}' />
>  				</td>
> -				<td width='25%' class='base'>$Lang::tr{'tor relay port'}:</td>
> +				<td width='25%' class='base'>$Lang::tr{'tor relay port'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td width='20%'>
>  					<input type='text' name='TOR_RELAY_PORT' value='$settings{'TOR_RELAY_PORT'}' size='5' />
>  				</td>
> @@ -404,13 +404,13 @@ END
>  			<tr>
>  				<td width='25%'>&nbsp;</td>
>  				<td width='30%'>&nbsp;</td>
> -				<td width='25%' class='base'>$Lang::tr{'tor directory port'}:</td>
> +				<td width='25%' class='base'>$Lang::tr{'tor directory port'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td width='20%'>
>  					<input type='text' name='TOR_RELAY_DIRPORT' value='$settings{'TOR_RELAY_DIRPORT'}' size='5' />&nbsp;$Lang::tr{'tor 0 = disabled'}
>  				</td>
>  			</tr>
>  			<tr>
> -				<td width='25%' class='base'>$Lang::tr{'tor contact info'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +				<td width='25%' class='base'>$Lang::tr{'tor contact info'}:</td>
>  				<td width='75%' colspan='3'>
>  					<input type='text' name='TOR_RELAY_CONTACT_INFO' value='$settings{'TOR_RELAY_CONTACT_INFO'}' style='width: 98%;' />
>  				</td>
> @@ -441,7 +441,7 @@ END
>  						<option value='0' $selected{'TOR_RELAY_BANDWIDTH_RATE'}{'0'}>$Lang::tr{'tor bandwidth unlimited'}</option>
>  					</select>
>  				</td>
> -				<td width='25%' class='base'>$Lang::tr{'tor accounting limit'}:</td>
> +				<td width='25%' class='base'>$Lang::tr{'tor accounting limit'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td width='20%'>
>  					<input type='text' name='TOR_RELAY_ACCOUNTING_LIMIT' value='$settings{'TOR_RELAY_ACCOUNTING_LIMIT'}' size='12' />
>  				</td>
> @@ -484,9 +484,7 @@ END
>  	print <<END;
>  		<table width='95%'>
>  			<tr>
> -				<td>
> -					<img src='/blob.gif' align='top' alt='*' />&nbsp;<font class='base'>$Lang::tr{'this field may be blank'}</font>
> -				</td>
> +				<td><img src='/blob.gif' align='top' alt='*' />&nbsp;<font class='base'>$Lang::tr{'required field'}</font></td>
>  				<td align='right'>&nbsp;</td>
>  			</tr>
>  		</table>
> diff --git a/html/cgi-bin/updatexlrator.cgi b/html/cgi-bin/updatexlrator.cgi
> index 6cd9668..c94c34e 100644
> --- a/html/cgi-bin/updatexlrator.cgi
> +++ b/html/cgi-bin/updatexlrator.cgi
> @@ -397,7 +397,7 @@ print <<END
>  <tr>
>  	<td class='base'>$Lang::tr{'updxlrtr passive mode'}:</td>
>  	<td class='base'><input type='checkbox' name='PASSIVE_MODE' $checked{'PASSIVE_MODE'}{'on'} /></td>
> -	<td class='base'>$Lang::tr{'updxlrtr max disk usage'}:</td>
> +	<td class='base'>$Lang::tr{'updxlrtr max disk usage'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td class='base'><input type='text' name='MAX_DISK_USAGE' value='$xlratorsettings{'MAX_DISK_USAGE'}' size='1' /> %</td>
>  </tr>
>  </table>
> @@ -409,7 +409,7 @@ print <<END
>  <tr>
>  	<td class='base' width='25%'>$Lang::tr{'updxlrtr low download priority'}:</td>
>  	<td class='base' width='20%'><input type='checkbox' name='LOW_DOWNLOAD_PRIORITY' $checked{'LOW_DOWNLOAD_PRIORITY'}{'on'} /></td>
> -	<td class='base' width='25%'>$Lang::tr{'updxlrtr max download rate'}:&nbsp;<img src='/blob.gif' alt='*' </td>
> +	<td class='base' width='25%'>$Lang::tr{'updxlrtr max download rate'}:</td>
>  	<td class='base' width='30%'><input type='text' name='MAX_DOWNLOAD_RATE' value='$xlratorsettings{'MAX_DOWNLOAD_RATE'}' size='5' /></td>
>  </tr>
>  </table>
> diff --git a/html/cgi-bin/urlfilter.cgi b/html/cgi-bin/urlfilter.cgi
> index 1e50de9..c3c327e 100644
> --- a/html/cgi-bin/urlfilter.cgi
> +++ b/html/cgi-bin/urlfilter.cgi
> @@ -1214,8 +1214,8 @@ print <<END
>          <td>&nbsp;</td>
>  </tr>
>  <tr>
> -	<td colspan='2'>$Lang::tr{'urlfilter blocked domains'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> -	<td colspan='2'>$Lang::tr{'urlfilter blocked urls'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td colspan='2'>$Lang::tr{'urlfilter blocked domains'}</td>
> +	<td colspan='2'>$Lang::tr{'urlfilter blocked urls'}</td>
>  </tr>
>  <tr>
>  	<td colspan='2'>$Lang::tr{'urlfilter example'}</td>
> @@ -1257,8 +1257,8 @@ print <<END
>          <td>&nbsp;</td>
>  </tr>
>  <tr>
> -	<td colspan='2'>$Lang::tr{'urlfilter allowed domains'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> -	<td colspan='2'>$Lang::tr{'urlfilter allowed urls'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td colspan='2'>$Lang::tr{'urlfilter allowed domains'}</td>
> +	<td colspan='2'>$Lang::tr{'urlfilter allowed urls'}</td>
>  </tr>
>  <tr>
>  	<td colspan='2'>$Lang::tr{'urlfilter example'}</td>
> @@ -1297,7 +1297,7 @@ print <<END
>          <td colspan='4'><b>$Lang::tr{'urlfilter custom expression list'}</b></td>
>  </tr>
>  <tr>
> -	<td colspan='4'>$Lang::tr{'urlfilter blocked expressions'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td colspan='4'>$Lang::tr{'urlfilter blocked expressions'}</td>
>  </tr>
>  <tr>
>  	<td colspan='4'><textarea name='CUSTOM_EXPRESSIONS' cols='70' rows='3' wrap='off'>
> @@ -1360,8 +1360,8 @@ print <<END
>          <td>&nbsp;</td>
>  </tr>
>  <tr>
> -	<td colspan='2'>$Lang::tr{'urlfilter unfiltered clients'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> -	<td colspan='2'>$Lang::tr{'urlfilter banned clients'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td colspan='2'>$Lang::tr{'urlfilter unfiltered clients'}</td>
> +	<td colspan='2'>$Lang::tr{'urlfilter banned clients'}</td>
>  </tr>
>  <tr>
>  	<td colspan='2' width='50%'><textarea name='UNFILTERED_CLIENTS' cols='32' rows='6' wrap='off'>
> @@ -1440,25 +1440,25 @@ print <<END
>  <tr>
>  	<td width='25%' class='base'>$Lang::tr{'urlfilter show category'}:</td>
>  	<td width='12%'><input type='checkbox' name='SHOW_CATEGORY' $checked{'SHOW_CATEGORY'}{'on'} /></td>
> -	<td width='25%' class='base'>$Lang::tr{'urlfilter redirectpage'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td width='25%' class='base'>$Lang::tr{'urlfilter redirectpage'}:</td>
>  	<td><input type='text' name='REDIRECT_PAGE' value='$filtersettings{'REDIRECT_PAGE'}' size='40' /></td>
>  </tr>
>  <tr>
>  	<td class='base'>$Lang::tr{'urlfilter show url'}:</td>
>  	<td><input type='checkbox' name='SHOW_URL' $checked{'SHOW_URL'}{'on'} /></td>
> -	<td class='base'>$Lang::tr{'urlfilter msg text 1'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'urlfilter msg text 1'}:</td>
>  	<td><input type='text' name='MSG_TEXT_1' value='$filtersettings{'MSG_TEXT_1'}' size='40' /></td>
>  </tr>
>  <tr>
>  	<td class='base'>$Lang::tr{'urlfilter show ip'}:</td>
>  	<td><input type='checkbox' name='SHOW_IP' $checked{'SHOW_IP'}{'on'} /></td>
> -	<td class='base'>$Lang::tr{'urlfilter msg text 2'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'urlfilter msg text 2'}:</td>
>  	<td><input type='text' name='MSG_TEXT_2' value='$filtersettings{'MSG_TEXT_2'}' size='40' /></td>
>  </tr>
>  <tr>
>  	<td class='base'>$Lang::tr{'urlfilter show dnserror'}:</td>
>  	<td><input type='checkbox' name='ENABLE_DNSERROR' $checked{'ENABLE_DNSERROR'}{'on'} /></td>
> -	<td class='base'>$Lang::tr{'urlfilter msg text 3'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td class='base'>$Lang::tr{'urlfilter msg text 3'}:</td>
>  	<td><input type='text' name='MSG_TEXT_3' value='$filtersettings{'MSG_TEXT_3'}' size='40' /></td>
>  </tr>
>  </table>
> @@ -1499,12 +1499,8 @@ print <<END
>  <hr size='1'>
>  <table width='100%'>
>  <tr>
> -	<td>
> -	<img src='/blob.gif' align='top' alt='*' />&nbsp;
> -	<font class='base'>$Lang::tr{'this field may be blank'}</font>
> -	</td>
> -	<td align='right'>&nbsp;
> -	</td>
> +	<td><img src='/blob.gif' align='top' alt='*' />&nbsp;<font class='base'>$Lang::tr{'required field'}</font></td>
> +	<td align='right'>&nbsp;</td>
>  </tr>
>  </table>
>  <table width='100%'>
> @@ -1880,9 +1876,9 @@ print <<END
>  
>  <table width='100%'>
>  	<tr>
> -		<td width='5%'>$Lang::tr{'urlfilter source'}</td>
> +		<td width='5%'>$Lang::tr{'urlfilter source'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td width='1%'>&nbsp;&nbsp;</td>
> -		<td width='5%'>$Lang::tr{'urlfilter dst'}&nbsp;<img src='/blob.gif' alt='*'><img src='/blob.gif' alt='*'></td>
> +		<td width='5%'>$Lang::tr{'urlfilter dst'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td width='1%'>&nbsp;&nbsp;</td>
>  		<td width='5%'>$Lang::tr{'urlfilter access'}</td>
>  		<td>&nbsp;</td>
> @@ -1943,7 +1939,7 @@ print <<END
>  		<td>&nbsp;</td>
>  	</tr>
>  	<tr>
> -		<td>$Lang::tr{'remark'}&nbsp;<img src='/blob.gif' alt='*'></td>
> +		<td>$Lang::tr{'remark'}</td>
>  		<td>&nbsp;</td>
>  		<td>&nbsp;</td>
>  		<td>&nbsp;</td>
> @@ -1982,10 +1978,10 @@ print <<END
>  <table width='100%'>
>  	<tr>
>  		<td width='1%' align='right'> <img src='/blob.gif' align='top' alt='*' />&nbsp;</td>
> -		<td><font class='base'>$Lang::tr{'this field may be blank'}</font></td>
> +		<td><font class='base'>$Lang::tr{'required field'}</font></td>
>  	</tr>
>  	<tr>
> -		<td width='1%' align='right'><img src='/blob.gif' align='top' alt='*' /><img src='/blob.gif' align='top' alt='*' />&nbsp;</td>
> +		<td width='1%' align='right'>&nbsp;</td>
>  		<td><font class='base'>$Lang::tr{'urlfilter select multi'}</font></td>
>  	</tr>
>  </table>
> @@ -2168,7 +2164,7 @@ print <<END
>  	<td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
>  </tr>
>  <tr>
> -        <td class='base'>$Lang::tr{'urlfilter user time quota'}:</td>
> +        <td class='base'>$Lang::tr{'urlfilter user time quota'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td><input type='text' name='TIME_QUOTA' value='$uqsettings{'TIME_QUOTA'}' size='5' /></td>
>  	<td colspan='2' rowspan= '5' valign='top' class='base'>
>  		<table cellpadding='0' cellspacing='0'>
> @@ -2176,7 +2172,7 @@ print <<END
>  				<!-- intentionally left empty -->
>  			</tr>
>  			<tr>
> -			<td>$Lang::tr{'urlfilter assigned quota users'}:</td>
> +			<td>$Lang::tr{'urlfilter assigned quota users'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  			</tr>
>  			<tr>
>  				<!-- intentionally left empty -->
> @@ -2374,7 +2370,7 @@ print <<END
>         	<td class='base'><b>$Lang::tr{'urlfilter blacklist name'}</b></td>
>  </tr>
>  <tr>
> -       	<td class='base'>$Lang::tr{'urlfilter blacklist category name'}:</td>
> +       	<td class='base'>$Lang::tr{'urlfilter blacklist category name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td><input type='text' name='BE_NAME' value='$besettings{'BE_NAME'}' size='12' /></td>
>  </tr>
>  </table>
> @@ -2384,7 +2380,7 @@ print <<END
>  	<td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='20%'></td>
>  </tr>
>  <tr>
> -       	<td class='base' colspan='4'><b>$Lang::tr{'urlfilter edit domains urls expressions'}</b></td>
> +       	<td class='base' colspan='4'><b>$Lang::tr{'urlfilter edit domains urls expressions'}</b>&nbsp;<img src='/blob.gif' alt='*' /></td>
>  </tr>
>  <tr>
>  	<td colspan='2'>$Lang::tr{'urlfilter domains'}</td>
> diff --git a/html/cgi-bin/vpnmain.cgi b/html/cgi-bin/vpnmain.cgi
> index 2a020ea..43f85d6 100644
> --- a/html/cgi-bin/vpnmain.cgi
> +++ b/html/cgi-bin/vpnmain.cgi
> @@ -1036,17 +1036,17 @@ END
>      print <<END
>      <form method='post' enctype='multipart/form-data' action='$ENV{'SCRIPT_NAME'}'>
>      <table width='100%' border='0' cellspacing='1' cellpadding='0'>
> -    <tr><td width='40%' class='base'>$Lang::tr{'organization name'}:</td>
> +    <tr><td width='40%' class='base'>$Lang::tr{'organization name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td width='60%' class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_ORGANIZATION' value='$cgiparams{'ROOTCERT_ORGANIZATION'}' size='32' /></td></tr>
> -    <tr><td class='base'>$Lang::tr{'ipfires hostname'}:</td>
> +    <tr><td class='base'>$Lang::tr{'ipfires hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>          <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_HOSTNAME' value='$cgiparams{'ROOTCERT_HOSTNAME'}' size='32' /></td></tr>
> -    <tr><td class='base'>$Lang::tr{'your e-mail'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <tr><td class='base'>$Lang::tr{'your e-mail'}:</td>
>          <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_EMAIL' value='$cgiparams{'ROOTCERT_EMAIL'}' size='32' /></td></tr>
> -    <tr><td class='base'>$Lang::tr{'your department'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <tr><td class='base'>$Lang::tr{'your department'}:</td>
>          <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_OU' value='$cgiparams{'ROOTCERT_OU'}' size='32' /></td></tr>
> -    <tr><td class='base'>$Lang::tr{'city'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <tr><td class='base'>$Lang::tr{'city'}:</td>
>          <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_CITY' value='$cgiparams{'ROOTCERT_CITY'}' size='32' /></td></tr>
> -    <tr><td class='base'>$Lang::tr{'state or province'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <tr><td class='base'>$Lang::tr{'state or province'}:</td>
>          <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_STATE' value='$cgiparams{'ROOTCERT_STATE'}' size='32' /></td></tr>
>      <tr><td class='base'>$Lang::tr{'country'}:</td>
>          <td class='base'><select name='ROOTCERT_COUNTRY'>
> @@ -1061,7 +1061,7 @@ END
>      }
>      print <<END
>          </select></td></tr>
> -    <tr><td class='base'>$Lang::tr{'vpn subjectaltname'} (subjectAltName=email:*,URI:*,DNS:*,RID:*) <img src='/blob.gif' alt='*' /></td>
> +    <tr><td class='base'>$Lang::tr{'vpn subjectaltname'} (subjectAltName=email:*,URI:*,DNS:*,RID:*)</td>
>  	<td class='base' nowrap='nowrap'><input type='text' name='SUBJECTALTNAME' value='$cgiparams{'SUBJECTALTNAME'}' size='32' /></td></tr>
>      <tr><td>&nbsp;</td>
>          <td><br /><input type='submit' name='ACTION' value='$Lang::tr{'generate root/host certificates'}' /><br /><br /></td></tr>
> @@ -1072,12 +1072,12 @@ END
>      <tr><td colspan='2'><hr></td></tr>
>      <tr><td class='base' nowrap='nowrap'>$Lang::tr{'upload p12 file'}:</td>
>          <td nowrap='nowrap'><input type='file' name='FH' size='32' /></td></tr>
> -    <tr><td class='base'>$Lang::tr{'pkcs12 file password'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +    <tr><td class='base'>$Lang::tr{'pkcs12 file password'}:</td>
>          <td class='base' nowrap='nowrap'><input type='password' name='P12_PASS' value='$cgiparams{'P12_PASS'}' size='32' /></td></tr>
>      <tr><td>&nbsp;</td>
>          <td><input type='submit' name='ACTION' value='$Lang::tr{'upload p12 file'}' /></td></tr>
>      <tr><td class='base' colspan='2' align='left'>
> -        <img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
> +        <img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'required field'}</td></tr>
>      </table></form>
>  END
>      ;
> @@ -1929,7 +1929,7 @@ END
>      if (!$cgiparams{'KEY'}) {
>      	print <<EOF;
>      		<tr>
> -    			<td width='20%'>$Lang::tr{'name'}:</td>
> +    			<td width='20%'>$Lang::tr{'name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>      			<td width='30%'>
>      				<input type='text' name='NAME' value='$cgiparams{'NAME'}' size='25' />
>      			</td>
> @@ -1939,10 +1939,8 @@ EOF
>      }
>  
>      my $disabled;
> -    my $blob;
>      if ($cgiparams{'TYPE'} eq 'host') {
>  	$disabled = "disabled='disabled'";
> -	$blob = "<img src='/blob.gif' alt='*' />";
>      };
>  
>      print <<END
> @@ -1951,17 +1949,17 @@ EOF
>  		<td width='30%'>
>  			<input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} />
>  		</td>
> -	    <td class='boldbase' nowrap='nowrap' width='20%'>$Lang::tr{'local subnet'}</td>
> +	    <td class='boldbase' nowrap='nowrap' width='20%'>$Lang::tr{'local subnet'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	    <td width='30%'>
>  	        <input type='text' name='LOCAL_SUBNET' value='$cgiparams{'LOCAL_SUBNET'}' size="25" />
>  	    </td>
>  	</tr>
>  	<tr>
> -	    <td class='boldbase' width='20%'>$Lang::tr{'remote host/ip'}:&nbsp;$blob</td>
> +	    <td class='boldbase' width='20%'>$Lang::tr{'remote host/ip'}:TODO blob.gif when net2net</td>
>  	    <td width='30%'>
>  	        <input type='text' name='REMOTE' value='$cgiparams{'REMOTE'}' size="25" />
>  	    </td>
> -	    <td class='boldbase' nowrap='nowrap' width='20%'>$Lang::tr{'remote subnet'}</td>
> +	    <td class='boldbase' nowrap='nowrap' width='20%'>$Lang::tr{'remote subnet'}TODO blob.gif when net2net</td>
>  	    <td width='30%'>
>  	        <input $disabled type='text' name='REMOTE_SUBNET' value='$cgiparams{'REMOTE_SUBNET'}' size="25" />
>  	    </td>
> @@ -1978,7 +1976,7 @@ EOF
>  	</tr>
>  	<tr><td colspan="4"><br /></td></tr>
>  	<tr>
> -	    <td class='boldbase' width='20%'>$Lang::tr{'remark title'}&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	    <td class='boldbase' width='20%'>$Lang::tr{'remark title'}</td>
>  	    <td colspan='3'>
>  	    	<input type='text' name='REMARK' value='$cgiparams{'REMARK'}' maxlength='50' size="73" />
>  	    </td>
> @@ -2027,22 +2025,22 @@ END
>  	<tr><td><input type='radio' name='AUTH' value='certgen' $checked{'AUTH'}{'certgen'} $cakeydisabled /></td>
>  	    <td class='base'><hr />$Lang::tr{'generate a certificate'}</td><td>&nbsp;</td></tr>
>  	<tr><td>&nbsp;</td>
> -	    <td class='base'>$Lang::tr{'users fullname or system hostname'}:</td>
> +	    <td class='base'>$Lang::tr{'users fullname or system hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='CERT_NAME' value='$cgiparams{'CERT_NAME'}' size='32' $cakeydisabled /></td></tr>
>  	<tr><td>&nbsp;</td>
> -	    <td class='base'>$Lang::tr{'users email'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	    <td class='base'>$Lang::tr{'users email'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='CERT_EMAIL' value='$cgiparams{'CERT_EMAIL'}' size='32' $cakeydisabled /></td></tr>
>  	<tr><td>&nbsp;</td>
> -	    <td class='base'>$Lang::tr{'users department'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	    <td class='base'>$Lang::tr{'users department'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='CERT_OU' value='$cgiparams{'CERT_OU'}' size='32' $cakeydisabled /></td></tr>
>  	<tr><td>&nbsp;</td>
> -	    <td class='base'>$Lang::tr{'organization name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	    <td class='base'>$Lang::tr{'organization name'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='CERT_ORGANIZATION' value='$cgiparams{'CERT_ORGANIZATION'}' size='32' $cakeydisabled /></td></tr>
>  	<tr><td>&nbsp;</td>
> -	    <td class='base'>$Lang::tr{'city'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	    <td class='base'>$Lang::tr{'city'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='CERT_CITY' value='$cgiparams{'CERT_CITY'}' size='32' $cakeydisabled /></td></tr>
>  	<tr><td>&nbsp;</td>
> -	    <td class='base'>$Lang::tr{'state or province'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	    <td class='base'>$Lang::tr{'state or province'}:</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='CERT_STATE' value='$cgiparams{'CERT_STATE'}' size='32' $cakeydisabled /></td></tr>
>  	<tr><td>&nbsp;</td>
>  	    <td class='base'>$Lang::tr{'country'}:</td>
> @@ -2059,12 +2057,12 @@ END
>  	print <<END
>  	    </select></td></tr>
>  
> -	<tr><td>&nbsp;</td><td class='base'>$Lang::tr{'vpn subjectaltname'} (subjectAltName=email:*,URI:*,DNS:*,RID:*)<img src='/blob.gif' alt='*' /></td>
> +	<tr><td>&nbsp;</td><td class='base'>$Lang::tr{'vpn subjectaltname'} (subjectAltName=email:*,URI:*,DNS:*,RID:*)</td>
>  	    <td class='base' nowrap='nowrap'><input type='text' name='SUBJECTALTNAME' value='$cgiparams{'SUBJECTALTNAME'}' size='32' $cakeydisabled /></td></tr>
>  	<tr><td>&nbsp;</td>
> -	    <td class='base'>$Lang::tr{'pkcs12 file password'}:</td>
> +	    <td class='base'>$Lang::tr{'pkcs12 file password'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	    <td class='base' nowrap='nowrap'><input type='password' name='CERT_PASS1' value='$cgiparams{'CERT_PASS1'}' size='32' $cakeydisabled /></td></tr>
> -	<tr><td>&nbsp;</td><td class='base'>$Lang::tr{'pkcs12 file password'}:($Lang::tr{'confirmation'})</td>
> +	<tr><td>&nbsp;</td><td class='base'>$Lang::tr{'pkcs12 file password'}&nbsp;($Lang::tr{'confirmation'}):&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	    <td class='base' nowrap='nowrap'><input type='password' name='CERT_PASS2' value='$cgiparams{'CERT_PASS2'}' size='32' $cakeydisabled /></td></tr>
>  	</table>
>  END
> @@ -2451,7 +2449,7 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}) ||
>  			</td>
>  		</tr>
>  		<tr>
> -			<td class='boldbase' width="15%">$Lang::tr{'lifetime'}</td>
> +			<td class='boldbase' width="15%">$Lang::tr{'lifetime'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  			<td class='boldbase'>
>  				<input type='text' name='IKE_LIFETIME' value='$cgiparams{'IKE_LIFETIME'}' size='5' /> $Lang::tr{'hours'}
>  			</td>
> @@ -2506,13 +2504,13 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}) ||
>  		</td>
>  	</tr>
>  	<tr>
> -		<td width="15%">$Lang::tr{'dpd timeout'}:</td>
> +		<td width="15%">$Lang::tr{'dpd timeout'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td>
>  			<input type='text' name='DPD_TIMEOUT' size='5' value='$cgiparams{'DPD_TIMEOUT'}' />
>  		</td>
>  	</tr>
>  	<tr>
> -		<td width="15%">$Lang::tr{'dpd delay'}:</td>
> +		<td width="15%">$Lang::tr{'dpd delay'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  		<td>
>  			<input type='text' name='DPD_DELAY' size='5' value='$cgiparams{'DPD_DELAY'}' />
>  		</td>
> @@ -2560,6 +2558,7 @@ EOF
>  
>      print <<EOF;
>  	<tr>
> +		<td align='left' colspan='1'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'required field'}</td>
>  		<td align='right' colspan='2'>
>  			<input type='submit' name='ACTION' value='$Lang::tr{'save'}' />
>  			<input type='submit' name='ACTION' value='$Lang::tr{'cancel'}' />
> @@ -2633,7 +2632,7 @@ EOF
>      <form method='post' action='$ENV{'SCRIPT_NAME'}'>
>      <table width='100%'>
>      <tr>
> -	<td width='20%' class='base' nowrap='nowrap'>$Lang::tr{'vpn red name'}:</td>
> +	<td width='20%' class='base' nowrap='nowrap'>$Lang::tr{'vpn red name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td width='20%'><input type='text' name='VPN_IP' value='$cgiparams{'VPN_IP'}' /></td>
>  	<td width='20%' class='base'>$Lang::tr{'enabled'}<input type='checkbox' name='ENABLED' $checked{'ENABLED'} /></td>
>      </tr>
> @@ -2645,7 +2644,7 @@ print <<END
>  	<td ><input type='text' name='VPN_DELAYED_START' value='$cgiparams{'VPN_DELAYED_START'}' /></td>
>      </tr>
>      <tr>
> -	<td  class='base' nowrap='nowrap'>$Lang::tr{'host to net vpn'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +	<td  class='base' nowrap='nowrap'>$Lang::tr{'host to net vpn'}:</td>
>  	<td ><input type='text' name='RW_NET' value='$cgiparams{'RW_NET'}' /></td>
>      </tr>
>  </table>
> @@ -2654,7 +2653,7 @@ print <<END
>  <table width='100%'>
>  <tr>
>      <td class='base' valign='top'><img src='/blob.gif' alt='*' /></td>
> -    <td width='70%' class='base' valign='top'>$Lang::tr{'this field may be blank'}</td><td width='30%' align='right' class='base'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
> +    <td width='70%' class='base' valign='top'>$Lang::tr{'required field'}</td><td width='30%' align='right' class='base'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
>  </tr>
>  <tr>
>      <td class='base' valign='top' nowrap='nowrap'><img src='/blob.gif' alt='*' /><img src='/blob.gif' alt='*' />&nbsp;</td>
> @@ -2975,7 +2974,7 @@ END
>      <table width='100%' border='0' cellspacing='1' cellpadding='0'>
>      $createCA
>      <tr>
> -	<td class='base' nowrap='nowrap'>$Lang::tr{'ca name'}:</td>
> +	<td class='base' nowrap='nowrap'>$Lang::tr{'ca name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  	<td nowrap='nowrap'><input type='text' name='CA_NAME' value='$cgiparams{'CA_NAME'}' size='15' /> </td>
>  	<td nowrap='nowrap'><input type='file' name='FH' size='30' /></td>
>  	<td nowrap='nowrap'><input type='submit' name='ACTION' value='$Lang::tr{'upload ca certificate'}' /></td>
> diff --git a/html/cgi-bin/wakeonlan.cgi b/html/cgi-bin/wakeonlan.cgi
> index 4a7fc84..bb55add 100644
> --- a/html/cgi-bin/wakeonlan.cgi
> +++ b/html/cgi-bin/wakeonlan.cgi
> @@ -232,7 +232,7 @@ else
>  print <<END
>  <table width='100%'>
>  <tr>
> -  <td width='15%' class='base'>$Lang::tr{'mac address'}:&nbsp;</td>
> +  <td width='15%' class='base'>$Lang::tr{'mac address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>    <td width='40%'><input type='text' name='CLIENT_MAC' value='$cgiparams{'CLIENT_MAC'}' size='25' /></td>
>    <td width='10%' class='base'>$Lang::tr{'interface'}:&nbsp;</td>
>    <td align='left'>
> @@ -256,7 +256,7 @@ print <<END
>    </td>
>  </tr>
>  <tr>
> -  <td width='15%' class='base'>$Lang::tr{'remark'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +  <td width='15%' class='base'>$Lang::tr{'remark'}:</td>
>    <td colspan='4' align='left'><input type='text' name='CLIENT_COMMENT' value='$cgiparams{'CLIENT_COMMENT'}' size='40' /></td>
>  </tr>
>  </table>
> @@ -264,7 +264,7 @@ print <<END
>  <hr />
>  <table width='100%'>
>  <tr>
> -  <td class='base' valign='top'><img src='/blob.gif' alt='*' />$Lang::tr{'this field may be blank'}</td>
> +  <td class='base' valign='top'><img src='/blob.gif' alt='*' />$Lang::tr{'required field'}</td>
>    <td width='40%' align='right'>
>  END
>  ;
> diff --git a/html/cgi-bin/wireless.cgi b/html/cgi-bin/wireless.cgi
> index 358f318..d4592a2 100644
> --- a/html/cgi-bin/wireless.cgi
> +++ b/html/cgi-bin/wireless.cgi
> @@ -211,17 +211,17 @@ if ($cgiparams{'ACTION'} eq 'edit') {
>  print <<END
>  <table width='100%'>
>  <tr>
> -<td width='25%' class='base'>$Lang::tr{'source ip'}:&nbsp;</td>
> +<td width='25%' class='base'>$Lang::tr{'source ip'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  <td width='25%' ><input type='text' name='SOURCE_IP' value='$cgiparams{'SOURCE_IP'}' size='25' /></td>
>  <td width='25%' class='base' align='right'>$Lang::tr{'enabled'}&nbsp;</td>
>  <td width='25%'><input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>
>  </tr>
>  <tr>
> -<td width='25%' class='base'>$Lang::tr{'source'} $Lang::tr{'mac address'}:&nbsp;</td>
> +<td width='25%' class='base'>$Lang::tr{'source'} $Lang::tr{'mac address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
>  <td colspan='3'><input type='text' name='SOURCE_MAC' value='$cgiparams{'SOURCE_MAC'}' size='25' /></td>
>  </tr>
>  <tr>
> -<td width='25%' class='base'>$Lang::tr{'remark'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
> +<td width='25%' class='base'>$Lang::tr{'remark'}:</td>
>  <td colspan='3'><input type='text' name='REMARK' value='$cgiparams{'REMARK'}' size='40' /></td>
>  </tr>
>  </table>
> @@ -229,7 +229,7 @@ print <<END
>  <hr>
>  <table width='100%'>
>  <tr>
> -    <td class='base' valign='top'><img src='/blob.gif' alt='*' /> $Lang::tr{'this field may be blank'}</td>
> +    <td class='base' valign='top'><img src='/blob.gif' alt='*' /> $Lang::tr{'required field'}</td>
>      <td width='40%' align='right'>
>        <input type='hidden' name='ACTION' value='add' />
>        <input type='submit' name='SUBMIT' value='$buttontext' />
> diff --git a/langs/de/cgi-bin/de.pl b/langs/de/cgi-bin/de.pl
> index 8adefdf..c20e4bb 100644
> --- a/langs/de/cgi-bin/de.pl
> +++ b/langs/de/cgi-bin/de.pl
> @@ -1912,6 +1912,7 @@
>  'reportlevel' => 'Report Level',
>  'request' => 'Abfrage',
>  'requested data' => '1. Verbindungs-Einstellungen',
> +'required field' => 'Pflichtfeld',
>  'reserved dst port' => 'Dieser Zielport ist für die ausschließliche Benutzung durch IPFire reserviert:',
>  'reserved src port' => 'Dieser Quellport ist für die ausschließliche Benutzung durch IPFire reserviert:',
>  'reset' => 'Zurücksetzen',
> @@ -2122,7 +2123,6 @@
>  'there are updates available' => 'Für Ihr System sind Programm-Updates verfügbar. Es wird dringend empfohlen, daß Sie Ihr System baldmöglichst aktualisieren.',
>  'there was no file upload' => 'Es wurde keine Datei hochgeladen',
>  'this feature has been sponsored by' => 'Diese Funktion wurde gesponsort von',
> -'this field may be blank' => 'Dieses Feld kann leer bleiben.',
>  'this is not a valid archive' => 'Dies ist kein gültiges Archiv.',
>  'this is not an authorised update' => 'Dies ist kein autorisiertes Update.',
>  'this months volume' => 'Diesen Monat',
> diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
> index 43601c8..1199e90 100644
> --- a/langs/en/cgi-bin/en.pl
> +++ b/langs/en/cgi-bin/en.pl
> @@ -1944,6 +1944,7 @@
>  'reportlevel' => 'Reportlevel',
>  'request' => 'Request',
>  'requested data' => '1. Connection Settings:',
> +'required field' => 'Required field',
>  'reserved dst port' => 'Destination port is reserved for IPFire use only:',
>  'reserved src port' => 'Source port is reserved for IPFire use only:',
>  'reset' => 'Reset',
> @@ -2159,7 +2160,6 @@
>  'there are updates available' => 'There are updates available for your system. It is strongly urged that you install them as soon as possible.',
>  'there was no file upload' => 'There was no file upload.',
>  'this feature has been sponsored by' => 'This feature has been sponsored by',
> -'this field may be blank' => 'This field may be blank.',
>  'this is not a valid archive' => 'This is not a valid archive.',
>  'this is not an authorised update' => 'This is not an authorised update.',
>  'this months volume' => 'This months volume',

For all translation below there is the same rule as in the last patch.
Better leave them empty if we cannot come up with a translation for
that. Maybe you could reach out on the translation mailing list to find
native speakers for the respective languages.

> diff --git a/langs/es/cgi-bin/es.pl b/langs/es/cgi-bin/es.pl
> index 90f4237..9250960 100644
> --- a/langs/es/cgi-bin/es.pl
> +++ b/langs/es/cgi-bin/es.pl
> @@ -1501,6 +1501,7 @@
>  'reportlevel' => 'Nivel reporte',
>  'request' => 'Consulta',
>  'requested data' => 'Configuraciones de conexión:',
> +'required field' => 'Required field',
>  'reserved dst port' => 'Puerto de destino está reservado para uso exclusivo de IPFire',
>  'reserved src port' => 'Puerto de orígen está reservado para uso exclusivo de IPFire:',
>  'reset' => 'Restablecer',
> @@ -1699,7 +1700,6 @@
>  'there are updates available' => 'Existen actualizaciones disponibles para su sistema. Se recomienda encarecidamente que las instala a la brevedad posible.',
>  'there was no file upload' => 'No había archivo para cargar.',
>  'this feature has been sponsored by' => 'Esta característica ha sido patrocinada por',
> -'this field may be blank' => 'Este campo se puede dejar en blanco',
>  'this is not a valid archive' => 'No es un archivo válido.',
>  'this is not an authorised update' => 'No es una actualización autorizada.',
>  'this months volume' => 'Volúmen de este mes',
> diff --git a/langs/fr/cgi-bin/fr.pl b/langs/fr/cgi-bin/fr.pl
> index 40053a0..24b4a9d 100644
> --- a/langs/fr/cgi-bin/fr.pl
> +++ b/langs/fr/cgi-bin/fr.pl
> @@ -1507,6 +1507,7 @@
>  'reportlevel' => 'Niveau de rapport',
>  'request' => 'Interrogation',
>  'requested data' => '1. Paramètres de connexion :',
> +'required field' => 'Required field',
>  'reserved dst port' => 'Le port de destination est réservé pour l\'usage d\'IPFire :',
>  'reserved src port' => 'Le port source est réservé pour l\'usage d\'IPFire :',
>  'reset' => 'Réinitialiser',
> @@ -1704,7 +1705,6 @@
>  'there are updates available' => 'Plusieurs mises à jour sont disponibles pour votre système. Il est recommandé de les installer aussi vite que possible.',
>  'there was no file upload' => 'Il n\'y a pas eu de fichier envoyé.',
>  'this feature has been sponsored by' => 'Cette fonctionnalité a été sponsorisée par',
> -'this field may be blank' => 'Ce champ peut être vide.',
>  'this is not a valid archive' => 'Ceci n\'est pas une archive valide.',
>  'this is not an authorised update' => 'Ce n\'est pas une mise à jour autorisée.',
>  'this months volume' => 'Le volume mensuel',
> diff --git a/langs/it/cgi-bin/it.pl b/langs/it/cgi-bin/it.pl
> index 4fde313..84eda16 100644
> --- a/langs/it/cgi-bin/it.pl
> +++ b/langs/it/cgi-bin/it.pl
> @@ -1900,6 +1900,7 @@
>  'reportlevel' => 'Reportlevel',
>  'request' => 'Request',
>  'requested data' => '1. Connection Settings:',
> +'required field' => 'Required field',
>  'reserved dst port' => 'Destination port is reserved for IPFire use only:',
>  'reserved src port' => 'Source port is reserved for IPFire use only:',
>  'reset' => 'Reset',
> @@ -2112,7 +2113,6 @@
>  'there are updates available' => 'There are updates available for your system. It is strongly urged that you install them as soon as possible.',
>  'there was no file upload' => 'There was no file upload.',
>  'this feature has been sponsored by' => 'This feature has been sponsored by',
> -'this field may be blank' => 'Questo campo pu&ograve; essere vuoto.',
>  'this is not a valid archive' => 'This is not a valid archive.',
>  'this is not an authorised update' => 'This is not an authorised update.',
>  'this months volume' => 'This months volume',
> diff --git a/langs/nl/cgi-bin/nl.pl b/langs/nl/cgi-bin/nl.pl
> index 7468eb9..35949bd 100644
> --- a/langs/nl/cgi-bin/nl.pl
> +++ b/langs/nl/cgi-bin/nl.pl
> @@ -1851,6 +1851,7 @@
>  'reportlevel' => 'Rapportniveau',
>  'request' => 'Verzoek',
>  'requested data' => '1. Connectie-instellingen:',
> +'required field' => 'Required field',
>  'reserved dst port' => 'Bestemmingspoort is gereserveerd voor IPFire:',
>  'reserved src port' => 'Bronpoort is gereserveerd voor IPFire:',
>  'reset' => 'Reset',
> @@ -2057,7 +2058,6 @@
>  'there are updates available' => 'Er zijn updates beschikbaar voor uw systeem. Het wordt aangeraden om deze zo snel mogelijk te installeren.',
>  'there was no file upload' => 'Er is geen bestand geüpload.',
>  'this feature has been sponsored by' => 'Deze feature wordt gesponsord door',
> -'this field may be blank' => 'Dit veld mag leeg blijven.',
>  'this is not a valid archive' => 'Dit is geen geldig archief.',
>  'this is not an authorised update' => 'Dit is geen geautoriseerde update.',
>  'this months volume' => 'Volume van deze maand',
> diff --git a/langs/pl/cgi-bin/pl.pl b/langs/pl/cgi-bin/pl.pl
> index 02fb531..aa9d70a 100644
> --- a/langs/pl/cgi-bin/pl.pl
> +++ b/langs/pl/cgi-bin/pl.pl
> @@ -1513,6 +1513,7 @@
>  'reportlevel' => 'Poziom szczegółów',
>  'request' => 'Żądanie',
>  'requested data' => '1. Ustawienia połączenia:',
> +'required field' => 'Required field',
>  'reserved dst port' => 'Port docelowy jest zarezerwowany przez IPFire. Używaj tylko:',
>  'reserved src port' => 'Port źródłowy jest zarezerwowany przez IPFire. Używaj tylko:',
>  'reset' => 'Reset',
> @@ -1712,7 +1713,6 @@
>  'there are updates available' => 'Dostępne są nowe aktualizacje dla twojego systemu. Zalecane jest wykonanie aktualizacji tak szybko jak to możliwe',
>  'there was no file upload' => 'Nie wgrano żadnego pliku.',
>  'this feature has been sponsored by' => 'Ta funkcjonalność jest sponsorowana przez',
> -'this field may be blank' => 'To pole może być puste.',
>  'this is not a valid archive' => 'Nie odnaleziono poprawnego archiwum.',
>  'this is not an authorised update' => 'To nie jest autoryzowana aktualizacja.',
>  'this months volume' => 'Ilość w tym miesiącu',
> diff --git a/langs/ru/cgi-bin/ru.pl b/langs/ru/cgi-bin/ru.pl
> index a2a3693..936f271 100644
> --- a/langs/ru/cgi-bin/ru.pl
> +++ b/langs/ru/cgi-bin/ru.pl
> @@ -1508,6 +1508,7 @@
>  'reportlevel' => 'Reportlevel',
>  'request' => 'Request',
>  'requested data' => '1. Connection Settings:',
> +'required field' => 'Required field',
>  'reserved dst port' => 'Destination port is reserved for IPFire use only:',
>  'reserved src port' => 'Source port is reserved for IPFire use only:',
>  'reset' => 'Сбростить',
> @@ -1707,7 +1708,6 @@
>  'there are updates available' => 'There are updates available for your system. It is strongly urged that you install them as soon as possible.',
>  'there was no file upload' => 'There was no file upload.',
>  'this feature has been sponsored by' => 'This feature has been sponsored by',
> -'this field may be blank' => 'Эти поля могут остаться пустыми.',
>  'this is not a valid archive' => 'This is not a valid archive.',
>  'this is not an authorised update' => 'This is not an authorised update.',
>  'this months volume' => 'This months volume',
> diff --git a/langs/tr/cgi-bin/tr.pl b/langs/tr/cgi-bin/tr.pl
> index 89f753e..cf0ef0b 100644
> --- a/langs/tr/cgi-bin/tr.pl
> +++ b/langs/tr/cgi-bin/tr.pl
> @@ -1921,6 +1921,7 @@
>  'reportlevel' => 'Seviye raporu',
>  'request' => 'Talep',
>  'requested data' => '1. Bağlantı Ayarları:',
> +'required field' => 'Required field',
>  'reserved dst port' => 'IPFire için ayrılmış hedef bağlantı noktası numarası:',
>  'reserved src port' => 'IPFire için ayrılmış kaynak bağlantı noktası numarası:',
>  'reset' => 'Sıfırla',
> @@ -2135,7 +2136,6 @@
>  'there are updates available' => 'Sisteminiz için kullanılabilir güncelleştirmeler var. Kesinlikle en kısa zamanda bunları yüklemeniz gerekir.',
>  'there was no file upload' => 'Hiçbir dosya yüklenemedi.',
>  'this feature has been sponsored by' => 'Bu özelliklerin destekçisi',
> -'this field may be blank' => 'Bu alan boÅŸ kalabilir.',
>  'this is not a valid archive' => 'Bu, geçerli bir arşiv değil.',
>  'this is not an authorised update' => 'Bu yetkili bir güncelleştirme değil.',
>  'this months volume' => 'Bu ayki hacim',
> diff --git a/src/squid-accounting/accounting.cgi b/src/squid-accounting/accounting.cgi
> index 1ec9849..326807a 100755
> --- a/src/squid-accounting/accounting.cgi
> +++ b/src/squid-accounting/accounting.cgi
> @@ -664,11 +664,11 @@ END
>  			<td><input type='text' name='txt_mailport' value='$settings{'MAILPORT'}' size='3'></td>
>  		</tr>
>  		<tr>
> -			<td>$Lang::tr{'acct mailuser'}<img src='/blob.gif' alt='*' /></td>
> +			<td>$Lang::tr{'acct mailuser'}</td>
>  			<td><input type='text' name='txt_mailuser' value='$settings{'MAILUSER'}' style='width:22em;'></td>
>  		</tr>
>  		<tr>
> -			<td>$Lang::tr{'acct mailpass'}<img src='/blob.gif' alt='*' /></td>
> +			<td>$Lang::tr{'acct mailpass'}</td>
>  			<td><input type='password' name='txt_mailpass' value='$settings{'MAILPASS'}' style='width:22em;' ></td>
>  		</tr>
>  		<tr>
> @@ -1119,61 +1119,61 @@ print<<END;
>  				<td>
>  					<input type='radio' name='rdo_companytype' value='CUST' $checked{'rdo_companytype'}{'CUST'}>$Lang::tr{'acct customer'} &nbsp;
>  					<input type='radio' name='rdo_companytype' value='HOST' $checked{'rdo_companytype'}{'HOST'}>$Lang::tr{'acct hoster'}</td>
> -				<td style='width:8em;'>$Lang::tr{'acct bank'}</td>
> +				<td style='width:8em;'>$Lang::tr{'acct bank'}TODO blob.gif only for provider</td>
>  				<td>
>  					<input type='text' name='txt_bank' value='$cgiparams{'txt_bank'}' style='width:25em;'></td>
>  			</tr>
>  			<tr>
> -				<td>$Lang::tr{'acct company'}</td>
> +				<td>$Lang::tr{'acct company'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td>
>  					<input type='text' name='txt_company' value='$cgiparams{'txt_company'}' style='width:25em;'></td>
> -				<td>$Lang::tr{'acct iban'}<img src='/blob.gif' alt='*' /></td>
> +				<td>$Lang::tr{'acct iban'}</td>
>  				<td>
>  					<input type='text' name='txt_iban' value='$cgiparams{'txt_iban'}' style='width:25em;'></td>
>  			</tr>
>  			<tr>
> -				<td>$Lang::tr{'acct name1'}<img src='/blob.gif' alt='*' /></td>
> +				<td>$Lang::tr{'acct name1'}</td>
>  				<td>
>  					<input type='text' name='txt_name1' value='$cgiparams{'txt_name1'}' style='width:25em;'></td>
> -				<td>$Lang::tr{'acct bic'}<img src='/blob.gif' alt='*' /></td>
> +				<td>$Lang::tr{'acct bic'}</td>
>  				<td>
>  					<input type='text' name='txt_bic' maxlength='8' value='$cgiparams{'txt_bic'}' style='width:25em;'></td>
>  			</tr>
>  			<tr>
> -				<td>$Lang::tr{'acct str'}</td>
> +				<td>$Lang::tr{'acct str'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td align='left'>
>  					<input type='text' name='txt_str' value='$cgiparams{'txt_str'}' style='width:25em;'></td>
> -				<td>$Lang::tr{'acct blz'}</td>
> +				<td>$Lang::tr{'acct blz'}TODO blob.gif only for provider</td>
>  				<td>
>  					<input type='text' name='txt_blz' maxlength='8' value='$cgiparams{'txt_blz'}' style='width:25em;'></td>
>  			</tr>
>  			<tr>
> -				<td>$Lang::tr{'acct str_nr'}</td>
> +				<td>$Lang::tr{'acct str_nr'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td><input type='text' name='txt_str_nr' value='$cgiparams{'txt_str_nr'}' style='width:25em;'></td>
> -				<td>$Lang::tr{'acct kto'}</td>
> +				<td>$Lang::tr{'acct kto'}TODO blob.gif only for provider</td>
>  				<td>
>  					<input type='text' name='txt_kto' value='$cgiparams{'txt_kto'}' style='width:25em;'></td>
>  			</tr>
>  
>  			
>  			<tr>
> -				<td>$Lang::tr{'acct plz'}</td>
> +				<td>$Lang::tr{'acct plz'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td>
>  					<input type='text' name='txt_plz' value='$cgiparams{'txt_plz'}' style='width:25em;'></td>
> -				<td>$Lang::tr{'acct email'}</td>
> +				<td>$Lang::tr{'acct email'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td><input type='text' name='txt_email' value='$cgiparams{'txt_email'}' style='width:25em;'></td>
>  			</tr>
>  			<tr>
> -				<td>$Lang::tr{'acct city'}</td>
> +				<td>$Lang::tr{'acct city'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td><input type='text' name='txt_city' value='$cgiparams{'txt_city'}' style='width:25em;'></td>
> -				<td>$Lang::tr{'acct inet'}<img src='/blob.gif' alt='*' /></td>
> +				<td>$Lang::tr{'acct inet'}</td>
>  				<td>
>  					<input type='text' name='txt_inet' value='$cgiparams{'txt_inet'}' style='width:25em;'></td>
>  			</tr>
>  			<tr>
>  				<td></td>
>  				<td></td>
> -				<td>$Lang::tr{'acct hrb'}<img src='/blob.gif' alt='*' /></td>
> +				<td>$Lang::tr{'acct hrb'}</td>
>  				<td>
>  					<input type='text' name='txt_hrb' value='$cgiparams{'txt_hrb'}' style='width:25em;'></td>
>  			</tr>
> @@ -1186,19 +1186,19 @@ print<<END;
>  			<tr>
>  				<td></td>
>  				<td></td>
> -				<td>$Lang::tr{'acct tel'}<img src='/blob.gif' alt='*' /></td>
> +				<td>$Lang::tr{'acct tel'}</td>
>  				<td>
>  					<input type='text' name='txt_tel' value='$cgiparams{'txt_tel'}' style='width:25em;'></td>
>  			</tr>
>  			<tr>
>  				<td></td>
>  				<td></td>
> -				<td>$Lang::tr{'acct fax'}<img src='/blob.gif' alt='*' /></td>
> +				<td>$Lang::tr{'acct fax'}</td>
>  				<td>
>  					<input type='text' name='txt_fax' value='$cgiparams{'txt_fax'}' style='width:25em;'></td>
>  			</tr>
>  			<tr>
> -				<td colspan='6'><img src='/blob.gif' alt='*' /><font size="1">$Lang::tr{'acct optional'}</font></td>
> +				<td colspan='6'><img src='/blob.gif' alt='*' /><font size="1">&nbsp;$Lang::tr{'required field'}</font></td>
>  			</tr>
>  			<tr>
>  END
> @@ -1715,14 +1715,14 @@ if ($host && $cust){
>  	<form method='post' action='$ENV{'SCRIPT_NAME'}' ENCTYPE='multipart/form-data'>
>  		<table style='width:100%;'>
>  			<tr>
> -				<td style='width: 22em;'>$Lang::tr{'name'}</td>
> +				<td style='width: 22em;'>$Lang::tr{'name'}&nbsp;<img src='/blob.gif' alt='*' /></td>
>  				<td><input type='text' name='txt_billgroup' value='$cgiparams{'txt_billgroup'}' style='width: 24em;'></td>
>  			</tr>
>  			<tr>
>  				<td><br></td>
>  			</tr>
>  			<tr>
> -				<td valign='top'>$Lang::tr{'acct billtext1'}<img src='/blob.gif' alt='*' /></td>
> +				<td valign='top'>$Lang::tr{'acct billtext1'}</td>
>  				<td><textarea name='txt_billtext1' cols='40' rows='5'  style='width: 24em;' maxlength='300'>$cgiparams{'txt_billtext1'}</textarea></td>
>  			</tr>
>  			<tr><td><br></td></tr>
> @@ -1782,7 +1782,7 @@ END
>  	my $val=sprintf"%.3f",$cgiparams{'txt_cent'};
>  	print"<tr><td>$Lang::tr{'acct cent'}</td><td><input type='text' name='txt_cent' value='$val' size='3'>$settings{'CURRENCY'} </td></tr>";
>  	#Optional note
> -	print"<tr><td colspan='2' align='left'><img src='/blob.gif' alt='*' /><font size='1'>$Lang::tr{'acct optional'}</font></td></tr>";
> +	print"<tr><td colspan='2' align='left'><img src='/blob.gif' alt='*' /><font size='1'>$Lang::tr{'required field'}</font></td></tr>";
>  	print"<tr><td colspan='2' align='right'><br><br>";
>  	print"</td></tr></table>";
>  
>
  
Michael Tremer June 6, 2015, 12:45 a.m. UTC | #3
On Thu, 2015-06-04 at 23:46 +0200, Larsen wrote:
> PS: Need help with the TODOs in that patch as I am now web developer
> and where I don´t know how to use an if-clause.

As these are in the ovpnmain.cgi (as far as I have seen) you should get
in touch with Alex when he is back from holiday. That will be towards
the end of next week.

> I already noticed the problem with the translation for
> "required field" where I have put in the English translation in the
> other languages. Developed this patch before the other patch where I
> was told not to do so and forgot to fix it here =)

Commented on this in the other email...

> 
> 
> Lars
  
Lars Schuhmacher June 7, 2015, 8:05 p.m. UTC | #4
On Fri, 05 Jun 2015 16:43:51 +0200, Michael Tremer  
<michael.tremer@ipfire.org> wrote:

>> +    <td class='base'>next-server:</td>
>>      <td><input type='text' name='NEXT_${itf}'  
>> value='$dhcpsettings{"NEXT_${itf}"}' /></td>
>> -    <td class='base'>filename:&nbsp;<img src='/blob.gif' alt='*'  
>> /></td>
>> +    <td class='base'>filename:</td>
>>      <td><input type='text' name='FILE_${itf}'  
>> value='$dhcpsettings{"FILE_${itf}"}' /></td>
>>  </tr>
>>  </table>
>
> There are some hard-coded strings here. These are not newly introduced
> but still we should fix them in an other patch later. I am sure you have
> come across a couple of them.

Didn´t notice before, but made a note on my todo-list for later.



On Fri, 05 Jun 2015 16:45:05 +0200, Michael Tremer  
<michael.tremer@ipfire.org> wrote:

> On Thu, 2015-06-04 at 23:46 +0200, Larsen wrote:
>> PS: Need help with the TODOs in that patch as I am now web developer
>> and where I don´t know how to use an if-clause.
>
> As these are in the ovpnmain.cgi (as far as I have seen) you should get
> in touch with Alex when he is back from holiday. That will be towards
> the end of next week.

Should not be related to ovpnmain.cgi. I just don´t have the experience  
how to combine html-code and if-clauses here. Any dev might be able to  
give a hint here.

btw: Will be on vacation myself from june 14th to june 22nd.


Lars
  
Lars Schuhmacher June 25, 2015, 8:28 a.m. UTC | #5
On Sun, 07 Jun 2015 12:05:36 +0200, Larsen <larsen007@web.de> wrote:

> On Fri, 05 Jun 2015 16:45:05 +0200, Michael Tremer  
> <michael.tremer@ipfire.org> wrote:
>
>> On Thu, 2015-06-04 at 23:46 +0200, Larsen wrote:
>>> PS: Need help with the TODOs in that patch as I am now web developer
>>> and where I don´t know how to use an if-clause.
>>
>> As these are in the ovpnmain.cgi (as far as I have seen) you should get
>> in touch with Alex when he is back from holiday. That will be towards
>> the end of next week.
>
> Should not be related to ovpnmain.cgi. I just don´t have the experience  
> how to combine html-code and if-clauses here. Any dev might be able to  
> give a hint here.


Still need help with this... Is really no dev here who knows how to fix it?


Lars
  
Michael Tremer June 25, 2015, 8:05 p.m. UTC | #6
On Thu, 2015-06-25 at 00:28 +0200, Larsen wrote:
> On Sun, 07 Jun 2015 12:05:36 +0200, Larsen <larsen007@web.de> wrote:
> 
> > On Fri, 05 Jun 2015 16:45:05 +0200, Michael Tremer  
> > <michael.tremer@ipfire.org> wrote:
> >
> >> On Thu, 2015-06-04 at 23:46 +0200, Larsen wrote:
> >>> PS: Need help with the TODOs in that patch as I am now web developer
> >>> and where I don´t know how to use an if-clause.
> >>
> >> As these are in the ovpnmain.cgi (as far as I have seen) you should get
> >> in touch with Alex when he is back from holiday. That will be towards
> >> the end of next week.
> >
> > Should not be related to ovpnmain.cgi. I just don´t have the experience  
> > how to combine html-code and if-clauses here. Any dev might be able to  
> > give a hint here.
> 
> 
> Still need help with this... Is really no dev here who knows how to fix it?

I will copy this email to Alex again. He is back from vacation but seems
to be quite busy with catching up with work. I quickly talked to him
this week.

Let's give him a few more days. If he replies that he is busy I will
have a look.

-Michael

> 
> 
> Lars
  
Alexander Marx June 25, 2015, 8:28 p.m. UTC | #7
Am 25.06.2015 um 12:05 schrieb Michael Tremer:
> On Thu, 2015-06-25 at 00:28 +0200, Larsen wrote:
>> On Sun, 07 Jun 2015 12:05:36 +0200, Larsen <larsen007@web.de> wrote:
>>
>>> On Fri, 05 Jun 2015 16:45:05 +0200, Michael Tremer
>>> <michael.tremer@ipfire.org> wrote:
>>>
>>>> On Thu, 2015-06-04 at 23:46 +0200, Larsen wrote:
>>>>> PS: Need help with the TODOs in that patch as I am now web developer
>>>>> and where I don´t know how to use an if-clause.
>>>> As these are in the ovpnmain.cgi (as far as I have seen) you should get
>>>> in touch with Alex when he is back from holiday. That will be towards
>>>> the end of next week.
>>> Should not be related to ovpnmain.cgi. I just don´t have the experience
>>> how to combine html-code and if-clauses here. Any dev might be able to
>>> give a hint here.
Hi
All "HTML" Files are the cgi files within /srv/web/ipfire/cgi-bin.
These Files are CGI's which means it can be any programming language.
The IPFire CGI's are usually written in perl. So one can easily use perl 
if-clauses.
When it comes to the output part you also use Perl code to "print" the 
htmlcode.

I didn't get the whole conversation so i do not know whats the exact 
problem.
This is just a general answer. If you need further assistance, please 
let me know.
>>
>> Still need help with this... Is really no dev here who knows how to fix it?
> I will copy this email to Alex again. He is back from vacation but seems
> to be quite busy with catching up with work. I quickly talked to him
> this week.
>
> Let's give him a few more days. If he replies that he is busy I will
> have a look.
>
> -Michael
>
>>
>> Lars
  
Lars Schuhmacher June 27, 2015, 5:37 p.m. UTC | #8
On Thu, 25 Jun 2015 12:28:51 +0200, Alexander Marx <alexander.marx@oab.de>  
wrote:

>>>>> On Thu, 2015-06-04 at 23:46 +0200, Larsen wrote:
>>>>>> PS: Need help with the TODOs in that patch as I am now web developer
>>>>>> and where I don´t know how to use an if-clause.
>>>>> As these are in the ovpnmain.cgi (as far as I have seen) you should  
>>>>> get
>>>>> in touch with Alex when he is back from holiday. That will be towards
>>>>> the end of next week.
>>>> Should not be related to ovpnmain.cgi. I just don´t have the  
>>>> experience
>>>> how to combine html-code and if-clauses here. Any dev might be able to
>>>> give a hint here.
> Hi
> All "HTML" Files are the cgi files within /srv/web/ipfire/cgi-bin.
> These Files are CGI's which means it can be any programming language.
> The IPFire CGI's are usually written in perl. So one can easily use perl  
> if-clauses.
> When it comes to the output part you also use Perl code to "print" the  
> htmlcode.

Yes, I know where to change it, but I don´t know how exactly to combine  
perl code and HTML.
Please have a look at the parts marked with TODO here:
http://patchwork.ipfire.org/patch/15/

In other places, there is a huge "print" part where perl gives out HTML in  
one block. Here however, I need to use perl inside one of those blocks.


Lars
  
Michael Tremer June 27, 2015, 8:45 p.m. UTC | #9
Alright. The first two TODOs are easy. There is a variable called $blob
which is defined a couple of lines above. You would need to change the
if statement so that it checks for "net" and that should do the job I
guess.

The other huge blocks need to be cut in two pieces. Usually they use
something that looks like this:

print <<END;
   ABC
   DEF
   123
END

This will simply print everything between the print statement and END.
It will stop when ever there is a line with just "END" in it.

So you could cut that in two parts:

print <<END;
   ABC
   DEF
END

if ($something) {
	print "123\n";
}

That is basically it.

I am not entirely sure if that answers all your questions, so feel free
to ask back if there is anything else you would like to know :)

-Michael

On Sat, 2015-06-27 at 09:37 +0200, Larsen wrote:
> On Thu, 25 Jun 2015 12:28:51 +0200, Alexander Marx <alexander.marx@oab.de>  
> wrote:
> 
> >>>>> On Thu, 2015-06-04 at 23:46 +0200, Larsen wrote:
> >>>>>> PS: Need help with the TODOs in that patch as I am now web developer
> >>>>>> and where I don´t know how to use an if-clause.
> >>>>> As these are in the ovpnmain.cgi (as far as I have seen) you should  
> >>>>> get
> >>>>> in touch with Alex when he is back from holiday. That will be towards
> >>>>> the end of next week.
> >>>> Should not be related to ovpnmain.cgi. I just don´t have the  
> >>>> experience
> >>>> how to combine html-code and if-clauses here. Any dev might be able to
> >>>> give a hint here.
> > Hi
> > All "HTML" Files are the cgi files within /srv/web/ipfire/cgi-bin.
> > These Files are CGI's which means it can be any programming language.
> > The IPFire CGI's are usually written in perl. So one can easily use perl  
> > if-clauses.
> > When it comes to the output part you also use Perl code to "print" the  
> > htmlcode.
> 
> Yes, I know where to change it, but I don´t know how exactly to combine  
> perl code and HTML.
> Please have a look at the parts marked with TODO here:
> http://patchwork.ipfire.org/patch/15/
> 
> In other places, there is a huge "print" part where perl gives out HTML in  
> one block. Here however, I need to use perl inside one of those blocks.
> 
> 
> Lars
  
Lars Schuhmacher June 29, 2015, 6:21 a.m. UTC | #10
On Sat, 27 Jun 2015 12:45:52 +0200, Michael Tremer  
<michael.tremer@ipfire.org> wrote:

> Alright. The first two TODOs are easy. There is a variable called $blob
> which is defined a couple of lines above. You would need to change the
> if statement so that it checks for "net" and that should do the job I
> guess.

Thx, fixed and looking good.



> The other huge blocks need to be cut in two pieces. Usually they use
> something that looks like this:

Hmm, it looks a little bit ugly as I have to split a <td>-element in half  
to enter the <img>-element, but it will work.

Though, another problem came up:
When the user changes the value of the radio button to select between  
"Customer" and "Provider", the page would need to be reloaded so the star  
is displayed or removed from the fields that are only necessary when  
"Provider" is selected, but not when "Customer" is selected.

How can I do that (without loosing any user input that has not been saved  
yet)?


Lars
  
Alexander Marx June 29, 2015, 10:55 p.m. UTC | #11
An very easy site is p2p-block.cgi.

Here you can see how it is combined in a simple way.

Just imagine a perl script (cgi) as a top-down document.
The file is read from top to bottom and all commands are executed after 
each other.
This aproach is very simple but not really useful for bigger sites.

You can use functions to  summarise usefull parts of the code.

it is difficult to describe as every developer has his own "way of 
code". Just have a look at
the smaller cgi's and try to understand the way it works.

My own opinion for a cgi structure is as follows:

- load modules
- define variables
- define arrays/hashes
- include needed other files
- "ACTION"- handler (if you use forms)
- rest are functions for the different action handlers or a "default" 
function which is called if no action was taken




Am 27.06.2015 um 09:37 schrieb Larsen:
> On Thu, 25 Jun 2015 12:28:51 +0200, Alexander Marx 
> <alexander.marx@oab.de> wrote:
>
>>>>>> On Thu, 2015-06-04 at 23:46 +0200, Larsen wrote:
>>>>>>> PS: Need help with the TODOs in that patch as I am now web 
>>>>>>> developer
>>>>>>> and where I don´t know how to use an if-clause.
>>>>>> As these are in the ovpnmain.cgi (as far as I have seen) you 
>>>>>> should get
>>>>>> in touch with Alex when he is back from holiday. That will be 
>>>>>> towards
>>>>>> the end of next week.
>>>>> Should not be related to ovpnmain.cgi. I just don´t have the 
>>>>> experience
>>>>> how to combine html-code and if-clauses here. Any dev might be 
>>>>> able to
>>>>> give a hint here.
>> Hi
>> All "HTML" Files are the cgi files within /srv/web/ipfire/cgi-bin.
>> These Files are CGI's which means it can be any programming language.
>> The IPFire CGI's are usually written in perl. So one can easily use 
>> perl if-clauses.
>> When it comes to the output part you also use Perl code to "print" 
>> the htmlcode.
>
> Yes, I know where to change it, but I don´t know how exactly to 
> combine perl code and HTML.
> Please have a look at the parts marked with TODO here:
> http://patchwork.ipfire.org/patch/15/
>
> In other places, there is a huge "print" part where perl gives out 
> HTML in one block. Here however, I need to use perl inside one of 
> those blocks.
>
>
> Lars