Changeset 8db45ff


Ignore:
Timestamp:
Oct 13, 2010 4:07:35 PM (9 years ago)
Author:
z3d <z3d@…>
Branches:
master
Children:
8cda510
Parents:
6cd645b (diff), b41e714a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge of '01c6aeb6ee46c7795e83553f40e16b5bdae08aac'

and '56ee4b01df5de86f0fdc98cdc4ed1197104584b5'

Files:
3 added
153 edited

Legend:

Unmodified
Added
Removed
  • apps/BOB/src/net/i2p/BOB/DoCMDS.java

    r6cd645b r8db45ff  
    3535import net.i2p.I2PException;
    3636import net.i2p.client.I2PClientFactory;
     37import net.i2p.data.DataFormatException;
    3738import net.i2p.data.Destination;
     39import net.i2p.i2ptunnel.I2PTunnel;
    3840import net.i2p.util.Log;
    3941// needed only for debugging.
     
    5153        // FIX ME
    5254        // I need a better way to do versioning, but this will do for now.
    53         public static final String BMAJ = "00",  BMIN = "00",  BREV = "0D",  BEXT = "";
     55        public static final String BMAJ = "00",  BMIN = "00",  BREV = "0E",  BEXT = "";
    5456        public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT;
    5557        private Socket server;
     
    8789        private static final String C_inport = "inport";
    8890        private static final String C_list = "list";
     91        private static final String C_lookup = "lookup";
    8992        private static final String C_newkeys = "newkeys";
    9093        private static final String C_option = "option";
     
    114117                {C_inport, C_inport + " port_number * Set the inbound port number nickname listens on."},
    115118                {C_list, C_list + " * List all tunnels."},
     119                {C_lookup, C_lookup + " * Lookup an i2p address."},
    116120                {C_newkeys, C_newkeys + " * Generate a new keypair for the current nickname."},
    117121                {C_option, C_option + " I2CPoption=something * Set an I2CP option. NOTE: Don't use any spaces."},
     
    139143                        C_inport + " " +
    140144                        C_list + " " +
     145                        C_lookup + " " +
    141146                        C_newkeys + " " +
    142147                        C_option + " " +
     
    447452                                                                        visitAllThreads();
    448453                                                                        out.println("OK ");
     454                                                                } else if (Command.equals(C_lookup)) {
     455                                                                        Destination dest = null;
     456                                                                        String reply = null;
     457                                                                        if (Arg.endsWith(".i2p")) {
     458                                                                                try {
     459                                                                                        try {
     460                                                                                                dest = I2PTunnel.destFromName(Arg);
     461                                                                                        } catch (DataFormatException ex) {
     462                                                                                        }
     463                                                                                        reply = dest.toBase64();
     464                                                                                } catch (NullPointerException npe) {
     465                                                                                        // Could not find the destination!?
     466                                                                                }
     467                                                                        }
     468                                                                        if (reply == null) {
     469                                                                                out.println("ERROR Address Not found.");
     470                                                                        } else {
     471                                                                                out.println("OK " + reply);
     472                                                                        }
    449473                                                                } else if (Command.equals(C_getdest)) {
    450474                                                                        if (ns) {
  • apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java

    r6cd645b r8db45ff  
    2626import java.io.File;
    2727import java.io.FileInputStream;
    28 import java.io.FileWriter;
    2928import java.io.IOException;
    3029import java.io.InputStreamReader;
     30import java.io.OutputStreamWriter;
    3131import java.io.StringReader;
    3232import java.util.HashMap;
     
    3535import java.util.List;
    3636import java.util.Map;
     37
     38import net.i2p.util.SecureFileOutputStream;
    3739
    3840/**
     
    278280    public static void write(Map map, File file) throws IOException {
    279281        ConfigParser
    280                 .write(map, new BufferedWriter(new FileWriter(file, false)));
     282                .write(map, new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8")));
    281283    }
    282284
     
    317319            throws IOException {
    318320        ConfigParser.writeSubscriptions(list, new BufferedWriter(
    319                 new FileWriter(file, false)));
     321                new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8")));
    320322    }
    321323
  • apps/addressbook/java/src/net/i2p/addressbook/Daemon.java

    r6cd645b r8db45ff  
    3030
    3131import net.i2p.I2PAppContext;
     32import net.i2p.util.SecureDirectory;
    3233
    3334/**
     
    132133        File homeFile;
    133134        if (args.length > 0) {
    134             homeFile = new File(args[0]);
     135            homeFile = new SecureDirectory(args[0]);
    135136            if (!homeFile.isAbsolute())
    136                 homeFile = new File(I2PAppContext.getGlobalContext().getRouterDir(), args[0]);
     137                homeFile = new SecureDirectory(I2PAppContext.getGlobalContext().getRouterDir(), args[0]);
    137138        } else {
    138             homeFile = new File(System.getProperty("user.dir"));
     139            homeFile = new SecureDirectory(System.getProperty("user.dir"));
    139140        }
    140141       
  • apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java

    r6cd645b r8db45ff  
    2727import net.i2p.util.FileUtil;
    2828import net.i2p.util.Log;
     29import net.i2p.util.SecureDirectory;
    2930import net.i2p.util.SimpleScheduler;
    3031import net.i2p.util.SimpleTimer;
     
    7879        // so it must be available even if not connected to I2CP.
    7980        // so much for multiple instances
    80         _tmpDir = new File(ctx.getTempDir(), "i2psnark");
     81        _tmpDir = new SecureDirectory(ctx.getTempDir(), "i2psnark");
    8182        FileUtil.rmdir(_tmpDir, false);
    8283        _tmpDir.mkdirs();
     
    197198    /** connect to the given destination */
    198199    I2PSocket connect(PeerID peer) throws IOException {
    199         Hash dest = peer.getAddress().calculateHash();
     200        Destination addr = peer.getAddress();
     201        if (addr == null)
     202            throw new IOException("Null address");
     203        Hash dest = addr.calculateHash();
    200204        if (_shitlist.contains(dest))
    201205            throw new IOException("Not trying to contact " + dest.toBase64() + ", as they are shitlisted");
    202206        try {
    203             I2PSocket rv = _manager.connect(peer.getAddress());
     207            I2PSocket rv = _manager.connect(addr);
    204208            if (rv != null)
    205209                _shitlist.remove(dest);
     
    225229    public File get(String url, int retries) { return get(url, true, retries); }
    226230    public File get(String url, boolean rewrite, int retries) {
    227         _log.debug("Fetching [" + url + "] proxy=" + _proxyHost + ":" + _proxyPort + ": " + _shouldProxy);
     231        if (_log.shouldLog(Log.DEBUG))
     232            _log.debug("Fetching [" + url + "] proxy=" + _proxyHost + ":" + _proxyPort + ": " + _shouldProxy);
    228233        File out = null;
    229234        try {
     
    249254        EepGet get = new I2PSocketEepGet(_context, _manager, retries, out.getAbsolutePath(), fetchURL);
    250255        if (get.fetch()) {
    251             _log.debug("Fetch successful [" + url + "]: size=" + out.length());
     256            if (_log.shouldLog(Log.DEBUG))
     257                _log.debug("Fetch successful [" + url + "]: size=" + out.length());
    252258            return out;
    253259        } else {
    254             _log.warn("Fetch failed [" + url + "]");
     260            if (_log.shouldLog(Log.WARN))
     261                _log.warn("Fetch failed [" + url + "]");
    255262            out.delete();
    256263            return null;
  • apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java

    r6cd645b r8db45ff  
    110110  public MetaInfo(Map m) throws InvalidBEncodingException
    111111  {
    112     _log.debug("Creating a metaInfo: " + m, new Exception("source"));
     112    if (_log.shouldLog(Log.DEBUG))
     113        _log.debug("Creating a metaInfo: " + m, new Exception("source"));
    113114    BEValue val = (BEValue)m.get("announce");
    114115    if (val == null)
     
    447448            buf.append(val.toString());
    448449    }
    449     _log.debug(buf.toString());
     450    if (_log.shouldLog(Log.DEBUG))
     451        _log.debug(buf.toString());
    450452    byte[] infoBytes = BEncoder.bencode(info);
    451453    //_log.debug("info bencoded: [" + Base64.encode(infoBytes, true) + "]");
     
    454456        MessageDigest digest = MessageDigest.getInstance("SHA");
    455457        byte hash[] = digest.digest(infoBytes);
    456         _log.debug("info hash: [" + net.i2p.data.Base64.encode(hash) + "]");
     458        if (_log.shouldLog(Log.DEBUG))
     459            _log.debug("info hash: [" + net.i2p.data.Base64.encode(hash) + "]");
    457460        return hash;
    458461      }
  • apps/i2psnark/java/src/org/klomp/snark/Peer.java

    r6cd645b r8db45ff  
    9393    this.peerID = new PeerID(id, sock.getPeerDestination());
    9494    _id = ++__id;
    95     _log.debug("Creating a new peer with " + peerID.getAddress().calculateHash().toBase64(), new Exception("creating " + _id));
     95    if (_log.shouldLog(Log.DEBUG))
     96        _log.debug("Creating a new peer with " + peerID.getAddress().calculateHash().toBase64(), new Exception("creating " + _id));
    9697  }
    9798
     
    130131  public int hashCode()
    131132  {
    132     return peerID.hashCode() ^ (2 << _id);
     133    return peerID.hashCode() ^ (7777 * (int)_id);
    133134  }
    134135
     
    151152  /**
    152153   * Compares the PeerIDs.
     154   * @deprecated unused?
    153155   */
    154156  public int compareTo(Object o)
     
    182184      throw new IllegalStateException("Peer already started");
    183185
    184     _log.debug("Running connection to " + peerID.getAddress().calculateHash().toBase64(), new Exception("connecting"));   
     186    if (_log.shouldLog(Log.DEBUG))
     187        _log.debug("Running connection to " + peerID.getAddress().calculateHash().toBase64(), new Exception("connecting"));   
    185188    try
    186189      {
     
    189192          {
    190193            sock = util.connect(peerID);
    191             _log.debug("Connected to " + peerID + ": " + sock);
     194            if (_log.shouldLog(Log.DEBUG))
     195                _log.debug("Connected to " + peerID + ": " + sock);
    192196            if ((sock == null) || (sock.isClosed())) {
    193197                throw new IOException("Unable to reach " + peerID);
     
    208212            byte [] id = handshake(in, out); //handshake(bis, bos);
    209213            byte [] expected_id = peerID.getID();
    210             if (!Arrays.equals(expected_id, id))
    211               throw new IOException("Unexpected peerID '"
     214            if (expected_id == null) {
     215                peerID.setID(id);
     216            } else if (Arrays.equals(expected_id, id)) {
     217                if (_log.shouldLog(Log.DEBUG))
     218                    _log.debug("Handshake got matching IDs with " + toString());
     219            } else {
     220                throw new IOException("Unexpected peerID '"
    212221                                    + PeerID.idencode(id)
    213222                                    + "' expected '"
    214223                                    + PeerID.idencode(expected_id) + "'");
    215             _log.debug("Handshake got matching IDs with " + toString());
     224            }
    216225          } else {
    217             _log.debug("Already have din [" + sock + "] with " + toString());
     226            if (_log.shouldLog(Log.DEBUG))
     227                _log.debug("Already have din [" + sock + "] with " + toString());
    218228          }
    219229       
     
    230240        listener.connected(this);
    231241 
    232         _log.debug("Start running the reader with " + toString());
     242        if (_log.shouldLog(Log.DEBUG))
     243            _log.debug("Start running the reader with " + toString());
    233244        // Use this thread for running the incomming connection.
    234245        // The outgoing connection creates its own Thread.
     
    280291    dout.flush();
    281292   
    282     _log.debug("Wrote my shared hash and ID to " + toString());
     293    if (_log.shouldLog(Log.DEBUG))
     294        _log.debug("Wrote my shared hash and ID to " + toString());
    283295   
    284296    // Handshake read - header
     
    307319    // Handshake read - peer id
    308320    din.readFully(bs);
    309     _log.debug("Read the remote side's hash and peerID fully from " + toString());
     321    if (_log.shouldLog(Log.DEBUG))
     322        _log.debug("Read the remote side's hash and peerID fully from " + toString());
    310323    return bs;
    311324  }
  • apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java

    r6cd645b r8db45ff  
    7777        try {
    7878          peerInfoHash = readHash(in);
    79           _log.info("infohash read from " + socket.getPeerDestination().calculateHash().toBase64()
    80                     + ": " + Base64.encode(peerInfoHash));
     79          if (_log.shouldLog(Log.INFO))
     80              _log.info("infohash read from " + socket.getPeerDestination().calculateHash().toBase64()
     81                        + ": " + Base64.encode(peerInfoHash));
    8182        } catch (IOException ioe) {
    82             _log.info("Unable to read the infohash from " + socket.getPeerDestination().calculateHash().toBase64());
     83            if (_log.shouldLog(Log.INFO))
     84                _log.info("Unable to read the infohash from " + socket.getPeerDestination().calculateHash().toBase64());
    8385            throw ioe;
    8486        }
  • apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java

    r6cd645b r8db45ff  
    376376    if (need_more)
    377377      {
    378         _log.debug("Adding a peer " + peer.getPeerID().getAddress().calculateHash().toBase64() + " for " + metainfo.getName(), new Exception("add/run"));
     378        if (_log.shouldLog(Log.DEBUG))
     379            _log.debug("Adding a peer " + peer.getPeerID().toString() + " for " + metainfo.getName(), new Exception("add/run"));
    379380
    380381        // Run the peer with us as listener and the current bitfield.
  • apps/i2psnark/java/src/org/klomp/snark/PeerID.java

    r6cd645b r8db45ff  
    2525import java.util.Map;
    2626
     27import net.i2p.I2PAppContext;
     28import net.i2p.data.Base32;
    2729import net.i2p.data.Base64;
     30import net.i2p.data.DataHelper;
    2831import net.i2p.data.Destination;
    2932
     
    3235import org.klomp.snark.bencode.InvalidBEncodingException;
    3336
     37/**
     38 *  Store the address information about a peer.
     39 *  Prior to 0.8.1, an instantiation required a peer ID, and full Destination address.
     40 *  Starting with 0.8.1, to support compact tracker responses,
     41 *  a PeerID can be instantiated with a Destination Hash alone.
     42 *  The full destination lookup is deferred until getAddress() is called,
     43 *  and the PeerID is not required.
     44 *  Equality is now determined solely by the dest hash.
     45 */
    3446public class PeerID implements Comparable
    3547{
    36   private final byte[] id;
    37   private final Destination address;
     48  private byte[] id;
     49  private Destination address;
    3850  private final int port;
    39 
     51  private byte[] destHash;
     52  /** whether we have tried to get the dest from the hash - only do once */
     53  private boolean triedDestLookup;
    4054  private final int hash;
    4155
     
    4559    this.address = address;
    4660    this.port = 6881;
    47 
     61    this.destHash = address.calculateHash().getData();
    4862    hash = calculateHash();
    4963  }
     
    7892
    7993    port = 6881;
    80 
     94    this.destHash = address.calculateHash().getData();
    8195    hash = calculateHash();
    8296  }
    8397
     98  /**
     99   * Creates a PeerID from a destHash
     100   * @since 0.8.1
     101   */
     102  public PeerID(byte[] dest_hash) throws InvalidBEncodingException
     103  {
     104    // id and address remain null
     105    port = 6881;
     106    if (dest_hash.length != 32)
     107        throw new InvalidBEncodingException("bad hash length");
     108    destHash = dest_hash;
     109    hash = DataHelper.hashCode(dest_hash);
     110  }
     111
    84112  public byte[] getID()
    85113  {
     
    87115  }
    88116
    89   public Destination getAddress()
    90   {
     117  /** for connecting out to peer based on desthash @since 0.8.1 */
     118  public void setID(byte[] xid)
     119  {
     120    id = xid;
     121  }
     122
     123  /**
     124   *  Get the destination.
     125   *  If this PeerId was instantiated with a destHash,
     126   *  and we have not yet done so, lookup the full destination, which may take
     127   *  up to 10 seconds.
     128   *  @return Dest or null if unknown
     129   */
     130  public synchronized Destination getAddress()
     131  {
     132    if (address == null && destHash != null && !triedDestLookup) {
     133        String b32 = Base32.encode(destHash) + ".b32.i2p";
     134        address = I2PAppContext.getGlobalContext().namingService().lookup(b32);
     135        triedDestLookup = true;
     136    }
    91137    return address;
    92138  }
     
    97143  }
    98144
     145  /** @since 0.8.1 */
     146  public byte[] getDestHash()
     147  {
     148    return destHash;
     149  }
     150
    99151  private int calculateHash()
    100152  {
    101     int b = 0;
    102     for (int i = 0; i < id.length; i++)
    103       b ^= id[i];
    104     return (b ^ address.hashCode()) ^ port;
    105   }
    106 
    107   /**
    108    * The hash code of a PeerID is the exclusive or of all id bytes.
     153    return DataHelper.hashCode(destHash);
     154  }
     155
     156  /**
     157   * The hash code of a PeerID is the hashcode of the desthash
    109158   */
    110159    @Override
     
    116165  /**
    117166   * Returns true if and only if this peerID and the given peerID have
    118    * the same 20 bytes as ID.
     167   * the same destination hash
    119168   */
    120169  public boolean sameID(PeerID pid)
    121170  {
    122     boolean equal = true;
    123     for (int i = 0; equal && i < id.length; i++)
    124       equal = id[i] == pid.id[i];
    125     return equal;
    126   }
    127 
    128   /**
    129    * Two PeerIDs are equal when they have the same id, address and port.
     171    return DataHelper.eq(destHash, pid.getDestHash());
     172  }
     173
     174  /**
     175   * Two PeerIDs are equal when they have the same dest hash
    130176   */
    131177    @Override
     
    136182        PeerID pid = (PeerID)o;
    137183
    138         return port == pid.port
    139           && address.equals(pid.address)
    140           && sameID(pid);
     184        return sameID(pid);
    141185      }
    142186    else
     
    146190  /**
    147191   * Compares port, address and id.
     192   * @deprecated unused? and will NPE now that address can be null?
    148193   */
    149194  public int compareTo(Object o)
     
    177222  public String toString()
    178223  {
     224    if (id == null || address == null)
     225        return "unkn@" + Base64.encode(destHash).substring(0, 6);
    179226    int nonZero = 0;
    180227    for (int i = 0; i < id.length; i++) {
  • apps/i2psnark/java/src/org/klomp/snark/Snark.java

    r6cd645b r8db45ff  
    438438                ioee.printStackTrace();
    439439            }
    440             fatal("Could not create storage", ioe);
     440            fatal("Could not check or create storage", ioe);
    441441          }
    442442      }
  • apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java

    r6cd645b r8db45ff  
    2222import net.i2p.util.Log;
    2323import net.i2p.util.OrderedProperties;
     24import net.i2p.util.SecureDirectory;
    2425
    2526/**
     
    131132    public File getDataDir() {
    132133        String dir = _config.getProperty(PROP_DIR, "i2psnark");
    133         File f = new File(dir);
     134        File f = new SecureDirectory(dir);
    134135        if (!f.isAbsolute())
    135             f = new File(_context.getAppDir(), dir);
     136            f = new SecureDirectory(_context.getAppDir(), dir);
    136137        return f;
    137138    }
     
    202203        if (i2cpHost != null) {
    203204            _util.setI2CPConfig(i2cpHost, i2cpPort, i2cpOpts);
    204             _log.debug("Configuring with I2CP options " + i2cpOpts);
     205            if (_log.shouldLog(Log.DEBUG))
     206                _log.debug("Configuring with I2CP options " + i2cpOpts);
    205207        }
    206208        //I2PSnarkUtil.instance().setI2CPConfig("66.111.51.110", 7654, new Properties());
     
    332334                    _util.setI2CPConfig(i2cpHost, port, p);
    333335                    addMessage(_("I2CP and tunnel changes will take effect after stopping all torrents"));
    334                     _log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts
    335                                + "] oldOpts [" + oldOpts + "]");
     336                    if (_log.shouldLog(Log.DEBUG))
     337                        _log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts
     338                                   + "] oldOpts [" + oldOpts + "]");
    336339                } else {
    337340                    if (_util.connected()) {
     
    440443    }
    441444
     445    /** @throws RuntimeException via Snark.fatal() */
    442446    public void addTorrent(String filename) { addTorrent(filename, false); }
     447
     448    /** @throws RuntimeException via Snark.fatal() */
    443449    public void addTorrent(String filename, boolean dontAutoStart) {
    444450        if ((!dontAutoStart) && !_util.connected()) {
     
    712718            while (true) {
    713719                File dir = getDataDir();
    714                 _log.debug("Directory Monitor loop over " + dir.getAbsolutePath());
     720                if (_log.shouldLog(Log.DEBUG))
     721                    _log.debug("Directory Monitor loop over " + dir.getAbsolutePath());
    715722                try {
    716723                    monitorTorrents(dir);
     
    725732    /** two listeners */
    726733    public void torrentComplete(Snark snark) {
    727         File f = new File(snark.torrent);
     734        StringBuilder buf = new StringBuilder(256);
     735        buf.append("<a href=\"/i2psnark/").append(snark.storage.getBaseName());
     736        if (snark.meta.getFiles() != null)
     737            buf.append('/');
     738        buf.append("\">").append(snark.storage.getBaseName()).append("</a>");
    728739        long len = snark.meta.getTotalLength();
    729         addMessage(_("Download finished: \"{0}\"", f.getName()) + " (" + _("size: {0}B", DataHelper.formatSize2(len)) + ')');
     740        addMessage(_("Download finished: {0}", buf.toString()) + " (" + _("size: {0}B", DataHelper.formatSize2(len)) + ')');
    730741        updateStatus(snark);
    731742    }
     
    737748    private void monitorTorrents(File dir) {
    738749        String fileNames[] = dir.list(TorrentFilenameFilter.instance());
    739         List foundNames = new ArrayList(0);
     750        List<String> foundNames = new ArrayList(0);
    740751        if (fileNames != null) {
    741752            for (int i = 0; i < fileNames.length; i++) {
     
    748759        }
    749760       
    750         Set existingNames = listTorrentFiles();
     761        Set<String> existingNames = listTorrentFiles();
    751762        // lets find new ones first...
    752763        for (int i = 0; i < foundNames.size(); i++) {
     
    756767                if (shouldAutoStart() && !_util.connect())
    757768                    addMessage(_("Unable to connect to I2P!"));
    758                 addTorrent((String)foundNames.get(i), !shouldAutoStart());
     769                try {
     770                    // Snark.fatal() throws a RuntimeException
     771                    // don't let one bad torrent kill the whole loop
     772                    addTorrent(foundNames.get(i), !shouldAutoStart());
     773                } catch (Exception e) {
     774                    addMessage(_("Unable to add {0}", foundNames.get(i)) + ": " + e);
     775                }
    759776            }
    760777        }
     
    766783            } else {
    767784                // known, but removed.  drop it
    768                 stopTorrent(name, true);
     785                try {
     786                    // Snark.fatal() throws a RuntimeException
     787                    // don't let one bad torrent kill the whole loop
     788                    stopTorrent(name, true);
     789                } catch (Exception e) {
     790                    // don't bother with message
     791                }
    769792            }
    770793        }
  • apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java

    r6cd645b r8db45ff  
    358358      + "&downloaded=" + downloaded
    359359      + "&left=" + left
     360      + "&compact"
    360361      + ((! event.equals(NO_EVENT)) ? ("&event=" + event) : "");
    361362    if (left <= 0 || event.equals(STOPPED_EVENT) || !coordinator.needPeers())
  • apps/i2psnark/java/src/org/klomp/snark/TrackerInfo.java

    r6cd645b r8db45ff  
    2525import java.util.HashSet;
    2626import java.util.Collections;
    27 import java.util.Iterator;
    2827import java.util.List;
    2928import java.util.Map;
     
    3433import org.klomp.snark.bencode.InvalidBEncodingException;
    3534
     35/**
     36 *  The data structure for the tracker response.
     37 *  Handles both traditional and compact formats.
     38 *  Compact format 1 - a list of hashes - early format for testing
     39 *  Compact format 2 - One big string of concatenated hashes - official format
     40 */
    3641public class TrackerInfo
    3742{
    3843  private final String failure_reason;
    3944  private final int interval;
    40   private final Set peers;
     45  private final Set<Peer> peers;
    4146  private int complete;
    4247  private int incomplete;
     
    7479
    7580        BEValue bePeers = (BEValue)m.get("peers");
    76         if (bePeers == null)
     81        if (bePeers == null) {
    7782          peers = Collections.EMPTY_SET;
    78         else
    79           peers = getPeers(bePeers.getList(), my_id, metainfo);
     83        } else {
     84            Set<Peer> p;
     85            try {
     86              // One big string (the official compact format)
     87              p = getPeers(bePeers.getBytes(), my_id, metainfo);
     88            } catch (InvalidBEncodingException ibe) {
     89              // List of Dictionaries or List of Strings
     90              p = getPeers(bePeers.getList(), my_id, metainfo);
     91            }
     92            peers = p;
     93        }
    8094
    8195        BEValue bev = (BEValue)m.get("complete");
     
    95109  }
    96110
    97   public static Set getPeers(InputStream in, byte[] my_id, MetaInfo metainfo)
     111/******
     112  public static Set<Peer> getPeers(InputStream in, byte[] my_id, MetaInfo metainfo)
    98113    throws IOException
    99114  {
     
    101116  }
    102117
    103   public static Set getPeers(BDecoder be, byte[] my_id, MetaInfo metainfo)
     118  public static Set<Peer> getPeers(BDecoder be, byte[] my_id, MetaInfo metainfo)
    104119    throws IOException
    105120  {
    106121    return getPeers(be.bdecodeList().getList(), my_id, metainfo);
    107122  }
    108 
    109   public static Set getPeers(List l, byte[] my_id, MetaInfo metainfo)
    110     throws IOException
    111   {
    112     Set peers = new HashSet(l.size());
    113 
    114     Iterator it = l.iterator();
    115     while (it.hasNext())
    116       {
     123******/
     124
     125  /** List of Dictionaries or List of Strings */
     126  private static Set<Peer> getPeers(List<BEValue> l, byte[] my_id, MetaInfo metainfo)
     127    throws IOException
     128  {
     129    Set<Peer> peers = new HashSet(l.size());
     130
     131    for (BEValue bev : l) {
    117132        PeerID peerID;
    118133        try {
    119             peerID = new PeerID(((BEValue)it.next()).getMap());
     134            // Case 1 - non-compact - A list of dictionaries (maps)
     135            peerID = new PeerID(bev.getMap());
    120136        } catch (InvalidBEncodingException ibe) {
    121             // don't let one bad entry spoil the whole list
    122             //Snark.debug("Discarding peer from list: " + ibe, Snark.ERROR);
     137            try {
     138                // Case 2 - compact - A list of 32-byte binary strings (hashes)
     139                // This was just for testing and is not the official format
     140                peerID = new PeerID(bev.getBytes());
     141            } catch (InvalidBEncodingException ibe2) {
     142                // don't let one bad entry spoil the whole list
     143                //Snark.debug("Discarding peer from list: " + ibe, Snark.ERROR);
     144                continue;
     145            }
     146        }
     147        peers.add(new Peer(peerID, my_id, metainfo));
     148      }
     149
     150    return peers;
     151  }
     152
     153  private static final int HASH_LENGTH = 32;
     154
     155  /**
     156   *  One big string of concatenated 32-byte hashes
     157   *  @since 0.8.1
     158   */
     159  private static Set<Peer> getPeers(byte[] l, byte[] my_id, MetaInfo metainfo)
     160    throws IOException
     161  {
     162    int count = l.length / HASH_LENGTH;
     163    Set<Peer> peers = new HashSet(count);
     164
     165    for (int i = 0; i < count; i++) {
     166        PeerID peerID;
     167        byte[] hash = new byte[HASH_LENGTH];
     168        System.arraycopy(l, i * HASH_LENGTH, hash, 0, HASH_LENGTH);
     169        try {
     170            peerID = new PeerID(hash);
     171        } catch (InvalidBEncodingException ibe) {
     172            // won't happen
    123173            continue;
    124174        }
     
    129179  }
    130180
    131   public Set getPeers()
     181  public Set<Peer> getPeers()
    132182  {
    133183    return peers;
  • apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java

    r6cd645b r8db45ff  
    141141   * throw a InvalidBEncodingException.
    142142   */
    143   public List getList() throws InvalidBEncodingException
     143  public List<BEValue> getList() throws InvalidBEncodingException
    144144  {
    145145    try
     
    158158   * a Map, otherwise it will throw a InvalidBEncodingException.
    159159   */
    160   public Map getMap() throws InvalidBEncodingException
     160  public Map<BEValue, BEValue> getMap() throws InvalidBEncodingException
    161161  {
    162162    try
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    r6cd645b r8db45ff  
    99import java.util.ArrayList;
    1010import java.util.Arrays;
     11import java.util.Collections;
    1112import java.util.Comparator;
    1213import java.util.Enumeration;
     
    822823
    823824        if(showPeers && isRunning && curPeers > 0) {
    824             List peers = snark.coordinator.peerList();
    825             Iterator it = peers.iterator();
    826             while (it.hasNext()) {
    827                 Peer peer = (Peer)it.next();
     825            List<Peer> peers = snark.coordinator.peerList();
     826            if (!showDebug)
     827                Collections.sort(peers, new PeerComparator());
     828            for (Peer peer : peers) {
    828829                if (!peer.isConnected())
    829830                    continue;
     
    909910    }
    910911   
     912    /**
     913     *  Sort by completeness (seeds first), then by ID
     914     *  @since 0.8.1
     915     */
     916    private static class PeerComparator implements Comparator<Peer> {
     917        public int compare(Peer l, Peer r) {
     918            int diff = r.completed() - l.completed();      // reverse
     919            if (diff != 0)
     920                return diff;
     921            return l.toString().substring(5, 9).compareTo(r.toString().substring(5, 9));
     922        }
     923    }
     924
    911925    private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException {
    912926        String uri = req.getRequestURI();
  • apps/i2psnark/locale/messages_zh.po

    r6cd645b r8db45ff  
    99"Project-Id-Version: I2P i2psnark\n"
    1010"Report-Msgid-Bugs-To: \n"
    11 "POT-Creation-Date: 2010-07-01 04:52+0000\n"
    12 "PO-Revision-Date: 2010-07-01 12:53+0800\n"
     11"POT-Creation-Date: 2010-10-04 02:45+0000\n"
     12"PO-Revision-Date: 2010-10-04 12:00+0800\n"
    1313"Last-Translator: walking <walking@mail.i2p>\n"
    1414"Language-Team: foo <foo@bar>\n"
     
    225225
    226226#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:187
    227 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:193
    228227#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837
    229228msgid "I2PSnark"
     
    234233msgstr "刷新页面"
    235234
     235#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:193
     236msgid "<img border=\"0\" src=\"/themes/console/snark/images/arrow_refresh.png\"> I2PSnark"
     237msgstr ""
     238
    236239#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:195
    237240msgid "Forum"
     
    239242
    240243#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:240
    241 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1289
    242 msgid "Status"
    243 msgstr "状态"
     244msgid "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"Torrent Status\">Status"
     245msgstr "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"种子状态\">状态"
    244246
    245247#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246
    246 msgid "Hide Peers"
    247 msgstr "隐藏用户"
     248msgid "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" title=\"Toggle Peer Visibility\" alt=\"Hide Peers\">"
     249msgstr "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" title=\"隐藏节点\" alt=\"隐藏节点\">"
    248250
    249251#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:249
    250 msgid "Show Peers"
    251 msgstr "显示用户"
     252msgid "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" title=\"Toggle Peer Visibility\" alt=\"Show Peers\">"
     253msgstr "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" title=\"显示节点\" alt=\"显示节点\">"
    252254
    253255#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254
    254 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271
    255 msgid "Torrent"
    256 msgstr "种子"
     256msgid "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title=\"Loaded Torrents\">Torrent"
     257msgstr "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title=\"载入的种子\">种子"
    257258
    258259#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:256
    259 msgid "ETA"
    260 msgstr "预计剩余时间"
     260msgid "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title=\"Estimated Download Time\">ETA"
     261msgstr "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title=\"预计剩余时间\">预计剩余时间"
    261262
    262263#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
    263 msgid "Downloaded"
    264 msgstr "下载"
     264msgid "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"Data Downloaded\">RX"
     265msgstr "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载数据量\">下载"
    265266
    266267#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:260
    267 msgid "Uploaded"
    268 msgstr "上传"
     268msgid "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"Data Uploaded\">TX"
     269msgstr "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"上传数据量\">上传"
    269270
    270271#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:262
    271 msgid "Down Rate"
    272 msgstr "下载速度"
     272msgid "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"Download Speed\">Rate"
     273msgstr "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载速度\">下载速度"
    273274
    274275#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264
    275 msgid "Up Rate"
    276 msgstr "上传速度"
     276msgid "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"Upload Speed\">Rate"
     277msgstr "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"上传速度\">上传速度"
    277278
    278279#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:271
     
    281282
    282283#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273
    283 msgid "Stop All"
    284 msgstr "停止全部"
     284msgid "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"Stop All Torrents\" alt=\"Stop All\">"
     285msgstr "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"全部停止\" alt=\"全部停止\">"
    285286
    286287#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:278
     
    289290
    290291#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:280
    291 msgid "Start All"
    292 msgstr "启动全部"
     292msgid "<img src=\"/themes/console/snark/images/start_all.png\" title=\"Start All Torrents\" alt=\"Start All\">"
     293msgstr "<img src=\"/themes/console/snark/images/start_all.png\" title=\"全部开始\" alt=\"全部开始\">"
    293294
    294295#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
     
    318319
    319320#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
    320 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1476
     321#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1481
    321322#, java-format
    322323msgid "Torrent already running: {0}"
     
    324325
    325326#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
    326 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1478
     327#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
    327328#, java-format
    328329msgid "Torrent already in the queue: {0}"
     
    451452
    452453#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:682
    453 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1327
     454#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
    454455msgid "Complete"
    455456msgstr "完成"
     
    487488
    488489#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:751
    489 msgid "Details"
    490 msgstr "详情"
     490msgid "<img border=\"0\" src=\"/themes/console/snark/images/details.png\">"
     491msgstr ""
    491492
    492493#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:785
     
    495496
    496497#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787
    497 msgid "Stop"
    498 msgstr "停止"
     498msgid "<img src=\"/themes/console/snark/images/stop.png\" title=\"Stop Torrent\" alt=\"Stop\">"
     499msgstr "<img src=\"/themes/console/snark/images/stop.png\" title=\"停止下载\" alt=\"停止\">"
    499500
    500501#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:793
     
    503504
    504505#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:795
    505 msgid "Start"
    506 msgstr "启动"
     506msgid "<img src=\"/themes/console/snark/images/start.png\" title=\"Start Torrent\" alt=\"Start\">"
     507msgstr "<img src=\"/themes/console/snark/images/start.png\" title=\"开始下载\" alt=\"开始\">"
    507508
    508509#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:800
     
    519520
    520521#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:807
    521 msgid "Remove"
    522 msgstr "移除"
     522msgid "<img src=\"/themes/console/snark/images/remove.png\" title=\"Remove Torrent\" alt=\"Remove\">"
     523msgstr "<img src=\"/themes/console/snark/images/remove.png\" title=\"删除种子\" alt=\"删除种子\">"
    523524
    524525#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811
     
    535536
    536537#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:818
    537 msgid "Delete"
    538 msgstr "删除"
     538msgid "<img src=\"/themes/console/snark/images/delete.png\" title=\"Delete Torrent + Data\" alt=\"Delete\">"
     539msgstr "<img src=\"/themes/console/snark/images/delete.png\" title=\"删除种子 + 数据\" alt=\"删除种子 + 数据\">"
    539540
    540541#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:861
     
    559560
    560561#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:927
    561 msgid "Add Torrent"
    562 msgstr "添加种子"
     562msgid "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">Add Torrent"
     563msgstr "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">添加种子"
    563564
    564565#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:929
     
    572573#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:937
    573574#, java-format
    574 msgid "Alternately, you can copy .torrent files to the directory {0}."
    575 msgstr "或者您可以将.torrent文件复制到以下目录{0}."
     575msgid "You can also copy .torrent files to: <code>{0}"
     576msgstr "或者您可以将.torrent文件复制到<code>{0}."
    576577
    577578#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:939
    578 msgid "Removing a .torrent file will cause the torrent to stop."
    579 msgstr "删除种子文件将导致中止该下载任务。"
     579msgid "Removing a .torrent will cause it to stop."
     580msgstr "删除种子文件将导致该下载任务中止。"
    580581
    581582#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958
    582 msgid "Create Torrent"
    583 msgstr "创建种子"
     583msgid "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">Create Torrent"
     584msgstr "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">创建种子"
    584585
    585586#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
     
    597598
    598599#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
    599 msgid "or"
    600 msgstr "或"
     600msgid "or&nbsp;"
     601msgstr "或&nbsp;"
    601602
    602603#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:985
     
    610611#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
    611612#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1133
    612 msgid "Configuration"
    613 msgstr "设置"
     613msgid "<img border=\"0\" src=\"/themes/console/snark/images/config.png\">Configuration"
     614msgstr "<img border=\"0\" src=\"/themes/console/snark/images/config.png\">设置"
    614615
    615616#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
     
    710711msgstr[0] "{0}隧道"
    711712
    712 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1283
     713#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271
     714msgid "Torrent"
     715msgstr "种子"
     716
     717#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278
     718msgid "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title=\"File\" alt=\"File\">&nbsp;"
     719msgstr "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title=\"文件\" alt=\"文件\">&nbsp;"
     720
     721#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278
     722msgid "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title=\"FileSize\" alt=\"FileSize\">Size"
     723msgstr "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title=\"文件大小\" alt=\"文件大小\">大小"
     724
     725#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279
     726msgid "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"Download Status\">Status"
     727msgstr "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"下载状态\">状态"
     728
     729#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301
     730msgid "Directory"
     731msgstr "文件夹"
     732
     733#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1306
     734msgid "Torrent not found?"
     735msgstr "种子未找到"
     736
     737#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
     738msgid "File not found in torrent?"
     739msgstr "种子中没有发现文件?"
     740
     741#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320
     742msgid "complete"
     743msgstr "完成"
     744
     745#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1321
     746msgid "bytes remaining"
     747msgstr "剩余字节数"
     748
     749#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373
    713750msgid "Up to higher level directory"
    714751msgstr "上一层文件夹"
    715752
    716 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288
    717 msgid "File"
    718 msgstr "文件"
    719 
    720 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288
    721 msgid "Size"
    722 msgstr "大小"
    723 
    724 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1311
    725 msgid "Directory"
    726 msgstr "文件夹"
    727 
    728 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1316
    729 msgid "Torrent not found?"
    730 msgstr "种子未找到"
    731 
    732 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1324
    733 msgid "File not found in torrent?"
    734 msgstr "种子中没有发现文件?"
    735 
    736 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1330
    737 msgid "complete"
    738 msgstr "完成"
    739 
    740 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1331
    741 msgid "bytes remaining"
    742 msgstr "剩余字节数"
    743 
    744 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1456
     753#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1461
    745754#, java-format
    746755msgid "Torrent fetched from {0}"
    747756msgstr "从{0}获取种子成功"
    748757
    749 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1484
     758#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489
    750759#, java-format
    751760msgid "Torrent at {0} was not valid"
    752761msgstr "{0}的种子中有错误"
    753762
    754 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489
     763#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1494
    755764#, java-format
    756765msgid "Torrent was not retrieved from {0}"
    757766msgstr "从{0}获得种子失败"
    758767
     768#~ msgid "Status"
     769#~ msgstr "状态"
     770#~ msgid "Hide Peers"
     771#~ msgstr "隐藏用户"
     772#~ msgid "Show Peers"
     773#~ msgstr "显示用户"
     774#~ msgid "ETA"
     775#~ msgstr "预计剩余时间"
     776#~ msgid "Downloaded"
     777#~ msgstr "已下载"
     778#~ msgid "Uploaded"
     779#~ msgstr "已上传"
     780#~ msgid "Down Rate"
     781#~ msgstr "下载速度"
     782#~ msgid "Up Rate"
     783#~ msgstr "上传速度"
     784#~ msgid "Stop All"
     785#~ msgstr "停止全部"
     786#~ msgid "Start All"
     787#~ msgstr "启动全部"
     788#~ msgid "Details"
     789#~ msgstr "详情"
     790#~ msgid "Stop"
     791#~ msgstr "停止"
     792#~ msgid "Start"
     793#~ msgstr "启动"
     794#~ msgid "Remove"
     795#~ msgstr "移除"
     796#~ msgid "Delete"
     797#~ msgstr "删除"
     798#~ msgid "Add Torrent"
     799#~ msgstr "添加种子"
     800#~ msgid "Create Torrent"
     801#~ msgstr "创建种子"
     802#~ msgid "or"
     803#~ msgstr "或"
     804#~ msgid "Configuration"
     805#~ msgstr "设置"
     806#~ msgid "File"
     807#~ msgstr "文件"
     808#~ msgid "Size"
     809#~ msgstr "大小"
    759810#~ msgid "Cannot change the I2CP settings while torrents are active"
    760811#~ msgstr "正在下载/上传,无法更改I2CP设置"
  • apps/i2psnark/web.xml

    r6cd645b r8db45ff  
    2323        </session-timeout>
    2424    </session-config>
     25
     26
     27    <!-- mime types not in mime.properties in the jetty 5.1.15 source -->
     28
     29    <mime-mapping>
     30        <extension>mkv</extension>
     31        <mime-type>video/x-matroska</mime-type>
     32    </mime-mapping>
     33
     34    <mime-mapping>
     35        <extension>wmv</extension>
     36        <mime-type>video/x-ms-wmv</mime-type>
     37    </mime-mapping>
     38
     39    <mime-mapping>
     40        <extension>flv</extension>
     41        <mime-type>video/x-flv</mime-type>
     42    </mime-mapping>
     43
     44    <mime-mapping>
     45        <extension>mp4</extension>
     46        <mime-type>video/mp4</mime-type>
     47    </mime-mapping>
     48
     49    <mime-mapping>
     50        <extension>rar</extension>
     51        <mime-type>application/rar</mime-type>
     52    </mime-mapping>
     53
     54    <mime-mapping>
     55        <extension>7z</extension>
     56        <mime-type>application/x-7z-compressed</mime-type>
     57    </mime-mapping>
     58
     59    <mime-mapping>
     60        <extension>iso</extension>
     61        <mime-type>application/x-iso9660-image</mime-type>
     62    </mime-mapping>
     63
     64    <mime-mapping>
     65        <extension>ico</extension>
     66        <mime-type>image/x-icon</mime-type>
     67    </mime-mapping>
     68
     69    <mime-mapping>
     70        <extension>exe</extension>
     71        <mime-type>application/x-msdos-program</mime-type>
     72    </mime-mapping>
     73
     74    <mime-mapping>
     75        <extension>flac</extension>
     76        <mime-type>audio/flac</mime-type>
     77    </mime-mapping>
     78
     79    <mime-mapping>
     80        <extension>m4a</extension>
     81        <mime-type>audio/mpeg</mime-type>
     82    </mime-mapping>
     83
     84    <mime-mapping>
     85        <extension>wma</extension>
     86        <mime-type>audio/x-ms-wma</mime-type>
     87    </mime-mapping>
     88
    2589</web-app>
  • apps/i2ptunnel/java/build.xml

    r6cd645b r8db45ff  
    8282    <target name="war" depends="precompilejsp, bundle">
    8383        <war destfile="build/i2ptunnel.war" webxml="../jsp/web-out.xml"
    84              basedir="../jsp/" excludes="web.xml, **/*.java, *.jsp">
     84             basedir="../jsp/" excludes="web.xml, web-fragment.xml, web-out.xml, **/*.java, *.jsp">
    8585        </war>
    8686    </target>
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java

    r6cd645b r8db45ff  
    2525
    2626/**
     27 * This does the transparent gzip decompression on the client side.
     28 * Extended in I2PTunnelHTTPServer to do the compression on the server side.
     29 *
    2730 * Simple stream for delivering an HTTP response to
    2831 * the client, trivially filtered to make sure "Connection: close"
     
    3437 */
    3538class HTTPResponseOutputStream extends FilterOutputStream {
    36     private I2PAppContext _context;
    37     private Log _log;
    38     private ByteCache _cache;
     39    private final I2PAppContext _context;
     40    private final Log _log;
    3941    protected ByteArray _headerBuffer;
    4042    private boolean _headerWritten;
    41     private byte _buf1[];
     43    private final byte _buf1[];
    4244    protected boolean _gzip;
    4345    private long _dataWritten;
    4446    private InternalGZIPInputStream _in;
    4547    private static final int CACHE_SIZE = 8*1024;
     48    private static final ByteCache _cache = ByteCache.getInstance(8, CACHE_SIZE);
     49    // OOM DOS prevention
     50    private static final int MAX_HEADER_SIZE = 64*1024;
    4651   
    4752    public HTTPResponseOutputStream(OutputStream raw) {
    4853        super(raw);
    4954        _context = I2PAppContext.getGlobalContext();
    50         _context.statManager().createRateStat("i2ptunnel.httpCompressionRatio", "ratio of compressed size to decompressed size after transfer", "I2PTunnel", new long[] { 60*1000, 30*60*1000 });
    51         _context.statManager().createRateStat("i2ptunnel.httpCompressed", "compressed size transferred", "I2PTunnel", new long[] { 60*1000, 30*60*1000 });
    52         _context.statManager().createRateStat("i2ptunnel.httpExpanded", "size transferred after expansion", "I2PTunnel", new long[] { 60*1000, 30*60*1000 });
     55        _context.statManager().createRateStat("i2ptunnel.httpCompressionRatio", "ratio of compressed size to decompressed size after transfer", "I2PTunnel", new long[] { 60*60*1000 });
     56        _context.statManager().createRateStat("i2ptunnel.httpCompressed", "compressed size transferred", "I2PTunnel", new long[] { 60*60*1000 });
     57        _context.statManager().createRateStat("i2ptunnel.httpExpanded", "size transferred after expansion", "I2PTunnel", new long[] { 60*60*1000 });
    5358        _log = _context.logManager().getLog(getClass());
    54         _cache = ByteCache.getInstance(8, CACHE_SIZE);
    5559        _headerBuffer = _cache.acquire();
    56         _headerWritten = false;
    57         _gzip = false;
    58         _dataWritten = 0;
    5960        _buf1 = new byte[1];
    6061    }
     
    9798    }
    9899   
    99     /** grow (and free) the buffer as necessary */
    100     private void ensureCapacity() {
     100    /**
     101     *  grow (and free) the buffer as necessary
     102     *  @throws IOException if the headers are too big
     103     */
     104    private void ensureCapacity() throws IOException {
     105        if (_headerBuffer.getValid() >= MAX_HEADER_SIZE)
     106            throw new IOException("Max header size exceeded: " + MAX_HEADER_SIZE);
    101107        if (_headerBuffer.getValid() + 1 >= _headerBuffer.getData().length) {
    102108            int newSize = (int)(_headerBuffer.getData().length * 1.5);
     
    105111            newBuf.setValid(_headerBuffer.getValid());
    106112            newBuf.setOffset(0);
     113            // if we changed the ByteArray size, don't put it back in the cache
    107114            if (_headerBuffer.getData().length == CACHE_SIZE)
    108115                _cache.release(_headerBuffer);
     
    220227        PipedInputStream pi = new PipedInputStream();
    221228        PipedOutputStream po = new PipedOutputStream(pi);
    222         new I2PAppThread(new Pusher(pi, out), "HTTP decompresser").start();
     229        new I2PAppThread(new Pusher(pi, out), "HTTP decompressor").start();
    223230        out = po;
    224231    }
     
    232239        }
    233240        public void run() {
    234             OutputStream to = null;
    235241            _in = null;
    236             long start = System.currentTimeMillis();
    237242            long written = 0;
     243            ByteArray ba = null;
    238244            try {
    239245                _in = new InternalGZIPInputStream(_inRaw);
    240                 byte buf[] = new byte[8192];
     246                ba = _cache.acquire();
     247                byte buf[] = ba.getData();
    241248                int read = -1;
    242249                while ( (read = _in.read(buf)) != -1) {
     
    252259                if (_log.shouldLog(Log.WARN))
    253260                    _log.warn("Error decompressing: " + written + ", " + (_in != null ? _in.getTotalRead() + "/" + _in.getTotalExpanded() : ""), ioe);
     261            } catch (OutOfMemoryError oom) {
     262                _log.error("OOM in HTTP Decompressor", oom);
    254263            } finally {
    255264                if (_log.shouldLog(Log.WARN) && (_in != null))
     
    260269                                + ", finished=" + _in.getFinished()
    261270                               : ""));
     271                if (ba != null)
     272                    _cache.release(ba);
    262273                if (_out != null) try {
    263274                    _out.close();
    264275                } catch (IOException ioe) {}
    265276            }
    266             long end = System.currentTimeMillis();
     277
    267278            double compressed = (_in != null ? _in.getTotalRead() : 0);
    268279            double expanded = (_in != null ? _in.getTotalExpanded() : 0);
    269             double ratio = 0;
    270             if (expanded > 0)
    271                 ratio = compressed/expanded;
    272 
    273             _context.statManager().addRateData("i2ptunnel.httpCompressionRatio", (int)(100d*ratio), end-start);
    274             _context.statManager().addRateData("i2ptunnel.httpCompressed", (long)compressed, end-start);
    275             _context.statManager().addRateData("i2ptunnel.httpExpanded", (long)expanded, end-start);
    276         }
    277     }
    278 
     280            if (compressed > 0 && expanded > 0) {
     281                // only update the stats if we did something
     282                double ratio = compressed/expanded;
     283                _context.statManager().addRateData("i2ptunnel.httpCompressionRatio", (int)(100d*ratio), 0);
     284                _context.statManager().addRateData("i2ptunnel.httpCompressed", (long)compressed, 0);
     285                _context.statManager().addRateData("i2ptunnel.httpExpanded", (long)expanded, 0);
     286            }
     287        }
     288    }
     289
     290    /** just a wrapper to provide stats for debugging */
    279291    private static class InternalGZIPInputStream extends GZIPInputStream {
    280292        public InternalGZIPInputStream(InputStream in) throws IOException {
     
    295307            }
    296308        }
     309
     310        /**
     311         *  From Inflater javadoc:
     312         *  Returns the total number of bytes remaining in the input buffer. This can be used to find out
     313         *  what bytes still remain in the input buffer after decompression has finished.
     314         */
    297315        public long getRemaining() {
    298316            try {
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java

    r6cd645b r8db45ff  
    99import java.util.StringTokenizer;
    1010
    11 import net.i2p.I2PAppContext;
    1211import net.i2p.client.streaming.I2PSocket;
    1312import net.i2p.data.DataFormatException;
     
    111110        if (size == 1) // skip the rand in the most common case
    112111            return dests.get(0);
    113         int index = I2PAppContext.getGlobalContext().random().nextInt(size);
     112        int index = _context.random().nextInt(size);
    114113        return dests.get(index);
    115114    }
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java

    r6cd645b r8db45ff  
    147147            if (size <= 0)
    148148                return null;
    149             int index = I2PAppContext.getGlobalContext().random().nextInt(size);
     149            int index = _context.random().nextInt(size);
    150150            return _proxyList.get(index);
    151151        }
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java

    r6cd645b r8db45ff  
    206206                return null;
    207207            }
    208             int index = I2PAppContext.getGlobalContext().random().nextInt(size);
     208            int index = _context.random().nextInt(size);
    209209            String proxy = (String)proxyList.get(index);
    210210            return proxy;
     
    627627                        line = null;
    628628                        continue; // completely strip the line
     629                    } else if (lowercaseLine.startsWith("authorization: ntlm ")) {
     630                        // Block Windows NTLM after 401
     631                        line = null;
     632                        continue;
     633                    } else if (lowercaseLine.startsWith("proxy-authorization: ntlm ")) {
     634                        // Block Windows NTLM after 407
     635                        line = null;
     636                        continue;
    629637                    }
    630638                }
     
    809817     */
    810818    private byte[] getErrorPage(String base, byte[] backup) {
    811         return getErrorPage(getTunnel().getContext(), base, backup);
     819        return getErrorPage(_context, base, backup);
    812820    }
    813821
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java

    r6cd645b r8db45ff  
    291291    }
    292292
     293    /** just a wrapper to provide stats for debugging */
    293294    private static class InternalGZIPOutputStream extends GZIPOutputStream {
    294295        public InternalGZIPOutputStream(OutputStream target) throws IOException {
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java

    r6cd645b r8db45ff  
    1010import java.util.StringTokenizer;
    1111
    12 import net.i2p.I2PAppContext;
    1312import net.i2p.client.streaming.I2PSocket;
    1413import net.i2p.data.DataFormatException;
     
    125124        if (size == 1) // skip the rand in the most common case
    126125            return dests.get(0);
    127         int index = I2PAppContext.getGlobalContext().random().nextInt(size);
     126        int index = _context.random().nextInt(size);
    128127        return dests.get(index);
    129128    }
     
    183182                            outmsg=outmsg+"\r\n";   // rfc1459 sec. 2.3
    184183                            output.write(outmsg.getBytes("ISO-8859-1"));
     184                            // probably doesn't do much but can't hurt
     185                            output.flush();
    185186                        } else {
    186187                            if (_log.shouldLog(Log.WARN))
     
    258259                                outmsg=outmsg+"\r\n";   // rfc1459 sec. 2.3
    259260                                output.write(outmsg.getBytes("ISO-8859-1"));
     261                                // save 250 ms in streaming
     262                                output.flush();
    260263                            } else {
    261264                                if (_log.shouldLog(Log.WARN))
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java

    r6cd645b r8db45ff  
    130130                    // But if we don't flush, then we have to wait for the connectDelay timer to fire
    131131                    // in i2p socket? To be researched and/or fixed.
    132                     //i2pout.flush();
     132                    //
     133                    // AS OF 0.8.1, MessageOutputStream.flush() is fixed to only wait for accept,
     134                    // not for "completion" (i.e. an ACK from the far end).
     135                    // So we now get a fast return from flush(), and can do it here to save 250 ms.
     136                    // To make sure we are under the initial window size and don't hang waiting for accept,
     137                    // only flush if it fits in one message.
     138                    if (initialI2PData.length <= 1730)   // ConnectionOptions.DEFAULT_MAX_MESSAGE_SIZE
     139                        i2pout.flush();
    133140                }
    134141            }
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java

    r6cd645b r8db45ff  
    1919import net.i2p.util.I2PAppThread;
    2020import net.i2p.util.Log;
     21import net.i2p.util.SecureFileOutputStream;
    2122
    2223/**
     
    9091        FileOutputStream fos = null;
    9192        try {
    92             fos = new FileOutputStream(keyFile);
     93            fos = new SecureFileOutputStream(keyFile);
    9394            Destination dest = client.createDestination(fos);
    9495            String destStr = dest.toBase64();
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java

    r6cd645b r8db45ff  
    2121import net.i2p.util.I2PAppThread;
    2222import net.i2p.util.Log;
     23import net.i2p.util.SecureFileOutputStream;
    2324
    2425/**
     
    256257        FileOutputStream fos = null;
    257258        try {
    258             fos = new FileOutputStream(cfgFile);
     259            fos = new SecureFileOutputStream(cfgFile);
    259260            fos.write(buf.toString().getBytes("UTF-8"));
    260261            if (_log.shouldLog(Log.INFO))
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java

    r6cd645b r8db45ff  
    1414import java.util.StringTokenizer;
    1515
     16import net.i2p.data.Base64;
     17import net.i2p.data.Destination;
     18import net.i2p.data.PrivateKeyFile;
     19import net.i2p.data.Signature;
     20import net.i2p.data.SigningPrivateKey;
    1621import net.i2p.i2ptunnel.TunnelController;
    1722import net.i2p.i2ptunnel.TunnelControllerGroup;
     
    6772            tunnel = _group.getControllers().size();
    6873        return "i2ptunnel" + tunnel + "-privKeys.dat";
     74    }
     75   
     76    public String getNameSignature(int tunnel) {
     77        String spoof = getSpoofedHost(tunnel);
     78        if (spoof.length() <= 0)
     79            return "";
     80        TunnelController tun = getController(tunnel);
     81        if (tun == null)
     82            return "";
     83        String keyFile = tun.getPrivKeyFile();
     84        if (keyFile != null && keyFile.trim().length() > 0) {
     85            PrivateKeyFile pkf = new PrivateKeyFile(keyFile);
     86            try {
     87                Destination d = pkf.getDestination();
     88                if (d == null)
     89                    return "";
     90                SigningPrivateKey privKey = pkf.getSigningPrivKey();
     91                if (privKey == null)
     92                    return "";
     93                //System.err.println("Signing " + spoof + " with " + Base64.encode(privKey.getData()));
     94                Signature sig = _context.dsa().sign(spoof.getBytes("UTF-8"), privKey);
     95                return Base64.encode(sig.getData());
     96            } catch (Exception e) {}
     97        }
     98        return "";
    6999    }
    70100   
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java

    r6cd645b r8db45ff  
    1010
    1111import java.util.concurrent.ConcurrentHashMap;
     12import java.util.ArrayList;
    1213import java.util.Arrays;
    1314import java.util.HashSet;
     
    4243    private String _action;
    4344    private int _tunnel;
    44     private long _prevNonce;
    45     private long _prevNonce2;
    46     private long _curNonce;
    47     private long _nextNonce;
     45    //private long _prevNonce;
     46    //private long _prevNonce2;
     47    private String _curNonce;
     48    //private long _nextNonce;
    4849
    4950    private String _type;
     
    8687    //public static final String PROP_TUNNEL_PASSPHRASE = "i2ptunnel.passphrase";
    8788    public static final String PROP_TUNNEL_PASSPHRASE = "consolePassword";
    88     static final String PROP_NONCE = IndexBean.class.getName() + ".nonce";
    89     static final String PROP_NONCE_OLD = PROP_NONCE + '2';
     89    //static final String PROP_NONCE = IndexBean.class.getName() + ".nonce";
     90    //static final String PROP_NONCE_OLD = PROP_NONCE + '2';
     91    /** 3 wasn't enough for some browsers. They are reloading the page for some reason - maybe HEAD? @since 0.8.1 */
     92    private static final int MAX_NONCES = 5;
     93    /** store nonces in a static FIFO instead of in System Properties @since 0.8.1 */
     94    private static final List<String> _nonces = new ArrayList(MAX_NONCES + 1);
     95
    9096    static final String CLIENT_NICKNAME = "shared clients";
    91    
    9297    public static final String PROP_THEME_NAME = "routerconsole.theme";
    9398    public static final String DEFAULT_THEME = "light";
     
    99104        _log = _context.logManager().getLog(IndexBean.class);
    100105        _group = TunnelControllerGroup.getInstance();
    101         _action = null;
    102106        _tunnel = -1;
    103         _curNonce = -1;
    104         _prevNonce = -1;
    105         _prevNonce2 = -1;
    106         try {
    107             String nonce2 = System.getProperty(PROP_NONCE_OLD);
    108             if (nonce2 != null)
    109                 _prevNonce2 = Long.parseLong(nonce2);
    110             String nonce = System.getProperty(PROP_NONCE);
    111             if (nonce != null) {
    112                 _prevNonce = Long.parseLong(nonce);
    113                 System.setProperty(PROP_NONCE_OLD, nonce);
    114             }
    115         } catch (NumberFormatException nfe) {}
    116         _nextNonce = _context.random().nextLong();
    117         System.setProperty(PROP_NONCE, Long.toString(_nextNonce));
     107        _curNonce = "-1";
     108        addNonce();
    118109        _booleanOptions = new ConcurrentHashSet(4);
    119110        _otherOptions = new ConcurrentHashMap(4);
    120111    }
    121112   
    122     public long getNextNonce() { return _nextNonce; }
     113    public static String getNextNonce() {
     114        synchronized (_nonces) {
     115            return _nonces.get(0);
     116        }
     117    }
     118
    123119    public void setNonce(String nonce) {
    124120        if ( (nonce == null) || (nonce.trim().length() <= 0) ) return;
    125         try {
    126             _curNonce = Long.parseLong(nonce);
    127         } catch (NumberFormatException nfe) {
    128             _curNonce = -1;
     121        _curNonce = nonce;
     122    }
     123
     124    /** add a random nonce to the head of the queue @since 0.8.1 */
     125    private void addNonce() {
     126        String nextNonce = Long.toString(_context.random().nextLong());
     127        synchronized (_nonces) {
     128            _nonces.add(0, nextNonce);
     129            int sz = _nonces.size();
     130            if (sz > MAX_NONCES)
     131                _nonces.remove(sz - 1);
     132        }
     133    }
     134
     135    /** do we know this nonce? @since 0.8.1 */
     136    private static boolean haveNonce(String nonce) {
     137        synchronized (_nonces) {
     138            return _nonces.contains(nonce);
    129139        }
    130140    }
     
    156166        if ( (_action == null) || (_action.trim().length() <= 0) || ("Cancel".equals(_action)))
    157167            return "";
    158         if ( (_prevNonce != _curNonce) && (_prevNonce2 != _curNonce) && (!validPassphrase()) )
     168        if ( (!haveNonce(_curNonce)) && (!validPassphrase()) )
    159169            return "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.";
    160170        if ("Stop all".equals(_action))
  • apps/i2ptunnel/jsp/editServer.jsp

    r6cd645b r8db45ff  
    197197         <% } %>
    198198            </div>
    199            
     199
     200            <% if (("httpserver".equals(tunnelType)) || ("httpbidirserver".equals(tunnelType))) {
     201          %><div id="sigField" class="rowItem">
     202                <label for="signature">
     203                    <%=intl._("Hostname Signature")%>
     204                </label>
     205                <input type="text" size="30" readonly="readonly" title="Use to prove that the website name is for this destination" value="<%=editBean.getNameSignature(curTunnel)%>" wrap="off" class="freetext" />               
     206            </div>
     207            <% } %>
     208
    200209            <div class="footer">
    201210            </div>
  • apps/i2ptunnel/locale/messages_zh.po

    r6cd645b r8db45ff  
    99"Project-Id-Version: I2P i2ptunnel\n"
    1010"Report-Msgid-Bugs-To: \n"
    11 "POT-Creation-Date: 2010-07-01 04:52+0000\n"
     11"POT-Creation-Date: 2010-10-04 02:45+0000\n"
    1212"PO-Revision-Date: 2010-05-29 10:57+0800\n"
    1313"Last-Translator: walking <walking@mail.i2p>\n"
     
    1818"X-Poedit-Language: Chinese\n"
    1919
    20 #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:493
     20#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
    2121#, java-format
    2222msgid ""
     
    3636"主机:"
    3737
    38 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:369
     38#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:372
    3939msgid "New Tunnel"
    4040msgstr "新建隧道"
    4141
    42 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:389
     42#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:392
    4343msgid "Standard client"
    4444msgstr "标准客户端"
    4545
    46 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:390
     46#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:393
    4747msgid "HTTP client"
    4848msgstr "HTTP 客户端"
    4949
    50 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:391
     50#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:394
    5151msgid "IRC client"
    5252msgstr "IRC 客户端"
    5353
    54 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:392
     54#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:395
    5555msgid "Standard server"
    5656msgstr "标准服务器"
    5757
    58 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:393
     58#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:396
    5959msgid "HTTP server"
    6060msgstr "HTTP 服务器"
    6161
    62 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:394
     62#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:397
    6363msgid "SOCKS 4/4a/5 proxy"
    6464msgstr "SOCKS4/4A/5 代理"
    6565
    66 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:395
     66#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
    6767msgid "SOCKS IRC proxy"
    6868msgstr "SOCKS IRC 代理"
    6969
    70 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:396
     70#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:399
    7171msgid "CONNECT/SSL/HTTPS proxy"
    7272msgstr "CONNECT/SSL/HTTPS 代理"
    7373
    74 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:397
     74#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:400
    7575msgid "IRC server"
    7676msgstr "IRC 服务器"
    7777
    78 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
     78#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:401
    7979msgid "Streamr client"
    8080msgstr "Streamr 客户端"
    8181
    82 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:399
     82#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:402
    8383msgid "Streamr server"
    8484msgstr "Streamr 服务器"
    8585
    86 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:400
     86#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:403
    8787msgid "HTTP bidir"
    8888msgstr "双向http"
  • apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java

    r6cd645b r8db45ff  
    131131                opts.setProperty(name, System.getProperty(name));
    132132        }
    133         boolean oldLib = DEFAULT_MANAGER.equals(opts.getProperty(PROP_MANAGER, DEFAULT_MANAGER));
    134         if (oldLib && false) {
     133        //boolean oldLib = DEFAULT_MANAGER.equals(opts.getProperty(PROP_MANAGER, DEFAULT_MANAGER));
     134        //if (oldLib && false) {
    135135            // for the old streaming lib
    136             opts.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_GUARANTEED);
     136        //    opts.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_GUARANTEED);
    137137            //opts.setProperty("tunnels.depthInbound", "0");
    138         } else {
     138        //} else {
    139139            // for new streaming lib:
    140             opts.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
     140            //opts.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
     141            // as of 0.8.1 (I2CP default is BestEffort)
     142            if (!opts.containsKey(I2PClient.PROP_RELIABILITY))
     143                opts.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_NONE);
    141144            //p.setProperty("tunnels.depthInbound", "0");
    142         }
     145        //}
    143146
    144147        if (i2cpHost != null)
  • apps/routerconsole/java/build.xml

    r6cd645b r8db45ff  
    114114        <!-- Don't include the css in the war, the main build.xml will copy it to docs/themes/console/ -->
    115115        <war destfile="build/routerconsole.war" webxml="../jsp/web-out.xml"
    116              basedir="../jsp/" excludes="web.xml, *.css, **/*.java, *.jsp, *.jsi, web-fragment.xml">
     116             basedir="../jsp/" excludes="web.xml, *.css, **/*.java, *.jsp, *.jsi, web-fragment.xml, web-out.xml">
    117117        </war>
    118118    </target>
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java

    r6cd645b r8db45ff  
    1818    private String _dateFormat;
    1919    private String _fileSize;
     20    private String _newLogClass;
     21    private String _newLogLevel = "WARN";
    2022   
    2123    @Override
     
    2729        }
    2830    }
    29    
     31
    3032    public void setShouldsave(String moo) { _shouldSave = true; }
    3133   
     
    4850        _fileSize = (size != null ? size.trim() : null);
    4951    }
     52
     53    /** @since 0.8.1 */
     54    public void setNewlogclass(String s) {
     55        if (s != null && s.length() > 0)
     56            _newLogClass = s;
     57    }
     58   
     59    /** @since 0.8.1 */
     60    public void setNewloglevel(String s) {
     61        if (s != null)
     62            _newLogLevel = s;
     63    }
    5064   
    5165    /**
     
    5771        boolean shouldSave = false;
    5872       
    59         if (_levels != null) {
     73        if (_levels != null || _newLogClass != null) {
    6074            try {
    6175                Properties props = new Properties();
    62                 props.load(new ByteArrayInputStream(_levels.getBytes()));
     76                if (_levels != null)
     77                    props.load(new ByteArrayInputStream(_levels.getBytes()));
     78                if (_newLogClass != null)
     79                    props.setProperty(_newLogClass, _newLogLevel);
    6380                _context.logManager().setLimits(props);
    6481                shouldSave = true;
    65                 addFormNotice("Log limits updated");
     82                addFormNotice(_("Log overrides updated"));
    6683            } catch (IOException ioe) {
     84                // shouldn't ever happen (BAIS shouldnt cause an IOE)
    6785                _context.logManager().getLog(ConfigLoggingHandler.class).error("Error reading from the props?", ioe);
    6886                addFormError("Error updating the log limits - levels not valid");
     
    84102        }
    85103       
    86         if (_dateFormat != null) {
     104        if (_dateFormat != null && !_dateFormat.equals(_context.logManager().getDateFormatPattern())) {
    87105            boolean valid = _context.logManager().setDateFormat(_dateFormat);
    88106            if (valid) {
     
    140158
    141159            if (saved)
    142                 addFormNotice("Log configuration saved and applied successfully");
     160                addFormNotice(_("Log configuration saved"));
    143161            else
    144162                addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs");
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java

    r6cd645b r8db45ff  
    11package net.i2p.router.web;
    22
     3import java.util.List;
    34import java.util.Iterator;
    45import java.util.Properties;
     6import java.util.Set;
    57import java.util.TreeSet;
    68
     9import net.i2p.data.DataHelper;
     10import net.i2p.util.Log;
    711
    812public class ConfigLoggingHelper extends HelperBase {
     
    2024    public String getMaxFileSize() {
    2125        int bytes = _context.logManager().getFileSize();
    22         if (bytes == 0) return "1m";
    23         if (bytes > 1024*1024*1024)
    24             return (bytes/(1024*1024*1024)) + "g";
    25         else if (bytes > 1024*1024)
    26             return (bytes/(1024*1024)) + "m";
    27         else
    28             return (bytes/(1024)) + "k";
     26        if (bytes <= 0) return "1.00 MB";
     27        return DataHelper.formatSize2(bytes) + 'B';
    2928    }
    3029    public String getLogLevelTable() {
    3130        StringBuilder buf = new StringBuilder(32*1024);
    3231        Properties limits = _context.logManager().getLimits();
    33         TreeSet sortedLogs = new TreeSet();
     32        TreeSet<String> sortedLogs = new TreeSet();
    3433        for (Iterator iter = limits.keySet().iterator(); iter.hasNext(); ) {
    3534            String prefix = (String)iter.next();
     
    4746        buf.append("<i>" + _("Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN") + "</i><br>");
    4847        buf.append("<i>" + _("Valid levels are DEBUG, INFO, WARN, ERROR, CRIT") + "</i>\n");
     48
     49      /****
     50        // this is too big and ugly
     51        if (limits.size() <= 0)
     52            return "";
     53        buf.append("<table>");
     54        for (String prefix : sortedLogs) {
     55            buf.append("<tr><td>").append(prefix).append("</td><td>");
     56            String level = limits.getProperty(prefix);
     57            buf.append(getLogLevelBox("level-" + prefix, level, true)).append("</td></tr>");
     58        }
     59        buf.append("</table>");
     60       ****/
     61
    4962        return buf.toString();
    5063    }
     
    5467    public String getDefaultLogLevelBox() {
    5568        String cur = _context.logManager().getDefaultLimit();
     69        return getLogLevelBox("defaultloglevel", cur, false);
     70    }
     71
     72    private String getLogLevelBox(String name, String cur, boolean showRemove) {
    5673        StringBuilder buf = new StringBuilder(128);
    57         buf.append("<select name=\"defaultloglevel\">\n");
     74        buf.append("<select name=\"").append(name).append("\">\n");
    5875       
    5976        for (int i = 0; i < levels.length; i++) {
    6077            String l = levels[i];
    61             buf.append("<option value=\"").append(l).append("\" ");
     78            buf.append("<option value=\"").append(l).append('\"');
    6279            if (l.equals(cur))
    63                 buf.append(" selected=\"true\" ");
     80                buf.append(" selected=\"true\"");
    6481            buf.append('>').append(_(l)).append("</option>\n");
    6582        }       
    6683       
     84        if (showRemove)
     85            buf.append("<option value=\"remove\">").append(_("Remove")).append("</option>");
    6786        buf.append("</select>\n");
    6887        return buf.toString();
    6988    }
     89
     90    /**
     91     *  All the classes the log manager knows about, except ones that
     92     *  already have overrides
     93     *  @since 0.8.1
     94     */
     95    public String getNewClassBox() {
     96        List<Log> logs = _context.logManager().getLogs();
     97        Set limits = _context.logManager().getLimits().keySet();
     98        TreeSet<String> sortedLogs = new TreeSet();
     99
     100        for (Log log : logs) {
     101            String name = log.getName();
     102            if (!limits.contains(name))
     103                sortedLogs.add(name);
     104
     105            // add higher classes of length 3 or more
     106            int dots = 0;
     107            int lastdot = -1;
     108            int nextdot = 0;
     109            while ((nextdot = name.indexOf('.', lastdot + 1)) > 0) {
     110                if (++dots >= 3) {
     111                    String subst = name.substring(0, nextdot);
     112                    if (!limits.contains(subst))
     113                        sortedLogs.add(subst);
     114                }
     115                lastdot = nextdot;
     116            }
     117        }
     118
     119        StringBuilder buf = new StringBuilder(65536);
     120        buf.append("<select name=\"newlogclass\">\n" +
     121                   "<option value=\"\" selected=\"true\">")
     122           .append(_("Select a class to add"))
     123           .append("</option>\n");
     124
     125        for (String l : sortedLogs) {
     126            buf.append("<option value=\"").append(l).append("\">")
     127               .append(l).append("</option>\n");
     128        }       
     129       
     130        buf.append("</select>\n");
     131        buf.append(getLogLevelBox("newloglevel", "WARN", false));
     132        return buf.toString();
     133    }
    70134}
  • apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java

    r6cd645b r8db45ff  
    4545    ******/
    4646
    47     private String formatMessages(List msgs) {
     47    /** formats in reverse order */
     48    private String formatMessages(List<String> msgs) {
     49        if (msgs.isEmpty())
     50            return "<p><i>" + _("No log messages") + "</i></p>";
    4851        boolean colorize = Boolean.valueOf(_context.getProperty("routerconsole.logs.color")).booleanValue();
    4952        StringBuilder buf = new StringBuilder(16*1024);
     
    5154        buf.append("<code>\n");
    5255        for (int i = msgs.size(); i > 0; i--) {
    53             String msg = (String)msgs.get(i - 1);
     56            String msg = msgs.get(i - 1);
    5457            buf.append("<li>");
    5558            if (colorize) {
  • apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java

    r6cd645b r8db45ff  
    2020import java.util.List;
    2121import java.util.Locale;
     22import java.util.Map;
     23import java.util.Properties;
    2224import java.util.Set;
    2325import java.util.TreeSet;
     
    3537import net.i2p.util.HexDump;                             // debug
    3638import net.i2p.util.ObjectCounter;
     39import net.i2p.util.OrderedProperties;
    3740import net.i2p.util.VersionComparator;
    3841
     
    372375            if (!((style.equals("SSU") && cost == 5) || (style.equals("NTCP") && cost == 10)))
    373376                buf.append('[').append(_("cost")).append('=').append("" + cost).append("] ");
    374             for (Iterator optIter = addr.getOptions().keySet().iterator(); optIter.hasNext(); ) {
    375                 String name = (String)optIter.next();
    376                 String val = addr.getOptions().getProperty(name);
     377            Properties p = new OrderedProperties();
     378            p.putAll(addr.getOptions());
     379            for (Map.Entry e : p.entrySet()) {
     380                String name = (String) e.getKey();
     381                String val = (String) e.getValue();
    377382                buf.append('[').append(_(DataHelper.stripHTML(name))).append('=').append(DataHelper.stripHTML(val)).append("] ");
    378383            }
  • apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java

    r6cd645b r8db45ff  
    564564     *  http://jimlife.wordpress.com/2007/12/19/java-adding-new-classpath-at-runtime/
    565565     */
    566     public static void addPath(URL u) throws Exception {
     566    private static void addPath(URL u) throws Exception {
    567567        URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
    568568        Class urlClass = URLClassLoader.class;
  • apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java

    r6cd645b r8db45ff  
    1717import net.i2p.util.Log;
    1818import net.i2p.util.OrderedProperties;
     19import net.i2p.util.SecureDirectory;
    1920import net.i2p.util.SimpleScheduler;
    2021import net.i2p.util.SimpleTimer;
     
    151152            updateStatus("<b>" + _("Plugin downloaded") + "</b>");
    152153            File f = new File(_updateFile);
    153             File appDir = new File(_context.getConfigDir(), PLUGIN_DIR);
     154            File appDir = new SecureDirectory(_context.getConfigDir(), PLUGIN_DIR);
    154155            if ((!appDir.exists()) && (!appDir.mkdir())) {
    155156                f.delete();
     
    274275            }
    275276
    276             File destDir = new File(appDir, appName);
     277            File destDir = new SecureDirectory(appDir, appName);
    277278            if (destDir.exists()) {
    278279                if (Boolean.valueOf(props.getProperty("install-only")).booleanValue()) {
  • apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java

    r6cd645b r8db45ff  
    1515import net.i2p.util.FileUtil;
    1616import net.i2p.util.I2PAppThread;
     17import net.i2p.util.SecureDirectory;
    1718
    1819import org.mortbay.http.DigestAuthenticator;
     
    6364   
    6465    public void startConsole() {
    65         File workDir = new File(I2PAppContext.getGlobalContext().getTempDir(), "jetty-work");
     66        File workDir = new SecureDirectory(I2PAppContext.getGlobalContext().getTempDir(), "jetty-work");
    6667        boolean workDirRemoved = FileUtil.rmdir(workDir, false);
    6768        if (!workDirRemoved)
     
    116117            _server.setRootWebApp(ROUTERCONSOLE);
    117118            WebApplicationContext wac = _server.addWebApplication("/", _webAppsDir + ROUTERCONSOLE + ".war");
    118             File tmpdir = new File(workDir, ROUTERCONSOLE + "-" + _listenPort);
     119            File tmpdir = new SecureDirectory(workDir, ROUTERCONSOLE + "-" + _listenPort);
    119120            tmpdir.mkdir();
    120121            wac.setTempDirectory(tmpdir);
     
    131132                        if (! "false".equals(enabled)) {
    132133                            String path = new File(dir, fileNames[i]).getCanonicalPath();
    133                             tmpdir = new File(workDir, appName + "-" + _listenPort);
     134                            tmpdir = new SecureDirectory(workDir, appName + "-" + _listenPort);
    134135                            WebAppStarter.addWebApp(I2PAppContext.getGlobalContext(), _server, appName, path, tmpdir);
    135136
  • apps/routerconsole/java/src/net/i2p/router/web/WebAppStarter.java

    r6cd645b r8db45ff  
    1111import net.i2p.I2PAppContext;
    1212import net.i2p.util.FileUtil;
     13import net.i2p.util.SecureDirectory;
    1314
    1415import org.mortbay.http.HttpContext;
     
    4243     */
    4344    static void startWebApp(I2PAppContext ctx, Server server, String appName, String warPath) throws Exception {
    44          File tmpdir = new File(ctx.getTempDir(), "jetty-work-" + appName + ctx.random().nextInt());
     45         File tmpdir = new SecureDirectory(ctx.getTempDir(), "jetty-work-" + appName + ctx.random().nextInt());
    4546         WebApplicationContext wac = addWebApp(ctx, server, appName, warPath, tmpdir);
    4647         wac.start();
     
    7475        } else if (oldmod.longValue() < newmod) {
    7576            // copy war to temporary directory
    76             File warTmpDir = new File(ctx.getTempDir(), "war-copy-" + appName + ctx.random().nextInt());
     77            File warTmpDir = new SecureDirectory(ctx.getTempDir(), "war-copy-" + appName + ctx.random().nextInt());
    7778            warTmpDir.mkdir();
    7879            String tmpPath = (new File(warTmpDir, appName + ".war")).getAbsolutePath();
  • apps/routerconsole/jsp/configlogging.jsp

    r6cd645b r8db45ff  
    4747        </tr><tr><td class="mediumtags" align="right"><b><%=intl._("Log level overrides")%>:</b></td>
    4848          <td><jsp:getProperty name="logginghelper" property="logLevelTable" /></td>
     49        </tr><tr><td class="mediumtags" align="right"><b><%=intl._("New override")%>:</b></td>
     50          <td><jsp:getProperty name="logginghelper" property="newClassBox" /></td>
    4951        </tr><tr><td colspan="2"><hr></td>
    5052        </tr><tr class="tablefooter"><td colspan="2"> <div class="formaction">
  • apps/routerconsole/locale/messages_zh.po

    r6cd645b r8db45ff  
    99"Project-Id-Version: I2P routerconsole\n"
    1010"Report-Msgid-Bugs-To: \n"
    11 "POT-Creation-Date: 2010-04-29 14:53+0000\n"
     11"POT-Creation-Date: 2010-10-04 02:45+0000\n"
    1212"PO-Revision-Date: \n"
    1313"Last-Translator: walking <walking@mail.i2p>\n"
     
    2929msgstr "已按路由 HASH 封杀"
    3030
     31#. Temporary reason, until the job finishes
    3132#: ../../../router/java/src/net/i2p/router/Blocklist.java:673
    3233msgid "IP banned"
     
    4647msgstr "拒绝共享:高消息延迟"
    4748
     49#. hard to do {0} from here
     50#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests");
    4851#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177
    4952msgid "Rejecting most tunnels: High number of requests"
     
    5457msgstr "拒绝共享:隧道数限额"
    5558
     59#. .067KBps
     60#. * also limited to 90% - see below
     61#. always leave at least 4KBps free when allowing
    5662#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301
    5763msgid "Rejecting tunnels: Bandwidth limit"
    5864msgstr "拒绝共享:带宽限额"
    5965
     66#. hard to do {0} from here
     67#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit");
    6068#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:371
    6169msgid "Rejecting most tunnels: Bandwidth limit"
    6270msgstr "收紧共享:带宽限额"
    6371
     72#. hard to do {0} from here
     73#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels");
    6474#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:375
    6575msgid "Accepting most tunnels"
     
    7080msgstr "接收共享隧道"
    7181
     82#. NPE, too early
     83#. if (_context.router().getRouterInfo().getBandwidthTier().equals("K"))
     84#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low");
     85#. else
    7286#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:487
    7387msgid "Rejecting tunnels"
    7488msgstr "拒绝参与共享隧道"
    7589
    76 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:49
     90#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:48
    7791msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
    7892msgstr "请保证HTTP通信没有受阻,检查 <a target=\"_top\" href=\"logs.jsp\">日志</a> ,如果问题仍无法解决,请参照 <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> 进行手动补种。"
    7993
    80 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:81
     94#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:80
    8195msgid "Reseeding"
    8296msgstr "正在补种(引导网络启动)..."
    8397
    84 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:145
     98#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:144
    8599msgid "Reseeding: fetching seed URL."
    86100msgstr "正在补种:获取补种连接..."
    87101
    88 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:151
     102#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150
    89103msgid "Last reseed failed fully (failed reading seed URL)."
    90104msgstr "上次补种尝试失败(读取补种URL失败)。"
    91105
    92 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:177
     106#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:176
    93107msgid "Last reseed failed fully (no routerInfo URLs at seed URL)."
    94108msgstr "上次补种尝试失败(补种服务器未返回任何路由信息URL)。"
    95109
    96 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:190
     110#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:189
    97111#, java-format
    98112msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
    99113msgstr "正在补种:从补种服务器获取路由信息({0}成功,{1}失败)。"
    100114
    101 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:211
     115#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:210
    102116#, java-format
    103117msgid "Last reseed failed partly ({0}% of {1})."
    104118msgstr "上次补种部分失败({0}%失败,共{1})"
    105119
    106 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:216
     120#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:215
    107121#, java-format
    108122msgid "Last reseed failed ({0}% of {1})."
    109123msgstr "上次补种失败({0}%失败,共{1})"
    110124
    111 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:226
     125#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:225
    112126msgid "Last reseed failed fully (exception caught)."
    113127msgstr "上次补种失败(exception caught)."
    114128
    115 #: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:498
     129#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:510
    116130msgid "NetDb entry"
    117131msgstr "NetDb 项目"
    118132
     133#. This used to be "no common transports" but it is almost always no transports at all
    119134#: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:70
    120135msgid "No transports (hidden or starting up?)"
     
    125140msgstr "各传输方式均不可达"
    126141
    127 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:503
     142#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:508
    128143msgid "Router Transport Addresses"
    129144msgstr "路由传输地址"
    130145
    131 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:509
     146#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:514
    132147#, java-format
    133148msgid "{0} is used for outbound connections only"
    134149msgstr "{0} 仅被用作出站连接"
    135150
    136 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:380
    137 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:594
    138 #, java-format
    139 msgid "Excessive clock skew: {0}"
    140 msgstr "严重时滞:{0}"
    141 
    142 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:691
    143 msgid "NTCP connections"
    144 msgstr "NTCP连接"
    145 
    146 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:692
    147 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1879
    148 msgid "Limit"
    149 msgstr "限制"
    150 
    151 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:693
    152 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1880
    153 msgid "Timeout"
    154 msgstr "超时"
    155 
    156 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:696
    157 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1883
    158 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2146
     151#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
     152#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
     153msgid "Definitions"
     154msgstr "定义"
     155
     156#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
     157#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:715
     158#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
    159159#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
    160160#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
     
    162162#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
    163163#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
    164 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:235
     164#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
    165165msgid "Peer"
    166166msgstr "节点"
    167167
    168 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:697
    169 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
    170 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2147
     168#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
     169msgid "The remote peer, identified by router hash"
     170msgstr "以路由Hash区分的远程节点"
     171
     172#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
     173#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:716
     174#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889
    171175msgid "Dir"
    172176msgstr "类别"
    173177
    174 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:698
    175 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1888
    176 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2155
     178#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531
     179msgid "Inbound connection"
     180msgstr "进站连接"
     181
     182#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
     183msgid "Outbound connection"
     184msgstr "出站连接"
     185
     186#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
     187msgid "They offered to introduce us (help other peers traverse our firewall)"
     188msgstr "对方节点为中继帮助我方穿越防火墙"
     189
     190#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
     191msgid "We offered to introduce them (help other peers traverse their firewall)"
     192msgstr "我方为中继帮助其他节点穿越防火墙"
     193
     194#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
     195msgid "How long since a packet has been received / sent"
     196msgstr "最近一次数据传输距现在的时间"
     197
     198#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
     199#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:717
     200#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
    177201msgid "Idle"
    178202msgstr "空闲"
    179203
    180 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:699
    181 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893
    182 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2156
     204#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
     205#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:718
     206#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
    183207#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
    184208msgid "In/Out"
    185209msgstr "入/出"
    186210
    187 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:700
    188 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
    189 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2157
     211#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
     212msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
     213msgstr "进/出站平滑传输率(Kbyte/s)"
     214
     215#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
     216msgid "How long ago this connection was established"
     217msgstr "连接建立时间"
     218
     219#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
     220#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719
     221#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
    190222msgid "Up"
    191223msgstr "寿命"
    192224
    193 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:701
    194 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
    195 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2158
     225#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
     226#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:720
     227#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902
    196228msgid "Skew"
    197229msgstr "时滞"
    198230
    199 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:702
    200 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
    201 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2168
     231#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
     232msgid "The difference between the peer's clock and your own"
     233msgstr "节点与本地时钟间的时滞"
     234
     235#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
     236msgid "The congestion window, which is how many bytes can be sent without an acknowledgement"
     237msgstr "拥塞窗口,即每次确认前可发送的字节量"
     238
     239#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
     240msgid "The number of sent messages awaiting acknowledgement"
     241msgstr "等待确认的已发送数据包数量"
     242
     243#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
     244msgid "The maximum number of concurrent messages to send"
     245msgstr "并发消息的最大发送量"
     246
     247#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
     248msgid "The number of pending sends which exceed congestion window"
     249msgstr "超过拥塞窗口的待发送数量"
     250
     251#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
     252msgid "The slow start threshold"
     253msgstr "慢启动门槛"
     254
     255#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
     256msgid "The round trip time in milliseconds"
     257msgstr "往返时间单位毫秒"
     258
     259#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
     260#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1912
     261msgid "Dev"
     262msgstr "偏差"
     263
     264#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
     265msgid "The standard deviation of the round trip time in milliseconds"
     266msgstr "环行时间的标准差单位毫秒"
     267
     268#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
     269msgid "The retransmit timeout in milliseconds"
     270msgstr "重传输超时时间单位毫秒"
     271
     272#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
     273msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)"
     274msgstr "当前发送数据包的最大大小/预计接收数据包的最大大小(字节)"
     275
     276#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
     277#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721
     278#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1919
    202279msgid "TX"
    203280msgstr "发包"
    204281
    205 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:703
    206 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1919
    207 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2169
     282#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
     283msgid "The total number of packets sent to the peer"
     284msgstr "向节点发送的数据包总量"
     285
     286#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552
     287#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:722
     288#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921
    208289msgid "RX"
    209290msgstr "接包"
    210291
    211 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:704
     292#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552
     293msgid "The total number of packets received from the peer"
     294msgstr "从节点接收到数据包总量"
     295
     296#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:553
     297#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
     298msgid "Dup TX"
     299msgstr "重发包"
     300
     301#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:553
     302msgid "The total number of packets retransmitted to the peer"
     303msgstr "向节点发送的重复数据包总量"
     304
     305#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:554
     306#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
     307msgid "Dup RX"
     308msgstr "重接包"
     309
     310#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:554
     311msgid "The total number of duplicate packets received from the peer"
     312msgstr "从节点接收到的重复数据包总量"
     313
     314#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:409
     315#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:627
     316#, java-format
     317msgid "Excessive clock skew: {0}"
     318msgstr "严重时滞:{0}"
     319
     320#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:710
     321msgid "NTCP connections"
     322msgstr "NTCP连接"
     323
     324#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:711
     325#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1881
     326msgid "Limit"
     327msgstr "限制"
     328
     329#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:712
     330#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1882
     331msgid "Timeout"
     332msgstr "超时"
     333
     334#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:723
    212335msgid "Out Queue"
    213336msgstr "出队"
    214337
    215 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:705
     338#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:724
    216339msgid "Backlogged?"
    217340msgstr "积压?"
    218341
    219 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719
    220 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1942
     342#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
     343#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1944
    221344#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
    222345msgid "Inbound"
    223346msgstr "入站"
    224347
    225 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721
    226 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1944
     348#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
     349#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1946
    227350#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
    228351msgid "Outbound"
    229352msgstr "出站"
    230353
    231 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:768
     354#. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
     355#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:787
    232356msgid "peers"
    233357msgstr "节点"
    234358
    235 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1878
     359#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1880
    236360msgid "UDP connections"
    237361msgstr "UDP连接"
    238362
    239 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
     363#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
    240364msgid "Sort by peer hash"
    241365msgstr "按节点Hash"
    242366
    243 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
     367#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889
    244368msgid "Direction/Introduction"
    245369msgstr "方向"
    246370
    247 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889
     371#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891
    248372msgid "Sort by idle inbound"
    249373msgstr "出站空闲"
    250374
    251 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891
     375#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893
    252376msgid "Sort by idle outbound"
    253377msgstr "入站空闲"
    254378
    255 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
     379#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
    256380msgid "Sort by inbound rate"
    257381msgstr "按入站速度"
    258382
    259 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
     383#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
    260384msgid "Sort by outbound rate"
    261385msgstr "按出站速度"
    262386
    263 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1899
     387#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
    264388msgid "Sort by connection uptime"
    265389msgstr "按连接时间"
    266390
    267 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
     391#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
    268392msgid "Sort by clock skew"
    269393msgstr "按时滞"
    270394
    271 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904
     395#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
    272396msgid "Sort by congestion window"
    273397msgstr "按拥塞窗口"
    274398
    275 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
     399#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
    276400msgid "Sort by slow start threshold"
    277401msgstr "按启动门槛"
    278402
    279 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1909
     403#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
    280404msgid "Sort by round trip time"
    281405msgstr "按往返时间"
    282406
    283 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1910
    284 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2165
    285 msgid "Dev"
    286 msgstr "偏差"
    287 
    288 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
     407#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
    289408msgid "Sort by round trip time deviation"
    290409msgstr "按RTT偏差"
    291410
    292 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
     411#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915
    293412msgid "Sort by retransmission timeout"
    294413msgstr "按重传输超时时间"
    295414
    296 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
     415#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
    297416msgid "Sort by outbound maximum transmit unit"
    298417msgstr "按出站最大传输单元"
    299418
    300 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
     419#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
    301420msgid "Sort by packets sent"
    302421msgstr "按已发送数据包"
    303422
    304 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
     423#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922
    305424msgid "Sort by packets received"
    306425msgstr "按已接收数据包"
    307426
    308 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922
    309 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2170
    310 msgid "Dup TX"
    311 msgstr "重发包"
    312 
    313 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
     427#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
    314428msgid "Sort by packets retransmitted"
    315429msgstr "按重传数据包"
    316430
    317 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
    318 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2171
    319 msgid "Dup RX"
    320 msgstr "重接包"
    321 
    322 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
     431#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
    323432msgid "Sort by packets received more than once"
    324433msgstr "按重复数据包"
    325434
    326 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1946
     435#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1948
    327436msgid "We offered to introduce them"
    328437msgstr "中继客户"
    329438
    330 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1948
     439#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950
    331440msgid "They offered to introduce us"
    332441msgstr "中继"
    333442
    334 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1952
     443#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1954
    335444msgid "Choked"
    336445msgstr ""
    337446
    338 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1957
    339 msgid "fail(s)"
    340 msgstr "失败"
    341 
    342447#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1962
     448msgid "1 fail"
     449msgstr "失败 1 次"
     450
     451#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1964
     452#, java-format
     453msgid "{0} fails"
     454msgstr "失败 {0} 次"
     455
     456#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1970
    343457#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
    344458msgid "Banned"
    345459msgstr "已封锁"
    346460
    347 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2094
     461#. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
     462#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2102
    348463msgid "SUMMARY"
    349464msgstr "总结"
    350 
    351 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2145
    352 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
    353 msgid "Definitions"
    354 msgstr "定义"
    355 
    356 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2146
    357 msgid "The remote peer, identified by router hash"
    358 msgstr "以路由Hash区分的远程节点"
    359 
    360 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2148
    361 msgid "Inbound connection"
    362 msgstr "进站连接"
    363 
    364 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2150
    365 msgid "Outbound connection"
    366 msgstr "出站连接"
    367 
    368 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2152
    369 msgid "They offered to introduce us (help other peers traverse our firewall)"
    370 msgstr "对方节点为中继帮助我方穿越防火墙"
    371 
    372 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2154
    373 msgid "We offered to introduce them (help other peers traverse their firewall)"
    374 msgstr "我方为中继帮助其他节点穿越防火墙"
    375 
    376 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2155
    377 msgid "How long since a packet has been received / sent"
    378 msgstr "最近一次数据传输距现在的时间"
    379 
    380 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2156
    381 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
    382 msgstr "进/出站平滑传输率(Kbyte/s)"
    383 
    384 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2157
    385 msgid "How long ago this connection was established"
    386 msgstr "连接建立时间"
    387 
    388 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2158
    389 msgid "The difference between the peer's clock and your own"
    390 msgstr "节点与本地时钟间的时滞"
    391 
    392 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2159
    393 msgid "The congestion window, which is how many bytes can be sent without an acknowledgement"
    394 msgstr "拥塞窗口,即每次确认前可发送的字节量"
    395 
    396 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2160
    397 msgid "The number of sent messages awaiting acknowledgement"
    398 msgstr "等待确认的已发送数据包数量"
    399 
    400 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2161
    401 msgid "The maximum number of concurrent messages to send"
    402 msgstr "并发消息的最大发送量"
    403 
    404 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2162
    405 msgid "The number of pending sends which exceed congestion window"
    406 msgstr "超过拥塞窗口的待发送数量"
    407 
    408 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2163
    409 msgid "The slow start threshold"
    410 msgstr "慢启动门槛"
    411 
    412 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2164
    413 msgid "The round trip time in milliseconds"
    414 msgstr "往返时间单位毫秒"
    415 
    416 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2165
    417 msgid "The standard deviation of the round trip time in milliseconds"
    418 msgstr "环行时间的标准差单位毫秒"
    419 
    420 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2166
    421 msgid "The retransmit timeout in milliseconds"
    422 msgstr "重传输超时时间单位毫秒"
    423 
    424 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2167
    425 msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)"
    426 msgstr "当前发送数据包的最大大小/预计接收数据包的最大大小(字节)"
    427 
    428 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2168
    429 msgid "The total number of packets sent to the peer"
    430 msgstr "向节点发送的数据包总量"
    431 
    432 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2169
    433 msgid "The total number of packets received from the peer"
    434 msgstr "从节点接收到数据包总量"
    435 
    436 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2170
    437 msgid "The total number of packets retransmitted to the peer"
    438 msgstr "向节点发送的重复数据包总量"
    439 
    440 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2171
    441 msgid "The total number of duplicate packets received from the peer"
    442 msgstr "从节点接收到的重复数据包总量"
    443465
    444466#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145
     
    446468msgstr "忽略共享请求:速度太慢"
    447469
     470#. don't even bother, since we are so overloaded locally
    448471#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352
    449472msgid "Dropping tunnel requests: Overloaded"
    450473msgstr "忽略共享请求:路由过载"
    451474
    452 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:523
     475#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525
    453476msgid "Rejecting tunnels: Request overload"
    454477msgstr "拒绝共享:请求过多"
    455478
    456 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:548
     479#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550
    457480msgid "Rejecting tunnels: Connection limit"
    458481msgstr "拒绝共享:连接受限"
    459482
    460 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:742
     483#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744
    461484msgid "Dropping tunnel requests: High load"
    462485msgstr "忽略共享请求:高负载"
    463486
    464 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:751
     487#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753
    465488msgid "Dropping tunnel requests: Queue time"
    466489msgstr "忽略共享请求:队列积压"
    467490
     491#. Automatically generated pseudo-java for xgettext - do not edit
     492#. Translators may wish to translate a few of these, do not bother to translate all of them!!
    468493#: ../java/build/Countries.java:3
    469494msgid "Andorra"
     
    526551msgstr "阿鲁巴"
    527552
    528 #: ../java/build/Countries.java:19
     553#: ../java/build/Countries.java:18
    529554msgid "Azerbaijan"
    530555msgstr "阿塞拜疆"
    531556
    532 #: ../java/build/Countries.java:20
     557#: ../java/build/Countries.java:19
    533558msgid "Bosnia and Herzegovina"
    534559msgstr "波黑"
    535560
    536 #: ../java/build/Countries.java:21
     561#: ../java/build/Countries.java:20
    537562msgid "Barbados"
    538563msgstr "巴巴多斯"
    539564
    540 #: ../java/build/Countries.java:22
     565#: ../java/build/Countries.java:21
    541566msgid "Bangladesh"
    542567msgstr "孟加拉"
    543568
    544 #: ../java/build/Countries.java:23
     569#: ../java/build/Countries.java:22
    545570msgid "Belgium"
    546571msgstr "比利时"
    547572
    548 #: ../java/build/Countries.java:24
     573#: ../java/build/Countries.java:23
    549574msgid "Burkina Faso"
    550575msgstr "布基纳法索"
    551576
    552 #: ../java/build/Countries.java:25
     577#: ../java/build/Countries.java:24
    553578msgid "Bulgaria"
    554579msgstr "保加利亚"
    555580
    556 #: ../java/build/Countries.java:26
     581#: ../java/build/Countries.java:25
    557582msgid "Bahrain"
    558583msgstr "巴林"
    559584
    560 #: ../java/build/Countries.java:27
     585#: ../java/build/Countries.java:26
    561586msgid "Burundi"
    562587msgstr "不丹"
    563588
    564 #: ../java/build/Countries.java:28
     589#: ../java/build/Countries.java:27
    565590msgid "Benin"
    566591msgstr "贝宁"
    567592
    568 #: ../java/build/Countries.java:29
     593#: ../java/build/Countries.java:28
    569594msgid "Bermuda"
    570595msgstr "百慕大"
    571596
    572 #: ../java/build/Countries.java:30
     597#: ../java/build/Countries.java:29
    573598msgid "Brunei Darussalam"
    574599msgstr "文莱达鲁萨兰"
    575600
    576 #: ../java/build/Countries.java:31
     601#: ../java/build/Countries.java:30
    577602msgid "Bolivia"
    578603msgstr "玻利维亚"
    579604
    580 #: ../java/build/Countries.java:32
     605#: ../java/build/Countries.java:31
    581606msgid "Brazil"
    582607msgstr "巴西"
    583608
    584 #: ../java/build/Countries.java:33
     609#: ../java/build/Countries.java:32
    585610msgid "Bahamas"
    586611msgstr "巴哈马"
    587612
    588 #: ../java/build/Countries.java:34
     613#: ../java/build/Countries.java:33
    589614msgid "Bhutan"
    590615msgstr "不丹"
    591616
    592 #: ../java/build/Countries.java:35
     617#: ../java/build/Countries.java:34
    593618msgid "Bouvet Island"
    594619msgstr "布韦群岛"
    595620
    596 #: ../java/build/Countries.java:36
     621#: ../java/build/Countries.java:35
    597622msgid "Botswana"
    598623msgstr "伯兹瓦纳"
    599624
    600 #: ../java/build/Countries.java:37
     625#: ../java/build/Countries.java:36
    601626msgid "Belarus"
    602627msgstr "白俄罗斯"
    603628
    604 #: ../java/build/Countries.java:38
     629#: ../java/build/Countries.java:37
    605630msgid "Belize"
    606631msgstr "伯利兹"
    607632
    608 #: ../java/build/Countries.java:39
     633#: ../java/build/Countries.java:38
    609634msgid "Canada"
    610635msgstr "加拿大"
    611636
    612 #: ../java/build/Countries.java:40
     637#: ../java/build/Countries.java:39
    613638msgid "The Democratic Republic of the Congo"
    614639msgstr "刚果"
    615640
    616 #: ../java/build/Countries.java:41
     641#: ../java/build/Countries.java:40
    617642msgid "Central African Republic"
    618643msgstr "中非"
    619644
    620 #: ../java/build/Countries.java:42
     645#: ../java/build/Countries.java:41
    621646msgid "Congo"
    622647msgstr "Congo"
    623648
    624 #: ../java/build/Countries.java:43
     649#: ../java/build/Countries.java:42
    625650msgid "Switzerland"
    626651msgstr "瑞士"
    627652
    628 #: ../java/build/Countries.java:44
     653#: ../java/build/Countries.java:43
    629654msgid "Cote D'Ivoire"
    630655msgstr "象牙海岸"
    631656
    632 #: ../java/build/Countries.java:45
     657#: ../java/build/Countries.java:44
    633658msgid "Cook Islands"
    634659msgstr "库克群岛"
    635660
    636 #: ../java/build/Countries.java:46
     661#: ../java/build/Countries.java:45
    637662msgid "Chile"
    638663msgstr "智利"
    639664
    640 #: ../java/build/Countries.java:47
     665#: ../java/build/Countries.java:46
    641666msgid "Cameroon"
    642667msgstr "喀麦隆"
    643668
    644 #: ../java/build/Countries.java:48
     669#: ../java/build/Countries.java:47
    645670msgid "China"
    646671msgstr "中国"
    647672
    648 #: ../java/build/Countries.java:49
     673#: ../java/build/Countries.java:48
    649674msgid "Colombia"
    650675msgstr "哥伦比亚"
    651676
    652 #: ../java/build/Countries.java:50
     677#: ../java/build/Countries.java:49
    653678msgid "Costa Rica"
    654679msgstr "哥斯达黎加"
    655680
    656 #: ../java/build/Countries.java:51
     681#: ../java/build/Countries.java:50
    657682msgid "Serbia and Montenegro"
    658683msgstr "塞尔维亚与黑山"
    659684
    660 #: ../java/build/Countries.java:52
     685#: ../java/build/Countries.java:51
    661686msgid "Cuba"
    662687msgstr "古巴"
    663688
    664 #: ../java/build/Countries.java:53
     689#: ../java/build/Countries.java:52
    665690msgid "Cape Verde"
    666691msgstr "佛得角"
    667692
    668 #: ../java/build/Countries.java:54
     693#: ../java/build/Countries.java:53
    669694msgid "Cyprus"
    670695msgstr "塞浦路斯"
    671696
    672 #: ../java/build/Countries.java:55
     697#: ../java/build/Countries.java:54
    673698msgid "Czech Republic"
    674699msgstr "捷克"
    675700
    676 #: ../java/build/Countries.java:56
     701#: ../java/build/Countries.java:55
    677702msgid "Germany"
    678703msgstr "德国"
    679704
    680 #: ../java/build/Countries.java:57
     705#: ../java/build/Countries.java:56
    681706msgid "Djibouti"
    682707msgstr "吉布提"
    683708
    684 #: ../java/build/Countries.java:58
     709#: ../java/build/Countries.java:57
    685710msgid "Denmark"
    686711msgstr "丹麦"
    687712
    688 #: ../java/build/Countries.java:59
     713#: ../java/build/Countries.java:58
    689714msgid "Dominica"
    690715msgstr "多米尼"
    691716
    692 #: ../java/build/Countries.java:60
     717#: ../java/build/Countries.java:59
    693718msgid "Dominican Republic"
    694719msgstr "多米尼加联邦"
    695720
    696 #: ../java/build/Countries.java:61
     721#: ../java/build/Countries.java:60
    697722msgid "Algeria"
    698723msgstr "阿尔及利亚"
    699724
    700 #: ../java/build/Countries.java:62
     725#: ../java/build/Countries.java:61
    701726msgid "Ecuador"
    702727msgstr "厄瓜多尔"
    703728
    704 #: ../java/build/Countries.java:63
     729#: ../java/build/Countries.java:62
    705730msgid "Estonia"
    706731msgstr "爱沙尼亚"
    707732
    708 #: ../java/build/Countries.java:64
     733#: ../java/build/Countries.java:63
    709734msgid "Egypt"
    710735msgstr "埃及"
    711736
    712 #: ../java/build/Countries.java:65
     737#: ../java/build/Countries.java:64
    713738msgid "Eritrea"
    714739msgstr "厄立特里亚"
    715740
    716 #: ../java/build/Countries.java:66
     741#: ../java/build/Countries.java:65
    717742msgid "Spain"
    718743msgstr "西班牙"
    719744
    720 #: ../java/build/Countries.java:67
     745#: ../java/build/Countries.java:66
    721746msgid "Ethiopia"
    722747msgstr "埃塞俄比亚"
    723748
    724 #: ../java/build/Countries.java:68
     749#: ../java/build/Countries.java:67
    725750msgid "Finland"
    726751msgstr "芬兰"
    727752
    728 #: ../java/build/Countries.java:69
     753#: ../java/build/Countries.java:68
    729754msgid "Fiji"
    730755msgstr "斐济"
    731756
    732 #: ../java/build/Countries.java:70
     757#: ../java/build/Countries.java:69
    733758msgid "Falkland Islands (Malvinas)"
    734759msgstr "福克兰群岛"
    735760
    736 #: ../java/build/Countries.java:71
     761#: ../java/build/Countries.java:70
    737762msgid "Federated States of Micronesia"
    738763msgstr "密克罗尼西亚"
    739764
    740 #: ../java/build/Countries.java:72
     765#: ../java/build/Countries.java:71
    741766msgid "Faroe Islands"
    742767msgstr "法罗群岛"
    743768
    744 #: ../java/build/Countries.java:73
     769#: ../java/build/Countries.java:72
    745770msgid "France"
    746771msgstr "法国"
    747772
    748 #: ../java/build/Countries.java:74
     773#: ../java/build/Countries.java:73
    749774msgid "Gabon"
    750775msgstr "加蓬"
    751776
    752 #: ../java/build/Countries.java:75
     777#: ../java/build/Countries.java:74
    753778msgid "United Kingdom"
    754779msgstr "英国"
    755780
    756 #: ../java/build/Countries.java:76
     781#: ../java/build/Countries.java:75
    757782msgid "Grenada"
    758783msgstr "格林纳达"
    759784
    760 #: ../java/build/Countries.java:77
     785#: ../java/build/Countries.java:76
    761786msgid "Georgia"
    762787msgstr "格鲁吉亚"
    763788
    764 #: ../java/build/Countries.java:78
     789#: ../java/build/Countries.java:77
    765790msgid "French Guiana"
    766791msgstr "圭亚那"
    767792
    768 #: ../java/build/Countries.java:79
     793#: ../java/build/Countries.java:78
    769794msgid "Ghana"
    770795msgstr "加纳"
    771796
    772 #: ../java/build/Countries.java:80
     797#: ../java/build/Countries.java:79
    773798msgid "Gibraltar"
    774799msgstr "直布罗陀"
    775800
    776 #: ../java/build/Countries.java:81
     801#: ../java/build/Countries.java:80
    777802msgid "Greenland"
    778803msgstr "格陵兰群岛"
    779804
    780 #: ../java/build/Countries.java:82
     805#: ../java/build/Countries.java:81
    781806msgid "Gambia"
    782807msgstr "冈比亚"
    783808
    784 #: ../java/build/Countries.java:83
     809#: ../java/build/Countries.java:82
    785810msgid "Guinea"
    786811msgstr "几内亚"
    787812
    788 #: ../java/build/Countries.java:84
     813#: ../java/build/Countries.java:83
    789814msgid "Guadeloupe"
    790815msgstr "瓜德罗普岛"
    791816
    792 #: ../java/build/Countries.java:85
     817#: ../java/build/Countries.java:84
    793818msgid "Equatorial Guinea"
    794819msgstr "赤道几内亚"
    795820
    796 #: ../java/build/Countries.java:86
     821#: ../java/build/Countries.java:85
    797822msgid "Greece"
    798823msgstr "希腊"
    799824
    800 #: ../java/build/Countries.java:87
     825#: ../java/build/Countries.java:86
    801826msgid "South Georgia and the South Sandwich Islands"
    802827msgstr "南乔治亚岛和南桑德韦奇岛"
    803828
    804 #: ../java/build/Countries.java:88
     829#: ../java/build/Countries.java:87
    805830msgid "Guatemala"
    806831msgstr "危地马拉"
    807832
    808 #: ../java/build/Countries.java:89
     833#: ../java/build/Countries.java:88
    809834msgid "Guam"
    810835msgstr "关岛"
    811836
    812 #: ../java/build/Countries.java:90
     837#: ../java/build/Countries.java:89
    813838msgid "Guinea-Bissau"
    814839msgstr "几内亚比绍"
    815840
    816 #: ../java/build/Countries.java:91
     841#: ../java/build/Countries.java:90
    817842msgid "Guyana"
    818843msgstr "圭亚那"
    819844
    820 #: ../java/build/Countries.java:92
     845#: ../java/build/Countries.java:91
    821846msgid "Hong Kong"
    822847msgstr "香港"
    823848
    824 #: ../java/build/Countries.java:93
     849#: ../java/build/Countries.java:92
    825850msgid "Honduras"
    826851msgstr "洪都拉斯"
    827852
    828 #: ../java/build/Countries.java:94
     853#: ../java/build/Countries.java:93
    829854msgid "Croatia"
    830855msgstr "克罗蒂亚"
    831856
    832 #: ../java/build/Countries.java:95
     857#: ../java/build/Countries.java:94
    833858msgid "Haiti"
    834859msgstr "海地"
    835860
    836 #: ../java/build/Countries.java:96
     861#: ../java/build/Countries.java:95
    837862msgid "Hungary"
    838863msgstr "匈牙利"
    839864
    840 #: ../java/build/Countries.java:97
     865#: ../java/build/Countries.java:96
    841866msgid "Indonesia"
    842867msgstr "印尼"
    843868
    844 #: ../java/build/Countries.java:98
     869#: ../java/build/Countries.java:97
    845870msgid "Ireland"
    846871msgstr "爱尔兰"
    847872
    848 #: ../java/build/Countries.java:99
     873#: ../java/build/Countries.java:98
    849874msgid "Israel"
    850875msgstr "以色列"
    851876
    852 #: ../java/build/Countries.java:101
     877#: ../java/build/Countries.java:99
    853878msgid "India"
    854879msgstr "印度"
    855880
    856 #: ../java/build/Countries.java:102
     881#: ../java/build/Countries.java:100
    857882msgid "British Indian Ocean Territory"
    858883msgstr "英属印度洋地区"
    859884
    860 #: ../java/build/Countries.java:103
     885#: ../java/build/Countries.java:101
    861886msgid "Iraq"
    862887msgstr "伊拉克"
    863888
    864 #: ../java/build/Countries.java:104
     889#: ../java/build/Countries.java:102
    865890msgid "Islamic Republic of Iran"
    866891msgstr "伊朗"
    867892
    868 #: ../java/build/Countries.java:105
     893#: ../java/build/Countries.java:103
    869894msgid "Iceland"
    870895msgstr "冰岛"
    871896
    872 #: ../java/build/Countries.java:106
     897#: ../java/build/Countries.java:104
    873898msgid "Italy"
    874899msgstr "意大利"
    875900
    876 #: ../java/build/Countries.java:108
     901#: ../java/build/Countries.java:105
    877902msgid "Jamaica"
    878903msgstr "牙买加"
    879904
    880 #: ../java/build/Countries.java:109
     905#: ../java/build/Countries.java:106
    881906msgid "Jordan"
    882907msgstr "约旦"
    883908
    884 #: ../java/build/Countries.java:110
     909#: ../java/build/Countries.java:107
    885910msgid "Japan"
    886911msgstr "日本"
    887912
    888 #: ../java/build/Countries.java:111
     913#: ../java/build/Countries.java:108
    889914msgid "Kenya"
    890915msgstr "肯尼亚"
    891916
    892 #: ../java/build/Countries.java:112
     917#: ../java/build/Countries.java:109
    893918msgid "Kyrgyzstan"
    894919msgstr "吉尔吉斯斯坦"
    895920
    896 #: ../java/build/Countries.java:113
     921#: ../java/build/Countries.java:110
    897922msgid "Cambodia"
    898923msgstr "柬埔塞"
    899924
    900 #: ../java/build/Countries.java:114
     925#: ../java/build/Countries.java:111
    901926msgid "Kiribati"
    902927msgstr "基里巴斯"
    903928
    904 #: ../java/build/Countries.java:115
     929#: ../java/build/Countries.java:112
    905930msgid "Comoros"
    906931msgstr "科摩罗"
    907932
    908 #: ../java/build/Countries.java:116
     933#: ../java/build/Countries.java:113
    909934msgid "Saint Kitts and Nevis"
    910935msgstr "圣克里斯多福与尼维斯"
    911936
    912 #: ../java/build/Countries.java:117
     937#: ../java/build/Countries.java:114
    913938msgid "Republic of Korea"
    914939msgstr "韩国"
    915940
    916 #: ../java/build/Countries.java:118
     941#: ../java/build/Countries.java:115
    917942msgid "Kuwait"
    918943msgstr "科威特"
    919944
    920 #: ../java/build/Countries.java:119
     945#: ../java/build/Countries.java:116
    921946msgid "Cayman Islands"
    922947msgstr "开曼群岛"
    923948
    924 #: ../java/build/Countries.java:120
     949#: ../java/build/Countries.java:117
    925950msgid "Kazakhstan"
    926951msgstr "哈萨克斯坦"
    927952
    928 #: ../java/build/Countries.java:121
     953#: ../java/build/Countries.java:118
    929954msgid "Lao People's Democratic Republic"
    930955msgstr "老挝"
    931956
    932 #: ../java/build/Countries.java:122
     957#: ../java/build/Countries.java:119
    933958msgid "Lebanon"
    934959msgstr "黎巴嫩"
    935960
    936 #: ../java/build/Countries.java:123
     961#: ../java/build/Countries.java:120
    937962msgid "Saint Lucia"
    938963msgstr "圣露西亚岛"
    939964
    940 #: ../java/build/Countries.java:124
     965#: ../java/build/Countries.java:121
    941966msgid "Liechtenstein"
    942967msgstr "列支敦士登"
    943968
    944 #: ../java/build/Countries.java:125
     969#: ../java/build/Countries.java:122
    945970msgid "Sri Lanka"
    946971msgstr "斯里兰卡"
    947972
    948 #: ../java/build/Countries.java:126
     973#: ../java/build/Countries.java:123
    949974msgid "Liberia"
    950975msgstr "利比里亚"
    951976
    952 #: ../java/build/Countries.java:127
     977#: ../java/build/Countries.java:124
    953978msgid "Lesotho"
    954979msgstr "莱索托"
    955980
    956 #: ../java/build/Countries.java:128
     981#: ../java/build/Countries.java:125
    957982msgid "Lithuania"
    958983msgstr "立陶宛"
    959984
    960 #: ../java/build/Countries.java:129
     985#: ../java/build/Countries.java:126
    961986msgid "Luxembourg"
    962987msgstr "卢森堡"
    963988
    964 #: ../java/build/Countries.java:130
     989#: ../java/build/Countries.java:127
    965990msgid "Latvia"
    966991msgstr "拉脱维亚"
    967992
    968 #: ../java/build/Countries.java:131
     993#: ../java/build/Countries.java:128
    969994msgid "Libyan Arab Jamahiriya"
    970995msgstr "利比亚"
    971996
    972 #: ../java/build/Countries.java:132
     997#: ../java/build/Countries.java:129
    973998msgid "Morocco"
    974999msgstr "摩洛哥"
    9751000
    976 #: ../java/build/Countries.java:133
     1001#: ../java/build/Countries.java:130
    9771002msgid "Monaco"
    9781003msgstr "摩纳哥"
    9791004
    980 #: ../java/build/Countries.java:134
     1005#: ../java/build/Countries.java:131
    9811006msgid "Republic of Moldova"
    9821007msgstr "摩尔多瓦"
    9831008
    984 #: ../java/build/Countries.java:137
     1009#: ../java/build/Countries.java:132
    9851010msgid "Madagascar"
    9861011msgstr "马达加斯加"
    9871012
    988 #: ../java/build/Countries.java:138
     1013#: ../java/build/Countries.java:133
    9891014msgid "Marshall Islands"
    9901015msgstr "马绍尔群岛"
    9911016
    992 #: ../java/build/Countries.java:139
     1017#: ../java/build/Countries.java:134
    9931018msgid "The Former Yugoslav Republic of Macedonia"
    9941019msgstr "前南斯拉夫之马其顿共和国"
    9951020
    996 #: ../java/build/Countries.java:140
     1021#: ../java/build/Countries.java:135
    9971022msgid "Mali"
    9981023msgstr "马里"
    9991024
    1000 #: ../java/build/Countries.java:141
     1025#: ../java/build/Countries.java:136
    10011026msgid "Myanmar"
    10021027msgstr "缅甸"
    10031028
    1004 #: ../java/build/Countries.java:142
     1029#: ../java/build/Countries.java:137
    10051030msgid "Mongolia"
    10061031msgstr "蒙古"
    10071032
    1008 #: ../java/build/Countries.java:143
     1033#: ../java/build/Countries.java:138
    10091034msgid "Macao"
    10101035msgstr "澳门"
    10111036
    1012 #: ../java/build/Countries.java:144
     1037#: ../java/build/Countries.java:139
    10131038msgid "Northern Mariana Islands"
    10141039msgstr "北马里亚纳群岛"
    10151040
    1016 #: ../java/build/Countries.java:145
     1041#: ../java/build/Countries.java:140
    10171042msgid "Martinique"
    10181043msgstr "马提尼克岛"
    10191044
    1020 #: ../java/build/Countries.java:146
     1045#: ../java/build/Countries.java:141
    10211046msgid "Mauritania"
    10221047msgstr "毛里塔尼亚"
    10231048
    1024 #: ../java/build/Countries.java:147
     1049#: ../java/build/Countries.java:142
    10251050msgid "Montserrat"
    10261051msgstr "蒙特塞拉特"
    10271052
    1028 #: ../java/build/Countries.java:148
     1053#: ../java/build/Countries.java:143
    10291054msgid "Malta"
    10301055msgstr "马尔他"
    10311056
    1032 #: ../java/build/Countries.java:149
     1057#: ../java/build/Countries.java:144
    10331058msgid "Mauritius"
    10341059msgstr "毛里求斯"
    10351060
    1036 #: ../java/build/Countries.java:150
     1061#: ../java/build/Countries.java:145
    10371062msgid "Maldives"
    10381063msgstr "马尔代夫"
    10391064
    1040 #: ../java/build/Countries.java:151
     1065#: ../java/build/Countries.java:146
    10411066msgid "Malawi"
    10421067msgstr "马拉维"
    10431068
    1044 #: ../java/build/Countries.java:152
     1069#: ../java/build/Countries.java:147
    10451070msgid "Mexico"
    10461071msgstr "墨西哥"
    10471072
    1048 #: ../java/build/Countries.java:153
     1073#: ../java/build/Countries.java:148
    10491074msgid "Malaysia"
    10501075msgstr "马来西亚"
    10511076
    1052 #: ../java/build/Countries.java:154
     1077#: ../java/build/Countries.java:149
    10531078msgid "Mozambique"
    10541079msgstr "莫桑比克"
    10551080
    1056 #: ../java/build/Countries.java:155
     1081#: ../java/build/Countries.java:150
    10571082msgid "Namibia"
    10581083msgstr "纳米比亚"
    10591084
    1060 #: ../java/build/Countries.java:156
     1085#: ../java/build/Countries.java:151
    10611086msgid "New Caledonia"
    10621087msgstr "新喀里多尼亚"
    10631088
    1064 #: ../java/build/Countries.java:157
     1089#: ../java/build/Countries.java:152
    10651090msgid "Niger"
    10661091msgstr "尼日尔"
    10671092
    1068 #: ../java/build/Countries.java:158
     1093#: ../java/build/Countries.java:153
    10691094msgid "Norfolk Island"
    10701095msgstr "尼加拉瓜"
    10711096
    1072 #: ../java/build/Countries.java:159
     1097#: ../java/build/Countries.java:154
    10731098msgid "Nigeria"
    10741099msgstr "尼日利亚"
    10751100
    1076 #: ../java/build/Countries.java:160
     1101#: ../java/build/Countries.java:155
    10771102msgid "Nicaragua"
    10781103msgstr "尼加拉瓜"
    10791104
    1080 #: ../java/build/Countries.java:161
     1105#: ../java/build/Countries.java:156
    10811106msgid "Netherlands"
    10821107msgstr "荷兰"
    10831108
    1084 #: ../java/build/Countries.java:162
     1109#: ../java/build/Countries.java:157
    10851110msgid "Norway"
    10861111msgstr "挪威"
    10871112
    1088 #: ../java/build/Countries.java:163
     1113#: ../java/build/Countries.java:158
    10891114msgid "Nepal"
    10901115msgstr "尼泊尔"
    10911116
    1092 #: ../java/build/Countries.java:164
     1117#: ../java/build/Countries.java:159
    10931118msgid "Nauru"
    10941119msgstr "瑙鲁"
    10951120
    1096 #: ../java/build/Countries.java:165
     1121#: ../java/build/Countries.java:160
    10971122msgid "Niue"
    10981123msgstr "纽埃岛"
    10991124
    1100 #: ../java/build/Countries.java:166
     1125#: ../java/build/Countries.java:161
    11011126msgid "New Zealand"
    11021127msgstr "新西兰"
    11031128
    1104 #: ../java/build/Countries.java:167
     1129#: ../java/build/Countries.java:162
    11051130msgid "Oman"
    11061131msgstr "阿曼"
    11071132
    1108 #: ../java/build/Countries.java:168
     1133#: ../java/build/Countries.java:163
    11091134msgid "Panama"
    11101135msgstr "巴拿马"
    11111136
    1112 #: ../java/build/Countries.java:169
     1137#: ../java/build/Countries.java:164
    11131138msgid "Peru"
    11141139msgstr "秘鲁"
    11151140
    1116 #: ../java/build/Countries.java:170
     1141#: ../java/build/Countries.java:165
    11171142msgid "French Polynesia"
    11181143msgstr "玻利尼西亚"
    11191144
    1120 #: ../java/build/Countries.java:171
     1145#: ../java/build/Countries.java:166
    11211146msgid "Papua New Guinea"
    11221147msgstr "巴布亚新几内亚"
    11231148
    1124 #: ../java/build/Countries.java:172
     1149#: ../java/build/Countries.java:167
    11251150msgid "Philippines"
    11261151msgstr "菲律宾"
    11271152
    1128 #: ../java/build/Countries.java:173
     1153#: ../java/build/Countries.java:168
    11291154msgid "Pakistan"
    11301155msgstr "巴基斯坦"
    11311156
    1132 #: ../java/build/Countries.java:174
     1157#: ../java/build/Countries.java:169
    11331158msgid "Poland"
    11341159msgstr "波兰"
    11351160
    1136 #: ../java/build/Countries.java:175
     1161#: ../java/build/Countries.java:170
    11371162msgid "Saint Pierre and Miquelon"
    11381163msgstr "圣皮埃尔岛和密克隆"
    11391164
    1140 #: ../java/build/Countries.java:176
     1165#: ../java/build/Countries.java:171
    11411166msgid "Puerto Rico"
    11421167msgstr "波多黎各"
    11431168
    1144 #: ../java/build/Countries.java:177
     1169#: ../java/build/Countries.java:172
    11451170msgid "Palestinian Territory"
    11461171msgstr "巴勒斯坦地区"
    11471172
    1148 #: ../java/build/Countries.java:178
     1173#: ../java/build/Countries.java:173
    11491174msgid "Portugal"
    11501175msgstr "葡萄牙"
    11511176
    1152 #: ../java/build/Countries.java:179
     1177#: ../java/build/Countries.java:174
    11531178msgid "Palau"
    11541179msgstr "帕劳"
    11551180
    1156 #: ../java/build/Countries.java:180
     1181#: ../java/build/Countries.java:175
    11571182msgid "Paraguay"
    11581183msgstr "巴拉圭"
    11591184
    1160 #: ../java/build/Countries.java:181
     1185#: ../java/build/Countries.java:176
    11611186msgid "Qatar"
    11621187msgstr "卡塔尔"
    11631188
    1164 #: ../java/build/Countries.java:182
     1189#: ../java/build/Countries.java:177
    11651190msgid "Reunion"
    11661191msgstr "留尼汪岛"
    11671192
    1168 #: ../java/build/Countries.java:183
     1193#: ../java/build/Countries.java:178
    11691194msgid "Romania"
    11701195msgstr "罗马尼亚"
    11711196
    1172 #: ../java/build/Countries.java:184
     1197#: ../java/build/Countries.java:179
    11731198msgid "Serbia"
    11741199msgstr "塞尔维亚"
    11751200
    1176 #: ../java/build/Countries.java:185
     1201#: ../java/build/Countries.java:180
    11771202msgid "Russian Federation"
    11781203msgstr "俄联邦"
    11791204
    1180 #: ../java/build/Countries.java:186
     1205#: ../java/build/Countries.java:181
    11811206msgid "Rwanda"
    11821207msgstr "卢旺达"
    11831208
    1184 #: ../java/build/Countries.java:187
     1209#: ../java/build/Countries.java:182
    11851210msgid "Saudi Arabia"
    11861211msgstr "沙特阿拉伯"
    11871212
    1188 #: ../java/build/Countries.java:188
     1213#: ../java/build/Countries.java:183
    11891214msgid "Solomon Islands"
    11901215msgstr "所罗门群岛"
    11911216
    1192 #: ../java/build/Countries.java:189
     1217#: ../java/build/Countries.java:184
    11931218msgid "Seychelles"
    11941219msgstr "塞舌尔"
    11951220
    1196 #: ../java/build/Countries.java:190
     1221#: ../java/build/Countries.java:185
    11971222msgid "Sudan"
    11981223msgstr "苏丹"
    11991224
    1200 #: ../java/build/Countries.java:191
     1225#: ../java/build/Countries.java:186
    12011226msgid "Sweden"
    12021227msgstr "瑞典"
    12031228
    1204 #: ../java/build/Countries.java:192
     1229#: ../java/build/Countries.java:187
    12051230msgid "Singapore"
    12061231msgstr "新加坡"
    12071232
    1208 #: ../java/build/Countries.java:193
     1233#: ../java/build/Countries.java:188
    12091234msgid "Slovenia"
    12101235msgstr "斯洛文尼亚"
    12111236
    1212 #: ../java/build/Countries.java:194
     1237#: ../java/build/Countries.java:189
    12131238msgid "Slovakia"
    12141239msgstr "斯洛伐克"
    12151240
    1216 #: ../java/build/Countries.java:195
     1241#: ../java/build/Countries.java:190
    12171242msgid "Sierra Leone"
    12181243msgstr "塞拉利昂"
    12191244
    1220 #: ../java/build/Countries.java:196
     1245#: ../java/build/Countries.java:191
    12211246msgid "San Marino"
    12221247msgstr "圣马力诺"
    12231248
    1224 #: ../java/build/Countries.java:197
     1249#: ../java/build/Countries.java:192
    12251250msgid "Senegal"
    12261251msgstr "塞内加尔"
    12271252
    1228 #: ../java/build/Countries.java:198
     1253#: ../java/build/Countries.java:193
    12291254msgid "Somalia"
    12301255msgstr "索马里"
    12311256
    1232 #: ../java/build/Countries.java:199
     1257#: ../java/build/Countries.java:194
    12331258msgid "Suriname"
    12341259msgstr "苏里南"
    12351260
    1236 #: ../java/build/Countries.java:200
     1261#: ../java/build/Countries.java:195
    12371262msgid "Sao Tome and Principe"
    12381263msgstr "圣多美与普林西比共和国"
    12391264
    1240 #: ../java/build/Countries.java:201
     1265#: ../java/build/Countries.java:196
    12411266msgid "El Salvador"
    12421267msgstr "萨尔瓦多"
    12431268
    1244 #: ../java/build/Countries.java:202
     1269#: ../java/build/Countries.java:197
    12451270msgid "Syrian Arab Republic"
    12461271msgstr "叙利亚"
    12471272
    1248 #: ../java/build/Countries.java:203
     1273#: ../java/build/Countries.java:198
    12491274msgid "Swaziland"
    12501275msgstr "斯威士兰"
    12511276
    1252 #: ../java/build/Countries.java:204
     1277#: ../java/build/Countries.java:199
    12531278msgid "Turks and Caicos Islands"
    12541279msgstr "特克斯和凯科斯群岛"
    12551280
    1256 #: ../java/build/Countries.java:205
     1281#: ../java/build/Countries.java:200
    12571282msgid "Chad"
    12581283msgstr "乍得"
    12591284
    1260 #: ../java/build/Countries.java:206
     1285#: ../java/build/Countries.java:201
    12611286msgid "French Southern Territories"
    12621287msgstr "法属南半球领地"
    12631288
    1264 #: ../java/build/Countries.java:207
     1289#: ../java/build/Countries.java:202
    12651290msgid "Togo"
    12661291msgstr "多哥"
    12671292
    1268 #: ../java/build/Countries.java:208
     1293#: ../java/build/Countries.java:203
    12691294msgid "Thailand"
    12701295msgstr "泰国"
    12711296
    1272 #: ../java/build/Countries.java:209
     1297#: ../java/build/Countries.java:204
    12731298msgid "Tajikistan"
    12741299msgstr "塔吉克斯坦"
    12751300
    1276 #: ../java/build/Countries.java:210
     1301#: ../java/build/Countries.java:205
    12771302msgid "Tokelau"
    12781303msgstr "托克劳群岛"
    12791304
    1280 #: ../java/build/Countries.java:211
     1305#: ../java/build/Countries.java:206
    12811306msgid "Timor-Leste"
    12821307msgstr "东帝汶"
    12831308
    1284 #: ../java/build/Countries.java:212
     1309#: ../java/build/Countries.java:207
    12851310msgid "Turkmenistan"
    12861311msgstr "土库曼斯坦"
    12871312
    1288 #: ../java/build/Countries.java:213
     1313#: ../java/build/Countries.java:208
    12891314msgid "Tunisia"
    12901315msgstr "突尼斯"
    12911316
    1292 #: ../java/build/Countries.java:214
     1317#: ../java/build/Countries.java:209
    12931318msgid "Tonga"
    12941319msgstr "汤加"
    12951320
    1296 #: ../java/build/Countries.java:215
     1321#: ../java/build/Countries.java:210
    12971322msgid "Turkey"
    12981323msgstr "土耳其"
    12991324
    1300 #: ../java/build/Countries.java:216
     1325#: ../java/build/Countries.java:211
    13011326msgid "Trinidad and Tobago"
    13021327msgstr "特立尼达和多巴哥"
    13031328
    1304 #: ../java/build/Countries.java:217
     1329#: ../java/build/Countries.java:212
    13051330msgid "Tuvalu"
    13061331msgstr "图瓦鲁"
    13071332
    1308 #: ../java/build/Countries.java:218
     1333#: ../java/build/Countries.java:213
    13091334msgid "Taiwan"
    13101335msgstr "台湾"
    13111336
    1312 #: ../java/build/Countries.java:219
     1337#: ../java/build/Countries.java:214
    13131338msgid "United Republic of Tanzania"
    13141339msgstr "坦桑尼亚"
    13151340
    1316 #: ../java/build/Countries.java:220
     1341#: ../java/build/Countries.java:215
    13171342msgid "Ukraine"
    13181343msgstr "乌克兰"
    13191344
    1320 #: ../java/build/Countries.java:221
     1345#: ../java/build/Countries.java:216
    13211346msgid "Uganda"
    13221347msgstr "乌干达"
    13231348
    1324 #: ../java/build/Countries.java:222
     1349#: ../java/build/Countries.java:217
    13251350msgid "United States Minor Outlying Islands"
    13261351msgstr "美国本土外小岛屿"
    13271352
    1328 #: ../java/build/Countries.java:223
     1353#: ../java/build/Countries.java:218
    13291354msgid "United States"
    13301355msgstr "美国"
    13311356
    1332 #: ../java/build/Countries.java:224
     1357#: ../java/build/Countries.java:219
    13331358msgid "Uruguay"
    13341359msgstr "乌拉圭"
    13351360
    1336 #: ../java/build/Countries.java:225
     1361#: ../java/build/Countries.java:220
    13371362msgid "Uzbekistan"
    13381363msgstr "乌兹别克斯坦"
    13391364
    1340 #: ../java/build/Countries.java:226
     1365#: ../java/build/Countries.java:221
    13411366msgid "Holy See (Vatican City State)"
    13421367msgstr "梵地冈"
    13431368
    1344 #: ../java/build/Countries.java:227
     1369#: ../java/build/Countries.java:222
    13451370msgid "Saint Vincent and the Grenadines"
    13461371msgstr "圣文森特和格林纳丁斯"
    13471372
    1348 #: ../java/build/Countries.java:228
     1373#: ../java/build/Countries.java:223
    13491374msgid "Venezuela"
    13501375msgstr "委内瑞拉"
    13511376
    1352 #: ../java/build/Countries.java:229
    1353 #: ../java/build/Countries.java:230
     1377#: ../java/build/Countries.java:224
     1378#: ../java/build/Countries.java:225
    13541379msgid "Virgin Islands"
    13551380msgstr "维京群岛"
    13561381
    1357 #: ../java/build/Countries.java:231
     1382#: ../java/build/Countries.java:226
    13581383msgid "Viet Nam"
    13591384msgstr "越南"
    13601385
    1361 #: ../java/build/Countries.java:232
     1386#: ../java/build/Countries.java:227
    13621387msgid "Vanuatu"
    13631388msgstr "瓦努阿图"
    13641389
    1365 #: ../java/build/Countries.java:233
     1390#: ../java/build/Countries.java:228
    13661391msgid "Wallis and Futuna"
    13671392msgstr "瓦利斯群岛和富图纳群岛"
    13681393
    1369 #: ../java/build/Countries.java:234
     1394#: ../java/build/Countries.java:229
    13701395msgid "Samoa"
    13711396msgstr "东萨摩亚"
    13721397
    1373 #: ../java/build/Countries.java:235
     1398#: ../java/build/Countries.java:230
    13741399msgid "Yemen"
    13751400msgstr "也门"
    13761401
    1377 #: ../java/build/Countries.java:236
     1402#: ../java/build/Countries.java:231
    13781403msgid "Mayotte"
    13791404msgstr "马约特"
    13801405
    1381 #: ../java/build/Countries.java:237
     1406#: ../java/build/Countries.java:232
    13821407msgid "South Africa"
    13831408msgstr "南非"
    13841409
    1385 #: ../java/build/Countries.java:238
     1410#: ../java/build/Countries.java:233
    13861411msgid "Zambia"
    13871412msgstr "赞比亚"
    13881413
    1389 #: ../java/build/Countries.java:239
     1414#: ../java/build/Countries.java:234
    13901415msgid "Zimbabwe"
    13911416msgstr "津巴布韦"
    13921417
    1393 #: ../java/src/net/i2p/router/web/CSSHelper.java:54
    1394 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:30
    1395 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:32
     1418#: ../java/src/net/i2p/router/web/CSSHelper.java:57
     1419#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:34
     1420#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:36
    13961421#: ../java/strings/Strings.java:29
    13971422#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:234
     
    14041429
    14051430#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69
    1406 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:263
     1431#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:266
    14071432msgid "Configuration saved successfully"
    14081433msgstr "设置保存成功"
    14091434
    14101435#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71
    1411 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:265
     1436#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268
    14121437msgid "Error saving the configuration (applied but not saved) - please see the error logs"
    14131438msgstr "配置保存出错(已应用但未保存) - 参见错误日志"
     
    14531478msgstr "停用插件 {0} 时发生错误"
    14541479
     1480#. label (IE)
    14551481#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:119
    14561482#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:189
     
    14801506#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
    14811507#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
    1482 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:374
    1483 #: ../java/src/net/i2p/router/web/SummaryHelper.java:389
     1508#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:387
     1509#: ../java/src/net/i2p/router/web/SummaryHelper.java:379
    14841510msgid "Client"
    14851511msgstr "客户"
     
    15891615
    15901616#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95
    1591 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:191
    1592 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:165
     1617#: ../java/src/net/i2p/router/web/NetDbRenderer.java:268
     1618#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:180
    15931619msgid "Version"
    15941620msgstr "版本"
     
    16231649
    16241650#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:196
    1625 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:58
     1651#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81
    16261652#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:312
    16271653msgid "Check for updates"
     
    16301656#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
    16311657#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
    1632 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:213
    1633 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:220
     1658#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:230
     1659#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:237
    16341660msgid "Update"
    16351661msgstr "更新"
     
    17211747
    17221748#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
     1749#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:199
    17231750msgid "Network"
    17241751msgstr "网络"
     
    17291756
    17301757#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
    1731 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:90
     1758#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:100
     1759#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376
    17321760#: ../java/strings/Strings.java:72
    17331761msgid "Tunnels"
     
    17521780
    17531781#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
    1754 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:96
    1755 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:238
     1782#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:106
     1783#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255
    17561784#: ../java/strings/Strings.java:67
    17571785msgid "Peers"
     
    17591787
    17601788#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
    1761 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:298
    1762 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:132
     1789#: ../java/src/net/i2p/router/web/NetDbRenderer.java:382
     1790#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:142
    17631791msgid "Stats"
    17641792msgstr "统计"
     
    17691797
    17701798#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
    1771 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:261
     1799#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264
    17721800#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:35
    17731801#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
     
    17841812msgstr "正在重检查路由连通性..."
    17851813
    1786 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:150
     1814#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:153
    17871815msgid "Updating IP address"
    17881816msgstr "正在更新IP地址"
    17891817
    1790 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:168
     1818#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:171
    17911819msgid "Disabling TCP completely"
    17921820msgstr "正在彻底禁用TCP"
    17931821
    1794 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:172
     1822#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:175
    17951823msgid "Updating inbound TCP address to"
    17961824msgstr "正在更新进站TCP地址至"
    17971825
    1798 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:176
     1826#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179
    17991827msgid "Disabling inbound TCP"
    18001828msgstr "正在禁用入站TCP"
    18011829
    1802 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:178
     1830#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:181
    18031831msgid "Updating inbound TCP address to auto"
    18041832msgstr "正在更新入站TCP地址至"
    18051833
    1806 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:187
     1834#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190
    18071835msgid "Updating inbound TCP port to"
    18081836msgstr "正在更新入站TCP端口至"
    18091837
    1810 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190
     1838#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193
    18111839msgid "Updating inbound TCP port to auto"
    18121840msgstr "正在更新入站TCP端口至"
    18131841
    1814 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:202
     1842#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
    18151843msgid "Updating UDP port from"
    18161844msgstr "正在更新UDP端口由"
    18171845
    1818 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:202
     1846#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
    18191847msgid "to"
    18201848msgstr "至"
    18211849
    1822 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:218
     1850#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221
    18231851msgid "Gracefully restarting into Hidden Router Mode"
    18241852msgstr "正在平滑重启路由进入隐身模式"
    18251853
    1826 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:220
     1854#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:223
    18271855msgid "Gracefully restarting to exit Hidden Router Mode"
    18281856msgstr "正在平滑重启路由退出隐身模式"
    18291857
    1830 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:229
     1858#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:232
    18311859msgid "Enabling UPnP, restart required to take effect"
    18321860msgstr "正在启用UPnP,程序重启后生效"
    18331861
    1834 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:231
     1862#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234
    18351863msgid "Disabling UPnP, restart required to take effect"
    18361864msgstr "正在禁用UPnP,程序重启后生效"
    18371865
    1838 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:239
     1866#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:242
    18391867msgid "Enabling laptop mode"
    18401868msgstr "正在启用笔记本模式"
    18411869
    1842 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:241
     1870#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244
    18431871msgid "Disabling laptop mode"
    18441872msgstr "正在禁用笔记本模式"
    18451873
    1846 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:247
     1874#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:250
    18471875msgid "Requiring SSU introducers"
    18481876msgstr "正在获取SSU中介"
    18491877
    1850 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:288
     1878#. There's a few changes that don't really require restart (e.g. enabling inbound TCP)
     1879#. But it would be hard to get right, so just do a restart.
     1880#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291
    18511881msgid "Gracefully restarting I2P to change published router address"
    18521882msgstr "正在平滑重启路由重新发布路由地址"
    18531883
    1854 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:311
     1884#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:314
    18551885msgid "Updating bandwidth share percentage"
    18561886msgstr "正在更新共享带宽比例"
    18571887
    1858 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:394
     1888#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:397
    18591889msgid "Updated bandwidth limits"
    18601890msgstr "带宽限制更新完毕"
     
    18701900#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169
    18711901msgid "bits per second"
    1872 msgstr "比特/秒"
     1902msgstr "Bit/s"
     1903
     1904#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:170
     1905#, java-format
     1906msgid "or {0} bytes per month maximum"
     1907msgstr "或最多 {0} Byte/月(假设始终 7 天 x 24小时开机)"
    18731908
    18741909#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
     
    19181953msgstr "容量值无效"
    19191954
     1955#. Normal browsers send value, IE sends button label
    19201956#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
    19211957#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
     
    19241960msgstr "立刻关闭"
    19251961
     1962#. ctx.router().shutdown(Router.EXIT_HARD); // never returns
     1963#. give the UI time to respond
    19261964#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36
    19271965msgid "Cancel shutdown"
     
    19361974msgstr "立刻重启"
    19371975
     1976#. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns
     1977#. give the UI time to respond
    19381978#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:43
    19391979msgid "Restart"
     
    21072147msgstr "曲线图列表已更新,更新后的内容可能需要最多 60s 的时间才能在这里及 <a href=\"graphs.jsp\">统计图表</a>页面中反映出来。"
    21082148
     2149#. the count isn't really correct anyway, since we don't check for actual changes
     2150#. addFormNotice("Updated settings for " + updated + " pools.");
    21092151#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:137
    21102152msgid "Updated settings for all pools."
     
    21202162msgstr "配置保存出错(已应用但未保存) - 参见错误日志"
    21212163
    2122 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:11
    2123 msgid "hop"
    2124 msgstr "跳点"
    2125 
    2126 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:12
    2127 msgid "tunnel"
    2128 msgstr "隧道"
    2129 
     2164#. * dummies for translation
    21302165#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14
    2131 msgid "hops"
    2132 msgstr "跳点"
     2166#, java-format
     2167msgid "1 hop"
     2168msgid_plural "{0} hops"
     2169msgstr[0] "{0} 跳点"
    21332170
    21342171#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:15
    2135 msgid "tunnels"
    2136 msgstr "隧道"
     2172#, java-format
     2173msgid "1 tunnel"
     2174msgid_plural "{0} tunnels"
     2175msgstr[0] "{0} 隧道"
    21372176
    21382177#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26
     
    21622201msgstr "性能警告 - 设置中包括大量隧道"
    21632202
     2203#. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n");
     2204#. tunnel depth
    21642205#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
    21652206msgid "Length"
    21662207msgstr "长度"
    21672208
     2209#. tunnel depth variance
    21682210#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104
    21692211msgid "Randomization"
    21702212msgstr "随机"
    21712213
     2214#. tunnel quantity
    21722215#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128
    21732216msgid "Quantity"
    21742217msgstr "数量"
    21752218
     2219#. tunnel backup quantity
    21762220#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145
    21772221msgid "Backup quantity"
     
    22222266msgstr "瑞士语"
    22232267
    2224 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:65
     2268#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:88
    22252269msgid "Update available, attempting to download now"
    22262270msgstr "有更新可用,正在尝试下载"
    22272271
    2228 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:67
     2272#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:90
    22292273msgid "Update available, click button on left to download"
    22302274msgstr "有更新可用,点左侧按钮下载"
    22312275
    2232 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:73
     2276#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96
    22332277msgid "No update available"
    22342278msgstr "无更新"
    22352279
    2236 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81
     2280#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104
    22372281msgid "Updating news URL to"
    22382282msgstr "正在更新新闻链接至"
    22392283
    2240 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:89
     2284#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:112
    22412285msgid "Updating proxy host to"
    22422286msgstr "正在更新代理主机至"
    22432287
    2244 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:97
     2288#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120
    22452289msgid "Updating proxy port to"
    22462290msgstr "正在更新代理端口至"
    22472291
    2248 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:110
     2292#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:133
    22492293msgid "Updating refresh frequency to"
    22502294msgstr "正在更新更新频率为"
    22512295
    2252 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117
     2296#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:140
    22532297msgid "Updating update policy to"
    22542298msgstr "正在更新更新策略为"
    22552299
    2256 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:126
     2300#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:149
    22572301msgid "Updating update URLs."
    22582302msgstr "正在更新更新链接至"
    22592303
    2260 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:135
     2304#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158
    22612305msgid "Updating trusted keys."
    22622306msgstr "正在更新可信公钥为"
    22632307
    2264 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:143
     2308#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:166
    22652309msgid "Updating unsigned update URL to"
    22662310msgstr "正在更新未签名软件链接至"
    22672311
    22682312#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88
    2269 #: ../java/src/net/i2p/router/web/GraphHelper.java:136
     2313#: ../java/src/net/i2p/router/web/GraphHelper.java:138
    22702314msgid "Never"
    22712315msgstr "从不"
     
    22912335msgstr "表单提交无效,可能的原因是您使用了“后退”或“刷新”按钮。请重新提交。"
    22922336
    2293 #: ../java/src/net/i2p/router/web/GraphHelper.java:128
     2337#: ../java/src/net/i2p/router/web/GraphHelper.java:82
     2338msgid "Combined bandwidth graph"
     2339msgstr "复合带宽图"
     2340
     2341#. e.g. "statname for 60m"
     2342#: ../java/src/net/i2p/router/web/GraphHelper.java:96
     2343#, java-format
     2344msgid "{0} for {1}"
     2345msgstr "过去 {1} 统计 {0}"
     2346
     2347#: ../java/src/net/i2p/router/web/GraphHelper.java:130
    22942348msgid "Configure Graph Display"
    22952349msgstr "图表显示设置"
    22962350
    2297 #: ../java/src/net/i2p/router/web/GraphHelper.java:128
     2351#: ../java/src/net/i2p/router/web/GraphHelper.java:130
    22982352msgid "Select Stats"
    22992353msgstr "选择统计项"
    23002354
    2301 #: ../java/src/net/i2p/router/web/GraphHelper.java:130
     2355#: ../java/src/net/i2p/router/web/GraphHelper.java:132
    23022356msgid "Periods"
    23032357msgstr "周期"
    23042358
    2305 #: ../java/src/net/i2p/router/web/GraphHelper.java:131
     2359#: ../java/src/net/i2p/router/web/GraphHelper.java:133
    23062360msgid "Plot averages"
    23072361msgstr "事件均值"
    23082362
    2309 #: ../java/src/net/i2p/router/web/GraphHelper.java:132
     2363#: ../java/src/net/i2p/router/web/GraphHelper.java:134
    23102364#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416
    23112365#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332
     
    23132367msgstr "或"
    23142368
    2315 #: ../java/src/net/i2p/router/web/GraphHelper.java:132
     2369#: ../java/src/net/i2p/router/web/GraphHelper.java:134
    23162370msgid "plot events"
    23172371msgstr "事件数量"
    23182372
    2319 #: ../java/src/net/i2p/router/web/GraphHelper.java:133
     2373#: ../java/src/net/i2p/router/web/GraphHelper.java:135
    23202374msgid "Image sizes"
    23212375msgstr "图像尺寸"
    23222376
    2323 #: ../java/src/net/i2p/router/web/GraphHelper.java:133
     2377#: ../java/src/net/i2p/router/web/GraphHelper.java:135
    23242378msgid "width"
    23252379msgstr "宽度"
    23262380
    2327 #: ../java/src/net/i2p/router/web/GraphHelper.java:134
     2381#: ../java/src/net/i2p/router/web/GraphHelper.java:136
    23282382msgid "height"
    23292383msgstr "高度"
    23302384
    2331 #: ../java/src/net/i2p/router/web/GraphHelper.java:134
    2332 #: ../java/src/net/i2p/router/web/GraphHelper.java:135
     2385#: ../java/src/net/i2p/router/web/GraphHelper.java:136
     2386#: ../java/src/net/i2p/router/web/GraphHelper.java:137
    23332387msgid "pixels"
    23342388msgstr "像素"
    23352389
    2336 #: ../java/src/net/i2p/router/web/GraphHelper.java:136
     2390#: ../java/src/net/i2p/router/web/GraphHelper.java:138
    23372391msgid "Refresh delay"
    23382392msgstr "刷新延迟"
    23392393
    2340 #: ../java/src/net/i2p/router/web/GraphHelper.java:136
     2394#: ../java/src/net/i2p/router/web/GraphHelper.java:138
    23412395msgid "hour"
    23422396msgstr "小时"
    23432397
    2344 #: ../java/src/net/i2p/router/web/GraphHelper.java:136
     2398#: ../java/src/net/i2p/router/web/GraphHelper.java:138
    23452399msgid "minute"
    23462400msgstr "分钟"
    23472401
    2348 #: ../java/src/net/i2p/router/web/GraphHelper.java:136
     2402#: ../java/src/net/i2p/router/web/GraphHelper.java:138
    23492403msgid "minutes"
    23502404msgstr "分钟"
    23512405
    2352 #: ../java/src/net/i2p/router/web/GraphHelper.java:137
     2406#: ../java/src/net/i2p/router/web/GraphHelper.java:139
    23532407msgid "Redraw"
    23542408msgstr "重绘"
     
    23592413msgstr "文件位置"
    23602414
    2361 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:60
     2415#: ../java/src/net/i2p/router/web/NetDbRenderer.java:77
    23622416msgid "Network Database RouterInfo Lookup"
    23632417msgstr "网络数据库 RouterInfo 检索"
    23642418
    2365 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:75
     2419#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92
    23662420#: ../java/strings/Strings.java:68
    23672421msgid "Router"
    23682422msgstr "路由器"
    23692423
    2370 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:75
     2424#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92
    23712425msgid "not found in network database"
    23722426msgstr "在网络数据库概况未找到"
    23732427
    2374 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:83
    2375 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
     2428#: ../java/src/net/i2p/router/web/NetDbRenderer.java:104
     2429#: ../java/src/net/i2p/router/web/NetDbRenderer.java:212
    23762430msgid "Network Database Contents"
    23772431msgstr "网络数据库内容"
    23782432
    2379 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:84
     2433#: ../java/src/net/i2p/router/web/NetDbRenderer.java:105
    23802434msgid "View RouterInfo"
    23812435msgstr "浏览 RouterInfo"
    23822436
    2383 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:85
     2437#: ../java/src/net/i2p/router/web/NetDbRenderer.java:106
    23842438msgid "LeaseSets"
    23852439msgstr "赁集"
    23862440
    2387 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:93
     2441#: ../java/src/net/i2p/router/web/NetDbRenderer.java:128
    23882442msgid "LeaseSet"
    23892443msgstr "赁集"
    23902444
    2391 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
     2445#: ../java/src/net/i2p/router/web/NetDbRenderer.java:130
    23922446msgid "Local"
    23932447msgstr "本地"
    23942448
    2395 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:97
     2449#: ../java/src/net/i2p/router/web/NetDbRenderer.java:132
    23962450msgid "Unpublished"
    23972451msgstr "未发布"
    23982452
    2399 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:98
    2400 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:105
     2453#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133
     2454#: ../java/src/net/i2p/router/web/NetDbRenderer.java:140
    24012455msgid "Destination"
    24022456msgstr "目标"
    24032457
    2404 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:115
     2458#: ../java/src/net/i2p/router/web/NetDbRenderer.java:150
    24052459#, java-format
    24062460msgid "Expires in {0}"
    24072461msgstr "{0} 后过期"
    24082462
    2409 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:117
     2463#: ../java/src/net/i2p/router/web/NetDbRenderer.java:152
    24102464#, java-format
    24112465msgid "Expired {0} ago"
    24122466msgstr "{0}前过期"
    24132467
    2414 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:119
     2468#: ../java/src/net/i2p/router/web/NetDbRenderer.java:164
    24152469#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
    24162470msgid "Gateway"
    24172471msgstr "网关"
    24182472
    2419 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:119
     2473#: ../java/src/net/i2p/router/web/NetDbRenderer.java:164
    24202474msgid "Lease"
    24212475msgstr "租赁"
    24222476
    2423 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:121
     2477#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166
    24242478msgid "Tunnel"
    24252479msgstr "隧道"
    24262480
    2427 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
     2481#: ../java/src/net/i2p/router/web/NetDbRenderer.java:212
    24282482msgid "View LeaseSets"
    24292483msgstr "查看赁集"
    24302484
    2431 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:137
     2485#: ../java/src/net/i2p/router/web/NetDbRenderer.java:214
    24322486msgid "Not initialized"
    24332487msgstr "未初始化"
    24342488
    2435 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:146
     2489#: ../java/src/net/i2p/router/web/NetDbRenderer.java:223
    24362490msgid "Routers"
    24372491msgstr "路由器"
    24382492
    2439 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:148
     2493#: ../java/src/net/i2p/router/web/NetDbRenderer.java:225
    24402494msgid "Show all routers"
    24412495msgstr "显示所有路由器"
    24422496
    2443 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:150
     2497#: ../java/src/net/i2p/router/web/NetDbRenderer.java:227
    24442498msgid "Show all routers with full stats"
    24452499msgstr "显示所有路由及统计"
    24462500
    2447 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:185
     2501#: ../java/src/net/i2p/router/web/NetDbRenderer.java:262
    24482502msgid "Network Database Router Statistics"
    24492503msgstr "NetDb路由器统计"
    24502504
    2451 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:191
    2452 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:205
    2453 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:223
     2505#: ../java/src/net/i2p/router/web/NetDbRenderer.java:268
     2506#: ../java/src/net/i2p/router/web/NetDbRenderer.java:282
     2507#: ../java/src/net/i2p/router/web/NetDbRenderer.java:300
    24542508msgid "Count"
    24552509msgstr "计数"
    24562510
    2457 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:205
     2511#: ../java/src/net/i2p/router/web/NetDbRenderer.java:282
    24582512msgid "Transports"
    24592513msgstr "传输"
    24602514
    2461 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:223
     2515#: ../java/src/net/i2p/router/web/NetDbRenderer.java:300
    24622516msgid "Country"
    24632517msgstr "国家"
    24642518
    2465 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:255
     2519#: ../java/src/net/i2p/router/web/NetDbRenderer.java:339
    24662520msgid "Our info"
    24672521msgstr "我方信息"
    24682522
    2469 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:257
     2523#: ../java/src/net/i2p/router/web/NetDbRenderer.java:341
    24702524msgid "Peer info for"
    24712525msgstr "节点信息"
    24722526
    2473 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:261
     2527#: ../java/src/net/i2p/router/web/NetDbRenderer.java:345
    24742528msgid "Full entry"
    24752529msgstr "完整项"
    24762530
    2477 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:267
     2531#: ../java/src/net/i2p/router/web/NetDbRenderer.java:351
    24782532#: ../java/src/net/i2p/router/web/SummaryHelper.java:110
    24792533#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:600
     
    24812535msgstr "隐身"
    24822536
    2483 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:267
     2537#: ../java/src/net/i2p/router/web/NetDbRenderer.java:351
    24842538msgid "Updated"
    24852539msgstr "已更新"
    24862540
    2487 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:268
    2488 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
     2541#: ../java/src/net/i2p/router/web/NetDbRenderer.java:352
     2542#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355
    24892543#, java-format
    24902544msgid "{0} ago"
    24912545msgstr "{0}前"
    24922546
    2493 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:270
    2494 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:274
     2547#. shouldnt happen
     2548#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
     2549#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358
    24952550msgid "Published"
    24962551msgstr "发布"
    24972552
    2498 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:276
     2553#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360
    24992554msgid "Address(es)"
    25002555msgstr "地址"
    25012556
    2502 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:289
     2557#: ../java/src/net/i2p/router/web/NetDbRenderer.java:373
    25032558msgid "cost"
    2504 msgstr ""
    2505 
    2506 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:313
     2559msgstr "开销"
     2560
     2561#: ../java/src/net/i2p/router/web/NetDbRenderer.java:397
    25072562msgid "Hidden or starting up"
    25082563msgstr "隐身或正在启动"
    25092564
    2510 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:313
     2565#: ../java/src/net/i2p/router/web/NetDbRenderer.java:397
    25112566msgid "SSU"
    25122567msgstr ""
    25132568
    2514 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:313
     2569#: ../java/src/net/i2p/router/web/NetDbRenderer.java:397
    25152570msgid "SSU with introducers"
    25162571msgstr "使用中介的SSU连接"
    25172572
    2518 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:314
     2573#: ../java/src/net/i2p/router/web/NetDbRenderer.java:398
    25192574msgid "NTCP"
    25202575msgstr ""
    25212576
    2522 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:314
     2577#: ../java/src/net/i2p/router/web/NetDbRenderer.java:398
    25232578msgid "NTCP and SSU"
    25242579msgstr "NTCP 与 SSU"
    25252580
    2526 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:314
     2581#: ../java/src/net/i2p/router/web/NetDbRenderer.java:398
    25272582msgid "NTCP and SSU with introducers"
    25282583msgstr "使用中介的NTCP与SSU连接"
    25292584
    2530 #: ../java/src/net/i2p/router/web/NewsFetcher.java:80
     2585#: ../java/src/net/i2p/router/web/NewsFetcher.java:82
    25312586#, java-format
    25322587msgid "News last updated {0} ago."
    25332588msgstr "新闻更新于{0}前"
    25342589
    2535 #: ../java/src/net/i2p/router/web/NewsFetcher.java:86
     2590#: ../java/src/net/i2p/router/web/NewsFetcher.java:88
    25362591#, java-format
    25372592msgid "News last checked {0} ago."
     
    25482603msgstr "正在为插件 {0} 检查更新"
    25492604
    2550 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:153
     2605#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154
    25512606#, java-format
    25522607msgid "New plugin version {0} is available"
    25532608msgstr "新插件版本为 {0}"
    25542609
    2555 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:155
     2610#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156
    25562611#, java-format
    25572612msgid "No new version is available for plugin {0}"
    25582613msgstr "插件 {0} 有更新"
    25592614
    2560 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:164
     2615#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:165
    25612616#, java-format
    25622617msgid "Update check failed for plugin {0}"
     
    25992654msgstr "由 {0} 获取的插件缺少必要的配置文件"
    26002655
     2656#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
    26012657#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:199
    26022658#, java-format
     
    27592815
    27602816#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
    2761 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:264
     2817#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281
    27622818msgid "Integrated"
    27632819msgstr "已整合节点"
     
    27672823msgstr "不可达"
    27682824
     2825#. hide if < 10%
    27692826#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171
    27702827msgid "Test Fails"
     
    27852842#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
    27862843msgid "Integ. Value"
    2787 msgstr ""
     2844msgstr "整数值"
    27882845
    27892846#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
     
    28672924msgstr "netDb中的容量,与描述信息无关。"
    28682925
     2926#. capabilities
    28692927#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
    28702928#: ../java/strings/Strings.java:81
     
    29222980msgstr "立即解封"
    29232981
     2982#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
     2983#: ../java/src/net/i2p/router/web/StatSummarizer.java:174
     2984msgid "Bandwidth usage"
     2985msgstr "带宽占用"
     2986
     2987#: ../java/src/net/i2p/router/web/StatSummarizer.java:181
     2988msgid "Outbound bytes/sec"
     2989msgstr "出站(byte/s)"
     2990
     2991#. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3);
     2992#: ../java/src/net/i2p/router/web/StatSummarizer.java:183
     2993msgid "Inbound bytes/sec"
     2994msgstr "入站(byte/s)"
     2995
     2996#: ../java/src/net/i2p/router/web/StatSummarizer.java:186
     2997#: ../java/src/net/i2p/router/web/StatSummarizer.java:187
     2998#: ../java/src/net/i2p/router/web/StatSummarizer.java:188
     2999#: ../java/src/net/i2p/router/web/StatSummarizer.java:189
     3000msgid "bytes/sec"
     3001msgstr ""
     3002
     3003#: ../java/src/net/i2p/router/web/StatSummarizer.java:186
     3004msgid "out average"
     3005msgstr "出站平均值"
     3006
     3007#: ../java/src/net/i2p/router/web/StatSummarizer.java:187
     3008#: ../java/src/net/i2p/router/web/StatSummarizer.java:189
     3009#: ../java/src/net/i2p/router/web/SummaryRenderer.java:110
     3010msgid "max"
     3011msgstr "最大"
     3012
     3013#: ../java/src/net/i2p/router/web/StatSummarizer.java:188
     3014msgid "in average"
     3015msgstr "入站平均值"
     3016
    29243017#: ../java/src/net/i2p/router/web/StatsGenerator.java:56
    29253018msgid "GO"
     
    29663059msgstr "峰值平均值"
    29673060
     3061#. Display the strict average
    29683062#: ../java/src/net/i2p/router/web/StatsGenerator.java:217
    29693063msgid "lifetime average value"
    29703064msgstr "总平均值"
    29713065
    2972 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:44
     3066#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:40
     3067msgid "I2P Router Help &amp; FAQ"
     3068msgstr "I2P 使用帮助与常见问答"
     3069
     3070#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:42
     3071msgid "Help &amp; FAQ"
     3072msgstr ""
     3073
     3074#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:54
    29733075msgid "Configure startup of clients and webapps (services); manually start dormant services"
    29743076msgstr "设置客户程序及Web程序(服务)的启动;手动启动重要服务"
    29753077
    2976 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:46
     3078#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:56
    29773079msgid "I2P Services"
    29783080msgstr "I2P 服务"
    29793081
    2980 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:52
     3082#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:62
    29813083msgid "Manage your I2P hosts file here (I2P domain name resolution)"
    29823084msgstr "管理您的 I2P HOST表(I2P域名解析表)"
    29833085
    2984 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:54
     3086#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:64
    29853087msgid "Addressbook"
    29863088msgstr "地址簿"
    29873089
    2988 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:58
     3090#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:68
    29893091msgid "Built-in anonymous BitTorrent Client"
    29903092msgstr "内建的匿名 BitTorrent 客户端"
    29913093
    2992 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:60
     3094#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:70
    29933095msgid "Torrents"
    29943096msgstr "匿名BT"
    29953097
    2996 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:64
     3098#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:74
    29973099msgid "Anonymous webmail client"
    29983100msgstr "匿名Web邮件客户端"
    29993101
    3000 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:66
     3102#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:76
    30013103msgid "Webmail"
    30023104msgstr "匿名邮箱"
    30033105
    3004 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:70
     3106#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:80
    30053107msgid "Anonymous resident webserver"
    30063108msgstr "内置的匿名Web服务器"
    30073109
    3008 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:72
     3110#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:82
    30093111msgid "Webserver"
    30103112msgstr "匿名主页服务器"
    30113113
    3012 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:80
     3114#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:90
    30133115msgid "Configure I2P Router"
    30143116msgstr "设置 I2P 路由器"
    30153117
    3016 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:82
     3118#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:92
    30173119msgid "I2P Internals"
    30183120msgstr "I2P内部设置"
    30193121
    3020 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:88
    3021 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:359
     3122#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:98
     3123#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:374
    30223124msgid "View existing tunnels and tunnel build status"
    30233125msgstr "查看现存隧道及隧道的建立状态"
    30243126
    3025 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:94
    3026 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:236
     3127#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:104
     3128#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
    30273129msgid "Show all current peer connections"
    30283130msgstr "显示当前所有的节点连接"
    30293131
    3030 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:100
     3132#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:110
    30313133msgid "Show recent peer performance profiles"
    30323134msgstr "显示当前节点的性能记录"
    30333135
    3034 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:102
     3136#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:112
    30353137msgid "Profiles"
    30363138msgstr "节点信息"
    30373139
    3038 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:106
     3140#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:116
    30393141msgid "Show list of all known I2P routers"
    30403142msgstr "包含所有已知I2P路由器的列表"
    30413143
    3042 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:108
     3144#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:118
    30433145msgid "NetDB"
    30443146msgstr "NetDB"
    30453147
    3046 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:112
     3148#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:122
    30473149msgid "Health Report"
    30483150msgstr "路由器健康状况报告"
    30493151
    3050 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:114
     3152#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:124
    30513153msgid "Logs"
    30523154msgstr "日志"
    30533155
    3054 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:124
     3156#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:134
    30553157msgid "Graph router performance"
    30563158msgstr "路由性能统计图"
    30573159
    3058 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:126
     3160#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:136
    30593161msgid "Graphs"
    30603162msgstr "图表"
    30613163
    3062 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:130
     3164#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:140
    30633165msgid "Textual router performance statistics"
    30643166msgstr "路由性能文字统计"
    30653167
    3066 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:136
    3067 #: ../java/src/net/i2p/router/web/SummaryHelper.java:375
     3168#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:146
     3169#: ../java/src/net/i2p/router/web/SummaryHelper.java:365
    30683170msgid "Local Destinations"
    30693171msgstr "本地服务"
    30703172
    3071 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:138
     3173#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:148
    30723174#: ../java/strings/Strings.java:62
    30733175msgid "I2PTunnel"
    30743176msgstr "I2P隧道"
    30753177
    3076 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149
     3178#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:159
    30773179msgid "I2P Router Help"
    30783180msgstr "I2P路由帮助"
    30793181
    3080 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:151
     3182#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:161
    30813183msgid "General"
    30823184msgstr "功能概况"
    30833185
    3084 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:154
     3186#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166
     3187msgid "Local Identity"
     3188msgstr "本地身份"
     3189
     3190#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:170
    30853191msgid "Your unique I2P router identity is"
    30863192msgstr "您I2P路由的唯一身份为"
    30873193
    3088 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:158
     3194#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:174
    30893195msgid "never reveal it to anyone"
    30903196msgstr "切勿将其告诉任何人"
    30913197
    3092 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:160
    3093 msgid "Local Identity"
    3094 msgstr "本地身份"
    3095 
    3096 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:172
     3198#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:176
     3199msgid "show"
     3200msgstr "显示"
     3201
     3202#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:187
    30973203msgid "How long we've been running for this session"
    30983204msgstr "本次路由运行时间"
    30993205
    3100 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175
     3206#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:190
    31013207msgid "Uptime"
    31023208msgstr "运行时间"
    31033209
    3104 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:182
     3210#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:197
    31053211msgid "Help with configuring your firewall and router for optimal I2P performance"
    31063212msgstr "如何正确配置防火墙和(物理)路由器优化I2P性能"
    31073213
    3108 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:209
     3214#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:226
    31093215msgid "Download"
    31103216msgstr "下载"
    31113217
    3112 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:218
     3218#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235
    31133219msgid "Download Unsigned"
    31143220msgstr "下载未签名更新"
    31153221
    3116 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:244
     3222#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261
    31173223msgid "Active"
    31183224msgstr "活动节点"
    31193225
    3120 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:252
     3226#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:269
    31213227msgid "Fast"
    31223228msgstr "快速节点"
    31233229
    3124 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258
     3230#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275
    31253231msgid "High capacity"
    31263232msgstr "高容量节点"
    31273233
    3128 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270
     3234#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287
    31293235msgid "Known"
    31303236msgstr "已知节点"
    31313237
    3132 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:285
     3238#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:302
    31333239msgid "Help with firewall configuration"
    31343240msgstr "如何配置防火墙"
    31353241
    3136 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287
     3242#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:304
    31373243msgid "Check NAT/firewall"
    31383244msgstr "检查NAT/防火墙"
    31393245
    3140 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:307
     3246#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:324
    31413247msgid "Reseed"
    31423248msgstr "补种(搜索节点启动网络)"
    31433249
    3144 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:324
     3250#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:341
    31453251msgid "Configure router bandwidth allocation"
    31463252msgstr "设置路由的带宽分配"
    31473253
    3148 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:326
     3254#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:343
    31493255msgid "Bandwidth in/out"