- Add untagged strings for /tunnels tooltips and local tunnel indicator (to
  be tagged for translation post .31 release)
- classic: reduce color contrast of main display font
- classic/dark/midnight: alignment on /peers and /tunnels
- /tunnels:
  - Add bandwidth tiers definitions
  - Indicator for local tunnels
- /profiles:
  - Split capabilities and version
  - Minimize wrapping at narrow viewport width
  - Iconify view profile link
  - Add "OK" status indication for functional peers
- /peers: merge Dir and CWND rows in definitions table
- /events: when no events found, place result in table
- All themes: marginally increased width of sidebar to better accommodate
  extra long strings
- Chinese: ensure buttons do not deviate in height (ticket #1996)
- Arabic: fix alignment issues on /configui; presentational enhancements
- Misc: remove erroneous tags
This commit is contained in:
str4d
2017-06-19 13:46:40 +00:00
parent 3d535a2282
commit 4aa4ff738a
20 changed files with 1544 additions and 314 deletions

View File

@ -167,12 +167,12 @@ public class EventLogHelper extends FormHandler {
if (events.isEmpty()) {
if (isAll) {
if (_age == 0)
return _t("No events found");
return _t("No events found in previous {0}", DataHelper.formatDuration2(_age));
return ("<table id=\"eventlog\"><tr><td class=\"infohelp\">") + _t("No events found") + ("</td></tr></table>");;
return ("<table id=\"eventlog\"><tr><td>") + _t("No events found in previous {0}", DataHelper.formatDuration2(_age)) + ("</td></tr></table>");
}
if (_age == 0)
return _t("No \"{0}\" events found", xev);
return _t("No \"{0}\" events found in previous {1}", xev, DataHelper.formatDuration2(_age));
return ("<table id=\"eventlog\"><tr><td class=\"infohelp\">") + _t("No \"{0}\" events found", xev) + ("</td></tr></table>");
return ("<table id=\"eventlog\"><tr><td class=\"infohelp\">") + _t("No \"{0}\" events found in previous {1}", xev, DataHelper.formatDuration2(_age)) + ("</td></tr></table>");
}
StringBuilder buf = new StringBuilder(2048);
buf.append("<table id=\"eventlog\"><tr><th>");

View File

@ -127,18 +127,18 @@ public class PeerHelper extends HelperBase {
buf.append("<h3 class=\"tabletitle\">").append(_t("Definitions")).append("</h3>")
.append("<table id=\"peerdefs\">\n")
.append("<tr><td><b id=\"def.peer\">").append(_t("Peer")).append("</b></td><td>").append(_t("The remote peer, identified by router hash")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.dir\">").append(_t("Dir")).append("</b></td><td><img alt=\"Inbound\" src=\"/themes/console/images/inbound.png\"> ").append(_t("Inbound connection")).append("</td></tr>\n")
.append("<tr><td></td><td><img alt=\"Outbound\" src=\"/themes/console/images/outbound.png\"> ").append(_t("Outbound connection")).append("</td></tr>\n")
.append("<tr><td></td><td><img src=\"/themes/console/images/inbound.png\" alt=\"V\" height=\"8\" width=\"12\"> ").append(_t("They offered to introduce us (help other peers traverse our firewall)")).append("</td></tr>\n")
.append("<tr><td></td><td><img src=\"/themes/console/images/outbound.png\" alt=\"^\" height=\"8\" width=\"12\"> ").append(_t("We offered to introduce them (help other peers traverse their firewall)")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.dir\">").append(_t("Dir")).append("</b></td><td><span class=\"peer_arrow\"><img alt=\"Inbound\" src=\"/themes/console/images/inbound.png\"></span> ").append(_t("Inbound connection")).append("<br>\n")
.append("<span class=\"peer_arrow\"><img alt=\"Outbound\" src=\"/themes/console/images/outbound.png\"></span> ").append(_t("Outbound connection")).append("<br>\n")
.append("<span class=\"peer_arrow\"><img src=\"/themes/console/images/inbound.png\" alt=\"V\" height=\"8\" width=\"12\"></span> ").append(_t("They offered to introduce us (help other peers traverse our firewall)")).append("<br>\n")
.append("<span class=\"peer_arrow\"><img src=\"/themes/console/images/outbound.png\" alt=\"^\" height=\"8\" width=\"12\"></span> ").append(_t("We offered to introduce them (help other peers traverse their firewall)")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.idle\">").append(_t("Idle")).append("</b></td><td>").append(_t("How long since a packet has been received / sent")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.rate\">").append(_t("In/Out")).append("</b></td><td>").append(_t("The smoothed inbound / outbound transfer rate (KBytes per second)")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.up\">").append(_t("Up")).append("</b></td><td>").append(_t("How long ago this connection was established")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.skew\">").append(_t("Skew")).append("</b></td><td>").append(_t("The difference between the peer's clock and your own")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.cwnd\">CWND</b></td><td>").append(_t("The congestion window, which is how many bytes can be sent without an acknowledgement")).append(" / </td></tr>\n")
.append("<tr><td></td><td>").append(_t("The number of sent messages awaiting acknowledgement")).append(" /</td></tr>\n")
.append("<tr><td></td><td>").append(_t("The maximum number of concurrent messages to send")).append(" /</td></tr>\n")
.append("<tr><td></td><td>").append(_t("The number of pending sends which exceed congestion window")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.cwnd\">CWND</b></td><td>").append(_t("The congestion window, which is how many bytes can be sent without an acknowledgement")).append(" /<br>\n")
.append(_t("The number of sent messages awaiting acknowledgement")).append(" /<br>\n")
.append(_t("The maximum number of concurrent messages to send")).append(" /<br>\n")
.append(_t("The number of pending sends which exceed congestion window")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.ssthresh\">SST</b></td><td>").append(_t("The slow start threshold")).append("</td></tr>\n")
.append("<tr><td><b id=\"def.rtt\">RTT</b></td><td>").append(_t("The round trip time in milliseconds")).append("</td></tr>\n")
//.append("<tr><td><b id=\"def.dev\">").append(_t("Dev")).append("</b></td><td>").append(_t("The standard deviation of the round trip time in milliseconds")).append("</td></tr>\n")
@ -267,8 +267,8 @@ public class PeerHelper extends HelperBase {
// buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
buf.append("<tr class=\"tablefooter\"><td colspan=\"4\" align=\"left\"><b>")
.append(ngettext("{0} peer", "{0} peers", peers.size()));
buf.append("</b></td><td align=\"center\" nowrap><b><span class=\"right\">").append(formatRate(bpsRecv/1024)).append("</span>");
buf.append(THINSP).append("<span class=\"left\">").append(formatRate(bpsSend/1024)).append("</b></span>");
buf.append("</b></td><td align=\"center\" nowrap><span class=\"right\"><b>").append(formatRate(bpsRecv/1024)).append("</b></span>");
buf.append(THINSP).append("<span class=\"left\"><b>").append(formatRate(bpsSend/1024)).append("</b></span>");
buf.append("</td><td align=\"right\"><b>").append(DataHelper.formatDuration2(totalUptime/peers.size()));
buf.append("</b></td><td align=\"right\"><b>").append(DataHelper.formatDuration2(offsetTotal*1000/peers.size()));
buf.append("</b></td><td align=\"right\"><b>").append(totalSend).append("</b></td><td align=\"right\"><b>").append(totalRecv);
@ -486,7 +486,7 @@ public class PeerHelper extends HelperBase {
buf.append("K");
buf.append("</span>").append(THINSP).append("<span class=\"right\">").append(peer.getConcurrentSends());
buf.append("</span>").append(THINSP).append("<span class=\"right\">").append(peer.getConcurrentSendWindow());
buf.append("</span>").append(THINSP).append("</span><span class=\"left\">").append(peer.getConsecutiveSendRejections());
buf.append("</span>").append(THINSP).append("<span class=\"left\">").append(peer.getConsecutiveSendRejections());
if (peer.isBacklogged())
buf.append(' ').append(_t("backlogged"));
buf.append("</span></td>");
@ -573,11 +573,11 @@ public class PeerHelper extends HelperBase {
buf.append("<tr class=\"tablefooter\"><td colspan=\"4\" align=\"left\"><b>")
.append(ngettext("{0} peer", "{0} peers", peers.size()))
.append("</b></td>" +
"<td align=\"center\" nowrap><b><span class=\"right\">");
buf.append(formatKBps(bpsIn)).append("</span>").append(THINSP);
buf.append("<span class=\"left\">").append(formatKBps(bpsOut));
"<td align=\"center\" nowrap><span class=\"right\"><b>");
buf.append(formatKBps(bpsIn)).append("</b></span>").append(THINSP);
buf.append("<span class=\"left\"><b>").append(formatKBps(bpsOut));
long x = uptimeMsTotal/numPeers;
buf.append("</span></b></td>" +
buf.append("</b></span></td>" +
"<td align=\"right\"><b>").append(DataHelper.formatDuration2(x));
x = offsetTotal/numPeers;
buf.append("</b></td><td align=\"right\"><b>").append(DataHelper.formatDuration2(x)).append("</b></td>\n" +

View File

@ -90,6 +90,7 @@ class ProfileOrganizerRenderer {
buf.append("<th>").append(_t("Peer")).append("</th>");
buf.append("<th>").append(_t("Groups")).append("</th>");
buf.append("<th>").append(_t("Caps")).append("</th>");
buf.append("<th>").append(_t("Version")).append("</th>");
buf.append("<th>").append(_t("Speed")).append("</th>");
buf.append("<th>").append(_t("Capacity")).append("</th>");
buf.append("<th>").append(_t("Integration")).append("</th>");
@ -120,7 +121,7 @@ class ProfileOrganizerRenderer {
}
if (tier != prevTier)
buf.append("<tr><td colspan=\"8\"><hr></td></tr>\n");
buf.append("<tr><td colspan=\"9\"><hr></td></tr>\n");
prevTier = tier;
buf.append("<tr><td align=\"center\" nowrap>");
@ -141,12 +142,13 @@ class ProfileOrganizerRenderer {
if (info != null) {
// prevent HTML injection in the caps and version
buf.append("<td align=\"right\">").append(DataHelper.stripHTML(info.getCapabilities()));
String v = info.getOption("router.version");
if (v != null)
buf.append(' ').append(DataHelper.stripHTML(v));
} else {
buf.append("<td align=\"right\"><i>").append(_t("unknown")).append("</i></td>");
}
buf.append("<td align=\"right\">");
String v = info.getOption("router.version");
if (v != null)
buf.append(DataHelper.stripHTML(v));
buf.append("</td><td align=\"right\">").append(num(prof.getSpeedValue()));
long bonus = prof.getSpeedBonus();
if (bonus != 0) {
@ -173,6 +175,7 @@ class ProfileOrganizerRenderer {
RateAverages ra = RateAverages.getTemp();
Rate failed = prof.getTunnelHistory().getFailedRate().getRate(30*60*1000);
long fails = failed.computeAverages(ra, false).getTotalEventCount();
if (fails == 0) buf.append(_t("OK"));
if (fails > 0) {
Rate accepted = prof.getTunnelCreateResponseTime().getRate(30*60*1000);
long total = fails + accepted.computeAverages(ra, false).getTotalEventCount();
@ -207,13 +210,13 @@ class ProfileOrganizerRenderer {
buf.append("<th class=\"smallhead\">").append(_t("Integ. Value")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Heard About")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Heard From")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Good Send")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Good Send")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Bad Send")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("10m Resp. Time")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("1h Resp. Time")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("1d Resp. Time")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Good Lookup")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Bad Lookup")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Good Lookup")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Bad Lookup")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Good Store")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("Last Bad Store")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_t("1h Fail Rate")).append("</th>");

View File

@ -85,24 +85,25 @@ class TunnelRenderer {
continue;
}
// everything that isn't 'recent' is already in the tunnel.participatingMessageCount stat
// TODO translation tag "Tunnel identity" tooltips
processed += cfg.getRecentMessagesCount();
if (++displayed > DISPLAY_LIMIT)
continue;
out.write("<tr>");
if (cfg.getReceiveTunnel() != null)
out.write("<td class=\"cells\" align=\"center\">" + cfg.getReceiveTunnel().getTunnelId() +"</td>");
out.write("<td class=\"cells\" align=\"center\" title=\"Tunnel identity\"><span class=\"tunnel_id\">" + cfg.getReceiveTunnel().getTunnelId() +"</span></td>");
else
out.write("<td class=\"cells\" align=\"center\">n/a</td>");
if (cfg.getReceiveFrom() != null)
out.write("<td class=\"cells\" align=\"center\">" + netDbLink(cfg.getReceiveFrom()) +"</td>");
out.write("<td class=\"cells\" align=\"center\"><span class=\"tunnel_peer\">" + netDbLink(cfg.getReceiveFrom()) +"</span></td>");
else
out.write("<td class=\"cells\">&nbsp;</td>");
if (cfg.getSendTunnel() != null)
out.write("<td class=\"cells\" align=\"center\">" + cfg.getSendTunnel().getTunnelId() +"</td>");
out.write("<td class=\"cells\" align=\"center\" title=\"Tunnel identity\"><span class=\"tunnel_id\">" + cfg.getSendTunnel().getTunnelId() +"</span></td>");
else
out.write("<td class=\"cells\">&nbsp;</td>");
if (cfg.getSendTo() != null)
out.write("<td class=\"cells\" align=\"center\">" + netDbLink(cfg.getSendTo()) +"</td>");
out.write("<td class=\"cells\" align=\"center\"><span class=\"tunnel_peer\">" + netDbLink(cfg.getSendTo()) +"</span></td>");
else
out.write("<td class=\"cells\">&nbsp;</td>");
long timeLeft = cfg.getExpiration()-_context.clock().now();
@ -136,6 +137,24 @@ class TunnelRenderer {
out.write("<div class=\"statusnotes\"><b>" + _t("none") + "</b></div>\n");
out.write("<div class=\"statusnotes\"><b>" + _t("Lifetime bandwidth usage") + ":&nbsp;&nbsp;" + DataHelper.formatSize2(processed*1024) + "B</b></div>\n");
//renderPeers(out);
//out.write("<h3 class=\"tabletitle\">" + "Bandwidth Tiers" + "</h3>\n"); TODO: replace "definitions" with tagged "bandwidth tiers" post 0.9.31 release
out.write("<h3 class=\"tabletitle\">" + _t("Definitions") + "</h3>\n");
out.write("<table id=\"tunnel_defs\"><tbody>");
out.write("<tr><td>&nbsp;</td>"
+ "<td><span class=\"tunnel_cap\"><b>L</b></span></td><td>" + _t("{0} shared bandwidth", "12 - 32KBps") + "</td>"
+ "<td><span class=\"tunnel_cap\"><b>M</b></span></td><td>" + _t("{0} shared bandwidth", "32 - 64KBps") + "</td>"
+ "<td>&nbsp;</td></tr>");
out.write("<tr><td>&nbsp;</td>"
+ "<td><span class=\"tunnel_cap\"><b>N</b></span></td><td>" + _t("{0} shared bandwidth", "64 - 128KBps") + "</td>"
+ "<td><span class=\"tunnel_cap\"><b>O</b></span></td><td>" + _t("{0} shared bandwidth", "128 - 256KBps") + "</td>"
+ "<td>&nbsp;</td></tr>");
out.write("<tr><td>&nbsp;</td>"
+ "<td><span class=\"tunnel_cap\"><b>P</b></span></td><td>" + _t("{0} shared bandwidth", "256 - 2000KBps") + "</td>"
+ "<td><span class=\"tunnel_cap\"><b>X</b></span></td><td>" + _t("Over {0} shared bandwidth", "2000KBps") + "</td>"
+ "<td>&nbsp;</td></tr>");
out.write("</tbody></table>");
}
private static class TunnelComparator implements Comparator<HopConfig>, Serializable {
@ -193,15 +212,16 @@ class TunnelRenderer {
Hash peer = info.getPeer(j);
TunnelId id = (info.isInbound() ? info.getReceiveTunnelId(j) : info.getSendTunnelId(j));
if (_context.routerHash().equals(peer)) {
// Add empty content placeholders to force alignment
out.write(" <td class=\"cells\" align=\"center\"><span class=\"tunnel_peer\"></span><span class=\"tunnel_id\">" +
(id == null ? "" : "" + id) + "</span></span><b class=\"tunnel_cap\"></b></span></td>");
// Add empty content placeholders to force alignment. TODO tag "local" + tooltips for bandwidth tier / tunnel id for translation
out.write(" <td class=\"cells\" align=\"center\"><span class=\"tunnel_peer tunnel_local\" title=\"Locally hosted tunnel\">local</span>&nbsp;"
+ "<span class=\"tunnel_id\" title=\"Tunnel identity\">" +
(id == null ? "" : "" + id) + "</span><b class=\"tunnel_cap\" title=\"Bandwidth tier\"></b></td>");
} else {
String cap = getCapacity(peer);
// TODO Add tooltips for network cap / tunnel id
// TODO Tag for translation tooltips for network cap / tunnel id / bandwidth tier
out.write(" <td class=\"cells\" align=\"center\"><span class=\"tunnel_peer\">" + netDbLink(peer) +
"</span>&nbsp;<span class=\"nowrap\"><span class=\"tunnel_id\">" + (id == null ? "" : " " + id) +
"</span><b class=\"tunnel_cap\">" + cap + "</b></span></td>");
"</span>&nbsp;<span class=\"nowrap\"><span class=\"tunnel_id\" title=\"Tunnel identity\">" + (id == null ? "" : " " + id) +
"</span><b class=\"tunnel_cap\" title=\"Bandwidth tier\">" + cap + "</b></span></td>");
}
if (info.getLength() < maxLength && (info.getLength() == 1 || j == info.getLength() - 2)) {
for (int k = info.getLength(); k < maxLength; k++)