diff --git a/.tx/config b/.tx/config index 1374640b0..dad162975 100644 --- a/.tx/config +++ b/.tx/config @@ -12,9 +12,11 @@ trans.it = apps/i2ptunnel/locale/messages_it.po trans.ja = apps/i2ptunnel/locale/messages_ja.po trans.nb = apps/i2ptunnel/locale/messages_nb.po trans.nl = apps/i2ptunnel/locale/messages_nl.po +trans.nn = apps/i2ptunnel/locale/messages_nn.po trans.pl = apps/i2ptunnel/locale/messages_pl.po trans.pt = apps/i2ptunnel/locale/messages_pt.po trans.pt_BR = apps/i2ptunnel/locale/messages_pt_BR.po +trans.ro = apps/i2ptunnel/locale/messages_ro.po trans.ru_RU = apps/i2ptunnel/locale/messages_ru.po trans.sk = apps/i2ptunnel/locale/messages_sk.po trans.sv_SE = apps/i2ptunnel/locale/messages_sv.po @@ -39,6 +41,7 @@ trans.pt = apps/i2ptunnel/locale-proxy/messages_pt.po trans.pt_BR = apps/i2ptunnel/locale-proxy/messages_pt_BR.po trans.ro = apps/i2ptunnel/locale-proxy/messages_ro.po trans.ru_RU = apps/i2ptunnel/locale-proxy/messages_ru.po +trans.sk = apps/i2ptunnel/locale-proxy/messages_sk.po trans.sv_SE = apps/i2ptunnel/locale-proxy/messages_sv.po trans.uk_UA = apps/i2ptunnel/locale-proxy/messages_uk.po trans.vi = apps/i2ptunnel/locale-proxy/messages_vi.po @@ -80,8 +83,10 @@ trans.de = apps/routerconsole/locale-news/messages_de.po trans.es = apps/routerconsole/locale-news/messages_es.po trans.fr = apps/routerconsole/locale-news/messages_fr.po trans.he = apps/routerconsole/locale-news/messages_he.po -trans.ja = apps/routerconsole/locale-news/messages_ja.po trans.it = apps/routerconsole/locale-news/messages_it.po +trans.ja = apps/routerconsole/locale-news/messages_ja.po +trans.ko = apps/routerconsole/locale-news/messages_ko.po +trans.nb = apps/routerconsole/locale-news/messages_nb.po trans.nl = apps/routerconsole/locale-news/messages_nl.po trans.pl = apps/routerconsole/locale-news/messages_pl.po trans.pt = apps/routerconsole/locale-news/messages_pt.po @@ -91,12 +96,14 @@ trans.ru_RU = apps/routerconsole/locale-news/messages_ru.po trans.sk = apps/routerconsole/locale-news/messages_sk.po trans.sv_SE = apps/routerconsole/locale-news/messages_sv.po trans.tr_TR = apps/routerconsole/locale-news/messages_tr.po +trans.uk_UA = apps/routerconsole/locale-news/messages_uk.po trans.zh_CN = apps/routerconsole/locale-news/messages_zh.po [I2P.countries] type = PO source_file = apps/routerconsole/locale-countries/messages_en.po source_lang = en +trans.ca = apps/routerconsole/locale-countries/messages_ca.po trans.da = apps/routerconsole/locale-countries/messages_da.po trans.de = apps/routerconsole/locale-countries/messages_de.po trans.el = apps/routerconsole/locale-countries/messages_el.po @@ -115,7 +122,9 @@ trans.pt_BR = apps/routerconsole/locale-countries/messages_pt_BR.po trans.ro = apps/routerconsole/locale-countries/messages_ro.po trans.ru_RU = apps/routerconsole/locale-countries/messages_ru.po trans.sk = apps/routerconsole/locale-countries/messages_sk.po +trans.sq = apps/routerconsole/locale-countries/messages_sq.po trans.sv_SE = apps/routerconsole/locale-countries/messages_sv.po +trans.uk_UA = apps/routerconsole/locale-countries/messages_uk.po trans.tr_TR = apps/routerconsole/locale-countries/messages_tr.po trans.vi = apps/routerconsole/locale-countries/messages_vi.po trans.zh_CN = apps/routerconsole/locale-countries/messages_zh.po @@ -134,6 +143,7 @@ trans.nb = apps/i2psnark/locale/messages_nb.po trans.nl = apps/i2psnark/locale/messages_nl.po trans.pl = apps/i2psnark/locale/messages_pl.po trans.pt = apps/i2psnark/locale/messages_pt.po +trans.pt_BR = apps/i2psnark/locale/messages_pt_bR.po trans.ro = apps/i2psnark/locale/messages_ro.po trans.ru_RU = apps/i2psnark/locale/messages_ru.po trans.sk = apps/i2psnark/locale/messages_sk.po @@ -161,6 +171,7 @@ trans.pt_BR = apps/susidns/locale/messages_pt_BR.po trans.ro = apps/susidns/locale/messages_ro.po trans.ru_RU = apps/susidns/locale/messages_ru.po trans.sv_SE = apps/susidns/locale/messages_sv.po +trans.tr_TR = apps/susidns/locale/messages_tr.po trans.uk_UA = apps/susidns/locale/messages_uk.po trans.vi = apps/susidns/locale/messages_vi.po trans.zh_CN = apps/susidns/locale/messages_zh.po @@ -194,6 +205,7 @@ trans.zh_CN = apps/desktopgui/locale/messages_zh.po source_file = apps/susimail/locale/messages_en.po source_lang = en trans.cs = apps/susimail/locale/messages_cs.po +trans.da = apps/susimail/locale/messages_da.po trans.de = apps/susimail/locale/messages_de.po trans.es = apps/susimail/locale/messages_es.po trans.fr = apps/susimail/locale/messages_fr.po @@ -242,6 +254,7 @@ trans.fr = installer/resources/locale/po/messages_fr.po trans.it = installer/resources/locale/po/messages_it.po trans.pl = installer/resources/locale/po/messages_pl.po trans.ja = installer/resources/locale/po/messages_ja.po +trans.pl = installer/resources/locale/po/messages_pl.po trans.pt = installer/resources/locale/po/messages_pt.po trans.pt_BR = installer/resources/locale/po/messages_pt_BR.po trans.ro = installer/resources/locale/po/messages_ro.po @@ -274,6 +287,14 @@ trans.zh_CN = core/java/src/gnu/getopt/MessagesBundle_zh.properties [I2P.streaming] source_file = apps/ministreaming/locale/messages_en.po source_lang = en +trans.de = apps/ministreaming/locale/messages_de.po +trans.es = apps/ministreaming/locale/messages_es.po +trans.fr = apps/ministreaming/locale/messages_fr.po +trans.it = apps/ministreaming/locale/messages_it.po +trans.nb = apps/ministreaming/locale/messages_nb.po +trans.ru_RU = apps/ministreaming/locale/messages_ru.po +trans.uk_UA = apps/ministreaming/locale/messages_uk.po +trans.zh_CN = apps/ministreaming/locale/messages_zh.po [main] host = https://www.transifex.com diff --git a/apps/BOB/src/net/i2p/BOB/BOB.java b/apps/BOB/src/net/i2p/BOB/BOB.java index 8277fd259..6dbbe3712 100644 --- a/apps/BOB/src/net/i2p/BOB/BOB.java +++ b/apps/BOB/src/net/i2p/BOB/BOB.java @@ -119,15 +119,16 @@ public class BOB implements Runnable, ClientApp { public final static String PROP_BOB_HOST = "BOB.host"; public final static String PROP_CFG_VER = "BOB.CFG.VER"; + /** unused when started via the ClientApp interface */ private static BOB _bob; - private NamedDB database; - private Properties props = new Properties(); - private AtomicBoolean spin = new AtomicBoolean(true); + private final NamedDB database; + private final Properties props = new Properties(); + private final AtomicBoolean spin = new AtomicBoolean(true); private static final String P_RUNNING = "RUNNING"; private static final String P_STARTING = "STARTING"; private static final String P_STOPPING = "STOPPING"; - private AtomicBoolean lock = new AtomicBoolean(false); + private final AtomicBoolean lock = new AtomicBoolean(false); // no longer used. // private static int maxConnections = 0; @@ -143,8 +144,9 @@ public class BOB implements Runnable, ClientApp { * Stop BOB gracefully * @deprecated unused */ - public static void stop() { - _bob.shutdown(null); + public synchronized static void stop() { + if (_bob != null) + _bob.shutdown(null); } /** @@ -189,7 +191,7 @@ public class BOB implements Runnable, ClientApp { * * @param args */ - public static void main(String[] args) { + public synchronized static void main(String[] args) { try { _bob = new BOB(I2PAppContext.getGlobalContext(), null, args); _bob.startup(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/CompleteListener.java b/apps/i2psnark/java/src/org/klomp/snark/CompleteListener.java index 77fa9c98b..bd2f78e53 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/CompleteListener.java +++ b/apps/i2psnark/java/src/org/klomp/snark/CompleteListener.java @@ -57,4 +57,5 @@ public interface CompleteListener { // not really listeners but the easiest way to get back to an optional SnarkManager public long getSavedTorrentTime(Snark snark); public BitField getSavedTorrentBitField(Snark snark); + public boolean getSavedPreserveNamesSetting(Snark snark); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/IdleChecker.java b/apps/i2psnark/java/src/org/klomp/snark/IdleChecker.java index ff6454ee2..58a73b668 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/IdleChecker.java +++ b/apps/i2psnark/java/src/org/klomp/snark/IdleChecker.java @@ -66,7 +66,8 @@ class IdleChecker extends SimpleTimer2.TimedEvent { if (_log.shouldLog(Log.WARN)) _log.warn("Closing tunnels on idle"); _util.disconnect(); - _mgr.addMessage(_util.getString("I2P tunnel closed.")); + _mgr.addMessage(_util.getString("No more torrents running.") + ' ' + + _util.getString("I2P tunnel closed.")); schedule(3 * CHECK_TIME); return; } diff --git a/apps/i2psnark/java/src/org/klomp/snark/MagnetURI.java b/apps/i2psnark/java/src/org/klomp/snark/MagnetURI.java index 9044d62ff..60698a091 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/MagnetURI.java +++ b/apps/i2psnark/java/src/org/klomp/snark/MagnetURI.java @@ -42,7 +42,7 @@ public class MagnetURI { name = util.getString("Magnet") + ' ' + ihash; String dn = getParam("dn", url); if (dn != null) - name += " (" + Storage.filterName(dn) + ')'; + name += " (" + dn + ')'; } else if (url.startsWith(MAGGOT)) { // maggot://0691e40aae02e552cfcb57af1dca56214680c0c5:0b557bbdf8718e95d352fbe994dec3a383e2ede7 ihash = url.substring(MAGGOT.length()).trim(); @@ -82,7 +82,7 @@ public class MagnetURI { } /** - * @return pretty name or null + * @return pretty name or null, NOT HTML escaped */ public String getName() { return _name; diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index 35008394e..cf295a530 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -163,7 +163,7 @@ class PeerState implements DataLoader _log.debug(peer + " rcv bitfield"); if (bitfield != null) { - // XXX - Be liberal in what you except? + // XXX - Be liberal in what you accept? if (_log.shouldLog(Log.WARN)) _log.warn("Got unexpected bitfield message from " + peer); return; diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index d57fc3c45..e9d0937e6 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -34,6 +34,7 @@ import net.i2p.I2PAppContext; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.data.Destination; import net.i2p.util.Log; +import net.i2p.util.SecureFile; /** * Main Snark program startup class. @@ -221,7 +222,7 @@ public class Snark private PeerCoordinator coordinator; private ConnectionAcceptor acceptor; private TrackerClient trackerclient; - private String rootDataDir = "."; + private final File rootDataDir; private final CompleteListener completeListener; private volatile boolean stopped; private volatile boolean starting; @@ -238,13 +239,21 @@ public class Snark private volatile String activity = "Not started"; - /** from main() via parseArguments() single torrent */ + /** + * from main() via parseArguments() single torrent + * + * @deprecated unused + */ Snark(I2PSnarkUtil util, String torrent, String ip, int user_port, StorageListener slistener, CoordinatorListener clistener) { this(util, torrent, ip, user_port, slistener, clistener, null, null, null, true, "."); } - /** single torrent - via router */ + /** + * single torrent - via router + * + * @deprecated unused + */ public Snark(I2PAppContext ctx, Properties opts, String torrent, StorageListener slistener, boolean start, String rootDir) { this(new I2PSnarkUtil(ctx), torrent, null, -1, slistener, null, null, null, null, false, rootDir); @@ -275,11 +284,28 @@ public class Snark this.startTorrent(); } - /** multitorrent */ + /** + * multitorrent + */ public Snark(I2PSnarkUtil util, String torrent, String ip, int user_port, StorageListener slistener, CoordinatorListener clistener, CompleteListener complistener, PeerCoordinatorSet peerCoordinatorSet, ConnectionAcceptor connectionAcceptor, boolean start, String rootDir) + { + this(util, torrent, ip, user_port, slistener, clistener, complistener, + peerCoordinatorSet, connectionAcceptor, start, rootDir, null); + } + + /** + * multitorrent + * + * @param baseFile if null, use rootDir/torrentName; if non-null, use it instead + * @since 0.9.11 + */ + public Snark(I2PSnarkUtil util, String torrent, String ip, int user_port, + StorageListener slistener, CoordinatorListener clistener, + CompleteListener complistener, PeerCoordinatorSet peerCoordinatorSet, + ConnectionAcceptor connectionAcceptor, boolean start, String rootDir, File baseFile) { if (slistener == null) slistener = this; @@ -291,7 +317,7 @@ public class Snark acceptor = connectionAcceptor; this.torrent = torrent; - this.rootDataDir = rootDir; + this.rootDataDir = new File(rootDir); stopped = true; activity = "Network setup"; @@ -394,13 +420,22 @@ public class Snark try { activity = "Checking storage"; - storage = new Storage(_util, meta, slistener); + boolean shouldPreserve = completeListener != null && completeListener.getSavedPreserveNamesSetting(this); + if (baseFile == null) { + String base = meta.getName(); + if (!shouldPreserve) + base = Storage.filterName(base); + if (_util.getFilesPublic()) + baseFile = new File(rootDataDir, base); + else + baseFile = new SecureFile(rootDataDir, base); + } + storage = new Storage(_util, baseFile, meta, slistener, shouldPreserve); if (completeListener != null) { - storage.check(rootDataDir, - completeListener.getSavedTorrentTime(this), + storage.check(completeListener.getSavedTorrentTime(this), completeListener.getSavedTorrentBitField(this)); } else { - storage.check(rootDataDir); + storage.check(); } // have to figure out when to reopen // if (!start) @@ -452,7 +487,7 @@ public class Snark this.torrent = torrent; this.infoHash = ih; this.additionalTrackerURL = trackerURL; - this.rootDataDir = rootDir; + this.rootDataDir = rootDir != null ? new File(rootDir) : null; // null only for FetchAndAdd extension stopped = true; id = generateID(); @@ -547,7 +582,7 @@ public class Snark } else if (trackerclient.halted()) { if (storage != null) { try { - storage.reopen(rootDataDir); + storage.reopen(); } catch (IOException ioe) { try { storage.close(); } catch (IOException ioee) { ioee.printStackTrace(); @@ -1102,9 +1137,15 @@ public class Snark */ public void gotMetaInfo(PeerCoordinator coordinator, MetaInfo metainfo) { try { + String base = Storage.filterName(metainfo.getName()); + File baseFile; + if (_util.getFilesPublic()) + baseFile = new File(rootDataDir, base); + else + baseFile = new SecureFile(rootDataDir, base); // The following two may throw IOE... - storage = new Storage(_util, metainfo, this); - storage.check(rootDataDir); + storage = new Storage(_util, baseFile, metainfo, this, false); + storage.check(); // ... so don't set meta until here meta = metainfo; if (completeListener != null) { diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 073748d59..b910e32d5 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -15,6 +15,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; @@ -40,6 +41,7 @@ import net.i2p.util.SimpleTimer; import net.i2p.util.SimpleTimer2; import org.klomp.snark.dht.DHT; +import org.klomp.snark.dht.KRPC; /** * Manage multiple snarks @@ -55,7 +57,10 @@ public class SnarkManager implements CompleteListener { /** used to prevent DirMonitor from deleting torrents that don't have a torrent file yet */ private final Set _magnets; private final Object _addSnarkLock; - private /* FIXME final FIXME */ File _configFile; + private File _configFile; + private File _configDir; + /** one lock for all config, files for simplicity */ + private final Object _configLock = new Object(); private Properties _config; private final I2PAppContext _context; private final String _contextPath; @@ -81,14 +86,21 @@ public class SnarkManager implements CompleteListener { public static final String PROP_UPLOADERS_TOTAL = "i2psnark.uploaders.total"; public static final String PROP_UPBW_MAX = "i2psnark.upbw.max"; public static final String PROP_DIR = "i2psnark.dir"; - public static final String PROP_META_PREFIX = "i2psnark.zmeta."; - public static final String PROP_META_BITFIELD_SUFFIX = ".bitfield"; - public static final String PROP_META_PRIORITY_SUFFIX = ".priority"; - public static final String PROP_META_MAGNET_PREFIX = "i2psnark.magnet."; + private static final String PROP_META_PREFIX = "i2psnark.zmeta."; + private static final String PROP_META_STAMP = "stamp"; + private static final String PROP_META_BASE = "base"; + private static final String PROP_META_BITFIELD = "bitfield"; + private static final String PROP_META_PRIORITY = "priority"; + private static final String PROP_META_PRESERVE_NAMES = "preserveFileNames"; + //private static final String PROP_META_BITFIELD_SUFFIX = ".bitfield"; + //private static final String PROP_META_PRIORITY_SUFFIX = ".priority"; + private static final String PROP_META_MAGNET_PREFIX = "i2psnark.magnet."; private static final String CONFIG_FILE_SUFFIX = ".config"; + private static final String CONFIG_FILE = "i2psnark" + CONFIG_FILE_SUFFIX; public static final String PROP_FILES_PUBLIC = "i2psnark.filesPublic"; - public static final String PROP_AUTO_START = "i2snark.autoStart"; // oops + public static final String PROP_OLD_AUTO_START = "i2snark.autoStart"; // oops + public static final String PROP_AUTO_START = "i2psnark.autoStart"; // convert in migration to new config file public static final String DEFAULT_AUTO_START = "false"; //public static final String PROP_LINK_PREFIX = "i2psnark.linkPrefix"; //public static final String DEFAULT_LINK_PREFIX = "file:///"; @@ -109,6 +121,9 @@ public class SnarkManager implements CompleteListener { public static final int DEFAULT_STARTUP_DELAY = 3; public static final int DEFAULT_REFRESH_DELAY_SECS = 60; private static final int DEFAULT_PAGE_SIZE = 50; + public static final String CONFIG_DIR_SUFFIX = ".d"; + private static final String SUBDIR_PREFIX = "s"; + private static final String B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-~"; /** * "name", "announceURL=websiteURL" pairs @@ -169,9 +184,11 @@ public class SnarkManager implements CompleteListener { _messages = new LinkedBlockingQueue(); _util = new I2PSnarkUtil(_context, ctxName); String cfile = ctxName + CONFIG_FILE_SUFFIX; - _configFile = new File(cfile); - if (!_configFile.isAbsolute()) - _configFile = new File(_context.getConfigDir(), cfile); + File configFile = new File(cfile); + if (!configFile.isAbsolute()) + configFile = new File(_context.getConfigDir(), cfile); + _configDir = migrateConfig(configFile); + _configFile = new File(_configDir, CONFIG_FILE); _trackerMap = new ConcurrentHashMap(4); loadConfig(null); } @@ -341,20 +358,179 @@ public class SnarkManager implements CompleteListener { return f; } + /** + * Migrate the old flat config file to the new config dir + * containing the config file minus the per-torrent entries, + * the dht file, and 16 subdirs for per-torrent config files + * Caller must synch. + * + * @return the new config directory, non-null + * @throws RuntimeException on creation fail + * @since 0.9.11 + */ + private File migrateConfig(File oldFile) { + File dir = new SecureDirectory(oldFile + CONFIG_DIR_SUFFIX); + if ((!dir.exists()) && (!dir.mkdirs())) { + _log.error("Error creating I2PSnark config dir " + dir); + throw new RuntimeException("Error creating I2PSnark config dir " + dir); + } + // move the DHT file as-is + String oldName = oldFile.toString(); + if (oldName.endsWith(CONFIG_FILE_SUFFIX)) { + String oldDHT = oldName.replace(CONFIG_FILE_SUFFIX, KRPC.DHT_FILE_SUFFIX); + File oldDHTFile = new File(oldDHT); + if (oldDHTFile.exists()) { + File newDHTFile = new File(dir, "i2psnark" + KRPC.DHT_FILE_SUFFIX); + FileUtil.rename(oldDHTFile, newDHTFile); + } + } + if (!oldFile.exists()) + return dir; + Properties oldProps = new Properties(); + try { + DataHelper.loadProps(oldProps, oldFile); + // a good time to fix this ancient typo + String auto = (String) oldProps.remove(PROP_OLD_AUTO_START); + if (auto != null) + oldProps.setProperty(PROP_AUTO_START, auto); + } catch (IOException ioe) { + _log.error("Error loading I2PSnark config " + oldFile, ioe); + return dir; + } + // Gather the props for each torrent, removing them from config + // old b64 of hash as key + Map configs = new HashMap(16); + for (Iterator> iter = oldProps.entrySet().iterator(); iter.hasNext(); ) { + Map.Entry e = iter.next(); + String k = (String) e.getKey(); + if (k.startsWith(PROP_META_PREFIX)) { + iter.remove(); + String v = (String) e.getValue(); + try { + k = k.substring(PROP_META_PREFIX.length()); + String h = k.substring(0, 28); // length of b64 of 160 bit infohash + k = k.substring(29); // skip '.' + Properties tprops = configs.get(h); + if (tprops == null) { + tprops = new OrderedProperties(); + configs.put(h, tprops); + } + if (k.equals(PROP_META_BITFIELD)) { + // old config was timestamp,bitfield; split them + int comma = v.indexOf(','); + if (comma > 0 && v.length() > comma + 1) { + tprops.put(PROP_META_STAMP, v.substring(0, comma)); + tprops.put(PROP_META_BITFIELD, v.substring(comma + 1)); + } else { + // timestamp only?? + tprops.put(PROP_META_STAMP, v); + } + } else { + tprops.put(k, v); + } + } catch (IndexOutOfBoundsException ioobe) { + continue; + } + } + } + // Now make a config file for each torrent + for (Map.Entry e : configs.entrySet()) { + String b64 = e.getKey(); + Properties props = e.getValue(); + if (props.isEmpty()) + continue; + b64 = b64.replace('$', '='); + byte[] ih = Base64.decode(b64); + if (ih == null || ih.length != 20) + continue; + File cfg = configFile(dir, ih); + if (!cfg.exists()) { + File subdir = cfg.getParentFile(); + if (!subdir.exists()) + subdir.mkdirs(); + try { + DataHelper.storeProps(props, cfg); + } catch (IOException ioe) { + _log.error("Error storing I2PSnark config " + cfg, ioe); + } + } + } + // now store in new location, minus the zmeta entries + File newFile = new File(dir, CONFIG_FILE); + Properties newProps = new OrderedProperties(); + newProps.putAll(oldProps); + try { + DataHelper.storeProps(newProps, newFile); + } catch (IOException ioe) { + _log.error("Error storing I2PSnark config " + newFile, ioe); + return dir; + } + oldFile.delete(); + if (_log.shouldLog(Log.WARN)) + _log.warn("Config migrated from " + oldFile + " to " + dir); + return dir; + } + + /** + * The config for a torrent + * @return non-null, possibly empty + * @since 0.9.11 + */ + private Properties getConfig(Snark snark) { + return getConfig(snark.getInfoHash()); + } + + /** + * The config for a torrent + * @param ih 20-byte infohash + * @return non-null, possibly empty + * @since 0.9.11 + */ + private Properties getConfig(byte[] ih) { + Properties rv = new OrderedProperties(); + File conf = configFile(_configDir, ih); + synchronized(_configLock) { // one lock for all + try { + DataHelper.loadProps(rv, conf); + } catch (IOException ioe) {} + } + return rv; + } + + /** + * The config file for a torrent + * @param confDir the config directory + * @param ih 20-byte infohash + * @since 0.9.11 + */ + private static File configFile(File confDir, byte[] ih) { + String hex = I2PSnarkUtil.toHex(ih); + File subdir = new SecureDirectory(confDir, SUBDIR_PREFIX + B64.charAt((ih[0] >> 2) & 0x3f)); + return new File(subdir, hex + CONFIG_FILE_SUFFIX); + } + /** null to set initial defaults */ public void loadConfig(String filename) { + synchronized(_configLock) { + locked_loadConfig(filename); + } + } + + /** null to set initial defaults */ + private void locked_loadConfig(String filename) { if (_config == null) _config = new OrderedProperties(); if (filename != null) { File cfg = new File(filename); if (!cfg.isAbsolute()) cfg = new File(_context.getConfigDir(), filename); - _configFile = cfg; - if (cfg.exists()) { + _configDir = migrateConfig(cfg); + _configFile = new File(_configDir, CONFIG_FILE); + if (_configFile.exists()) { try { - DataHelper.loadProps(_config, cfg); + DataHelper.loadProps(_config, _configFile); } catch (IOException ioe) { - _log.error("Error loading I2PSnark config '" + filename + "'", ioe); + _log.error("Error loading I2PSnark config " + _configFile, ioe); } } } @@ -388,6 +564,7 @@ public class SnarkManager implements CompleteListener { // _config.setProperty(PROP_USE_DHT, Boolean.toString(I2PSnarkUtil.DEFAULT_USE_DHT)); updateConfig(); } + /** * Get current theme. * @return String -- the current theme @@ -505,6 +682,18 @@ public class SnarkManager implements CompleteListener { String startDelay, String pageSize, String seedPct, String eepHost, String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts, String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme) { + synchronized(_configLock) { + locked_updateConfig(dataDir, filesPublic, autoStart, refreshDelay, + startDelay, pageSize, seedPct, eepHost, + eepPort, i2cpHost, i2cpPort, i2cpOpts, + upLimit, upBW, useOpenTrackers, useDHT, theme); + } + } + + private void locked_updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay, + String startDelay, String pageSize, String seedPct, String eepHost, + String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts, + String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme) { boolean changed = false; boolean interruptMonitor = false; //if (eepHost != null) { @@ -836,7 +1025,7 @@ public class SnarkManager implements CompleteListener { public void saveConfig() { try { - synchronized (_configFile) { + synchronized (_configLock) { DataHelper.storeProps(_config, _configFile); } } catch (IOException ioe) { @@ -844,13 +1033,6 @@ public class SnarkManager implements CompleteListener { } } - public Properties getConfig() { return _config; } - - /** @since Jetty 7 */ - public String getConfigFilename() { - return _configFile.getAbsolutePath(); - } - /** hardcoded for sanity. perhaps this should be customizable, for people who increase their ulimit, etc. */ public static final int MAX_FILES_PER_TORRENT = 512; @@ -908,15 +1090,23 @@ public class SnarkManager implements CompleteListener { /** * Caller must verify this torrent is not already added. + * + * @param filename the absolute path to save the metainfo to, generally ending in ".torrent" + * @param baseFile may be null, if so look in rootDataDir * @throws RuntimeException via Snark.fatal() */ - private void addTorrent(String filename) { addTorrent(filename, false); } + private void addTorrent(String filename) { + addTorrent(filename, null, false); + } /** * Caller must verify this torrent is not already added. + * + * @param filename the absolute path to save the metainfo to, generally ending in ".torrent" + * @param baseFile may be null, if so look in rootDataDir * @throws RuntimeException via Snark.fatal() */ - private void addTorrent(String filename, boolean dontAutoStart) { + private void addTorrent(String filename, File baseFile, boolean dontAutoStart) { if ((!dontAutoStart) && !_util.connected()) { addMessage(_("Connecting to I2P")); boolean ok = _util.connect(); @@ -997,9 +1187,13 @@ public class SnarkManager implements CompleteListener { } else { // TODO load saved closest DHT nodes and pass to the Snark ? // This may take a LONG time + if (baseFile == null) + baseFile = getSavedBaseFile(info.getInfoHash()); + if (_log.shouldLog(Log.INFO)) + _log.info("New Snark, torrent: " + filename + " base: " + baseFile); torrent = new Snark(_util, filename, null, -1, null, null, this, _peerCoordinatorSet, _connectionAcceptor, - false, dataDir.getPath()); + false, dataDir.getPath(), baseFile); loadSavedFilePriorities(torrent); synchronized (_snarks) { _snarks.put(filename, torrent); @@ -1142,32 +1336,39 @@ public class SnarkManager implements CompleteListener { * This verifies that a torrent with this infohash is not already added. * This may take a LONG time to create or check the storage. * + * Called from servlet. This is only for the 'create torrent' form. + * * @param metainfo the metainfo for the torrent * @param bitfield the current completion status of the torrent * @param filename the absolute path to save the metainfo to, generally ending in ".torrent", which is also the name of the torrent * Must be a filesystem-safe name. + * @param baseFile may be null, if so look in rootDataDir * @throws RuntimeException via Snark.fatal() + * @return success * @since 0.8.4 */ - public void addTorrent(MetaInfo metainfo, BitField bitfield, String filename, boolean dontAutoStart) throws IOException { + public boolean addTorrent(MetaInfo metainfo, BitField bitfield, String filename, + File baseFile, boolean dontAutoStart) throws IOException { // prevent interference by DirMonitor synchronized (_snarks) { Snark snark = getTorrentByInfoHash(metainfo.getInfoHash()); if (snark != null) { addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); - return; + return false; } // so addTorrent won't recheck - saveTorrentStatus(metainfo, bitfield, null); // no file priorities + saveTorrentStatus(metainfo, bitfield, null, baseFile, true); // no file priorities try { locked_writeMetaInfo(metainfo, filename, areFilesPublic()); // hold the lock for a long time - addTorrent(filename, dontAutoStart); + addTorrent(filename, baseFile, dontAutoStart); } catch (IOException ioe) { addMessage(_("Failed to copy torrent file to {0}", filename)); _log.error("Failed to write torrent file", ioe); + return false; } } + return true; } /** @@ -1235,16 +1436,10 @@ public class SnarkManager implements CompleteListener { * A Snark.CompleteListener method. */ public long getSavedTorrentTime(Snark snark) { - byte[] ih = snark.getInfoHash(); - String infohash = Base64.encode(ih); - infohash = infohash.replace('=', '$'); - String time = _config.getProperty(PROP_META_PREFIX + infohash + PROP_META_BITFIELD_SUFFIX); + Properties config = getConfig(snark); + String time = config.getProperty(PROP_META_STAMP); if (time == null) return 0; - int comma = time.indexOf(','); - if (comma <= 0) - return 0; - time = time.substring(0, comma); try { return Long.parseLong(time); } catch (NumberFormatException nfe) {} return 0; } @@ -1258,16 +1453,10 @@ public class SnarkManager implements CompleteListener { MetaInfo metainfo = snark.getMetaInfo(); if (metainfo == null) return null; - byte[] ih = snark.getInfoHash(); - String infohash = Base64.encode(ih); - infohash = infohash.replace('=', '$'); - String bf = _config.getProperty(PROP_META_PREFIX + infohash + PROP_META_BITFIELD_SUFFIX); + Properties config = getConfig(snark); + String bf = config.getProperty(PROP_META_BITFIELD); if (bf == null) return null; - int comma = bf.indexOf(','); - if (comma <= 0) - return null; - bf = bf.substring(comma + 1).trim(); int len = metainfo.getPieces(); if (bf.equals(".")) { BitField bitfield = new BitField(len); @@ -1294,10 +1483,8 @@ public class SnarkManager implements CompleteListener { return; if (metainfo.getFiles() == null) return; - byte[] ih = snark.getInfoHash(); - String infohash = Base64.encode(ih); - infohash = infohash.replace('=', '$'); - String pri = _config.getProperty(PROP_META_PREFIX + infohash + PROP_META_PRIORITY_SUFFIX); + Properties config = getConfig(snark); + String pri = config.getProperty(PROP_META_PRIORITY); if (pri == null) return; int filecount = metainfo.getFiles().size(); @@ -1312,24 +1499,66 @@ public class SnarkManager implements CompleteListener { } storage.setFilePriorities(rv); } + + /** + * Get the base location for a torrent from the config file. + * @return File or null, doesn't necessarily exist + * @since 0.9.11 + */ + private File getSavedBaseFile(byte[] ih) { + Properties config = getConfig(ih); + String base = config.getProperty(PROP_META_BASE); + if (base == null) + return null; + return new File(base); + } + + /** + * Get setting for a torrent from the config file. + * @return setting, false if not found + * @since 0.9.15 + */ + public boolean getSavedPreserveNamesSetting(Snark snark) { + Properties config = getConfig(snark); + return Boolean.parseBoolean(config.getProperty(PROP_META_PRESERVE_NAMES)); + } + /** + * Save the completion status of a torrent and other data in the config file + * for that torrent. Does nothing for magnets. + * + * @since 0.9.15 + */ + public void saveTorrentStatus(Snark snark) { + MetaInfo meta = snark.getMetaInfo(); + Storage storage = snark.getStorage(); + if (meta == null || storage == null) + return; + saveTorrentStatus(meta, storage.getBitField(), storage.getFilePriorities(), + storage.getBase(), storage.getPreserveFileNames()); + } + /** * Save the completion status of a torrent and the current time in the config file - * in the form "i2psnark.zmeta.$base64infohash=$time,$base64bitfield". - * The config file property key is appended with the Base64 of the infohash, - * with the '=' changed to '$' since a key can't contain '='. + * for that torrent. * The time is a standard long converted to string. * The status is either a bitfield converted to Base64 or "." for a completed * torrent to save space in the config file and in memory. * * @param bitfield non-null * @param priorities may be null + * @param base may be null */ - public void saveTorrentStatus(MetaInfo metainfo, BitField bitfield, int[] priorities) { + private void saveTorrentStatus(MetaInfo metainfo, BitField bitfield, int[] priorities, + File base, boolean preserveNames) { + synchronized (_configLock) { + locked_saveTorrentStatus(metainfo, bitfield, priorities, base, preserveNames); + } + } + + private void locked_saveTorrentStatus(MetaInfo metainfo, BitField bitfield, int[] priorities, + File base, boolean preserveNames) { byte[] ih = metainfo.getInfoHash(); - String infohash = Base64.encode(ih); - infohash = infohash.replace('=', '$'); - String now = "" + System.currentTimeMillis(); String bfs; if (bitfield.complete()) { bfs = "."; @@ -1337,10 +1566,14 @@ public class SnarkManager implements CompleteListener { byte[] bf = bitfield.getFieldBytes(); bfs = Base64.encode(bf); } - _config.setProperty(PROP_META_PREFIX + infohash + PROP_META_BITFIELD_SUFFIX, now + "," + bfs); + Properties config = getConfig(ih); + config.setProperty(PROP_META_STAMP, Long.toString(System.currentTimeMillis())); + config.setProperty(PROP_META_BITFIELD, bfs); + config.setProperty(PROP_META_PRESERVE_NAMES, Boolean.toString(preserveNames)); + if (base != null) + config.setProperty(PROP_META_BASE, base.getAbsolutePath()); // now the file priorities - String prop = PROP_META_PREFIX + infohash + PROP_META_PRIORITY_SUFFIX; if (priorities != null) { boolean nonzero = false; for (int i = 0; i < priorities.length; i++) { @@ -1358,30 +1591,40 @@ public class SnarkManager implements CompleteListener { if (i != priorities.length - 1) buf.append(','); } - _config.setProperty(prop, buf.toString()); + config.setProperty(PROP_META_PRIORITY, buf.toString()); } else { - _config.remove(prop); + config.remove(PROP_META_PRIORITY); } } else { - _config.remove(prop); + config.remove(PROP_META_PRIORITY); } // TODO save closest DHT nodes too - saveConfig(); + File conf = configFile(_configDir, ih); + File subdir = conf.getParentFile(); + if (!subdir.exists()) + subdir.mkdirs(); + try { + DataHelper.storeProps(config, conf); + } catch (IOException ioe) { + _log.error("Unable to save the config to " + conf); + } } /** - * Remove the status of a torrent from the config file. - * This may help the config file from growing too big. + * Remove the status of a torrent by removing the config file. */ public void removeTorrentStatus(MetaInfo metainfo) { byte[] ih = metainfo.getInfoHash(); - String infohash = Base64.encode(ih); - infohash = infohash.replace('=', '$'); - _config.remove(PROP_META_PREFIX + infohash + PROP_META_BITFIELD_SUFFIX); - _config.remove(PROP_META_PREFIX + infohash + PROP_META_PRIORITY_SUFFIX); - saveConfig(); + File conf = configFile(_configDir, ih); + synchronized (_configLock) { + conf.delete(); + File subdir = conf.getParentFile(); + String[] files = subdir.list(); + if (files != null && files.length == 0) + subdir.delete(); + } } /** @@ -1566,10 +1809,11 @@ public class SnarkManager implements CompleteListener { if (meta == null || storage == null) return; StringBuilder buf = new StringBuilder(256); - buf.append("").append(storage.getBaseName()).append(""); + buf.append("\">").append(base).append(""); addMessageNoEscape(_("Download finished: {0}", buf.toString())); // + " (" + _("size: {0}B", DataHelper.formatSize2(len)) + ')'); updateStatus(snark); } @@ -1581,7 +1825,8 @@ public class SnarkManager implements CompleteListener { MetaInfo meta = snark.getMetaInfo(); Storage storage = snark.getStorage(); if (meta != null && storage != null) - saveTorrentStatus(meta, storage.getBitField(), storage.getFilePriorities()); + saveTorrentStatus(meta, storage.getBitField(), storage.getFilePriorities(), + storage.getBase(), storage.getPreserveFileNames()); } /** @@ -1603,7 +1848,8 @@ public class SnarkManager implements CompleteListener { snark.stopTorrent(); return null; } - saveTorrentStatus(meta, storage.getBitField(), null); // no file priorities + saveTorrentStatus(meta, storage.getBitField(), null, + storage.getBase(), storage.getPreserveFileNames()); // no file priorities // temp for addMessage() in case canonical throws String name = storage.getBaseName(); try { @@ -1704,7 +1950,7 @@ public class SnarkManager implements CompleteListener { try { // Snark.fatal() throws a RuntimeException // don't let one bad torrent kill the whole loop - addTorrent(name, !shouldAutoStart()); + addTorrent(name, null, !shouldAutoStart()); } catch (Exception e) { addMessage(_("Error: Could not add the torrent {0}", name) + ": " + e); _log.error("Unable to add the torrent " + name, e); diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 5b7aa962f..efae9baad 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -32,7 +32,9 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.SortedSet; import java.util.StringTokenizer; +import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -52,6 +54,7 @@ public class Storage { private final MetaInfo metainfo; private final List _torrentFiles; + private final File _base; private final StorageListener listener; private final I2PSnarkUtil _util; private final Log _log; @@ -63,6 +66,7 @@ public class Storage private final int piece_size; private final int pieces; private final long total_length; + private final boolean _preserveFileNames; private boolean changed; private volatile boolean _isChecking; private final AtomicInteger _allocateCount = new AtomicInteger(); @@ -83,15 +87,19 @@ public class Storage private static final ByteCache _cache = ByteCache.getInstance(16, BUFSIZE); /** - * Creates a new storage based on the supplied MetaInfo. This will + * Creates a new storage based on the supplied MetaInfo. + * + * Does not check storage. Caller MUST call check(), which will * try to create and/or check all needed files in the MetaInfo. * - * Does not check storage. Caller MUST call check() + * @param baseFile the torrent data file or dir + * @param preserveFileNames if true, do not remap names to a 'safe' charset */ - public Storage(I2PSnarkUtil util, MetaInfo metainfo, StorageListener listener) + public Storage(I2PSnarkUtil util, File baseFile, MetaInfo metainfo, StorageListener listener, boolean preserveFileNames) { _util = util; _log = util.getContext().logManager().getLog(Storage.class); + _base = baseFile; this.metainfo = metainfo; this.listener = listener; needed = metainfo.getPieces(); @@ -102,6 +110,7 @@ public class Storage List> files = metainfo.getFiles(); int sz = files != null ? files.size() : 1; _torrentFiles = new ArrayList(sz); + _preserveFileNames = preserveFileNames; } /** @@ -121,8 +130,10 @@ public class Storage throws IOException { _util = util; + _base = baseFile; _log = util.getContext().logManager().getLog(Storage.class); this.listener = listener; + _preserveFileNames = true; // Create names, rafs and lengths arrays. _torrentFiles = getFiles(baseFile); @@ -305,24 +316,15 @@ public class Storage } /** - * @param file canonical path (non-directory) + * @param file non-canonical path (non-directory) * @return number of bytes remaining; -1 if unknown file * @since 0.7.14 */ - public long remaining(String file) { + public long remaining(File file) { long bytes = 0; for (TorrentFile tf : _torrentFiles) { File f = tf.RAFfile; - // use canonical in case snark dir or sub dirs are symlinked - String canonical = null; - if (f != null) { - try { - canonical = f.getCanonicalPath(); - } catch (IOException ioe) { - f = null; - } - } - if (f != null && canonical.equals(file)) { + if (f.equals(file)) { if (complete()) return 0; int psz = piece_size; @@ -348,22 +350,16 @@ public class Storage } /** - * @param file canonical path (non-directory) + * @param file non-canonical path (non-directory) * @since 0.8.1 */ - public int getPriority(String file) { + public int getPriority(File file) { if (complete() || metainfo.getFiles() == null) return 0; for (TorrentFile tf : _torrentFiles) { File f = tf.RAFfile; - // use canonical in case snark dir or sub dirs are symlinked - if (f != null) { - try { - String canonical = f.getCanonicalPath(); - if (canonical.equals(file)) - return tf.priority; - } catch (IOException ioe) {} - } + if (f.equals(file)) + return tf.priority; } return 0; } @@ -371,24 +367,18 @@ public class Storage /** * Must call Snark.updatePiecePriorities() * (which calls getPiecePriorities()) after calling this. - * @param file canonical path (non-directory) + * @param file non-canonical path (non-directory) * @param pri default 0; <0 to disable * @since 0.8.1 */ - public void setPriority(String file, int pri) { + public void setPriority(File file, int pri) { if (complete() || metainfo.getFiles() == null) return; for (TorrentFile tf : _torrentFiles) { File f = tf.RAFfile; - // use canonical in case snark dir or sub dirs are symlinked - if (f != null) { - try { - String canonical = f.getCanonicalPath(); - if (canonical.equals(file)) { - tf.priority = pri; - return; - } - } catch (IOException ioe) {} + if (f.equals(file)) { + tf.priority = pri; + return; } } } @@ -483,16 +473,21 @@ public class Storage * @since 0.7.14 */ public String getBaseName() { - return filterName(metainfo.getName()); + return optFilterName(metainfo.getName()); + } + + /** @since 0.9.15 */ + public boolean getPreserveFileNames() { + return _preserveFileNames; } /** * Creates (and/or checks) all files from the metainfo file list. * Only call this once, and only after the constructor with the metainfo. */ - public void check(String rootDir) throws IOException + public void check() throws IOException { - check(rootDir, 0, null); + check(0, null); } /** @@ -500,14 +495,9 @@ public class Storage * Use a saved bitfield and timestamp from a config file. * Only call this once, and only after the constructor with the metainfo. */ - public void check(String rootDir, long savedTime, BitField savedBitField) throws IOException + public void check(long savedTime, BitField savedBitField) throws IOException { - File base; boolean areFilesPublic = _util.getFilesPublic(); - if (areFilesPublic) - base = new File(rootDir, filterName(metainfo.getName())); - else - base = new SecureFile(rootDir, filterName(metainfo.getName())); boolean useSavedBitField = savedTime > 0 && savedBitField != null; if (!_torrentFiles.isEmpty()) @@ -517,18 +507,18 @@ public class Storage { // Create base as file. if (_log.shouldLog(Log.INFO)) - _log.info("Creating/Checking file: " + base); + _log.info("Creating/Checking file: " + _base); // createNewFile() can throw a "Permission denied" IOE even if the file exists??? // so do it second - if (!base.exists() && !base.createNewFile()) - throw new IOException("Could not create file " + base); + if (!_base.exists() && !_base.createNewFile()) + throw new IOException("Could not create file " + _base); - _torrentFiles.add(new TorrentFile(base, base, metainfo.getTotalLength())); + _torrentFiles.add(new TorrentFile(_base, _base, metainfo.getTotalLength())); if (useSavedBitField) { - long lm = base.lastModified(); + long lm = _base.lastModified(); if (lm <= 0 || lm > savedTime) useSavedBitField = false; - else if (base.length() != metainfo.getTotalLength()) + else if (_base.length() != metainfo.getTotalLength()) useSavedBitField = false; } } @@ -536,9 +526,9 @@ public class Storage { // Create base as dir. if (_log.shouldLog(Log.INFO)) - _log.info("Creating/Checking directory: " + base); - if (!base.mkdir() && !base.isDirectory()) - throw new IOException("Could not create directory " + base); + _log.info("Creating/Checking directory: " + _base); + if (!_base.mkdir() && !_base.isDirectory()) + throw new IOException("Could not create directory " + _base); List ls = metainfo.getLengths(); int size = files.size(); @@ -546,7 +536,7 @@ public class Storage for (int i = 0; i < size; i++) { List path = files.get(i); - File f = createFileFromNames(base, path, areFilesPublic); + File f = createFileFromNames(_base, path, areFilesPublic); // dup file name check after filtering for (int j = 0; j < i; j++) { if (f.equals(_torrentFiles.get(j).RAFfile)) { @@ -562,12 +552,12 @@ public class Storage else lastPath = '_' + lastPath; path.set(last, lastPath); - f = createFileFromNames(base, path, areFilesPublic); + f = createFileFromNames(_base, path, areFilesPublic); j = 0; } } long len = ls.get(i).longValue(); - _torrentFiles.add(new TorrentFile(base, f, len)); + _torrentFiles.add(new TorrentFile(_base, f, len)); total += len; if (useSavedBitField) { long lm = f.lastModified(); @@ -614,7 +604,7 @@ public class Storage * @param rootDir ignored * @throws IOE on fail */ - public void reopen(String rootDir) throws IOException + public void reopen() throws IOException { if (_torrentFiles.isEmpty()) throw new IOException("Storage not checked yet"); @@ -637,6 +627,19 @@ public class Storage 0x2028, 0x2029 }; + /** + * Filter the name, but only if configured to do so. + * We will do so on torrents received from others, but not + * on those we created ourselves, so we do not lose track of files. + * + * @since 0.9.15 + */ + private String optFilterName(String name) { + if (_preserveFileNames) + return name; + return filterName(name); + } + /** * Removes 'suspicious' characters from the given file name. * http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx @@ -690,14 +693,16 @@ public class Storage * Note that filtering each path element individually may lead to * things going in the wrong place if there are duplicates * in intermediate path elements after filtering. + * + * @param names path elements */ - private static File createFileFromNames(File base, List names, boolean areFilesPublic) throws IOException + private File createFileFromNames(File base, List names, boolean areFilesPublic) throws IOException { File f = null; Iterator it = names.iterator(); while (it.hasNext()) { - String name = filterName(it.next()); + String name = optFilterName(it.next()); if (it.hasNext()) { // Another dir in the hierarchy. @@ -725,15 +730,47 @@ public class Storage return f; } - public static File getFileFromNames(File base, List names) - { - Iterator it = names.iterator(); - while (it.hasNext()) - { - String name = filterName(it.next()); - base = new File(base, name); + /** + * The base file or directory. + * @return the File + * @since 0.9.11 + */ + public File getBase() { + return _base; + } + + /** + * Does not include directories. Unsorted. + * @return a new List + * @since 0.9.11 + */ + public List getFiles() { + List rv = new ArrayList(_torrentFiles.size()); + for (TorrentFile tf : _torrentFiles) { + rv.add(tf.RAFfile); } - return base; + return rv; + } + + /** + * Includes the base for a multi-file torrent. + * Sorted bottom-up for easy deletion. + * Slow. Use for deletion only. + * @since 0.9.11 + * @return a new Set or null for a single-file torrent + */ + public SortedSet getDirectories() { + if (!_base.isDirectory()) + return null; + SortedSet rv = new TreeSet(Collections.reverseOrder()); + rv.add(_base); + for (TorrentFile tf : _torrentFiles) { + File f = tf.RAFfile; + do { + f = f.getParentFile(); + } while (f != null && rv.add(f)); + } + return rv; } /** diff --git a/apps/i2psnark/java/src/org/klomp/snark/UpdateRunner.java b/apps/i2psnark/java/src/org/klomp/snark/UpdateRunner.java index 5812fb49c..28fe34ef9 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/UpdateRunner.java +++ b/apps/i2psnark/java/src/org/klomp/snark/UpdateRunner.java @@ -290,6 +290,10 @@ class UpdateRunner implements UpdateTask, CompleteListener { return _smgr.getSavedTorrentBitField(snark); } + public boolean getSavedPreserveNamesSetting(Snark snark) { + return _smgr.getSavedPreserveNamesSetting(snark); + } + //////// end CompleteListener methods private static String linkify(String url) { diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java index 50c3a0a00..85a0807f5 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java @@ -40,6 +40,7 @@ import net.i2p.util.I2PAppThread; import net.i2p.util.Log; import net.i2p.util.SimpleTimer2; +import org.klomp.snark.SnarkManager; import org.klomp.snark.TrackerClient; import org.klomp.snark.bencode.BDecoder; import org.klomp.snark.bencode.BEncoder; @@ -152,7 +153,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { private static final long CLEAN_TIME = 63*1000; private static final long EXPLORE_TIME = 877*1000; private static final long BLACKLIST_CLEAN_TIME = 17*60*1000; - private static final String DHT_FILE_SUFFIX = ".dht.dat"; + public static final String DHT_FILE_SUFFIX = ".dht.dat"; private static final int SEND_CRYPTO_TAGS = 8; private static final int LOW_CRYPTO_TAGS = 4; @@ -185,8 +186,14 @@ public class KRPC implements I2PSessionMuxedListener, DHT { _myNID = new NID(_myID); } _myNodeInfo = new NodeInfo(_myNID, session.getMyDestination(), _qPort); - _dhtFile = new File(ctx.getConfigDir(), baseName + DHT_FILE_SUFFIX); - _backupDhtFile = baseName.equals("i2psnark") ? null : new File(ctx.getConfigDir(), "i2psnark" + DHT_FILE_SUFFIX); + File conf = new File(ctx.getConfigDir(), baseName + ".config" + SnarkManager.CONFIG_DIR_SUFFIX); + _dhtFile = new File(conf, "i2psnark" + DHT_FILE_SUFFIX); + if (baseName.equals("i2psnark")) { + _backupDhtFile = null; + } else { + File bconf = new File(ctx.getConfigDir(), "i2psnark.config" + SnarkManager.CONFIG_DIR_SUFFIX); + _backupDhtFile = new File(bconf, "i2psnark" + DHT_FILE_SUFFIX); + } _knownNodes = new DHTNodes(ctx, _myNID); start(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/BasicServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/BasicServlet.java index 53a501af3..b3a1a6a5c 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/BasicServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/BasicServlet.java @@ -181,11 +181,10 @@ class BasicServlet extends HttpServlet HttpContent r = null; if (_warBase != null && pathInContext.startsWith(_warBase)) { r = new JarContent(pathInContext); - } else if (!pathInContext.contains("..") && - !pathInContext.endsWith("/")) { - File f = new File(_resourceBase, pathInContext); + } else { + File f = getResource(pathInContext); // exists && !directory - if (f.isFile()) + if (f != null && f.isFile()) r = new FileContent(f); } return r; @@ -283,7 +282,12 @@ class BasicServlet extends HttpServlet { if (content.getLastModified()/1000 <= ifmsl/1000) { - response.reset(); + try { + response.reset(); + } catch (IllegalStateException ise) { + // committed + return true; + } response.setStatus(304); response.flushBuffer(); return false; @@ -555,14 +559,17 @@ class BasicServlet extends HttpServlet /** * Simple version of URIUtil.encodePath() */ - protected static String encodePath(String path) throws MalformedURLException { - try { - URI uri = new URI(null, null, path, null); - return uri.toString(); - } catch (URISyntaxException use) { - // for ease of use, since a USE is not an IOE but a MUE is... - throw new MalformedURLException(use.getMessage()); - } + protected static String encodePath(String path) /* throws MalformedURLException */ { + // Does NOT handle a ':' correctly, throws MUE. + // Can't convert to %3a before hand or the % gets escaped + //try { + // URI uri = new URI(null, null, path, null); + // return uri.toString(); + //} catch (URISyntaxException use) { + // // for ease of use, since a USE is not an IOE but a MUE is... + // throw new MalformedURLException(use.getMessage()); + //} + return URIUtil.encodePath(path); } /** diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 527227081..3296ea0f4 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -9,6 +9,7 @@ import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -18,7 +19,6 @@ import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; -import java.util.TreeSet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; @@ -59,6 +59,7 @@ public class I2PSnarkServlet extends BasicServlet { private static final String DEFAULT_NAME = "i2psnark"; public static final String PROP_CONFIG_FILE = "i2psnark.configFile"; + private static final String WARBASE = "/.icons/"; public I2PSnarkServlet() { super(); @@ -73,6 +74,7 @@ public class I2PSnarkServlet extends BasicServlet { _nonce = _context.random().nextLong(); // limited protection against overwriting other config files or directories // in case you named your war "router.war" + // We don't handle bad characters in the context path. Don't do that. String configName = _contextName; if (!configName.equals(DEFAULT_NAME)) configName = DEFAULT_NAME + '_' + _contextName; @@ -84,7 +86,7 @@ public class I2PSnarkServlet extends BasicServlet { _manager.start(); loadMimeMap("org/klomp/snark/web/mime"); setResourceBase(_manager.getDataDir()); - setWarBase("/.icons/"); + setWarBase(WARBASE); } @Override @@ -95,17 +97,35 @@ public class I2PSnarkServlet extends BasicServlet { } /** - * We override this instead of passing a resource base to super(), because - * if a resource base is set, super.getResource() always uses that base, - * and we can't get any resources (like icons) out of the .war + * We override this to set the file relative to the storage dirctory + * for the torrent. + * + * @param pathInContext should always start with / */ @Override public File getResource(String pathInContext) { if (pathInContext == null || pathInContext.equals("/") || pathInContext.equals("/index.jsp") || - pathInContext.equals("/index.html") || pathInContext.startsWith("/.icons/")) + !pathInContext.startsWith("/") || pathInContext.length() == 0 || + pathInContext.equals("/index.html") || pathInContext.startsWith(WARBASE)) return super.getResource(pathInContext); // files in the i2psnark/ directory + // get top level + pathInContext = pathInContext.substring(1); + File top = new File(pathInContext); + File parent; + while ((parent = top.getParentFile()) != null) { + top = parent; + } + Snark snark = _manager.getTorrentByBaseName(top.getPath()); + if (snark != null) { + Storage storage = snark.getStorage(); + if (storage != null) { + File sbase = storage.getBase(); + String child = pathInContext.substring(top.getPath().length()); + return new File(sbase, child); + } + } return new File(_resourceBase, pathInContext); } @@ -154,10 +174,19 @@ public class I2PSnarkServlet extends BasicServlet { // _log.debug("Service " + req.getMethod() + " \"" + req.getContextPath() + "\" \"" + req.getServletPath() + "\" \"" + req.getPathInfo() + '"'); // since we are not overriding handle*(), do this here String method = req.getMethod(); - _themePath = "/themes/snark/" + _manager.getTheme() + '/'; - _imgPath = _themePath + "images/"; // this is the part after /i2psnark String path = req.getServletPath(); + + // in-war icons etc. + if (path != null && path.startsWith(WARBASE)) { + if (method.equals("GET") || method.equals("HEAD")) + super.doGet(req, resp); + else // no POST either + resp.sendError(405); + } + + _themePath = "/themes/snark/" + _manager.getTheme() + '/'; + _imgPath = _themePath + "images/"; resp.setHeader("X-Frame-Options", "SAMEORIGIN"); resp.setHeader("Content-Security-Policy", "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'"); resp.setHeader("X-XSS-Protection", "1; mode=block"); @@ -193,7 +222,8 @@ public class I2PSnarkServlet extends BasicServlet { boolean isConfigure = "/configure".equals(path); // index.jsp doesn't work, it is grabbed by the war handler before here - if (!(path == null || path.equals("/") || path.equals("/index.jsp") || path.equals("/index.html") || path.equals("/_post") || isConfigure)) { + if (!(path == null || path.equals("/") || path.equals("/index.jsp") || + path.equals("/index.html") || path.equals("/_post") || isConfigure)) { if (path.endsWith("/")) { // Listing of a torrent (torrent detail page) // bypass the horrid Resource.getListHTML() @@ -848,42 +878,36 @@ public class I2PSnarkServlet extends BasicServlet { _manager.addMessage(_("Data file could not be deleted: {0}", f.getAbsolutePath())); break; } + Storage storage = snark.getStorage(); + if (storage == null) + break; // step 1 delete files - for (int i = 0; i < files.size(); i++) { - // multifile torrents have the getFiles() return lists of lists of filenames, but - // each of those lists just contain a single file afaict... - File df = Storage.getFileFromNames(f, files.get(i)); + for (File df : storage.getFiles()) { if (df.delete()) { //_manager.addMessage(_("Data file deleted: {0}", df.getAbsolutePath())); } else { _manager.addMessage(_("Data file could not be deleted: {0}", df.getAbsolutePath())); } } - // step 2 make Set of dirs with reverse sort - Set dirs = new TreeSet(Collections.reverseOrder()); - for (List list : files) { - for (int i = 1; i < list.size(); i++) { - dirs.add(Storage.getFileFromNames(f, list.subList(0, i))); - } - } - // step 3 delete dirs bottom-up + // step 2 delete dirs bottom-up + Set dirs = storage.getDirectories(); + if (_log.shouldLog(Log.INFO)) + _log.info("Dirs to delete: " + DataHelper.toString(dirs)); + boolean ok = false; for (File df : dirs) { if (df.delete()) { + ok = true; //_manager.addMessage(_("Data dir deleted: {0}", df.getAbsolutePath())); } else { + ok = false; _manager.addMessage(_("Directory could not be deleted: {0}", df.getAbsolutePath())); if (_log.shouldLog(Log.WARN)) _log.warn("Could not delete dir " + df); } } - // step 4 delete base - if (f.delete()) { - _manager.addMessage(_("Directory deleted: {0}", f.getAbsolutePath())); - } else { - _manager.addMessage(_("Directory could not be deleted: {0}", f.getAbsolutePath())); - if (_log.shouldLog(Log.WARN)) - _log.warn("Could not delete dir " + f); - } + // step 3 message for base (last one) + if (ok) + _manager.addMessage(_("Directory deleted: {0}", storage.getBase())); break; } } @@ -920,9 +944,11 @@ public class I2PSnarkServlet extends BasicServlet { if (taction != null) processTrackerForm(taction, req); } else if ("Create".equals(action)) { - String baseData = req.getParameter("baseFile"); + String baseData = req.getParameter("nofilter_baseFile"); if (baseData != null && baseData.trim().length() > 0) { - File baseFile = new File(_manager.getDataDir(), baseData); + File baseFile = new File(baseData.trim()); + if (!baseFile.isAbsolute()) + baseFile = new File(_manager.getDataDir(), baseData); String announceURL = req.getParameter("announceURL"); // make the user add a tracker on the config form now //String announceURLOther = req.getParameter("announceURLOther"); @@ -930,6 +956,40 @@ public class I2PSnarkServlet extends BasicServlet { // announceURL = announceURLOther; if (baseFile.exists()) { + String torrentName = baseFile.getName(); + if (torrentName.toLowerCase(Locale.US).endsWith(".torrent")) { + _manager.addMessage(_("Cannot add a torrent ending in \".torrent\": {0}", baseFile.getAbsolutePath())); + return; + } + Snark snark = _manager.getTorrentByBaseName(torrentName); + if (snark != null) { + _manager.addMessage(_("Torrent with this name is already running: {0}", torrentName)); + return; + } + if (isParentOf(baseFile,_manager.getDataDir()) || + isParentOf(baseFile, _manager.util().getContext().getBaseDir()) || + isParentOf(baseFile, _manager.util().getContext().getConfigDir())) { + _manager.addMessage(_("Cannot add a torrent including an I2P directory: {0}", baseFile.getAbsolutePath())); + return; + } + Collection snarks = _manager.getTorrents(); + for (Snark s : snarks) { + Storage storage = s.getStorage(); + if (storage == null) + continue; + File sbase = storage.getBase(); + if (isParentOf(sbase, baseFile)) { + _manager.addMessage(_("Cannot add torrent {0} inside another torrent: {1}", + baseFile.getAbsolutePath(), sbase)); + return; + } + if (isParentOf(baseFile, sbase)) { + _manager.addMessage(_("Cannot add torrent {0} including another torrent: {1}", + baseFile.getAbsolutePath(), sbase)); + return; + } + } + if (announceURL.equals("none")) announceURL = null; _lastAnnounceURL = announceURL; @@ -982,7 +1042,9 @@ public class I2PSnarkServlet extends BasicServlet { File torrentFile = new File(_manager.getDataDir(), s.getBaseName() + ".torrent"); // FIXME is the storage going to stay around thanks to the info reference? // now add it, but don't automatically start it - _manager.addTorrent(info, s.getBitField(), torrentFile.getAbsolutePath(), true); + boolean ok = _manager.addTorrent(info, s.getBitField(), torrentFile.getAbsolutePath(), baseFile, true); + if (!ok) + return; _manager.addMessage(_("Torrent created for \"{0}\"", baseFile.getName()) + ": " + torrentFile.getAbsolutePath()); if (announceURL != null && !_manager.util().getOpenTrackers().contains(announceURL)) _manager.addMessage(_("Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"", baseFile.getName())); @@ -1333,7 +1395,7 @@ public class I2PSnarkServlet extends BasicServlet { } } - String encodedBaseName = urlEncode(fullBasename); + String encodedBaseName = encodePath(fullBasename); // File type icon column out.write("\n"); if (isValid) { @@ -1383,7 +1445,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\">"); out.write(buf.toString()); } - out.write(basename); + out.write(DataHelper.escapeHTML(basename)); if (remaining == 0 || isMultiFile) out.write(""); @@ -1762,12 +1824,6 @@ public class I2PSnarkServlet extends BasicServlet { } private void writeSeedForm(PrintWriter out, HttpServletRequest req, List sortedTrackers) throws IOException { - String baseFile = req.getParameter("baseFile"); - if (baseFile == null || baseFile.trim().length() <= 0) - baseFile = ""; - else - baseFile = DataHelper.stripHTML(baseFile); // XSS - out.write("
\n"); // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file out.write("
\n"); @@ -1783,10 +1839,11 @@ public class I2PSnarkServlet extends BasicServlet { out.write("
\n
"); //out.write("From file:
\n"); out.write(_("Data to seed")); - out.write(":
" + _manager.getDataDir().getAbsolutePath() + File.separatorChar - + "" + + "
\n"); out.write(_("Trackers")); out.write(":
"); @@ -2186,26 +2243,35 @@ public class I2PSnarkServlet extends BasicServlet { return ((bytes + 512*1024*1024)/(1024*1024*1024)) + " GB"; } - /** @since 0.7.14 */ + /** + * This is for a full URL. For a path only, use encodePath(). + * @since 0.7.14 + */ static String urlify(String s) { return urlify(s, 100); } - /** @since 0.9 */ + /** + * This is for a full URL. For a path only, use encodePath(). + * @since 0.9 + */ private static String urlify(String s, int max) { StringBuilder buf = new StringBuilder(256); // browsers seem to work without doing this but let's be strict String link = urlEncode(s); String display; if (s.length() <= max) - display = link; + display = DataHelper.escapeHTML(link); else - display = urlEncode(s.substring(0, max)) + "…"; + display = DataHelper.escapeHTML(s.substring(0, max)) + "…"; buf.append("").append(display).append(""); return buf.toString(); } - /** @since 0.8.13 */ + /** + * This is for a full URL. For a path only, use encodePath(). + * @since 0.8.13 + */ private static String urlEncode(String s) { return s.replace(";", "%3B").replace("&", "&").replace(" ", "%20") .replace("<", "<").replace(">", ">") @@ -2230,9 +2296,11 @@ public class I2PSnarkServlet extends BasicServlet { private static class ListingComparator implements Comparator, Serializable { public int compare(File l, File r) { - if (l.isDirectory() && !r.isDirectory()) + boolean ld = l.isDirectory(); + boolean rd = r.isDirectory(); + if (ld && !rd) return -1; - if (r.isDirectory() && !l.isDirectory()) + if (rd && !ld) return 1; return Collator.getInstance().compare(l.getName(), r.getName()); } @@ -2261,52 +2329,75 @@ public class I2PSnarkServlet extends BasicServlet { * * * Get the resource list as a HTML directory listing. - * @param r The Resource - * @param base The base URL + * @param xxxr The Resource unused + * @param base The encoded base URL * @param parent True if the parent directory should be included * @param postParams map of POST parameters or null if not a POST * @return String of HTML or null if postParams != null * @since 0.7.14 */ - private String getListHTML(File r, String base, boolean parent, Map postParams) + private String getListHTML(File xxxr, String base, boolean parent, Map postParams) throws IOException { - File[] ls = null; - if (r.isDirectory()) { - ls = r.listFiles(); - Arrays.sort(ls, new ListingComparator()); - } // if r is not a directory, we are only showing torrent info section - - String title = decodePath(base); + String decodedBase = decodePath(base); + String title = decodedBase; String cpath = _contextPath + '/'; if (title.startsWith(cpath)) title = title.substring(cpath.length()); // Get the snark associated with this directory String torrentName; + String pathInTorrent; int slash = title.indexOf('/'); - if (slash > 0) + if (slash > 0) { torrentName = title.substring(0, slash); - else + pathInTorrent = title.substring(slash); + } else { torrentName = title; + pathInTorrent = "/"; + } Snark snark = _manager.getTorrentByBaseName(torrentName); if (snark != null && postParams != null) { // caller must P-R-G - savePriorities(snark, postParams); + String[] val = postParams.get("nonce"); + if (val != null) { + String nonce = val[0]; + if (String.valueOf(_nonce).equals(nonce)) + savePriorities(snark, postParams); + else + _manager.addMessage("Please retry form submission (bad nonce)"); + } return null; } + File r; + if (snark != null) { + Storage storage = snark.getStorage(); + if (storage != null) { + File sbase = storage.getBase(); + if (pathInTorrent.equals("/")) + r = sbase; + else + r = new File(sbase, pathInTorrent); + } else { + // magnet, dummy + r = new File(""); + } + } else { + // dummy + r = new File(""); + } StringBuilder buf=new StringBuilder(4096); buf.append(DOCTYPE).append(""); if (title.endsWith("/")) title = title.substring(0, title.length() - 1); String directory = title; - title = _("Torrent") + ": " + title; + title = _("Torrent") + ": " + DataHelper.escapeHTML(title); buf.append(title); buf.append("").append(HEADER_A).append(_themePath).append(HEADER_B).append("" + "\n
\"\"  "); + buf.append(" class=\"snarkRefresh\">\"\"  "); if (_contextName.equals(DEFAULT_NAME)) buf.append(_("I2PSnark")); else @@ -2315,26 +2406,35 @@ public class I2PSnarkServlet extends BasicServlet { if (parent) // always true buf.append("
"); - boolean showPriority = ls != null && snark != null && snark.getStorage() != null && !snark.getStorage().complete(); - if (showPriority) + boolean showPriority = snark != null && snark.getStorage() != null && !snark.getStorage().complete() && + r.isDirectory(); + if (showPriority) { buf.append("\n"); + buf.append("\n"); + } if (snark != null) { // first table - torrent info buf.append("\n"); buf.append("\n"); String fullPath = snark.getName(); - String baseName = urlEncode((new File(fullPath)).getName()); + String baseName = encodePath((new File(fullPath)).getName()); buf.append("\n"); + buf.append("\n"); String announce = null; MetaInfo meta = snark.getMetaInfo(); @@ -2435,40 +2535,40 @@ public class I2PSnarkServlet extends BasicServlet { // .append(MAGGOT).append(hex).append(':').append(hex).append(""); buf.append("\n"); } buf.append("
") .append(_("Torrent")) .append(": ") - .append(snark.getBaseName()) + .append(DataHelper.escapeHTML(snark.getBaseName())) .append("
") - .append("\"\" ") + .append("\"\" ") .append(_("Torrent file")) .append(": ") - .append(fullPath) + .append(DataHelper.escapeHTML(fullPath)) .append("
") + .append("\"\" ") + .append(_("Data location")) + .append(": ") + .append(DataHelper.escapeHTML(snark.getStorage().getBase().getPath())) + .append("
") - .append("\"\" ") + .append("\"\" ") .append(_("Size")) .append(": ") .append(formatSize(snark.getTotalLength())); int pieces = snark.getPieces(); double completion = (pieces - snark.getNeeded()) / (double) pieces; if (completion < 1.0) - buf.append(" \"\" ") + buf.append(" \"\" ") .append(_("Completion")) .append(": ") .append((new DecimalFormat("0.00%")).format(completion)); else - buf.append(" \"\" ") + buf.append(" \"\" ") .append(_("Complete")); // else unknown long needed = snark.getNeededLength(); if (needed > 0) - buf.append(" \"\" ") + buf.append(" \"\" ") .append(_("Remaining")) .append(": ") .append(formatSize(needed)); if (meta != null) { List> files = meta.getFiles(); int fileCount = files != null ? files.size() : 1; - buf.append(" \"\" ") + buf.append(" \"\" ") .append(_("Files")) .append(": ") .append(fileCount); } - buf.append(" \"\" ") + buf.append(" \"\" ") .append(_("Pieces")) .append(": ") .append(pieces); - buf.append(" \"\" ") + buf.append(" \"\" ") .append(_("Piece size")) .append(": ") .append(formatSize(snark.getPieceLength(0))) @@ -2481,6 +2581,22 @@ public class I2PSnarkServlet extends BasicServlet { .append("\"
\n"); + + if (snark != null && !r.exists()) { + // fixup TODO + buf.append("

