forked from I2P_Developers/i2p.i2p
Console:
- 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:
@ -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>");
|
||||
|
@ -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" +
|
||||
|
@ -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>");
|
||||
|
@ -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\"> </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\"> </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\"> </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") + ": " + 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> </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> </td></tr>");
|
||||
out.write("<tr><td> </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> </td></tr>");
|
||||
out.write("<tr><td> </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> </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> "
|
||||
+ "<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> <span class=\"nowrap\"><span class=\"tunnel_id\">" + (id == null ? "" : " " + id) +
|
||||
"</span><b class=\"tunnel_cap\">" + cap + "</b></span></td>");
|
||||
"</span> <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++)
|
||||
|
Reference in New Issue
Block a user