Does not exist
resource=\"").append(r.toString()) + .append("\"
base=\"").append(base) + .append("\"
torrent=\"").append(torrentName) + .append("\"

"); + return buf.toString(); + } + + File[] ls = null; + if (r.isDirectory()) { + ls = r.listFiles(); + Arrays.sort(ls, new ListingComparator()); + } // if r is not a directory, we are only showing torrent info section + if (ls == null) { // We are only showing the torrent info section buf.append("
"); @@ -2491,7 +2607,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); buf.append("\n") .append("\n"); buf.append("\n"); buf.append("\n"); if (showPriority) buf.append("\n"); buf.append("\n\n"); buf.append("\n"); @@ -2530,7 +2646,7 @@ public class I2PSnarkServlet extends BasicServlet { boolean showSaveButton = false; for (int i=0 ; i< ls.length ; i++) { - String encoded = encodePath(ls[i].getName()); + //String encoded = encodePath(ls[i].getName()); // bugfix for I2P - Backport from Jetty 6 (zero file lengths and last-modified times) // http://jira.codehaus.org/browse/JETTY-361?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel#issue-tabs // See resource.diff attachment @@ -2544,6 +2660,7 @@ public class I2PSnarkServlet extends BasicServlet { boolean complete = false; String status = ""; long length = item.length(); + int priority = 0; if (item.isDirectory()) { complete = true; //status = toImg("tick") + ' ' + _("Directory"); @@ -2554,9 +2671,8 @@ public class I2PSnarkServlet extends BasicServlet { status = toImg("cancel") + ' ' + _("Torrent not found?"); } else { Storage storage = snark.getStorage(); - try { - File f = item; - long remaining = storage.remaining(f.getCanonicalPath()); + + long remaining = storage.remaining(item); if (remaining < 0) { complete = true; status = toImg("cancel") + ' ' + _("File not found in torrent?"); @@ -2564,7 +2680,7 @@ public class I2PSnarkServlet extends BasicServlet { complete = true; status = toImg("tick") + ' ' + _("Complete"); } else { - int priority = storage.getPriority(f.getCanonicalPath()); + priority = storage.getPriority(item); if (priority < 0) status = toImg("cancel"); else if (priority == 0) @@ -2575,16 +2691,14 @@ public class I2PSnarkServlet extends BasicServlet { (100 * (length - remaining) / length) + "% " + _("complete") + " (" + DataHelper.formatSize2(remaining) + "B " + _("remaining") + ")"; } - } catch (IOException ioe) { - status = "Not a file? " + ioe; - } + } } - String path=addPaths(base,encoded); + String path = addPaths(decodedBase, ls[i].getName()); if (item.isDirectory() && !path.endsWith("/")) path=addPaths(path,"/"); - path = urlEncode(path); + path = encodePath(path); String icon = toIcon(item); buf.append(""); if (showPriority) { buf.append("
") - .append("") - .append("\"")") - .append("\"")") - .append("\"")
\"\" ") + URIUtil.encodePath(buf, addPaths(decodedBase,"../")); + buf.append("\">\"\" ") .append(_("Up to higher level directory")) .append("
"); @@ -2605,7 +2719,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(""); if (complete) buf.append(""); - buf.append(item.getName().replace("&", "&")); + buf.append(DataHelper.escapeHTML(item.getName())); if (complete) buf.append(""); buf.append(""); @@ -2617,21 +2731,19 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(""); - File f = item; if ((!complete) && (!item.isDirectory())) { - int pri = snark.getStorage().getPriority(f.getCanonicalPath()); - buf.append(" 0) + buf.append(" 0) buf.append("checked=\"true\""); buf.append('>').append(_("High")); - buf.append("').append(_("Normal")); - buf.append("').append(_("Skip")); showSaveButton = true; @@ -2703,6 +2815,8 @@ public class I2PSnarkServlet extends BasicServlet { icon = "application"; else if (plc.endsWith(".iso")) icon = "cd"; + else if (mime.equals("application/x-bittorrent")) + icon = "magnet"; else icon = "page_white"; return icon; @@ -2727,7 +2841,7 @@ public class I2PSnarkServlet extends BasicServlet { String key = entry.getKey(); if (key.startsWith("pri.")) { try { - String file = key.substring(4); + File file = new File(key.substring(4)); String val = entry.getValue()[0]; // jetty arrays int pri = Integer.parseInt(val); storage.setPriority(file, pri); @@ -2736,6 +2850,36 @@ public class I2PSnarkServlet extends BasicServlet { } } snark.updatePiecePriorities(); - _manager.saveTorrentStatus(snark.getMetaInfo(), storage.getBitField(), storage.getFilePriorities()); + _manager.saveTorrentStatus(snark); + } + + /** + * Is "a" equal to "b", + * or is "a" a directory and a parent of file or directory "b", + * canonically speaking? + * + * @since 0.9.15 + */ + private static boolean isParentOf(File a, File b) { + try { + a = a.getCanonicalFile(); + b = b.getCanonicalFile(); + } catch (IOException ioe) { + return false; + } + if (a.equals(b)) + return true; + if (!a.isDirectory()) + return false; + // easy case + if (!b.getPath().startsWith(a.getPath())) + return false; + // dir by dir + while (!a.equals(b)) { + b = b.getParentFile(); + if (b == null) + return false; + } + return true; } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java b/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java new file mode 100644 index 000000000..3a9c3088e --- /dev/null +++ b/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java @@ -0,0 +1,206 @@ +// +// ======================================================================== +// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.klomp.snark.web; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URLEncoder; + +import net.i2p.data.DataHelper; + + +/** URI Holder. + * This class assists with the decoding and encoding or HTTP URI's. + * It differs from the java.net.URL class as it does not provide + * communications ability, but it does assist with query string + * formatting. + *

UTF-8 encoding is used by default for % encoded characters. This + * may be overridden with the org.eclipse.jetty.util.URI.charset system property. + * see UrlEncoded + * + * I2P modded from Jetty 8.1.15 + * @since 0.9.15 + */ +class URIUtil +{ + + /** Encode a URI path. + * This is the same encoding offered by URLEncoder, except that + * the '/' character is not encoded. + * @param path The path the encode + * @return The encoded path + */ + public static String encodePath(String path) + { + if (path==null || path.length()==0) + return path; + + StringBuilder buf = encodePath(null,path); + return buf==null?path:buf.toString(); + } + + /** Encode a URI path. + * @param path The path the encode + * @param buf StringBuilder to encode path into (or null) + * @return The StringBuilder or null if no substitutions required. + */ + public static StringBuilder encodePath(StringBuilder buf, String path) + { + byte[] bytes=null; + if (buf==null) + { + loop: + for (int i=0;i': + case ' ': + buf=new StringBuilder(path.length()*2); + break loop; + default: + if (c>127) + { + bytes = DataHelper.getUTF8(path); + buf=new StringBuilder(path.length()*2); + break loop; + } + + } + } + if (buf==null) + return null; + } + + //synchronized(buf) + //{ + if (bytes!=null) + { + for (int i=0;i': + buf.append("%3E"); + continue; + case ' ': + buf.append("%20"); + continue; + default: + if (c<0) + { + buf.append('%'); + toHex(c,buf); + } + else + buf.append((char)c); + continue; + } + } + + } + else + { + for (int i=0;i': + buf.append("%3E"); + continue; + case ' ': + buf.append("%20"); + continue; + default: + buf.append(c); + continue; + } + } + } + //} + + return buf; + } + + /** + * Modded from Jetty TypeUtil + */ + private static void toHex(byte b, StringBuilder buf) + { + int d=0xf&((0xF0&b)>>4); + buf.append((char)((d>9?('A'-10):'0')+d)); + d=0xf&b; + buf.append((char)((d>9?('A'-10):'0')+d)); + } +} + + + diff --git a/apps/i2psnark/locale/messages_pt_bR.po b/apps/i2psnark/locale/messages_pt_bR.po new file mode 100644 index 000000000..0e26aea0e --- /dev/null +++ b/apps/i2psnark/locale/messages_pt_bR.po @@ -0,0 +1,1244 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the i2psnark package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# testsubject67 , 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-01-09 19:27+0000\n" +"PO-Revision-Date: 2014-07-05 19:07+0000\n" +"Last-Translator: testsubject67 \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/SnarkManager.java:1949 +#: ../java/src/org/klomp/snark/SnarkManager.java:1960 +msgid "I2P tunnel closed." +msgstr "Túnel I2P fechado" + +#: ../java/src/org/klomp/snark/MagnetURI.java:42 +#: ../java/src/org/klomp/snark/MagnetURI.java:52 +#: ../java/src/org/klomp/snark/SnarkManager.java:1655 +msgid "Magnet" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:515 +#, java-format +msgid "Total uploaders limit changed to {0}" +msgstr "Limite de uploaders totais alterada para {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:517 +#, java-format +msgid "Minimum total uploaders limit is {0}" +msgstr "Mínimo de uploaders totais alterada para {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:529 +#, java-format +msgid "Up BW limit changed to {0}KBps" +msgstr "Limite de Up BW alterada para {0}KBps" + +#: ../java/src/org/klomp/snark/SnarkManager.java:531 +#, java-format +msgid "Minimum up bandwidth limit is {0}KBps" +msgstr "O limite de mínimo de banda larga é {0}KBps" + +#: ../java/src/org/klomp/snark/SnarkManager.java:543 +#, java-format +msgid "Startup delay changed to {0}" +msgstr "Atraso de inicialização alterada para {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:554 +#, java-format +msgid "Refresh time changed to {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:556 +msgid "Refresh disabled" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:572 +#, java-format +msgid "Page size changed to {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:581 +msgid "Data directory must be an absolute path" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:583 +msgid "Data directory does not exist" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:585 +msgid "Not a directory" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:587 +msgid "Unreadable" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:592 +#, java-format +msgid "Data directory changed to {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:647 +msgid "I2CP and tunnel changes will take effect after stopping all torrents" +msgstr "Alterações em túneis e I2C entrarão em vigor depois de parar todos torrents" + +#: ../java/src/org/klomp/snark/SnarkManager.java:651 +#, java-format +msgid "I2CP options changed to {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:657 +msgid "Disconnecting old I2CP destination" +msgstr "Desconectando destinação do velho I2CP" + +#: ../java/src/org/klomp/snark/SnarkManager.java:659 +#, java-format +msgid "I2CP settings changed to {0}" +msgstr "Configurações de I2CP alteradas para {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:664 +msgid "" +"Unable to connect with the new settings, reverting to the old I2CP settings" +msgstr "Não é possível conectar com as novas configurações. Revertendo para as prévias configurações de I2CP" + +#: ../java/src/org/klomp/snark/SnarkManager.java:668 +msgid "Unable to reconnect with the old settings!" +msgstr "Não é possível conectar com as novas configurações!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:670 +msgid "Reconnected on the new I2CP destination" +msgstr "Reconectado à nova destinação de I2CP" + +#: ../java/src/org/klomp/snark/SnarkManager.java:677 +#, java-format +msgid "I2CP listener restarted for \"{0}\"" +msgstr "Auditor I2CP recomeçadas a \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:691 +msgid "New files will be publicly readable" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:693 +msgid "New files will not be publicly readable" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:700 +msgid "Enabled autostart" +msgstr "Autocomeço permitido" + +#: ../java/src/org/klomp/snark/SnarkManager.java:702 +msgid "Disabled autostart" +msgstr "Autocomeço não permitido" + +#: ../java/src/org/klomp/snark/SnarkManager.java:708 +msgid "Enabled open trackers - torrent restart required to take effect." +msgstr "Trackers abertos permitidos - reinício de torrents é preciso para entrar em vigor" + +#: ../java/src/org/klomp/snark/SnarkManager.java:710 +msgid "Disabled open trackers - torrent restart required to take effect." +msgstr "Trackers abertos não permitidos - reinício de torrents é preciso para entrar em vigor" + +#: ../java/src/org/klomp/snark/SnarkManager.java:717 +msgid "Enabled DHT." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:719 +msgid "Disabled DHT." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:721 +msgid "DHT change requires tunnel shutdown and reopen" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:728 +#, java-format +msgid "{0} theme loaded, return to main i2psnark page to view." +msgstr "Tema {0} carregado, retornar para a página principal de i2psnark para visualizar." + +#: ../java/src/org/klomp/snark/SnarkManager.java:738 +msgid "Configuration unchanged." +msgstr "Configuração sem alteração" + +#: ../java/src/org/klomp/snark/SnarkManager.java:770 +msgid "Open Tracker list changed - torrent restart required to take effect." +msgstr "Lista de trackers abertos alterada - reinício de torrents é preciso para entrar em vigor" + +#: ../java/src/org/klomp/snark/SnarkManager.java:780 +msgid "Private tracker list changed - affects newly created torrents only." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#, java-format +msgid "Unable to save the config to {0}" +msgstr "Não é possivel salvar configurações para {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:904 +msgid "Connecting to I2P" +msgstr "Conectando a I2P" + +#: ../java/src/org/klomp/snark/SnarkManager.java:907 +msgid "Error connecting to I2P - check your I2CP settings!" +msgstr "Erro ao conectar a I2P - verifique as configurações de I2CP!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:916 +#: ../java/src/org/klomp/snark/SnarkManager.java:1692 +#, java-format +msgid "Error: Could not add the torrent {0}" +msgstr "Erro: não é possível adicionar o torrent {0}" + +#. catch this here so we don't try do delete it below +#: ../java/src/org/klomp/snark/SnarkManager.java:938 +#, java-format +msgid "Cannot open \"{0}\"" +msgstr "Não é possível abrir \"{0}\"" + +#. TODO - if the existing one is a magnet, delete it and add the metainfo +#. instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:957 +#: ../java/src/org/klomp/snark/SnarkManager.java:1058 +#: ../java/src/org/klomp/snark/SnarkManager.java:1140 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:162 +#, java-format +msgid "Torrent with this info hash is already running: {0}" +msgstr "O torrent com este info has já está sendo executado: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:963 +#, java-format +msgid "ERROR - No I2P trackers in private torrent \"{0}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:965 +#, java-format +msgid "" +"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" +" DHT only." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:968 +#, java-format +msgid "" +"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " +"announce to DHT only." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:970 +#, java-format +msgid "" +"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " +"disabled, you should enable open trackers or DHT before starting the " +"torrent." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:992 +#, java-format +msgid "Torrent in \"{0}\" is invalid" +msgstr "O torrent em \"{0}\" é inválido" + +#: ../java/src/org/klomp/snark/SnarkManager.java:999 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:186 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1011 +#, java-format +msgid "Torrent added and started: \"{0}\"" +msgstr "Torrent adicionado e começado: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1013 +#, java-format +msgid "Torrent added: \"{0}\"" +msgstr "Torrent adicionado: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1069 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:89 +#, java-format +msgid "Fetching {0}" +msgstr "Buscando {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1075 +#, java-format +msgid "" +"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " +"succeed until you start another torrent, enable open trackers, or enable " +"DHT." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1079 +#, java-format +msgid "Adding {0}" +msgstr "Adicionando {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1111 +#, java-format +msgid "Download already running: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1150 +#: ../java/src/org/klomp/snark/SnarkManager.java:1173 +#: ../java/src/org/klomp/snark/SnarkManager.java:1611 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "Falha ao copiar arquivo de torrent de {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1400 +#, java-format +msgid "Too many files in \"{0}\" ({1}), deleting it!" +msgstr "Arquivos em excesso em \"{0}\" ({1}), deletando!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1402 +#, java-format +msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" +msgstr "Arquivo de torrent \"{0}\" não pode terminar em \".torrent\", deletando!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1404 +#, java-format +msgid "No pieces in \"{0}\", deleting it!" +msgstr "Sem peças em \"{0}\", deletando!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1406 +#, java-format +msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" +msgstr "Peças em excesso em \"{0}\". O limite é {1}, deletando!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1408 +#, java-format +msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." +msgstr "Peças são muito grande em \"{0}\" ({1}B), deletando." + +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 +#, java-format +msgid "Limit is {0}B" +msgstr "O limite é {0}B" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1411 +#, java-format +msgid "Torrent \"{0}\" has no data, deleting it!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1419 +#, java-format +msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" +msgstr "Torrents maiores do que {0}B não são suportados ainda, deletando \"{1}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1435 +#, java-format +msgid "Error: Could not remove the torrent {0}" +msgstr "Erro: não foi possível remover o torrent {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1456 +#: ../java/src/org/klomp/snark/SnarkManager.java:1474 +#, java-format +msgid "Torrent stopped: \"{0}\"" +msgstr "Torrent parado: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1495 +#, java-format +msgid "Torrent removed: \"{0}\"" +msgstr "Torrent removido: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1503 +#, java-format +msgid "Adding torrents in {0}" +msgstr "Adicionando torrents em {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1534 +#, java-format +msgid "Up bandwidth limit is {0} KBps" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1556 +#, java-format +msgid "Download finished: {0}" +msgstr "Download terminado: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1607 +#, java-format +msgid "Metainfo received for {0}" +msgstr "Metainfo recebido para {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1608 +#: ../java/src/org/klomp/snark/SnarkManager.java:1837 +#, java-format +msgid "Starting up torrent {0}" +msgstr "Iniciando torrent {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1623 +#, java-format +msgid "Error on torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1686 +msgid "Unable to connect to I2P!" +msgstr "Incapaz de conectar ao I2P!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1836 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:126 +msgid "Opening the I2P tunnel" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1860 +msgid "Opening the I2P tunnel and starting all torrents." +msgstr "Abrindo o túnel I2P e começando todos os torrents." + +#: ../java/src/org/klomp/snark/SnarkManager.java:1923 +msgid "Stopping all torrents and closing the I2P tunnel." +msgstr "Parando todos os torrents e fechando o túnel I2P" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1942 +msgid "Closing I2P tunnel after notifying trackers." +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:234 +#, java-format +msgid "No valid trackers for {0} - enable opentrackers or DHT?" +msgstr "" + +#: ../java/src/org/klomp/snark/UpdateHandler.java:49 +#: ../java/src/org/klomp/snark/UpdateRunner.java:227 +msgid "Updating" +msgstr "" + +#: ../java/src/org/klomp/snark/UpdateRunner.java:114 +#, java-format +msgid "Updating from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:77 +#, java-format +msgid "Download torrent file from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:99 +#, java-format +msgid "Torrent was not retrieved from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:153 +#, java-format +msgid "Torrent fetched from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:174 +#, java-format +msgid "Torrent already running: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:176 +#, java-format +msgid "Torrent already in the queue: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:184 +#, java-format +msgid "Torrent at {0} was not valid" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:247 +msgid "I2PSnark - Anonymous BitTorrent Client" +msgstr "I2PSnark - BitTorrent Client Anônimo" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:260 +msgid "Router is down" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 +msgid "Torrents" +msgstr "Torrents" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2242 +msgid "I2PSnark" +msgstr "I2PSnar" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:287 +msgid "Refresh page" +msgstr "Recarregar página" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:295 +msgid "Forum" +msgstr "Fórum" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 +msgid "Click \"Add torrent\" button to fetch torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:345 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 +msgid "clear messages" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:398 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:400 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2427 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +msgid "Status" +msgstr "Status" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:411 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:413 +msgid "Hide Peers" +msgstr "Ocultar Peers" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:423 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:425 +msgid "Show Peers" +msgstr "Mostrar Peers" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:432 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2236 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2256 +msgid "Torrent" +msgstr "Torrent" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:442 +msgid "Estimated time remaining" +msgstr "Tempo restante estimado" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:445 +msgid "ETA" +msgstr "ETA" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:450 +msgid "Downloaded" +msgstr "Baixado" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +msgid "RX" +msgstr "RX" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458 +msgid "Uploaded" +msgstr "Uploaded" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +msgid "TX" +msgstr "TX" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +msgid "Down Rate" +msgstr "Taxa de down" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 +msgid "RX Rate" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:476 +msgid "Up Rate" +msgstr "Taxad de up" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:479 +msgid "TX Rate" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:494 +msgid "Stop all torrents and the I2P tunnel" +msgstr "Parar todos os torrents e o túnel I2P" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496 +msgid "Stop All" +msgstr "Parar todos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +msgid "Start all stopped torrents" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:524 +msgid "Start All" +msgstr "Começar todos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:522 +msgid "Start all torrents and the I2P tunnel" +msgstr "Começar todos os torrents e o túnel I2P" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:548 +msgid "No torrents loaded." +msgstr "Nenhum torrent carregado." + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +msgid "Totals" +msgstr "Totais" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:556 +#, java-format +msgid "1 torrent" +msgid_plural "{0} torrents" +msgstr[0] "1 torrent" +msgstr[1] "{0} torrents" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:561 +#, java-format +msgid "1 connected peer" +msgid_plural "{0} connected peers" +msgstr[0] "1 peer conectado" +msgstr[1] "{0} peers conectados" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#, java-format +msgid "1 DHT peer" +msgid_plural "{0} DHT peers" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 +msgid "First" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 +msgid "First page" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:615 +msgid "Prev" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:615 +msgid "Previous page" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:650 +msgid "Next" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:650 +msgid "Next page" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 +msgid "Last" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 +msgid "Last page" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:744 +#, java-format +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "URL inválido: deve começar com \"http://\", \"{0}\", ou \"{1}\"" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:785 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 +#, java-format +msgid "Magnet deleted: {0}" +msgstr "Magnet deletado: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:820 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Arquivo de torrent deletado: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:812 +#, java-format +msgid "Download deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#, java-format +msgid "Data file deleted: {0}" +msgstr "Arquivo de data deletado: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:839 +#, java-format +msgid "Data file could not be deleted: {0}" +msgstr "Não foi possível apagar o arquivo de data: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:863 +#, java-format +msgid "Directory could not be deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:861 +#, java-format +msgid "Directory deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933 +msgid "Error - Cannot include alternate trackers without a primary tracker" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:946 +msgid "Error - Cannot mix private and public trackers in a torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:966 +#, java-format +msgid "Torrent created for \"{0}\"" +msgstr "Torrent criado para \"{0}\"" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:968 +#, java-format +msgid "" +"Many I2P trackers require you to register new torrents before seeding - " +"please do so before starting \"{0}\"" +msgstr "Muitos I2P trackers requerem o registro de torrents antes de seeding - por favor, faça isso antes de começar \"{0}\"" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:970 +#, java-format +msgid "Error creating a torrent for \"{0}\"" +msgstr "Erro ao criar torrent para \"{0}\"" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:974 +#, java-format +msgid "Cannot create a torrent for the nonexistent data: {0}" +msgstr "Não foi possível criar um torrent para a informação inexistente: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977 +msgid "Error creating torrent - you must enter a file or directory" +msgstr "Erro ao criar torrent - é preciso um arquiso ou diretório" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1008 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2018 +msgid "Delete selected" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1008 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2019 +msgid "Save tracker configuration" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1025 +msgid "Removed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2017 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2022 +msgid "Add tracker" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +msgid "Enter valid tracker name and URLs" +msgstr "" + +#. "\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2021 +msgid "Restore defaults" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1085 +msgid "Restored default trackers" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1206 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +msgid "Checking" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1209 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1210 +msgid "Allocating" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1224 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +msgid "Tracker Error" +msgstr "Erro de tracker" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 +#, java-format +msgid "1 peer" +msgid_plural "{0} peers" +msgstr[0] "1 peer" +msgstr[1] "{0} peers" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1234 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +msgid "Starting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1243 +msgid "Seeding" +msgstr "Seeding" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2369 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2483 +msgid "Complete" +msgstr "Completo" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1266 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1267 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1272 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273 +msgid "OK" +msgstr "OK" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1277 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1284 +msgid "Stalled" +msgstr "Estagnado" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +msgid "No Peers" +msgstr "Sem peers" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1296 +msgid "Stopped" +msgstr "Parad" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1329 +msgid "Torrent details" +msgstr "Detalhes do torrent" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358 +msgid "View files" +msgstr "Ver arquivos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1360 +msgid "Open file" +msgstr "Abrir arquivos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1402 +msgid "Stop the torrent" +msgstr "Parar o torrent" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1404 +msgid "Stop" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1416 +msgid "Start the torrent" +msgstr "Começar o torrent" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1418 +msgid "Start" +msgstr "Começar" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1430 +msgid "Remove the torrent from the active list, deleting the .torrent file" +msgstr "Remover o torrent da lista de ativos, deletando o arquivo .torrent" + +#. Can't figure out how to escape double quotes inside the onclick string. +#. Single quotes in translate strings with parameters must be doubled. +#. Then the remaining single quote must be escaped +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1435 +#, java-format +msgid "" +"Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " +"not be deleted) ?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438 +msgid "Remove" +msgstr "Remover" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450 +msgid "Delete the .torrent file and the associated data file(s)" +msgstr "Deletar o arquivo ;torrent e associar data file(s)" + +#. Can't figure out how to escape double quotes inside the onclick string. +#. Single quotes in translate strings with parameters must be doubled. +#. Then the remaining single quote must be escaped +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1455 +#, java-format +msgid "" +"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " +"data?" +msgstr "Tem certeza que quer remover o torrent \\''{0}\\'' e todas as informaçoes baixadas?" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1458 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988 +msgid "Delete" +msgstr "Deletar" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1493 +msgid "Unknown" +msgstr "desconhecido" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 +msgid "Seed" +msgstr "Seed" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +msgid "Uninteresting (The peer has no pieces we need)" +msgstr "Desinteressante (O peer não tem as peças de interesse)" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +msgid "Choked (The peer is not allowing us to request pieces)" +msgstr "Engasgado (O peer não deixa solicitar as peças)" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +msgid "Uninterested (We have no pieces the peer needs)" +msgstr "Desinteressado (Peer não precisa das peças)" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1552 +msgid "Choking (We are not allowing the peer to request pieces)" +msgstr "Engasgando (Peer está impossibilitado de solicitar peças)" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1607 +#, java-format +msgid "Details at {0} tracker" +msgstr "Detalhes em tracker {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1624 +msgid "Info" +msgstr "Info" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Add Torrent" +msgstr "Adicionar Torrent" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1677 +msgid "From URL" +msgstr "Do URL" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1680 +msgid "" +"Enter the torrent file download URL (I2P only), magnet link, maggot link, or" +" info hash" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1685 +msgid "Add torrent" +msgstr "Acidionar torrent" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1688 +#, java-format +msgid "You can also copy .torrent files to: {0}." +msgstr "Pode também copiar arquivos .torrents de: {0}." + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1690 +msgid "Removing a .torrent will cause it to stop." +msgstr "A remoção de um .torrent parará a mesma" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1713 +msgid "Create Torrent" +msgstr "Criar Torrent" + +#. out.write("From file:
\n"); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 +msgid "Data to seed" +msgstr "Arquivo para seed" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1720 +msgid "File or directory to seed (must be within the specified path)" +msgstr "Arquivo ou diretório para seed (deve ser dentro do caminho especificado)" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1966 +msgid "Trackers" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1724 +msgid "Primary" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +msgid "Alternates" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1729 +msgid "Create torrent" +msgstr "Criar torrent" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1747 +msgid "none" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2033 +msgid "Configuration" +msgstr "Configuração" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1784 +msgid "Data directory" +msgstr "Diretório de arquivo" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1788 +msgid "Files readable by all" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1792 +msgid "If checked, other users may access the downloaded files" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1796 +msgid "Auto start" +msgstr "Autocomeçar" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1800 +msgid "If checked, automatically start torrents that are added" +msgstr "Automaticamente começar torrents adicionados se verificado" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1804 +msgid "Theme" +msgstr "Tema" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1817 +msgid "Refresh time" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1830 +msgid "Never" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1836 +msgid "Startup delay" +msgstr "Atraso de inicialização" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1838 +msgid "minutes" +msgstr "minutos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 +msgid "Page size" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1844 +msgid "torrents" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1868 +msgid "Total uploader limit" +msgstr "Limite total do uploader" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1871 +msgid "peers" +msgstr "peers" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1875 +msgid "Up bandwidth limit" +msgstr "Up limite de banda larga" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 +msgid "Half available bandwidth recommended." +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1880 +msgid "View or change router bandwidth" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1884 +msgid "Use open trackers also" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1888 +msgid "" +"If checked, announce torrents to open trackers as well as the tracker listed" +" in the torrent file" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1892 +msgid "Enable DHT" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1896 +msgid "If checked, use DHT" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1912 +msgid "Inbound Settings" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1918 +msgid "Outbound Settings" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1926 +msgid "I2CP host" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1931 +msgid "I2CP port" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1946 +msgid "I2CP options" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1951 +msgid "Save configuration" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1971 +msgid "Name" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1973 +msgid "Website URL" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1975 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2517 +msgid "Open" +msgstr "Abrir" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1977 +msgid "Private" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1979 +msgid "Announce URL" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2009 +msgid "Add" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "" + +#. * dummies for translation +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2057 +#, java-format +msgid "1 hop" +msgid_plural "{0} hops" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2058 +#, java-format +msgid "1 tunnel" +msgid_plural "{0} tunnels" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2265 +msgid "Torrent file" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2278 +msgid "Primary Tracker" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 +msgid "Tracker List" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2311 +msgid "Comment" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2320 +msgid "Created" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +msgid "Created By" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2340 +msgid "Magnet link" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2347 +msgid "Private torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2421 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2423 +msgid "Size" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2364 +msgid "Completion" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 +msgid "Remaining" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2381 +msgid "Files" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2386 +msgid "Pieces" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2390 +msgid "Piece size" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2413 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2417 +msgid "Directory" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2436 +msgid "Priority" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2442 +msgid "Up to higher level directory" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 +msgid "Torrent not found?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2480 +msgid "File not found in torrent?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2493 +msgid "complete" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2494 +msgid "remaining" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2543 +msgid "High" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2548 +msgid "Normal" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2553 +msgid "Skip" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2562 +msgid "Save priorities" +msgstr "" diff --git a/apps/i2psnark/mime.properties b/apps/i2psnark/mime.properties index 927155d9a..b251fb72e 100644 --- a/apps/i2psnark/mime.properties +++ b/apps/i2psnark/mime.properties @@ -24,6 +24,7 @@ su2 = application/zip su3 = application/zip sud = application/zip tbz = application/x-bzip2 +torrent = application/x-bittorrent txt = text/plain war = application/java-archive webm = video/webm diff --git a/apps/i2ptunnel/locale-proxy/messages_sk.po b/apps/i2ptunnel/locale-proxy/messages_sk.po new file mode 100644 index 000000000..f3c8d651e --- /dev/null +++ b/apps/i2ptunnel/locale-proxy/messages_sk.po @@ -0,0 +1,455 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the i2ptunnel package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# Roman 'Kaktuxista' Benji , 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-06 18:27+0000\n" +"PO-Revision-Date: 2014-05-19 19:29+0000\n" +"Last-Translator: Roman 'Kaktuxista' Benji \n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/I2P/language/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: ../java/build/Proxy.java:5 ../java/build/Proxy.java:11 +msgid "Warning: Outproxy Not Found" +msgstr "" + +#: ../java/build/Proxy.java:6 ../java/build/Proxy.java:18 +#: ../java/build/Proxy.java:27 ../java/build/Proxy.java:40 +#: ../java/build/Proxy.java:49 ../java/build/Proxy.java:61 +#: ../java/build/Proxy.java:69 ../java/build/Proxy.java:78 +#: ../java/build/Proxy.java:93 ../java/build/Proxy.java:104 +#: ../java/build/Proxy.java:116 ../java/build/Proxy.java:126 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:204 +msgid "Router Console" +msgstr "Konzola routra" + +#: ../java/build/Proxy.java:7 ../java/build/Proxy.java:19 +#: ../java/build/Proxy.java:28 ../java/build/Proxy.java:41 +#: ../java/build/Proxy.java:50 ../java/build/Proxy.java:62 +#: ../java/build/Proxy.java:70 ../java/build/Proxy.java:79 +#: ../java/build/Proxy.java:94 ../java/build/Proxy.java:105 +#: ../java/build/Proxy.java:117 ../java/build/Proxy.java:127 +msgid "I2P Router Console" +msgstr "Konzola I2P routra" + +#: ../java/build/Proxy.java:8 ../java/build/Proxy.java:20 +#: ../java/build/Proxy.java:29 ../java/build/Proxy.java:42 +#: ../java/build/Proxy.java:51 ../java/build/Proxy.java:63 +#: ../java/build/Proxy.java:71 ../java/build/Proxy.java:80 +#: ../java/build/Proxy.java:95 ../java/build/Proxy.java:106 +#: ../java/build/Proxy.java:118 ../java/build/Proxy.java:128 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:205 +msgid "Configuration" +msgstr "Konfigurácia" + +#: ../java/build/Proxy.java:9 ../java/build/Proxy.java:21 +#: ../java/build/Proxy.java:30 ../java/build/Proxy.java:43 +#: ../java/build/Proxy.java:52 ../java/build/Proxy.java:64 +#: ../java/build/Proxy.java:72 ../java/build/Proxy.java:81 +#: ../java/build/Proxy.java:96 ../java/build/Proxy.java:107 +#: ../java/build/Proxy.java:119 ../java/build/Proxy.java:129 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:205 +msgid "Help" +msgstr "Pomoc" + +#: ../java/build/Proxy.java:10 ../java/build/Proxy.java:22 +#: ../java/build/Proxy.java:31 ../java/build/Proxy.java:44 +#: ../java/build/Proxy.java:53 ../java/build/Proxy.java:65 +#: ../java/build/Proxy.java:73 ../java/build/Proxy.java:82 +#: ../java/build/Proxy.java:97 ../java/build/Proxy.java:108 +#: ../java/build/Proxy.java:120 ../java/build/Proxy.java:130 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:205 +msgid "Addressbook" +msgstr "Adresár" + +#: ../java/build/Proxy.java:12 +msgid "The HTTP Outproxy was not found." +msgstr "" + +#: ../java/build/Proxy.java:13 +msgid "" +"It is offline, there is network congestion, or your router is not yet well-" +"integrated with peers." +msgstr "" + +#: ../java/build/Proxy.java:14 +#, java-format +msgid "" +"You may want to {0}retry{1} as this will randomly reselect an outproxy from " +"the pool you have defined {2}here{3} (if you have more than one configured)." +msgstr "" + +#: ../java/build/Proxy.java:15 +#, java-format +msgid "" +"If you continue to have trouble you may want to edit your outproxy list " +"{0}here{1}." +msgstr "" + +#: ../java/build/Proxy.java:16 ../java/build/Proxy.java:38 +#: ../java/build/Proxy.java:59 ../java/build/Proxy.java:102 +msgid "Could not find the following destination:" +msgstr "Nebolo možné nájsť nasledovnú destináciu:" + +#: ../java/build/Proxy.java:17 +msgid "Error: Request Denied" +msgstr "" + +#: ../java/build/Proxy.java:23 +msgid "Error: Local Access" +msgstr "" + +#: ../java/build/Proxy.java:24 +msgid "Your browser is misconfigured." +msgstr "" + +#: ../java/build/Proxy.java:25 +msgid "" +"Do not use the proxy to access the router console, localhost, or local LAN " +"destinations." +msgstr "" + +#: ../java/build/Proxy.java:26 +msgid "Warning: Eepsite Unknown" +msgstr "Varovanie: Neznáma eepsite" + +#: ../java/build/Proxy.java:32 +msgid "Warning: Eepsite Not Found in Addressbook" +msgstr "Varovanie: Eepsite nebola v adresári nájdená" + +#: ../java/build/Proxy.java:33 +msgid "The eepsite was not found in your router's addressbook." +msgstr "Daná eepsite nebola nájdená v adresári vášho routra." + +#: ../java/build/Proxy.java:34 +msgid "Check the link or find a Base 32 or Base 64 address." +msgstr "Skontrolujte daný odkaz, prípadne nájdite Base 32 alebo Base 64 adresu." + +#: ../java/build/Proxy.java:35 +#, java-format +msgid "If you have the Base 64 address, {0}add it to your addressbook{1}." +msgstr "Ak máte Base 64 adresu, {0}pridajte si ju do svojho adresára{1}." + +#: ../java/build/Proxy.java:36 +msgid "" +"Otherwise, find a Base 32 or address helper link, or use a jump service link" +" below." +msgstr "" + +#: ../java/build/Proxy.java:37 +#, java-format +msgid "" +"Seeing this page often? See {0}the FAQ{1} for help in {2}adding some " +"subscriptions{3} to your addressbook." +msgstr "" + +#: ../java/build/Proxy.java:39 ../java/build/Proxy.java:45 +msgid "Warning: Invalid Request URI" +msgstr "Varovanie: Neplatná URI požiadavku" + +#: ../java/build/Proxy.java:46 +msgid "The request URI is invalid, and probably contains illegal characters." +msgstr "URI požiadavku je neplatná a zrejme obsahuje nepovolené znaky." + +#: ../java/build/Proxy.java:47 +msgid "" +"If you clicked a link, check the end of the URI for any characters the " +"browser has mistakenly added on." +msgstr "Ak ste klikli na odkaz, skontrolujte koniec URI, či sa v ňom nenachádzajú nejaké znaky omylom pridané prehliadačom." + +#: ../java/build/Proxy.java:48 ../java/build/Proxy.java:54 +msgid "Warning: Invalid Destination" +msgstr "Varovanie: Neplatná destinácia" + +#: ../java/build/Proxy.java:55 +msgid "" +"The eepsite destination specified was not valid, or was otherwise " +"unreachable." +msgstr "Zadaná eepsite destinácia nebola platná, alebo sa ju iným spôsobom nepodarilo dosiahnuť." + +#: ../java/build/Proxy.java:56 +msgid "" +"Perhaps you pasted in the wrong Base 64 string or the link you are following" +" is bad." +msgstr "Možno ste vložili nesprávny Base 64 reťazec, prípadne odkaz, ktorý práve nasledujete, je zlý." + +#: ../java/build/Proxy.java:57 +msgid "The I2P host could also be offline." +msgstr "Takisto I2P hostiteľ mohol byť offline." + +#: ../java/build/Proxy.java:58 ../java/build/Proxy.java:101 +#, java-format +msgid "You may want to {0}retry{1}." +msgstr "Môžete to chcieť {0}skúsiť znova{1}." + +#: ../java/build/Proxy.java:60 ../java/build/Proxy.java:66 +msgid "Warning: Request Denied" +msgstr "Varovanie: Požiadavok bol odmietnutý" + +#: ../java/build/Proxy.java:67 +msgid "You attempted to connect to a non-I2P website or location." +msgstr "Pokúsili ste sa pripojiť k webovej stránke alebo lokácii mimo I2P." + +#: ../java/build/Proxy.java:68 ../java/build/Proxy.java:74 +msgid "Warning: No Outproxy Configured" +msgstr "Varovanie: Nie je nakonfigurovaný žiadny východzí proxy" + +#: ../java/build/Proxy.java:75 +msgid "" +"Your request was for a site outside of I2P, but you have no HTTP outproxy " +"configured." +msgstr "Váš požiadavok bol určený pre stránku mimo I2P, avšak nemáte nakonfigurovaný žiadny východzí proxy." + +#: ../java/build/Proxy.java:76 +msgid "Please configure an outproxy in I2PTunnel." +msgstr "Prosím nakonfigurujte si v I2PTunneli východzí proxy." + +#: ../java/build/Proxy.java:77 ../java/build/Proxy.java:83 +msgid "Warning: Destination Key Conflict" +msgstr "" + +#: ../java/build/Proxy.java:84 +msgid "" +"The addresshelper link you followed specifies a different destination key " +"than a host entry in your host database." +msgstr "" + +#: ../java/build/Proxy.java:85 +msgid "" +"Someone could be trying to impersonate another eepsite, or people have given" +" two eepsites identical names." +msgstr "" + +#: ../java/build/Proxy.java:86 +msgid "" +"You can resolve the conflict by considering which key you trust, and either " +"discarding the addresshelper link, discarding the host entry from your host " +"database, or naming one of them differently." +msgstr "" + +#: ../java/build/Proxy.java:87 +msgid "Proxy Authorization Required" +msgstr "Je vyžadovaná autorizácia proxy" + +#: ../java/build/Proxy.java:88 +msgid "I2P HTTP Proxy Authorization Required" +msgstr "Je vyžadovaná autorizácia I2P HTTP proxy" + +#: ../java/build/Proxy.java:89 +msgid "" +"This proxy is configured to require a username and password for access." +msgstr "Tento proxy je nakonfigurovaný tak, aby pre prístup vyžadoval uživateľské meno a heslo." + +#: ../java/build/Proxy.java:90 +#, java-format +msgid "" +"Please enter your username and password, or check your {0}router " +"configuration{1} or {2}I2PTunnel configuration{3}." +msgstr "Prosím zadajte vaše užívateľské meno a heslo, prípadne skontrolujte vašu {0}konfiguráciu routra{1} alebo {2}I2PTunnel konfiguráciu{3}." + +#: ../java/build/Proxy.java:91 +#, java-format +msgid "" +"To disable authorization, remove the configuration " +"{0}i2ptunnel.proxy.auth=basic{1}, then stop and restart the HTTP Proxy " +"tunnel." +msgstr "Ak chcete zakázať autorizáciu, odstráňte nastavenie {0}i2ptunnel.proxy.auth=basic{1} a následne zastavte a reštartujte HTTP Proxy tunel." + +#: ../java/build/Proxy.java:92 ../java/build/Proxy.java:98 +msgid "Warning: Eepsite Unreachable" +msgstr "" + +#: ../java/build/Proxy.java:99 +msgid "The eepsite was not reachable." +msgstr "" + +#: ../java/build/Proxy.java:100 +msgid "" +"The eepsite is offline, there is network congestion, or your router is not " +"yet well-integrated with peers." +msgstr "" + +#: ../java/build/Proxy.java:103 +msgid "Information: New Host Name" +msgstr "Informácia: Nový názov hostiteľa" + +#: ../java/build/Proxy.java:109 +msgid "Information: New Host Name with Address Helper" +msgstr "Informácia: Nový názov hostiteľa s adresným pomocníkom" + +#: ../java/build/Proxy.java:110 +msgid "" +"The address helper link you followed is for a new host name that is not in " +"your address book." +msgstr "Odkaz adresného pomocníka, ktorý ste nasledovali, je určený pre nový názov hostiteľa nenachádzajúceho sa vo vašom adresári." + +#: ../java/build/Proxy.java:111 +msgid "You may save this host name to your local address book." +msgstr "Môžete uložiť tento názov hostiteľa do lokálneho adresára." + +#: ../java/build/Proxy.java:112 +msgid "" +"If you save it to your address book, you will not see this message again." +msgstr "Ak ho uložíte do svojho adresára, už túto správu znova neuvidíte." + +#: ../java/build/Proxy.java:113 +msgid "" +"If you do not save it, the host name will be forgotten after the next router" +" restart." +msgstr "Ak ho neuložíte, názov hostiteľa bude po ďalšom reštarte routra zabudnutý." + +#: ../java/build/Proxy.java:114 +msgid "" +"If you do not wish to visit this host, click the \"back\" button on your " +"browser." +msgstr "Ak si neželáte navštíviť tohto hostiteľa, kliknite na tlačítko \"Späť\" vo vašom prehliadači." + +#: ../java/build/Proxy.java:115 ../java/build/Proxy.java:121 +msgid "Warning: Bad Address Helper" +msgstr "" + +#: ../java/build/Proxy.java:122 +#, java-format +msgid "The helper key in the URL ({0}i2paddresshelper={1}) is not resolvable." +msgstr "" + +#: ../java/build/Proxy.java:123 +msgid "It seems to be garbage data, or a mistyped Base 32 address." +msgstr "" + +#: ../java/build/Proxy.java:124 +msgid "" +"Check your URL to try and fix the helper key to be a valid Base 32 hostname " +"or Base 64 key." +msgstr "" + +#: ../java/build/Proxy.java:125 ../java/build/Proxy.java:131 +msgid "Warning: Non-HTTP Protocol" +msgstr "" + +#: ../java/build/Proxy.java:132 +msgid "The request uses a bad protocol." +msgstr "" + +#: ../java/build/Proxy.java:133 +msgid "The I2P HTTP Proxy supports HTTP and HTTPS requests only." +msgstr "" + +#: ../java/build/Proxy.java:134 +msgid "Other protocols such as FTP are not allowed." +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:595 +msgid "This seems to be a bad destination:" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:595 +msgid "i2paddresshelper cannot help you with a destination like that!" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:662 +#, java-format +msgid "" +"To visit the destination in your host database, click here. To visit the conflicting addresshelper destination, " +"click here." +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1151 +msgid "Host" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1155 +msgid "Base 32" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1159 +msgid "Destination" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1165 +#, java-format +msgid "Continue to {0} without saving" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1170 +#, java-format +msgid "Save {0} to router address book and continue to eepsite" +msgstr "" + +#. only blockfile supports multiple books +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1173 +#, java-format +msgid "Save {0} to master address book and continue to eepsite" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1174 +#, java-format +msgid "Save {0} to private address book and continue to eepsite" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1290 +msgid "HTTP Outproxy" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1326 +msgid "" +"Click a link below to look for an address helper by using a \"jump\" " +"service:" +msgstr "" + +#. Translators: parameter is a host name +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1334 +#, java-format +msgid "{0} jump service" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:162 +#, java-format +msgid "Added via address helper from {0}" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:164 +msgid "Added via address helper" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:187 +msgid "router" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:189 +msgid "master" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:191 +msgid "private" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:198 +#, java-format +msgid "Redirecting to {0}" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:210 +#, java-format +msgid "Saved {0} to the {1} addressbook, redirecting now." +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:211 +#, java-format +msgid "Failed to save {0} to the {1} addressbook, redirecting now." +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:213 +msgid "Click here if you are not redirected automatically." +msgstr "" diff --git a/apps/i2ptunnel/locale/messages_es b/apps/i2ptunnel/locale/messages_es new file mode 100644 index 000000000..e69de29bb diff --git a/apps/i2ptunnel/locale/messages_nn.po b/apps/i2ptunnel/locale/messages_nn.po new file mode 100644 index 000000000..8f3d9aefe --- /dev/null +++ b/apps/i2ptunnel/locale/messages_nn.po @@ -0,0 +1,1180 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the i2ptunnel package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# , 2012 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-06 18:27+0000\n" +"PO-Revision-Date: 2014-02-06 18:45+0000\n" +"Last-Translator: kytv \n" +"Language-Team: Norwegian Nynorsk (http://www.transifex.com/projects/p/I2P/language/nn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:363 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:373 +msgid "internal" +msgstr "intern" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:449 +#, java-format +msgid "{0} inbound, {0} outbound tunnel" +msgid_plural "{0} inbound, {0} outbound tunnels" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:453 +msgid "lower bandwidth and reliability" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:455 +msgid "standard bandwidth and reliability" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:457 +msgid "higher bandwidth and reliability" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:123 +msgid "Tunnels are not initialized yet, please reload in two minutes." +msgstr "Tunellane har ikkje opna enno, ver venleg og last om att om to minutt." + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:196 +msgid "" +"Invalid form submission, probably because you used the 'back' or 'reload' " +"button on your browser. Please resubmit." +msgstr "Ugyldig skjemainnsending, sannsynlegvis fordi du brukte «tilbake»- eller «oppfrisk»-knappen på nettlesaren din. Ver venleg og send om att." + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:198 +msgid "" +"If the problem persists, verify that you have cookies enabled in your " +"browser." +msgstr "Sjekk at nettlesaren din har støtte for informasjonskapslar viss du enno har problem." + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:244 +msgid "Configuration reloaded for all tunnels" +msgstr "Konfigurasjon lasta om att for alle tunellar" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:257 +msgid "Starting tunnel" +msgstr "Startar tunell" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:270 +msgid "Stopping tunnel" +msgstr "Stoppar tunell" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:336 +msgid "Configuration changes saved" +msgstr "Konfigurasjonsendringar lagra" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:339 +msgid "Failed to save configuration" +msgstr "Klarte ikkje å lagra konfigurasjonen" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461 +msgid "New Tunnel" +msgstr "Ny tunell" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:484 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:494 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:611 +msgid "Port not set" +msgstr "Port ikkje stilt inn" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:487 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:613 +msgid "Invalid port" +msgstr "Ugyldig port" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:490 +msgid "Warning - ports less than 1024 are not recommended" +msgstr "Åtvaring – portar under 1024 er ikkje tilrådd" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:506 +msgid "Standard client" +msgstr "Standardklient" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:507 +msgid "HTTP/HTTPS client" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:508 +msgid "IRC client" +msgstr "IRC-klient" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:509 +msgid "Standard server" +msgstr "Standardtenar" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:510 +msgid "HTTP server" +msgstr "HTTP-tenar" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:511 +msgid "SOCKS 4/4a/5 proxy" +msgstr "SOCKS 4/4a/5-mellomtenar" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:512 +msgid "SOCKS IRC proxy" +msgstr "SOCKS IRC-mellomtenar" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:513 +msgid "CONNECT/SSL/HTTPS proxy" +msgstr "CONNECT/SSL/HTTPS-mellomtenar" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:514 +msgid "IRC server" +msgstr "IRC-tenar" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:515 +msgid "Streamr client" +msgstr "Streamr-klient" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:516 +msgid "Streamr server" +msgstr "Streamr-tenar" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +msgid "HTTP bidir" +msgstr "HTTP tovegs" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313 +msgid "Host not set" +msgstr "Tenar ikkje stilt inn" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:607 +msgid "Invalid address" +msgstr "Ugyldig adresse" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:82 +msgid "I2P Tunnel Manager - Edit Client Tunnel" +msgstr "I2p tunellhandterar – rediger klienttunell" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:110 +msgid "Edit proxy settings" +msgstr "Rediger mellomtenarinnstillingar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:118 +msgid "New proxy settings" +msgstr "Nye mellomtenarinnstillingar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:129 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:129 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:126 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:140 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:271 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326 +msgid "Name" +msgstr "Namn" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 +msgid "Type" +msgstr "Type" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:422 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:330 +msgid "Description" +msgstr "Skildring" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +msgid "Target" +msgstr "Mål" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:147 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:149 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:186 +msgid "Access Point" +msgstr "Tilgangspunkt" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:154 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:170 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:191 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:236 +msgid "required" +msgstr "kravd" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:482 +msgid "Reachable by" +msgstr "Kan nåast frå" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:196 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:358 +msgid "Outproxies" +msgstr "Ut-mellomtenarar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:203 +msgid "SSL Outproxies" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:209 +msgid "Use Outproxy Plugin" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:259 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526 +msgid "(Check the Box for 'YES')" +msgstr "(Huk av for «JA»)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:378 +msgid "Tunnel Destination" +msgstr "Tunellmålside" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:382 +msgid "name, name:port, or destination" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:233 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:386 +msgid "b32 not recommended" +msgstr "b32 ikkje tilrådd" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +msgid "Shared Client" +msgstr "Delt klient" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +msgid "" +"(Share tunnels with other clients and irc/httpclients? Change requires " +"restart of client proxy)" +msgstr "(Del tunellar med andre klientar og irc-/http-klientar? Endringa krev omstart av klientmellomtenaren.)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:141 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:522 +msgid "Auto Start" +msgstr "Autostart" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:255 +msgid "Enable DCC" +msgstr "Skru på DCC" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:263 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 +msgid "Advanced networking options" +msgstr "Avanserte nettverksval" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:265 +msgid "" +"(NOTE: when this client proxy is configured to share tunnels, then these " +"options are for all the shared proxy clients!)" +msgstr "(MERK: Når denne klientmellomtenaren er konfigurert for å dela tunellar, gjeld vala for alle dei delte mellomtenarklientane!)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:267 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:268 +msgid "Tunnel Options" +msgstr "Tunellval" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:269 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:270 +msgid "Length" +msgstr "Lengd" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277 +msgid "0 hop tunnel (no anonymity)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281 +msgid "1 hop tunnel (low anonymity)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:285 +msgid "2 hop tunnel (medium anonymity)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:288 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:289 +msgid "3 hop tunnel (high anonymity)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:297 +msgid "hop tunnel (very poor performance)" +msgstr "hoppstunell (veldig dårleg yting)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302 +msgid "Variance" +msgstr "Varians" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:309 +msgid "0 hop variance (no randomisation, consistant performance)" +msgstr "Varians på 0 hopp (ingen randomisering, konstant yting)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:313 +msgid "" +"+ 0-1 hop variance (medium additive randomisation, subtractive performance)" +msgstr "+ Varians på 0-1 hopp (middels aukande randomisering, minkande yting)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:317 +msgid "" +"+ 0-2 hop variance (high additive randomisation, subtractive performance)" +msgstr "+ Varians på 0-2 hopp (høg aukande randomisering, minkande yting)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:321 +msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" +msgstr "+/- Varians på 0-1 hopp (vanleg randomisering, vanleg yting)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:325 +msgid "+/- 0-2 hop variance (not recommended)" +msgstr "+/- Varians på 0-2 hopp (ikkje tilrådd)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:336 +msgid "hop variance" +msgstr "hoppsvarians" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:341 +msgid "Count" +msgstr "Tal" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:345 +msgid "Backup Count" +msgstr "Ekstra" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:352 +msgid "0 backup tunnels (0 redundancy, no added resource usage)" +msgstr "0 ekstratunellar (0 redundans, ikkje meir ressursbruk)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 +msgid "1 backup tunnel each direction (low redundancy, low resource usage)" +msgstr "1 ekstratunell kvar veg (låg redundans, låg ressursbruk)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 +msgid "" +"2 backup tunnels each direction (medium redundancy, medium resource usage)" +msgstr "2 ekstratunellar kvar veg (middels redundans, middels ressursbruk)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +msgid "3 backup tunnels each direction (high redundancy, high resource usage)" +msgstr "3 ekstratunellar kvar veg (høg redundans, høg ressursbruk)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:372 +msgid "backup tunnels" +msgstr "ekstratunellar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379 +msgid "Profile" +msgstr "Profil" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:386 +msgid "interactive connection" +msgstr "interaktiv tilkopling" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:390 +msgid "bulk connection (downloads/websites/BT)" +msgstr "massetilkopling (nedlastingar/nettsider/BT)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391 +msgid "Delay Connect" +msgstr "Forseink tilkopling" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:395 +msgid "for request/response connections" +msgstr "for førespurnad-/respons-tilkoplingar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:394 +msgid "Router I2CP Address" +msgstr "I2CP-adresse til ruteren" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:413 +msgid "Host" +msgstr "Tenar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:165 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:404 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:273 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:434 +msgid "Port" +msgstr "Port" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:502 +msgid "Reduce tunnel quantity when idle" +msgstr "Reduser tunellkvantitet når inaktiv" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:455 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:465 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:493 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:503 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504 +msgid "Enable" +msgstr "Skru på" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:508 +msgid "Reduced tunnel count" +msgstr "Reduser tunnelmengd" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:512 +msgid "Idle minutes" +msgstr "Minutt inaktiv" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:433 +msgid "Close tunnels when idle" +msgstr "Lukk tunellar når inaktiv" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:439 +msgid "New Keys on Reopen" +msgstr "Nye nøklar ved gjenopning" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:447 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430 +msgid "Disable" +msgstr "Skru av" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:453 +msgid "Delay tunnel open until required" +msgstr "Vent med tunellopning til det trengst" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463 +msgid "Persistent private key" +msgstr "Varig privat nøkkel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:469 +msgid "File" +msgstr "Fil" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 +msgid "Local destination" +msgstr "Lokal målside" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482 +msgid "Local Base 32" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:491 +msgid "Local Authorization" +msgstr "Lokal autorisering" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:507 +msgid "Username" +msgstr "Brukarnamn" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:499 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:511 +msgid "Password" +msgstr "Passord" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:501 +msgid "Outproxy Authorization" +msgstr "Autorisering av ut-mellomtenar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +msgid "Jump URL List" +msgstr "URL-liste over vidaresendingstenester" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:548 +msgid "Custom options" +msgstr "Eigne val" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:702 +msgid "Cancel" +msgstr "Avbryt" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:532 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:556 +msgid "Delete" +msgstr "Slett" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:558 +msgid "Save" +msgstr "Lagra" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:82 +msgid "I2P Tunnel Manager - Edit Server Tunnel" +msgstr "I2P tunellhandterar – rediger tenartunell" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:110 +msgid "Edit server settings" +msgstr "Rediger tenarinnstillingar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:118 +msgid "New server settings" +msgstr "Nye tenarinnstillingar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:179 +msgid "Use SSL?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:222 +msgid "Website name" +msgstr "Namn på nettstad" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:226 +msgid "(leave blank for outproxies)" +msgstr "(blank for ut-mellomtenarar)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:231 +msgid "Private key file" +msgstr "Privat nøkkelfil" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:253 +msgid "Add to local addressbook" +msgstr "Legg til i lokal adressebok" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260 +msgid "Hostname Signature" +msgstr "Signatur på tenarnamn" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:412 +msgid "Encrypt Leaseset" +msgstr "Krypter «leaseset» (tunellinngangar)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:418 +msgid "Encryption Key" +msgstr "Krypteringsnøkkel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:422 +msgid "Generate New Key" +msgstr "Opprett ny nøkkel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424 +msgid "Generate" +msgstr "Opprett" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:546 +msgid "(Tunnel must be stopped first)" +msgstr "(Tunellen må stoppast først)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:428 +msgid "Restricted Access List" +msgstr "Avgrensa tilgangsliste" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:434 +msgid "Whitelist" +msgstr "Kviteliste" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438 +msgid "Blacklist" +msgstr "Svarteliste" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442 +msgid "Access List" +msgstr "Tilgangsliste" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:446 +msgid "Inbound connection limits (0=unlimited)" +msgstr "Inn-tilkoplingsgrense (0=inga grense)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:448 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479 +msgid "Per client" +msgstr "Per klient" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450 +msgid "Per minute" +msgstr "Per minutt" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454 +msgid "Per hour" +msgstr "Per time" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:458 +msgid "Per day" +msgstr "Per dag" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:462 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489 +msgid "Total" +msgstr "I alt" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:470 +msgid "Max concurrent connections (0=unlimited)" +msgstr "Maks samtidige tilkoplingar (0=inga grense)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:477 +msgid "POST limits (0=unlimited)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 +msgid "Per period" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 +msgid "Ban minutes" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 +msgid "POST limit period (minutes)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:516 +msgid "New Certificate type" +msgstr "Ny sertifikattype" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:518 +msgid "None" +msgstr "Ingen" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:522 +msgid "Hashcash (effort)" +msgstr "Hashcash (arbeidsmengd)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:528 +msgid "Hashcash Calc Time" +msgstr "Hashcash kalkuleringstid" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:530 +msgid "Estimate" +msgstr "Estimat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:532 +msgid "Hidden" +msgstr "Skjult" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:536 +msgid "Signed (signed by)" +msgstr "Signert (signert av)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:542 +msgid "Modify Certificate" +msgstr "Endra sertifikat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:544 +msgid "Modify" +msgstr "Endra" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83 +msgid "I2P Tunnel Manager - List" +msgstr "I2P tunellhandterar – liste" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:97 +msgid "Status Messages" +msgstr "Statusmeldingar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:101 +msgid "Refresh" +msgstr "Oppfrisk" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109 +msgid "Tunnel Wizard" +msgstr "Tunellvegvisar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113 +msgid "Stop All" +msgstr "Stopp alle" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:117 +msgid "Start All" +msgstr "Start alle" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121 +msgid "Restart All" +msgstr "Omstart alle" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124 +msgid "I2P Server Tunnels" +msgstr "I2P tenartunellar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:128 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:149 +msgid "Points at" +msgstr "Peker på" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:186 +msgid "Preview" +msgstr "Førehandsvis" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:132 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:206 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:320 +msgid "Status" +msgstr "Status" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 +msgid "Base32 Address" +msgstr "Base32-adresse" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:200 +msgid "No Preview" +msgstr "Inga førehandsvising" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327 +msgid "Starting..." +msgstr "Startar …" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:362 +msgid "Stop" +msgstr "Stopp" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:355 +msgid "Running" +msgstr "Køyrer" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +msgid "Stopped" +msgstr "Stoppa" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:376 +msgid "Start" +msgstr "Start" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:263 +msgid "New server tunnel" +msgstr "Ny tenartunell" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:432 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:576 +msgid "Standard" +msgstr "Standard" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:267 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:434 +msgid "Create" +msgstr "Opprett" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269 +msgid "I2P Client Tunnels" +msgstr "I2P klienttunellar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:306 +msgid "Interface" +msgstr "Grensesnitt" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:341 +msgid "Standby" +msgstr "Ventemodus" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:385 +msgid "Outproxy" +msgstr "Ut-mellomtenar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:388 +msgid "Destination" +msgstr "Målside" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +msgid "internal plugin" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:414 +msgid "none" +msgstr "ingen" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:430 +msgid "New client tunnel" +msgstr "Ny klienttunell" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:119 +msgid "I2P Tunnel Manager - Tunnel Creation Wizard" +msgstr "I2P tunellhandterar – vegvisar for tunelloppretting" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:567 +msgid "Server or client tunnel?" +msgstr "Tenar- eller klienttunell?" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:571 +msgid "Tunnel type" +msgstr "Tunelltype" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:151 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:601 +msgid "Tunnel name and description" +msgstr "Tunellnamn og -skildring" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:157 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:610 +msgid "Tunnel destination" +msgstr "Tunellmålside" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:626 +msgid "Binding address and port" +msgstr "Bindingsadresse og -port" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:652 +msgid "Tunnel auto-start" +msgstr "Auto-start tunell" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:175 +msgid "Wizard completed" +msgstr "Vegvisar fullført" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:189 +msgid "" +"This wizard will take you through the various options available for creating" +" tunnels in I2P." +msgstr "Denne vegvisaren tek deg gjennom dei ulike tilgjengelege vala for å oppretta tunellar i I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:191 +msgid "" +"The first thing to decide is whether you want to create a server or a client" +" tunnel." +msgstr "Det første du må avgjera er om du ønskjer ein tenar- eller klienttunell." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:193 +msgid "" +"If you need to connect to a remote service, such as an IRC server inside I2P" +" or a code repository, then you will require a CLIENT tunnel." +msgstr "Viss du må kopla til ei ekstern teneste, t.d. ein IRC-tenar i I2P eller eit kodelager, så treng du ein KLIENT-tunell." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:195 +msgid "" +"On the other hand, if you wish to host a service for others to connect to " +"you'll need to create a SERVER tunnel." +msgstr "Viss du derimot ønskjer å ha ei teneste som andre koplar seg opp mot, så treng du ein TENAR-tunell." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:197 +msgid "Server Tunnel" +msgstr "Tenartunell" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:199 +msgid "Client Tunnel" +msgstr "Klienttunell" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:217 +msgid "There are several types of tunnels to choose from:" +msgstr "Det finst fleire typar tunellar å velja mellom:" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:225 +msgid "Basic tunnel for connecting to a single service inside I2P." +msgstr "Standardtunell for å kopla til ei einskild teneste i I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:269 +msgid "" +"Try this if none of the tunnel types below fit your requirements, or you " +"don't know what type of tunnel you need." +msgstr "Prøv denne viss ingen av tunelltypane under passar, eller viss du ikkje veit kva for tunell du treng." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:229 +msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P." +msgstr "Tunell som fungerer som ein HTTP-mellomtenar for å nå eepsider i I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:231 +msgid "" +"Set your browser to use this tunnel as an http proxy, or set your " +"\"http_proxy\" environment variable for command-line applications in " +"GNU/Linux." +msgstr "La nettlesaren din brukar denne tunellen som ein HTTP-mellomtenar, eller still inn miljøvariabelen «http_proxy» for kommandolinjeprogram i GNU/Linux." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:233 +msgid "" +"Websites outside I2P can also be reached if an HTTP proxy within I2P is " +"known." +msgstr "Du kan òg nå nettsider utanfor I2P om du har ein kjend HTTP-mellomtenar i I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:235 +msgid "Customised client tunnel specific for IRC connections." +msgstr "Klienttunell spesielt innstilt for IRC-tilkoplingar." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:237 +msgid "" +"With this tunnel type, your IRC client will be able to connect to an IRC " +"network inside I2P." +msgstr "Med denne tunelltypen vil IRC-klienten din kunna kopla til eit IRC-nettverk inni I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:239 +msgid "" +"Each IRC network in I2P that you wish to connect to will require its own " +"tunnel. (See Also, SOCKS IRC)" +msgstr "Kvart IRC-nettverk i I2P som du ønskjer å kopla til må ha sin eigen tunell. (Sjå òg SOCKS IRC.)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:241 +msgid "A tunnel that implements the SOCKS protocol." +msgstr "Ein tunell som implementerer SOCKS-protokollen." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:243 +msgid "" +"This enables both TCP and UDP connections to be made through a SOCKS " +"outproxy within I2P." +msgstr "Dette gjer det moleg å oppretta både TCP- og UDP-tilkoplingar gjennom ein SOCKS-basert ut-mellomtenar inni I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:245 +msgid "" +"A client tunnel implementing the SOCKS protocol, which is customised for " +"connecting to IRC networks." +msgstr "Ein klienttunell som implementerer SOCKS-protokollen, som i tillegg er spesielt innstilt for IRC-nettverk." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:247 +msgid "" +"With this tunnel type, IRC networks in I2P can be reached by typing the I2P " +"address into your IRC client, and configuring the IRC client to use this " +"SOCKS tunnel." +msgstr "Med denne tunelltypen kan du nå IRC-nettverk inni I2P ved å skriva I2P-adressa i IRC-klienten og konfigurera IRC-klienten til å bruka denne SOCKS-tunellen." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:249 +msgid "" +"This means that only one I2P tunnel is required rather than a separate " +"tunnel per IRC network." +msgstr "Dette vil seia at du berre treng éin I2P-tunell totalt, i staden for éin tunell per IRC-nettverk." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:251 +msgid "" +"IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P " +"is known, though it depends on whether or not the outproxy has been blocked " +"by the IRC network." +msgstr "Du kan òg nå IRC-nettverk utanfor I2P viss du kjenner til ein SOCKS-basert ut-mellomtenar inni I2P, men det avheng av at ikkje ut-mellomtenaren er blokkert av IRC-nettverket." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:253 +msgid "A client tunnel that implements the HTTP CONNECT command." +msgstr "Ein klienttunell som implementerer HTTP CONNECT-kommandoen." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:255 +msgid "" +"This enables TCP connections to be made through an HTTP outproxy, assuming " +"the proxy supports the CONNECT command." +msgstr "Dette gjer det mogleg å oppretta TCP-tilkoplingar gjennom ein HTTP-basert ut-mellomtenar, dersom mellomtenaren støtter CONNECT-kommandoen." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:257 +msgid "A customised client tunnel for Streamr." +msgstr "Ein klienttunell spesielt innstilt for Streamr." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:267 +msgid "A basic server tunnel for hosting a generic service inside I2P." +msgstr "Ein enkel tenartunell for generelle tenester inni I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:271 +msgid "A server tunnel that is customised for HTTP connections." +msgstr "Ein tenartunell som er spesielt innstilt for HTTP-tilkoplingar." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:273 +msgid "Use this tunnel type if you want to host an eepsite." +msgstr "Bruk denne tunelltypen viss du vil ha ei eepside." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:275 +msgid "" +"A customised server tunnel that can both serve HTTP data and connect to " +"other server tunnels." +msgstr "Ein tenartunell som kan både servera HTTP-data og kopla til andre tenartunellar." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:277 +msgid "This tunnel type is predominantly used when running a Seedless server." +msgstr "Denne tunelltypen er hovudsakleg nytta under køyring av ein Seedless-tenar." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:279 +msgid "A customised server tunnel for hosting IRC networks inside I2P." +msgstr "Ein tenartunell for å ha IRC-nettverk inni I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:281 +msgid "" +"Usually, a separate tunnel needs to be created for each IRC server that is " +"to be accessible inside I2P." +msgstr "Vanlegvis må du oppretta éin separat tunell for kvar IRC-tenar som skal vera tilgjengeleg inni I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:283 +msgid "A customised server tunnel for Streamr." +msgstr "Ein tenartunell som er spesielt innstilt for Streamr." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:322 +msgid "Choose a name and description for your tunnel." +msgstr "Vel eit namn og ei skildring av tunnelen" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:324 +msgid "" +"These can be anything you want - they are just for ease of identifying the " +"tunnel in the routerconsole." +msgstr "Dette kan vera kva som helst – det er berre for å gjera det enkelt for deg å identifisera tunellen i ruterkonsollen." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:354 +msgid "" +"If you know of any outproxies for this type of tunnel (either HTTP or " +"SOCKS), fill them in below." +msgstr "Fyll inn nedanfor viss du kjenner til utmellomtenarar for denne tunelltypen (anten HTTP eller SOCKS)." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:356 +msgid "Separate multiple proxies with commas." +msgstr "Nytt komma til å skilja mellomtenarar frå kvarandre." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:374 +msgid "" +"Type in the I2P destination of the service that this client tunnel should " +"connect to." +msgstr "Skriv inn I2P-målet til tenesten som denne klienttunellen skal kopla til." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:376 +msgid "" +"This could be the full base 64 destination key, or an I2P URL from your " +"address book." +msgstr "Dette kan vera den fulle målnøkkelen i base 64, eller ein I2P-URL frå adresseboka di." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:409 +msgid "" +"This is the IP that your service is running on, this is usually on the same " +"machine so 127.0.0.1 is autofilled." +msgstr "Dette er IP-adressa som tenesta di køyrer på. Dette er vanlegvis den same maskinen, så 127.0.0.1 er fylt inn på førehand." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:432 +msgid "This is the port that the service is accepting connections on." +msgstr "Dette er porten som tenesta tek i mot tilkoplingar på." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:453 +msgid "This is the port that the client tunnel will be accessed from locally." +msgstr "Dette er porten som du koplar til klienttunellen lokalt med." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:455 +msgid "This is also the client port for the HTTPBidir server tunnel." +msgstr "Dette er òg klientporten for HTTPBidir-tenartunellen." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:474 +msgid "" +"How do you want this tunnel to be accessed? By just this machine, your " +"entire subnet, or external internet?" +msgstr "Kor vil du tillata at denne tunellen skal få tilgang frå? Berre denne maskinen, heile subnettet ditt, eller eksternt frå internett?" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:476 +msgid "You will most likely want to just allow 127.0.0.1" +msgstr "Du vil sannsynlegvis berre tillata 127.0.0.1" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:518 +msgid "" +"The I2P router can automatically start this tunnel for you when the router " +"is started." +msgstr "I2P-ruteren kan automatisk starta denne tunellen for deg når ruteren startar." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:520 +msgid "" +"This can be useful for frequently-used tunnels (especially server tunnels), " +"but for tunnels that are only used occassionally it would mean that the I2P " +"router is creating and maintaining unnecessary tunnels." +msgstr "Dette kan vera nyttig for tunellar du nyttar ofte (spesielt tenartunellar). For tunellar som berre blir nytta av og til vil det tyda at I2P-ruteren opprettar og vedlikehaldar tunellar du ikkje treng." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:546 +msgid "The wizard has now collected enough information to create your tunnel." +msgstr "Vegvisaren har no samla inn nok informasjon for å oppretta tunellen din." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:548 +msgid "" +"Upon clicking the Save button below, the wizard will set up the tunnel, and " +"take you back to the main I2PTunnel page." +msgstr "Når du klikkar Lagra under vil vegvisaren oppretta tunellen og senda deg tilbake til hovudsida for I2P-tunellar." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:553 +msgid "" +"Because you chose to automatically start the tunnel when the router starts, " +"you don't have to do anything further." +msgstr "Sidan du valte å starta tunellen automatisk når ruteren startar treng du ikkje gjera noko meir." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:555 +msgid "The router will start the tunnel once it has been set up." +msgstr "Ruteren vil starta tunellen ved oppstart." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:559 +msgid "" +"Because you chose not to automatically start the tunnel, you will have to " +"manually start it." +msgstr "Fordi du valte å ikkje starta tunellen automatisk må du starta han for hand." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:561 +msgid "" +"You can do this by clicking the Start button on the main page which " +"corresponds to the new tunnel." +msgstr "Du kan gjera dette ved å klikka Start-knappen på hovudsida som samsvarer med den nye tunellen." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:565 +msgid "Below is a summary of the options you chose:" +msgstr "Nedanfor er ei oppsummering av vala dine:" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:663 +msgid "" +"Alongside these basic settings, there are a number of advanced options for " +"tunnel configuration." +msgstr "I tillegg til desse grunnleggande innstillingane finst ei rekkje avanserte val for tunellkonfigurasjon." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:665 +msgid "" +"The wizard will set reasonably sensible default values for these, but you " +"can view and/or edit these by clicking on the tunnel's name in the main " +"I2PTunnel page." +msgstr "Vegvisaren vil velja fornuftige standardverdiar for desse, men du kan visa og/eller redigera desse ved å klikka på tunellnamnet i hovudsida for I2P-tunnellar." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:707 +msgid "Previous" +msgstr "Førre" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:715 +msgid "Save Tunnel" +msgstr "Lagra tunell" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:721 +msgid "Finish" +msgstr "Avslutt" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:727 +msgid "Next" +msgstr "Neste" diff --git a/apps/i2ptunnel/locale/messages_ro.po b/apps/i2ptunnel/locale/messages_ro.po new file mode 100644 index 000000000..32dad11e8 --- /dev/null +++ b/apps/i2ptunnel/locale/messages_ro.po @@ -0,0 +1,1180 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the i2ptunnel package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-06 18:27+0000\n" +"PO-Revision-Date: 2014-02-06 18:45+0000\n" +"Last-Translator: kytv \n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/I2P/language/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:363 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:373 +msgid "internal" +msgstr "Intern" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:449 +#, java-format +msgid "{0} inbound, {0} outbound tunnel" +msgid_plural "{0} inbound, {0} outbound tunnels" +msgstr[0] "{0} de intrare, {0} tuneluri de ieșire " +msgstr[1] "{0} de intrare, {0} tuneluri de ieșire" +msgstr[2] "{0} de intrare, {0} tuneluri de ieșire" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:453 +msgid "lower bandwidth and reliability" +msgstr "lățime de bandă și fiabilitate joasa" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:455 +msgid "standard bandwidth and reliability" +msgstr "lățime de bandă și fiabilitate standarda," + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:457 +msgid "higher bandwidth and reliability" +msgstr "lățime de bandă și fiabilitate inalta," + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:123 +msgid "Tunnels are not initialized yet, please reload in two minutes." +msgstr "Tuneluri încă nu sunt inițializate , vă rugăm să reîncărcați în două minute." + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:196 +msgid "" +"Invalid form submission, probably because you used the 'back' or 'reload' " +"button on your browser. Please resubmit." +msgstr "Transmiterea formularului invalid, probabil pentru că ați folosit butonul \"reload\" sau \"inapoi\" din browser-ul dumneavoastră. Vă rugăm retrimiteți." + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:198 +msgid "" +"If the problem persists, verify that you have cookies enabled in your " +"browser." +msgstr "Dacă problema persistă, verificați dacă aveți activate cookie-urile în browser-ul dumneavoastră." + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:244 +msgid "Configuration reloaded for all tunnels" +msgstr "Configurare reîncărcata pentru toate tunelurile" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:257 +msgid "Starting tunnel" +msgstr "Pornirea tunelului" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:270 +msgid "Stopping tunnel" +msgstr "Oprirea tunelului" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:336 +msgid "Configuration changes saved" +msgstr "Schimbarea configuraţiei salvat" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:339 +msgid "Failed to save configuration" +msgstr "Eșec la salvarea configurației" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461 +msgid "New Tunnel" +msgstr "Tunel nou" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:484 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:494 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:611 +msgid "Port not set" +msgstr "Portul nu este setat" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:487 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:613 +msgid "Invalid port" +msgstr "Port incorect" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:490 +msgid "Warning - ports less than 1024 are not recommended" +msgstr "Atenție - nu sunt recomandate porturi mai mici de 1024" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:506 +msgid "Standard client" +msgstr "Client standart" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:507 +msgid "HTTP/HTTPS client" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:508 +msgid "IRC client" +msgstr "Client IRC" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:509 +msgid "Standard server" +msgstr "Server standard" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:510 +msgid "HTTP server" +msgstr "Server HTTP" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:511 +msgid "SOCKS 4/4a/5 proxy" +msgstr "SOCKS 4/4a/5 proxy" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:512 +msgid "SOCKS IRC proxy" +msgstr "SOCKS IRC proxy" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:513 +msgid "CONNECT/SSL/HTTPS proxy" +msgstr "CONNECTEAZA/SSL/HTTPS proxy" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:514 +msgid "IRC server" +msgstr "Server IRC" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:515 +msgid "Streamr client" +msgstr "Client Streamr" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:516 +msgid "Streamr server" +msgstr "Server streamr" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +msgid "HTTP bidir" +msgstr "HTTP bidir" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313 +msgid "Host not set" +msgstr "Gazdă nu este setata" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:607 +msgid "Invalid address" +msgstr "Adresă nevalidă" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:82 +msgid "I2P Tunnel Manager - Edit Client Tunnel" +msgstr "I2P Tunnel manager - Editare Client Tunnel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:110 +msgid "Edit proxy settings" +msgstr "Editați setările proxy" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:118 +msgid "New proxy settings" +msgstr "Opțiuni proxy noi" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:129 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:129 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:126 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:140 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:271 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326 +msgid "Name" +msgstr "Nume" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 +msgid "Type" +msgstr "Tip" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:422 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:330 +msgid "Description" +msgstr "Descriere" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +msgid "Target" +msgstr "Destinație" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:147 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:149 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:186 +msgid "Access Point" +msgstr "Punct de acces" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:154 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:170 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:191 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:236 +msgid "required" +msgstr "necesar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:482 +msgid "Reachable by" +msgstr "accesibil cu" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:196 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:358 +msgid "Outproxies" +msgstr "Outproxy" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:203 +msgid "SSL Outproxies" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:209 +msgid "Use Outproxy Plugin" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:259 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526 +msgid "(Check the Box for 'YES')" +msgstr "(Bifați căsuța pentru \"DA\")" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:378 +msgid "Tunnel Destination" +msgstr "destinație tunel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:382 +msgid "name, name:port, or destination" +msgstr "nume, nume: port, sau destinație" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:233 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:386 +msgid "b32 not recommended" +msgstr "B32 nu este recomandat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +msgid "Shared Client" +msgstr "client comun" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +msgid "" +"(Share tunnels with other clients and irc/httpclients? Change requires " +"restart of client proxy)" +msgstr "(Cota de tuneluri cu alți clienți și irc / httpclients? Schimbarea necesită repornirea de proxy client)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:141 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:522 +msgid "Auto Start" +msgstr "Start automat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:255 +msgid "Enable DCC" +msgstr "Activează DCC" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:263 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 +msgid "Advanced networking options" +msgstr "Opțiuni avansate de rețea" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:265 +msgid "" +"(NOTE: when this client proxy is configured to share tunnels, then these " +"options are for all the shared proxy clients!)" +msgstr "(NOTĂ: când acest proxy client este configurat pentru a partaja tuneluri, atunci aceste opțiuni sunt pentru toti clientii proxy comune!)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:267 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:268 +msgid "Tunnel Options" +msgstr "Opțiuni tunel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:269 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:270 +msgid "Length" +msgstr "Durată" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277 +msgid "0 hop tunnel (no anonymity)" +msgstr "0 tunel hop (fara anonimat)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281 +msgid "1 hop tunnel (low anonymity)" +msgstr "1 tunel hop (anonimat mic)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:285 +msgid "2 hop tunnel (medium anonymity)" +msgstr "2 tunel hop (anonimat mediu)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:288 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:289 +msgid "3 hop tunnel (high anonymity)" +msgstr "3 tunel hop (anonimat maxim)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:297 +msgid "hop tunnel (very poor performance)" +msgstr "tunel hop (performanță foarte slabă)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302 +msgid "Variance" +msgstr "Varianță" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:309 +msgid "0 hop variance (no randomisation, consistant performance)" +msgstr "variație 0 hop (fără randomizare, performanță consistenta)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:313 +msgid "" +"+ 0-1 hop variance (medium additive randomisation, subtractive performance)" +msgstr "+ 0-1 hop variație (randomizare aditiv mediu, performanță substractiva)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:317 +msgid "" +"+ 0-2 hop variance (high additive randomisation, subtractive performance)" +msgstr "+ 0-2 hop variație (randomizare ridicat aditiva, performanță substractiva)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:321 +msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" +msgstr "+ / - 0-1 hop varianța (randomizare standarda, performanță Standard)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:325 +msgid "+/- 0-2 hop variance (not recommended)" +msgstr "+ / - 0-2 hop variație (nu se recomandă)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:336 +msgid "hop variance" +msgstr "hop variație" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:341 +msgid "Count" +msgstr "Număr" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:345 +msgid "Backup Count" +msgstr "Numar de rezervă" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:352 +msgid "0 backup tunnels (0 redundancy, no added resource usage)" +msgstr "0 tuneluri de rezerva (0 redundanță, utilizarea resurselor nu e adăugata)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 +msgid "1 backup tunnel each direction (low redundancy, low resource usage)" +msgstr "1 tunel de rezervă pentru fiecare direcție (redundanță scăzuta, utilizarea redusă a resurselor)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 +msgid "" +"2 backup tunnels each direction (medium redundancy, medium resource usage)" +msgstr "2 tunele de rezervă pentru fiecare direcție (redundanță maxima, utilizarea maxima a resurselor)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +msgid "3 backup tunnels each direction (high redundancy, high resource usage)" +msgstr "3 tunel de rezervă pentru fiecare direcție (redundanță maxima, utilizarea maxima a resurselor)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:372 +msgid "backup tunnels" +msgstr "tuneluri de rezervă" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379 +msgid "Profile" +msgstr "Profil" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:386 +msgid "interactive connection" +msgstr "conexiune interactiva" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:390 +msgid "bulk connection (downloads/websites/BT)" +msgstr "conexiune în vrac (download-uri / site-uri / BT)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391 +msgid "Delay Connect" +msgstr "întârziere Connectarii" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:395 +msgid "for request/response connections" +msgstr "pentru conexiuni de cerere/răspuns" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:394 +msgid "Router I2CP Address" +msgstr "Router I2CP Adresa" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:413 +msgid "Host" +msgstr "Gazdă" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:165 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:404 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:273 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:434 +msgid "Port" +msgstr "Port" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:502 +msgid "Reduce tunnel quantity when idle" +msgstr "Reducerea cantitatii tunelilor atunci când este inactiva" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:455 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:465 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:493 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:503 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504 +msgid "Enable" +msgstr "Activează" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:508 +msgid "Reduced tunnel count" +msgstr "Scăderea numărului de tunelu" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:512 +msgid "Idle minutes" +msgstr "minute inactive" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:433 +msgid "Close tunnels when idle" +msgstr "Inchiderea tunelurilor când e inactiv" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:439 +msgid "New Keys on Reopen" +msgstr "Tastele noi la fiecare redeschidere" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:447 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430 +msgid "Disable" +msgstr "Deactivare" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:453 +msgid "Delay tunnel open until required" +msgstr "Întârziere tunelului deschis până este necesar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463 +msgid "Persistent private key" +msgstr "Cheie privată persistenta" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:469 +msgid "File" +msgstr "Fișier" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 +msgid "Local destination" +msgstr "Destinația locala" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482 +msgid "Local Base 32" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:491 +msgid "Local Authorization" +msgstr "Autorizare locala" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:507 +msgid "Username" +msgstr "Numele utilizatorului" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:499 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:511 +msgid "Password" +msgstr "Parolă" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:501 +msgid "Outproxy Authorization" +msgstr "Outproxy Autorizare" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +msgid "Jump URL List" +msgstr "Sari la Lista de URL" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:548 +msgid "Custom options" +msgstr "Opțiuni personalizate" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:702 +msgid "Cancel" +msgstr "Renunță" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:532 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:556 +msgid "Delete" +msgstr "Șterge" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:558 +msgid "Save" +msgstr "Salvează" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:82 +msgid "I2P Tunnel Manager - Edit Server Tunnel" +msgstr "Manager de tunele I2P - Editraza tunel de server" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:110 +msgid "Edit server settings" +msgstr "Editați setările de server" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:118 +msgid "New server settings" +msgstr "Setările de server noi" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:179 +msgid "Use SSL?" +msgstr "Utilizați SSL?" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:222 +msgid "Website name" +msgstr "Numele site-ului" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:226 +msgid "(leave blank for outproxies)" +msgstr "(lăsați gol pentru outproxies)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:231 +msgid "Private key file" +msgstr "Fișier cheie privată" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:253 +msgid "Add to local addressbook" +msgstr "Adauga la agenda locala" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260 +msgid "Hostname Signature" +msgstr "Semnătura hostname" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:412 +msgid "Encrypt Leaseset" +msgstr "Criptarea Leaseset" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:418 +msgid "Encryption Key" +msgstr "Cheie de criptare" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:422 +msgid "Generate New Key" +msgstr "Generează o cheie noua" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424 +msgid "Generate" +msgstr "Generează" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:546 +msgid "(Tunnel must be stopped first)" +msgstr "(Tunnelul mai întâi trebuie să fie oprit )" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:428 +msgid "Restricted Access List" +msgstr "Lista de acces restricționat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:434 +msgid "Whitelist" +msgstr "Listă de excepții" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438 +msgid "Blacklist" +msgstr "Listă de blocare" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442 +msgid "Access List" +msgstr "Lista de acces" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:446 +msgid "Inbound connection limits (0=unlimited)" +msgstr "Limitele de conectare la intrare (0 = nelimitat)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:448 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479 +msgid "Per client" +msgstr "pe client" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450 +msgid "Per minute" +msgstr "pe minut" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454 +msgid "Per hour" +msgstr "pe ora" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:458 +msgid "Per day" +msgstr "pe zi" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:462 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489 +msgid "Total" +msgstr "Total" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:470 +msgid "Max concurrent connections (0=unlimited)" +msgstr "Conexiuni concurente max (0 = nelimitat)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:477 +msgid "POST limits (0=unlimited)" +msgstr "Limitele POST (0 = nelimitat)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 +msgid "Per period" +msgstr "pe perioadă" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 +msgid "Ban minutes" +msgstr "ban minute" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 +msgid "POST limit period (minutes)" +msgstr "Perioada limita POST (minute)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:516 +msgid "New Certificate type" +msgstr "Nou tip de certificat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:518 +msgid "None" +msgstr "Niciunul" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:522 +msgid "Hashcash (effort)" +msgstr "Hashcash (efort)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:528 +msgid "Hashcash Calc Time" +msgstr "Hashcash Calc Timp" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:530 +msgid "Estimate" +msgstr "Estimare" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:532 +msgid "Hidden" +msgstr "Ascuns" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:536 +msgid "Signed (signed by)" +msgstr "Semnat (semnată de)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:542 +msgid "Modify Certificate" +msgstr "Modificare certificat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:544 +msgid "Modify" +msgstr "Modifică" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83 +msgid "I2P Tunnel Manager - List" +msgstr "Managerul tunelului I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:97 +msgid "Status Messages" +msgstr "Mesaje de status" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:101 +msgid "Refresh" +msgstr "Reîmprospătează" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109 +msgid "Tunnel Wizard" +msgstr "Expert tunel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113 +msgid "Stop All" +msgstr "Oprește toate" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:117 +msgid "Start All" +msgstr "Pornește toate" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121 +msgid "Restart All" +msgstr "Repornește toate" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124 +msgid "I2P Server Tunnels" +msgstr "I2P server Tunele" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:128 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:149 +msgid "Points at" +msgstr "Puncte la" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:186 +msgid "Preview" +msgstr "Previzualizare" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:132 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:206 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:320 +msgid "Status" +msgstr "Stare" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 +msgid "Base32 Address" +msgstr "Adresa Base32" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:200 +msgid "No Preview" +msgstr "Nici o previzualizare" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327 +msgid "Starting..." +msgstr "Pornire..." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:362 +msgid "Stop" +msgstr "Stop" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:355 +msgid "Running" +msgstr "În execuţie" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +msgid "Stopped" +msgstr "Oprit" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:376 +msgid "Start" +msgstr "Start" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:263 +msgid "New server tunnel" +msgstr "Tunel de server nou" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:432 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:576 +msgid "Standard" +msgstr "Standard" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:267 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:434 +msgid "Create" +msgstr "Creează" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269 +msgid "I2P Client Tunnels" +msgstr "I2P Tunnel client" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:306 +msgid "Interface" +msgstr "Interfață" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:341 +msgid "Standby" +msgstr "Stare de veghe" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:385 +msgid "Outproxy" +msgstr "Outproxy" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:388 +msgid "Destination" +msgstr "Destinație" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +msgid "internal plugin" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:414 +msgid "none" +msgstr "nici unul" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:430 +msgid "New client tunnel" +msgstr "Tunel client nou" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:119 +msgid "I2P Tunnel Manager - Tunnel Creation Wizard" +msgstr "I2P Tunnel manager - Expert Crearea Tunnel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:567 +msgid "Server or client tunnel?" +msgstr "Server sau tunel client?" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:571 +msgid "Tunnel type" +msgstr "Tipul tunerului" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:151 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:601 +msgid "Tunnel name and description" +msgstr "Numele tunel și descrierea" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:157 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:610 +msgid "Tunnel destination" +msgstr "destinație tunel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:626 +msgid "Binding address and port" +msgstr "Adresa de legare și de port" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:652 +msgid "Tunnel auto-start" +msgstr "Tunel auto-start" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:175 +msgid "Wizard completed" +msgstr "Expertul finalizat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:189 +msgid "" +"This wizard will take you through the various options available for creating" +" tunnels in I2P." +msgstr "Acest asistent vă va lua prin diferite opțiuni disponibile pentru crearea tunelurilor în I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:191 +msgid "" +"The first thing to decide is whether you want to create a server or a client" +" tunnel." +msgstr "Primul lucru este de a decide dacă doriți să creați un server sau un tunel client." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:193 +msgid "" +"If you need to connect to a remote service, such as an IRC server inside I2P" +" or a code repository, then you will require a CLIENT tunnel." +msgstr "Dacă aveți nevoie pentru a vă conecta la un serviciu de la distanță, cum ar fi un server de IRC în interiorul I2P sau un depozit de cod, atunci veți avea nevoie de un tunel CLIENT." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:195 +msgid "" +"On the other hand, if you wish to host a service for others to connect to " +"you'll need to create a SERVER tunnel." +msgstr "Pe de altă parte, dacă doriți să găzduiti un serviciu pentru alții veți avea nevoie pentru a crea un server de tunel." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:197 +msgid "Server Tunnel" +msgstr "Tunnel serverului" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:199 +msgid "Client Tunnel" +msgstr "Tunnel client" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:217 +msgid "There are several types of tunnels to choose from:" +msgstr "Există mai multe tipuri de tuneluri pentru a alege din:" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:225 +msgid "Basic tunnel for connecting to a single service inside I2P." +msgstr "Tunel de bază pentru conectarea la un singur serviciu în interiorul I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:269 +msgid "" +"Try this if none of the tunnel types below fit your requirements, or you " +"don't know what type of tunnel you need." +msgstr "Încercați acest lucru dacă nici unul dintre tipurile de tunel de mai jos se potrivesc cerințelor dumneavoastră, sau nu stiti ce tip de tunel de care aveți nevoie." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:229 +msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P." +msgstr "Tunel care actioneaza ca un proxy HTTP pentru a ajunge la eepsites din interiorul I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:231 +msgid "" +"Set your browser to use this tunnel as an http proxy, or set your " +"\"http_proxy\" environment variable for command-line applications in " +"GNU/Linux." +msgstr "Setati browser-ul pentru a utiliza acest tunel ca un proxy HTTP, sau pentru a seta variabila de mediu \"http_proxy\", pentru aplicații de linie de comandă în GNU / Linux." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:233 +msgid "" +"Websites outside I2P can also be reached if an HTTP proxy within I2P is " +"known." +msgstr "Site-uri din afara I2P poate fi atins în cazul în care un proxy HTTP în I2P este cunoscut." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:235 +msgid "Customised client tunnel specific for IRC connections." +msgstr "Tunel client personalizate specific pentru conexiuni de IRC." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:237 +msgid "" +"With this tunnel type, your IRC client will be able to connect to an IRC " +"network inside I2P." +msgstr "Cu acest tip tunel, clientul tau de IRC va fi capabil să se conecteze la o retea IRC din interiorul I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:239 +msgid "" +"Each IRC network in I2P that you wish to connect to will require its own " +"tunnel. (See Also, SOCKS IRC)" +msgstr "Fiecare rețea de IRC în I2P la care doriți să vă conectați pentru a va necesita propriul tunel. (A se vedea de asemenea, SOCKS IRC)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:241 +msgid "A tunnel that implements the SOCKS protocol." +msgstr "Un tunel care implementează protocolul SOCKS." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:243 +msgid "" +"This enables both TCP and UDP connections to be made through a SOCKS " +"outproxy within I2P." +msgstr "Acest lucru permite conexiunile cit TCP atât si UDP să se facă printr-un SOCKS outproxy în I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:245 +msgid "" +"A client tunnel implementing the SOCKS protocol, which is customised for " +"connecting to IRC networks." +msgstr "Un tunel client de punere în aplicare protocolul SOCKS, care este personalizat pentru conectarea la retele de IRC." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:247 +msgid "" +"With this tunnel type, IRC networks in I2P can be reached by typing the I2P " +"address into your IRC client, and configuring the IRC client to use this " +"SOCKS tunnel." +msgstr "Cu acest tip tunel, retele de IRC din I2P poate ajunge tastând adresa I2P in clientul tau de IRC, și configurarea clientul IRC pentru a utiliza acest tunel SOCKS." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:249 +msgid "" +"This means that only one I2P tunnel is required rather than a separate " +"tunnel per IRC network." +msgstr "Aceasta înseamnă că este necesar doar un tunel I2P mai degrabă decât un tunel separat pentru fiecare rețea IRC." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:251 +msgid "" +"IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P " +"is known, though it depends on whether or not the outproxy has been blocked " +"by the IRC network." +msgstr "Retele IRC din afara I2P pot fi ajunse, de asemenea, în cazul în care SOCKS outproxy în I2P este cunoscut, deși aceasta depinde dacă outproxy a fost blocat sau nu de către rețeaua IRC." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:253 +msgid "A client tunnel that implements the HTTP CONNECT command." +msgstr "Un tunel client care implementează comanda HTTP CONNECT." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:255 +msgid "" +"This enables TCP connections to be made through an HTTP outproxy, assuming " +"the proxy supports the CONNECT command." +msgstr "Acest lucru permite conexiuni TCP pentru a fi efectuate printr-un outproxy HTTP, presupunând proxy acceptă comanda CONNECT." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:257 +msgid "A customised client tunnel for Streamr." +msgstr "Un tunel client personalizat pentru Streamr." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:267 +msgid "A basic server tunnel for hosting a generic service inside I2P." +msgstr "Un tunel de server de bază pentru găzduirea un serviciu generic în interiorul I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:271 +msgid "A server tunnel that is customised for HTTP connections." +msgstr "Un tunel de server, care este personalizat pentru conexiuni HTTP." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:273 +msgid "Use this tunnel type if you want to host an eepsite." +msgstr "Utilizați acest tip tunel, dacă doriți să găzduiti un eepsite." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:275 +msgid "" +"A customised server tunnel that can both serve HTTP data and connect to " +"other server tunnels." +msgstr "Un tunel de server personalizat, care poate servi atât pentru date HTTP cit și pentru conectarea la alte tuneluri de server." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:277 +msgid "This tunnel type is predominantly used when running a Seedless server." +msgstr "Acest tip tunel este folosit în principal atunci când rulează un server de Seedless." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:279 +msgid "A customised server tunnel for hosting IRC networks inside I2P." +msgstr "Un tunel de server personalizat pentru găzduirea retelei de IRC în interiorul I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:281 +msgid "" +"Usually, a separate tunnel needs to be created for each IRC server that is " +"to be accessible inside I2P." +msgstr "De obicei, un tunel separat trebuie să fie creat pentru fiecare server de IRC, care să fie accesibil în interiorul I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:283 +msgid "A customised server tunnel for Streamr." +msgstr "Un tunel server personalizat pentru Streamr." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:322 +msgid "Choose a name and description for your tunnel." +msgstr "Alegeți un nume și o descriere pentru tunelul dumneavoastră." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:324 +msgid "" +"These can be anything you want - they are just for ease of identifying the " +"tunnel in the routerconsole." +msgstr "Acestea pot fi orice vrei - acestea sunt doar pentru a facilita identificarea tunelului în routerconsole." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:354 +msgid "" +"If you know of any outproxies for this type of tunnel (either HTTP or " +"SOCKS), fill them in below." +msgstr "Dacă știți de orice outproxies pentru acest tip de tunel (fie HTTP sau SOCKS), completaile-le mai jos." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:356 +msgid "Separate multiple proxies with commas." +msgstr "Mai multe proxy-uri separate prin virgula." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:374 +msgid "" +"Type in the I2P destination of the service that this client tunnel should " +"connect to." +msgstr "Tapati în destinația I2P a serviciului cu care acest tunel client trebuie să se conecteze." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:376 +msgid "" +"This could be the full base 64 destination key, or an I2P URL from your " +"address book." +msgstr "Acest lucru ar putea fi cheia base64 completa destinație, sau un URL I2P din agenda de adrese." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:409 +msgid "" +"This is the IP that your service is running on, this is usually on the same " +"machine so 127.0.0.1 is autofilled." +msgstr "Acesta este IP la care serviciul se execută, aceasta este, de obicei pe aceeași mașină, astfel 127.0.0.1 este autofilled." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:432 +msgid "This is the port that the service is accepting connections on." +msgstr "Acesta este portul pe care serviciul accepta conexiuni." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:453 +msgid "This is the port that the client tunnel will be accessed from locally." +msgstr "Acesta este portul la care tunelul client va fi accesat de la nivel local." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:455 +msgid "This is also the client port for the HTTPBidir server tunnel." +msgstr "Aceasta este, de asemenea, portul de client pentru tunelul de server HTTPBidir." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:474 +msgid "" +"How do you want this tunnel to be accessed? By just this machine, your " +"entire subnet, or external internet?" +msgstr "Cum vrei ca acest tunel sa fie accesat? Doar de la această mașină, întreaga subrețea, sau internet extern?" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:476 +msgid "You will most likely want to just allow 127.0.0.1" +msgstr "Veți dori, cel mai probabil, pentru a permite doar 127.0.0.1" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:518 +msgid "" +"The I2P router can automatically start this tunnel for you when the router " +"is started." +msgstr "Router-ul I2P poate porni automat acest tunel pentru tine atunci când este pornit router-ul." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:520 +msgid "" +"This can be useful for frequently-used tunnels (especially server tunnels), " +"but for tunnels that are only used occassionally it would mean that the I2P " +"router is creating and maintaining unnecessary tunnels." +msgstr "Acest lucru poate fi util pentru tuneluri utilizate frecvent (mai ales tuneluri server), dar pentru tuneluri care sunt utilizate doar ocazional, aceasta ar însemna că router-ul I2P creaza și menține tuneluri inutile." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:546 +msgid "The wizard has now collected enough information to create your tunnel." +msgstr "Expertul a colectat acum suficiente informații pentru a crea tunel dumneavoastră." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:548 +msgid "" +"Upon clicking the Save button below, the wizard will set up the tunnel, and " +"take you back to the main I2PTunnel page." +msgstr "La clic pe butonul Save de mai jos, expertul va configura tunelul, și te duce înapoi la pagina principală I2PTunnel." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:553 +msgid "" +"Because you chose to automatically start the tunnel when the router starts, " +"you don't have to do anything further." +msgstr "Pentru că ați ales să pornească automat tunel când router-ul începe, nu trebuie să faci nimic mai mult." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:555 +msgid "The router will start the tunnel once it has been set up." +msgstr "Router-ul va începe tunelul după ce a fost creat." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:559 +msgid "" +"Because you chose not to automatically start the tunnel, you will have to " +"manually start it." +msgstr "Pentru că ați ales să nu se pornească automat tunel, va trebui să-l porniți manual." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:561 +msgid "" +"You can do this by clicking the Start button on the main page which " +"corresponds to the new tunnel." +msgstr "Puteți face acest lucru făcând clic pe butonul Start de pe pagina principală, care corespunde cu noul tunel." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:565 +msgid "Below is a summary of the options you chose:" +msgstr "Mai jos este un rezumat al opțiunilor alese de tine:" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:663 +msgid "" +"Alongside these basic settings, there are a number of advanced options for " +"tunnel configuration." +msgstr "Alături de aceste setări de bază, există o serie de opțiuni avansate de configurare tunel." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:665 +msgid "" +"The wizard will set reasonably sensible default values for these, but you " +"can view and/or edit these by clicking on the tunnel's name in the main " +"I2PTunnel page." +msgstr "Expertul va stabili valorile implicite rezonabil sensibile pentru acestea, dar puteți vizualiza și/sau edita acestea, făcând clic pe numele tunelului pe pagina principală I2PTunnel." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:707 +msgid "Previous" +msgstr "Precedent" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:715 +msgid "Save Tunnel" +msgstr "Salvare Tunnel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:721 +msgid "Finish" +msgstr "Sfârșit" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:727 +msgid "Next" +msgstr "Următorul" diff --git a/apps/ministreaming/java/bundle-messages.sh b/apps/ministreaming/java/bundle-messages.sh index 82974403c..37d9ae465 100755 --- a/apps/ministreaming/java/bundle-messages.sh +++ b/apps/ministreaming/java/bundle-messages.sh @@ -51,8 +51,8 @@ do find $JPATHS -name *.java -newer $i > $TMPFILE fi - if [ -s build/obj/net/i2p/streaming/messages_$LG.class -a \ - build/obj/net/i2p/streaming/messages_$LG.class -nt $i -a \ + if [ -s build/obj/net/i2p/client/streaming/messages_$LG.class -a \ + build/obj/net/i2p/client/streaming/messages_$LG.class -nt $i -a \ ! -s $TMPFILE ] then continue diff --git a/apps/ministreaming/locale/messages_de.po b/apps/ministreaming/locale/messages_de.po new file mode 100644 index 000000000..324420235 --- /dev/null +++ b/apps/ministreaming/locale/messages_de.po @@ -0,0 +1,91 @@ +# I2P +# Copyright (C) 2014 The I2P Project +# This file is distributed under the same license as the streaming package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# Ettore Atalan , 2014 +# Lars Schimmer , 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-06-23 17:55+0000\n" +"PO-Revision-Date: 2014-06-26 13:15+0000\n" +"Last-Translator: Lars Schimmer \n" +"Language-Team: German (http://www.transifex.com/projects/p/I2P/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:58 +msgid "Message timeout" +msgstr "Nachrichten timeout" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:61 +msgid "Failed delivery to local destination" +msgstr "Konnte nicht zur lokalen Destination zugestellt werden" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:64 +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:97 +msgid "Local router failure" +msgstr "Fehler im lokalen Router" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:67 +msgid "Local network failure" +msgstr "Fehler im lokalen Netzwerk" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:70 +msgid "Session closed" +msgstr "Sitzung geschlossen" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:73 +msgid "Invalid message" +msgstr "Ungültige Nachricht" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:76 +msgid "Invalid message options" +msgstr "Ungültige Nachrichtenoptionen" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:79 +msgid "Buffer overflow" +msgstr "Pufferüberlauf" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:82 +msgid "Message expired" +msgstr "Nachricht nicht mehr gültig" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:85 +msgid "Local lease set invalid" +msgstr "Lokales Leaseset ungültig" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:88 +msgid "No local tunnels" +msgstr "Keine lokalen Tunnel" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:91 +msgid "Unsupported encryption options" +msgstr "Nicht unterstützte Verschlüsselungsoptionen" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:94 +msgid "Invalid destination" +msgstr "Ungültiges Ziel" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:100 +msgid "Destination lease set expired" +msgstr "Leaseset der Destination abgelaufen" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:103 +msgid "Destination lease set not found" +msgstr "Destinations Leaseset nicht gefunden" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:106 +msgid "Local destination shutdown" +msgstr "Lokale Destination geschlossen" + +#. Translate this one here, can't do it later +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:113 +msgid "Failure code" +msgstr "Fehlercode" diff --git a/apps/ministreaming/locale/messages_es.po b/apps/ministreaming/locale/messages_es.po new file mode 100644 index 000000000..a8538e166 --- /dev/null +++ b/apps/ministreaming/locale/messages_es.po @@ -0,0 +1,90 @@ +# I2P +# Copyright (C) 2014 The I2P Project +# This file is distributed under the same license as the streaming package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# strel, 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-06-23 17:55+0000\n" +"PO-Revision-Date: 2014-06-25 04:23+0000\n" +"Last-Translator: strel\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/I2P/language/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:58 +msgid "Message timeout" +msgstr "Tiempo hasta la expiración del mensaje" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:61 +msgid "Failed delivery to local destination" +msgstr "Fallo en la entrega al destino local" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:64 +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:97 +msgid "Local router failure" +msgstr "Fallo del router local" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:67 +msgid "Local network failure" +msgstr "Fallo de la red local" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:70 +msgid "Session closed" +msgstr "Sesión cerrada" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:73 +msgid "Invalid message" +msgstr "Mensaje no válido" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:76 +msgid "Invalid message options" +msgstr "Opciones de mensaje no válido" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:79 +msgid "Buffer overflow" +msgstr "Desbordamiento de memoria intermedia (buffer)" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:82 +msgid "Message expired" +msgstr "El mensaje expiró" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:85 +msgid "Local lease set invalid" +msgstr "El lease set (túneles al mismo destino) local no es válido" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:88 +msgid "No local tunnels" +msgstr "No hay túneles locales" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:91 +msgid "Unsupported encryption options" +msgstr "Opciones de cifrado no soportadas" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:94 +msgid "Invalid destination" +msgstr "Destino no válido" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:100 +msgid "Destination lease set expired" +msgstr "El lease set (túneles al mismo destino) del destino expiró" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:103 +msgid "Destination lease set not found" +msgstr "No se encontró el lease set (túneles al mismo destino) del destino" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:106 +msgid "Local destination shutdown" +msgstr "Cierre del destino local" + +#. Translate this one here, can't do it later +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:113 +msgid "Failure code" +msgstr "Código de fallo" diff --git a/apps/ministreaming/locale/messages_fr.po b/apps/ministreaming/locale/messages_fr.po new file mode 100644 index 000000000..6b692393e --- /dev/null +++ b/apps/ministreaming/locale/messages_fr.po @@ -0,0 +1,90 @@ +# I2P +# Copyright (C) 2014 The I2P Project +# This file is distributed under the same license as the streaming package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# Towinet, 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-06-23 17:55+0000\n" +"PO-Revision-Date: 2014-06-26 19:02+0000\n" +"Last-Translator: Towinet\n" +"Language-Team: French (http://www.transifex.com/projects/p/I2P/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:58 +msgid "Message timeout" +msgstr "Échéance de message" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:61 +msgid "Failed delivery to local destination" +msgstr "Échec de livraison vers la destination locale" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:64 +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:97 +msgid "Local router failure" +msgstr "Échec de routeur local" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:67 +msgid "Local network failure" +msgstr "Échec de réseau local" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:70 +msgid "Session closed" +msgstr "Session fermée" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:73 +msgid "Invalid message" +msgstr "Message invalide" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:76 +msgid "Invalid message options" +msgstr "Options de message invalide" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:79 +msgid "Buffer overflow" +msgstr "Débordement de buffer" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:82 +msgid "Message expired" +msgstr "Message expiré" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:85 +msgid "Local lease set invalid" +msgstr "Jeu de bail local invalide" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:88 +msgid "No local tunnels" +msgstr "Pas de tunnels locaux" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:91 +msgid "Unsupported encryption options" +msgstr "Options de chiffrement non supportées" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:94 +msgid "Invalid destination" +msgstr "Destination invalide" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:100 +msgid "Destination lease set expired" +msgstr "Jeu de bail de la destination expiré" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:103 +msgid "Destination lease set not found" +msgstr "Jeu de bail de la destination non trouvé" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:106 +msgid "Local destination shutdown" +msgstr "Arrêt de la destination locale" + +#. Translate this one here, can't do it later +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:113 +msgid "Failure code" +msgstr "Code d'échec" diff --git a/apps/ministreaming/locale/messages_it.po b/apps/ministreaming/locale/messages_it.po new file mode 100644 index 000000000..c5a805e2c --- /dev/null +++ b/apps/ministreaming/locale/messages_it.po @@ -0,0 +1,90 @@ +# I2P +# Copyright (C) 2014 The I2P Project +# This file is distributed under the same license as the streaming package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# alamir , 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-06-23 17:55+0000\n" +"PO-Revision-Date: 2014-06-24 22:56+0000\n" +"Last-Translator: alamir \n" +"Language-Team: Italian (http://www.transifex.com/projects/p/I2P/language/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:58 +msgid "Message timeout" +msgstr "Timeout del messaggio" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:61 +msgid "Failed delivery to local destination" +msgstr "Spedizione fallita alla destinazione locale" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:64 +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:97 +msgid "Local router failure" +msgstr "Errore del router locale" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:67 +msgid "Local network failure" +msgstr "Errore della rete locale" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:70 +msgid "Session closed" +msgstr "Sessione chiusa" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:73 +msgid "Invalid message" +msgstr "Messaggio non valido" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:76 +msgid "Invalid message options" +msgstr "Opzioni del messaggio non valide" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:79 +msgid "Buffer overflow" +msgstr "Errore di buffer overflow" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:82 +msgid "Message expired" +msgstr "Messaggio scaduto" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:85 +msgid "Local lease set invalid" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:88 +msgid "No local tunnels" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:91 +msgid "Unsupported encryption options" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:94 +msgid "Invalid destination" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:100 +msgid "Destination lease set expired" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:103 +msgid "Destination lease set not found" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:106 +msgid "Local destination shutdown" +msgstr "" + +#. Translate this one here, can't do it later +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:113 +msgid "Failure code" +msgstr "" diff --git a/apps/ministreaming/locale/messages_nb.po b/apps/ministreaming/locale/messages_nb.po new file mode 100644 index 000000000..115fefc8b --- /dev/null +++ b/apps/ministreaming/locale/messages_nb.po @@ -0,0 +1,90 @@ +# I2P +# Copyright (C) 2014 The I2P Project +# This file is distributed under the same license as the streaming package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# Allan Nordhøy , 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-06-23 17:55+0000\n" +"PO-Revision-Date: 2014-06-24 23:11+0000\n" +"Last-Translator: Allan Nordhøy \n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/I2P/language/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:58 +msgid "Message timeout" +msgstr "Meldingsfrist utløp" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:61 +msgid "Failed delivery to local destination" +msgstr "Kunne ikke levere til lokal plassering" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:64 +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:97 +msgid "Local router failure" +msgstr "Lokal rutings-feil" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:67 +msgid "Local network failure" +msgstr "Lokal nettverks-feil" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:70 +msgid "Session closed" +msgstr "Økt lukket" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:73 +msgid "Invalid message" +msgstr "Ugyldig melding" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:76 +msgid "Invalid message options" +msgstr "Ugyldige meldingsvalg" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:79 +msgid "Buffer overflow" +msgstr "Mellomlager gikk fullt" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:82 +msgid "Message expired" +msgstr "Melding utløp" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:85 +msgid "Local lease set invalid" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:88 +msgid "No local tunnels" +msgstr "Ingen lokale tunneler tilgjengelig" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:91 +msgid "Unsupported encryption options" +msgstr "Ustøttede krypteringsvalg" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:94 +msgid "Invalid destination" +msgstr "Ugyldig destinasjon" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:100 +msgid "Destination lease set expired" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:103 +msgid "Destination lease set not found" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:106 +msgid "Local destination shutdown" +msgstr "Nedstengning av lokal destinasjon" + +#. Translate this one here, can't do it later +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:113 +msgid "Failure code" +msgstr "Feilkode" diff --git a/apps/ministreaming/locale/messages_ru.po b/apps/ministreaming/locale/messages_ru.po new file mode 100644 index 000000000..740bc9d3c --- /dev/null +++ b/apps/ministreaming/locale/messages_ru.po @@ -0,0 +1,91 @@ +# I2P +# Copyright (C) 2014 The I2P Project +# This file is distributed under the same license as the streaming package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# yume, 2014 +# Тимофей , 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-06-23 17:55+0000\n" +"PO-Revision-Date: 2014-06-26 19:53+0000\n" +"Last-Translator: yume\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/language/ru_RU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru_RU\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:58 +msgid "Message timeout" +msgstr "Время ожидания для сообщения истекло" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:61 +msgid "Failed delivery to local destination" +msgstr "Ошибка доставки до локального адресата" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:64 +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:97 +msgid "Local router failure" +msgstr "Ошибка локального маршрутизатора" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:67 +msgid "Local network failure" +msgstr "Локальная ошибка сети" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:70 +msgid "Session closed" +msgstr "Сессия завершена" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:73 +msgid "Invalid message" +msgstr "Неправильное сообщение" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:76 +msgid "Invalid message options" +msgstr "Неправильные параметры сообщения" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:79 +msgid "Buffer overflow" +msgstr "Переполнение буфера" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:82 +msgid "Message expired" +msgstr "Истек срок действия сообщения" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:85 +msgid "Local lease set invalid" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:88 +msgid "No local tunnels" +msgstr "Нет локальных туннелей" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:91 +msgid "Unsupported encryption options" +msgstr "Не поддерживаемые настройки шифрования" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:94 +msgid "Invalid destination" +msgstr "Недопустимый адрес назначения" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:100 +msgid "Destination lease set expired" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:103 +msgid "Destination lease set not found" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:106 +msgid "Local destination shutdown" +msgstr "Адрес локального отправителя отключен" + +#. Translate this one here, can't do it later +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:113 +msgid "Failure code" +msgstr "Код ошибки" diff --git a/apps/ministreaming/locale/messages_uk.po b/apps/ministreaming/locale/messages_uk.po new file mode 100644 index 000000000..e76654fdc --- /dev/null +++ b/apps/ministreaming/locale/messages_uk.po @@ -0,0 +1,90 @@ +# I2P +# Copyright (C) 2014 The I2P Project +# This file is distributed under the same license as the streaming package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# puxud , 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-06-23 17:55+0000\n" +"PO-Revision-Date: 2014-08-07 13:56+0000\n" +"Last-Translator: puxud \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:58 +msgid "Message timeout" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:61 +msgid "Failed delivery to local destination" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:64 +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:97 +msgid "Local router failure" +msgstr "Крах локального роутеру" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:67 +msgid "Local network failure" +msgstr "Крах локальної мережі" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:70 +msgid "Session closed" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:73 +msgid "Invalid message" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:76 +msgid "Invalid message options" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:79 +msgid "Buffer overflow" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:82 +msgid "Message expired" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:85 +msgid "Local lease set invalid" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:88 +msgid "No local tunnels" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:91 +msgid "Unsupported encryption options" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:94 +msgid "Invalid destination" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:100 +msgid "Destination lease set expired" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:103 +msgid "Destination lease set not found" +msgstr "" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:106 +msgid "Local destination shutdown" +msgstr "" + +#. Translate this one here, can't do it later +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:113 +msgid "Failure code" +msgstr "" diff --git a/apps/ministreaming/locale/messages_zh.po b/apps/ministreaming/locale/messages_zh.po new file mode 100644 index 000000000..e55b602a7 --- /dev/null +++ b/apps/ministreaming/locale/messages_zh.po @@ -0,0 +1,90 @@ +# I2P +# Copyright (C) 2014 The I2P Project +# This file is distributed under the same license as the streaming package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# +# Translators: +# YF , 2014 +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-06-23 17:55+0000\n" +"PO-Revision-Date: 2014-06-24 22:23+0000\n" +"Last-Translator: YF \n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/I2P/language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:58 +msgid "Message timeout" +msgstr "消息超时" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:61 +msgid "Failed delivery to local destination" +msgstr "传送到本地目标失败" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:64 +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:97 +msgid "Local router failure" +msgstr "本地路由故障" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:67 +msgid "Local network failure" +msgstr "本地网络故障" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:70 +msgid "Session closed" +msgstr "会话已关闭" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:73 +msgid "Invalid message" +msgstr "无效消息" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:76 +msgid "Invalid message options" +msgstr "无效消息选项" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:79 +msgid "Buffer overflow" +msgstr "缓冲区溢出" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:82 +msgid "Message expired" +msgstr "消息已过期" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:85 +msgid "Local lease set invalid" +msgstr "本地租赁无效" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:88 +msgid "No local tunnels" +msgstr "没有本地隧道" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:91 +msgid "Unsupported encryption options" +msgstr "不支持的加密选项" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:94 +msgid "Invalid destination" +msgstr "无效目标" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:100 +msgid "Destination lease set expired" +msgstr "目标租赁已过期" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:103 +msgid "Destination lease set not found" +msgstr "找不到目标租赁" + +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:106 +msgid "Local destination shutdown" +msgstr "本地目标关机" + +#. Translate this one here, can't do it later +#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:113 +msgid "Failure code" +msgstr "失败代码" diff --git a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java index 64304bd3b..f327f739d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java @@ -43,7 +43,9 @@ class PluginUpdateHandler implements Checker, Updater { Properties props = PluginStarter.pluginProperties(_context, appName); String oldVersion = props.getProperty("version"); - String xpi2pURL = props.getProperty("updateURL"); + String xpi2pURL = props.getProperty("updateURL.su3"); + if (xpi2pURL == null) + xpi2pURL = props.getProperty("updateURL"); List updateSources = null; if (xpi2pURL != null) { try { diff --git a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java index 580948fc0..65e9f5584 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java @@ -1,6 +1,7 @@ package net.i2p.router.update; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.lang.IllegalArgumentException; import java.net.URI; @@ -9,6 +10,7 @@ import java.util.Map; import java.util.Properties; import net.i2p.CoreVersion; +import net.i2p.crypto.SU3File; import net.i2p.crypto.TrustedUpdate; import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; @@ -121,7 +123,6 @@ class PluginUpdateRunner extends UpdateRunner { @Override public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) { - boolean update = false; updateStatus("" + _("Plugin downloaded") + ""); File f = new File(_updateFile); File appDir = new SecureDirectory(_context.getConfigDir(), PLUGIN_DIR); @@ -130,7 +131,43 @@ class PluginUpdateRunner extends UpdateRunner { statusDone("" + _("Cannot create plugin directory {0}", appDir.getAbsolutePath()) + ""); return; } + boolean isSU3; + try { + isSU3 = isSU3File(f); + } catch (IOException ioe) { + f.delete(); + statusDone("" + ioe + ""); + return; + } + if (isSU3) + processSU3(f, appDir, url); + else + processSUD(f, appDir, url); + } + /** + * @since 0.9.15 + * @return if SU3 + */ + private static boolean isSU3File(File f) throws IOException { + FileInputStream fis = null; + try { + fis = new FileInputStream(f); + for (int i = 0; i < SU3File.MAGIC.length(); i++) { + if (fis.read() != SU3File.MAGIC.charAt(i)) + return false; + } + return true; + } finally { + if (fis != null) try { fis.close(); } catch (IOException ioe) {} + } + } + + /** + * @since 0.9.15 + * @return success + */ + private void processSUD(File f, File appDir, String url) { TrustedUpdate up = new TrustedUpdate(_context); File to = new File(_context.getTempDir(), "tmp" + _context.random().nextInt() + ZIP); // extract to a zip file whether the sig is good or not, so we can get the properties file @@ -141,27 +178,9 @@ class PluginUpdateRunner extends UpdateRunner { to.delete(); return; } - File tempDir = new File(_context.getTempDir(), "tmp" + _context.random().nextInt() + "-unzip"); - if (!FileUtil.extractZip(to, tempDir, Log.ERROR)) { - f.delete(); - to.delete(); - FileUtil.rmdir(tempDir, false); - statusDone("" + _("Plugin from {0} is corrupt", url) + ""); + Properties props = getPluginConfig(f, to, url); + if (props == null) return; - } - File installProps = new File(tempDir, "plugin.config"); - Properties props = new OrderedProperties(); - try { - DataHelper.loadProps(props, installProps); - } catch (IOException ioe) { - f.delete(); - to.delete(); - FileUtil.rmdir(tempDir, false); - statusDone("" + _("Plugin from {0} does not contain the required configuration file", url) + ""); - return; - } - // we don't need this anymore, we will unzip again - FileUtil.rmdir(tempDir, false); // ok, now we check sigs and deal with a bad sig String pubkey = props.getProperty("key"); @@ -251,7 +270,90 @@ class PluginUpdateRunner extends UpdateRunner { String sudVersion = TrustedUpdate.getVersionString(f); f.delete(); + processFinal(to, appDir, url, props, sudVersion, pubkey, signer); + } + /** + * @since 0.9.15 + */ + private void processSU3(File f, File appDir, String url) { + SU3File su3 = new SU3File(_context, f); + File to = new File(_context.getTempDir(), "tmp" + _context.random().nextInt() + ZIP); + String sudVersion; + String signingKeyName; + try { + su3.verifyAndMigrate(to); + if (su3.getFileType() != SU3File.TYPE_ZIP) + throw new IOException("bad file type"); + if (su3.getContentType() != SU3File.CONTENT_PLUGIN) + throw new IOException("bad content type"); + sudVersion = su3.getVersionString(); + signingKeyName = su3.getSignerString(); + } catch (IOException ioe) { + statusDone("" + ioe + ' ' + _("from {0}", url) + " "); + f.delete(); + to.delete(); + return; + } + Properties props = getPluginConfig(f, to, url); + if (props == null) + return; + String signer = props.getProperty("signer"); + if (signer == null || signer.length() <= 0) { + f.delete(); + to.delete(); + statusDone("" + _("Plugin from {0} contains an invalid key", url) + ""); + return; + } + if (!signer.equals(signingKeyName)) { + f.delete(); + to.delete(); + if (signingKeyName == null) + _log.error("Failed to verify plugin signature, corrupt plugin or bad signature, signed by: " + signer); + else + // shouldn't happen + _log.error("Plugin signer \"" + signer + "\" does not match new signer in plugin.config file \"" + signingKeyName + "\""); + statusDone("" + _("Plugin signature verification of {0} failed", url) + ""); + return; + } + processFinal(to, appDir, url, props, sudVersion, null, signer); + } + + /** + * @since 0.9.15 + * @return null on error + */ + private Properties getPluginConfig(File f, File to, String url) { + File tempDir = new File(_context.getTempDir(), "tmp" + _context.random().nextInt() + "-unzip"); + if (!FileUtil.extractZip(to, tempDir, Log.ERROR)) { + f.delete(); + to.delete(); + FileUtil.rmdir(tempDir, false); + statusDone("" + _("Plugin from {0} is corrupt", url) + ""); + return null; + } + File installProps = new File(tempDir, "plugin.config"); + Properties props = new OrderedProperties(); + try { + DataHelper.loadProps(props, installProps); + } catch (IOException ioe) { + f.delete(); + to.delete(); + statusDone("" + _("Plugin from {0} does not contain the required configuration file", url) + ""); + return null; + } finally { + // we don't need this anymore, we will unzip again + FileUtil.rmdir(tempDir, false); + } + return props; + } + + /** + * @param pubkey null OK for su3 + * @since 0.9.15 + */ + private void processFinal(File to, File appDir, String url, Properties props, String sudVersion, String pubkey, String signer) { + boolean update = false; String appName = props.getProperty("name"); String version = props.getProperty("version"); if (appName == null || version == null || appName.length() <= 0 || version.length() <= 0 || @@ -302,14 +404,13 @@ class PluginUpdateRunner extends UpdateRunner { DataHelper.loadProps(oldProps, oldPropFile); } catch (IOException ioe) { to.delete(); - FileUtil.rmdir(tempDir, false); statusDone("" + _("Installed plugin does not contain the required configuration file", url) + ""); return; } String oldPubkey = oldProps.getProperty("key"); String oldKeyName = oldProps.getProperty("signer"); String oldAppName = oldProps.getProperty("name"); - if ((!pubkey.equals(oldPubkey)) || (!signer.equals(oldKeyName)) || (!appName.equals(oldAppName))) { + if ((pubkey != null && !pubkey.equals(oldPubkey)) || (!signer.equals(oldKeyName)) || (!appName.equals(oldAppName))) { to.delete(); statusDone("" + _("Signature of downloaded plugin does not match installed plugin") + ""); return; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java index 5acdf313b..48343ff19 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java @@ -104,7 +104,12 @@ public class ConfigClientsHandler extends FormHandler { appnum = Integer.parseInt(app); } catch (NumberFormatException nfe) {} if (appnum >= 0) { - deleteClient(appnum); + if (_context.getBooleanProperty(ConfigClientsHelper.PROP_ENABLE_CLIENT_CHANGE) || + isAdvanced()) { + deleteClient(appnum); + } else { + addFormError("Delete client disabled"); + } } else if (pluginsEnabled) { try { PluginStarter.stopPlugin(_context, app); @@ -385,7 +390,9 @@ public class ConfigClientsHandler extends FormHandler { private void updatePlugin(String app) { Properties props = PluginStarter.pluginProperties(_context, app); - String url = props.getProperty("updateURL"); + String url = props.getProperty("updateURL.su3"); + if (url == null) + url = props.getProperty("updateURL"); if (url == null) { addFormError(_("No update URL specified for {0}",app)); return; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java index 843fef737..c9620cb7a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java @@ -141,7 +141,7 @@ public class ConfigClientsHelper extends HelperBase { // show stop button showStop, // show delete button, show start button - !isConsole, showStart); + allowEdit && !isConsole, showStart); } if (allowEdit && "new".equals(_edit)) @@ -248,7 +248,9 @@ public class ConfigClientsHelper extends HelperBase { desc.append("

") .append("").append(_("Website")).append(" "); } - String updateURL = stripHTML(appProps, "updateURL"); + String updateURL = stripHTML(appProps, "updateURL.su3"); + if (updateURL == null) + updateURL = stripHTML(appProps, "updateURL"); if (updateURL != null) { desc.append("
") .append("").append(_("Update link")).append(" "); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java index d3450eb6f..efe9f4f81 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java @@ -298,9 +298,9 @@ public class ConfigNetHelper extends HelperBase { StringBuilder buf = new StringBuilder(256); buf.append("