tor-commits
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
October 2012
- 20 participants
- 1288 discussions
commit 1203ca59ff5a1b50a330a7a05e34fcd7d9456b12
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Oct 25 11:37:02 2012 -0400
Add country names (#6471).
---
.../src/org/torproject/task6471/Countries.java | 284 ++++++++++++++++++++
.../java/src/org/torproject/task6471/Database.java | 21 ++
.../src/org/torproject/task6471/DatabaseImpl.java | 28 ++
.../src/org/torproject/task6471/DatabaseTest.java | 3 +
4 files changed, 336 insertions(+), 0 deletions(-)
diff --git a/task-6471/java/src/org/torproject/task6471/Countries.java b/task-6471/java/src/org/torproject/task6471/Countries.java
new file mode 100644
index 0000000..a70c4bf
--- /dev/null
+++ b/task-6471/java/src/org/torproject/task6471/Countries.java
@@ -0,0 +1,284 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.task6471;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Countries {
+
+ private static Countries instance = new Countries();
+
+ public static Countries getInstance() {
+ return Countries.instance;
+ }
+
+ /* List of arrays of length 2, containing country codes at [0] and
+ * country names at [1], alphabetically ordered by country names. */
+ private List<String[]> knownCountries;
+
+ private Countries() {
+ this.knownCountries = new ArrayList<String[]>();
+ this.knownCountries.add("af;Afghanistan".split(";"));
+ this.knownCountries.add("ax;Aland Islands".split(";"));
+ this.knownCountries.add("al;Albania".split(";"));
+ this.knownCountries.add("dz;Algeria".split(";"));
+ this.knownCountries.add("as;American Samoa".split(";"));
+ this.knownCountries.add("ad;Andorra".split(";"));
+ this.knownCountries.add("ao;Angola".split(";"));
+ this.knownCountries.add("ai;Anguilla".split(";"));
+ this.knownCountries.add("aq;Antarctica".split(";"));
+ this.knownCountries.add("ag;Antigua and Barbuda".split(";"));
+ this.knownCountries.add("ar;Argentina".split(";"));
+ this.knownCountries.add("am;Armenia".split(";"));
+ this.knownCountries.add("aw;Aruba".split(";"));
+ this.knownCountries.add("au;Australia".split(";"));
+ this.knownCountries.add("at;Austria".split(";"));
+ this.knownCountries.add("az;Azerbaijan".split(";"));
+ this.knownCountries.add("bs;Bahamas".split(";"));
+ this.knownCountries.add("bh;Bahrain".split(";"));
+ this.knownCountries.add("bd;Bangladesh".split(";"));
+ this.knownCountries.add("bb;Barbados".split(";"));
+ this.knownCountries.add("by;Belarus".split(";"));
+ this.knownCountries.add("be;Belgium".split(";"));
+ this.knownCountries.add("bz;Belize".split(";"));
+ this.knownCountries.add("bj;Benin".split(";"));
+ this.knownCountries.add("bm;Bermuda".split(";"));
+ this.knownCountries.add("bt;Bhutan".split(";"));
+ this.knownCountries.add("bo;Bolivia".split(";"));
+ this.knownCountries.add("ba;Bosnia and Herzegovina".split(";"));
+ this.knownCountries.add("bw;Botswana".split(";"));
+ this.knownCountries.add("bv;Bouvet Island".split(";"));
+ this.knownCountries.add("br;Brazil".split(";"));
+ this.knownCountries.add("io;British Indian Ocean Territory".
+ split(";"));
+ this.knownCountries.add("bn;Brunei".split(";"));
+ this.knownCountries.add("bg;Bulgaria".split(";"));
+ this.knownCountries.add("bf;Burkina Faso".split(";"));
+ this.knownCountries.add("mm;Burma".split(";"));
+ this.knownCountries.add("bi;Burundi".split(";"));
+ this.knownCountries.add("kh;Cambodia".split(";"));
+ this.knownCountries.add("cm;Cameroon".split(";"));
+ this.knownCountries.add("ca;Canada".split(";"));
+ this.knownCountries.add("cv;Cape Verde".split(";"));
+ this.knownCountries.add("ky;Cayman Islands".split(";"));
+ this.knownCountries.add("cf;Central African Republic".split(";"));
+ this.knownCountries.add("td;Chad".split(";"));
+ this.knownCountries.add("cl;Chile".split(";"));
+ this.knownCountries.add("cn;China".split(";"));
+ this.knownCountries.add("cx;Christmas Island".split(";"));
+ this.knownCountries.add("cc;Cocos (Keeling) Islands".split(";"));
+ this.knownCountries.add("co;Colombia".split(";"));
+ this.knownCountries.add("km;Comoros".split(";"));
+ this.knownCountries.add("cd;Congo, The Democratic Republic of the".
+ split(";"));
+ this.knownCountries.add("cg;Congo".split(";"));
+ this.knownCountries.add("ck;Cook Islands".split(";"));
+ this.knownCountries.add("cr;Costa Rica".split(";"));
+ this.knownCountries.add("ci:Côte d'Ivoire".split(":"));
+ this.knownCountries.add("hr;Croatia".split(";"));
+ this.knownCountries.add("cu;Cuba".split(";"));
+ this.knownCountries.add("cy;Cyprus".split(";"));
+ this.knownCountries.add("cz;Czech Republic".split(";"));
+ this.knownCountries.add("dk;Denmark".split(";"));
+ this.knownCountries.add("dj;Djibouti".split(";"));
+ this.knownCountries.add("dm;Dominica".split(";"));
+ this.knownCountries.add("do;Dominican Republic".split(";"));
+ this.knownCountries.add("ec;Ecuador".split(";"));
+ this.knownCountries.add("eg;Egypt".split(";"));
+ this.knownCountries.add("sv;El Salvador".split(";"));
+ this.knownCountries.add("gq;Equatorial Guinea".split(";"));
+ this.knownCountries.add("er;Eritrea".split(";"));
+ this.knownCountries.add("ee;Estonia".split(";"));
+ this.knownCountries.add("et;Ethiopia".split(";"));
+ this.knownCountries.add("fk;Falkland Islands (Malvinas)".split(";"));
+ this.knownCountries.add("fo;Faroe Islands".split(";"));
+ this.knownCountries.add("fj;Fiji".split(";"));
+ this.knownCountries.add("fi;Finland".split(";"));
+ this.knownCountries.add("fx;France, Metropolitan".split(";"));
+ this.knownCountries.add("fr;France".split(";"));
+ this.knownCountries.add("gf;French Guiana".split(";"));
+ this.knownCountries.add("pf;French Polynesia".split(";"));
+ this.knownCountries.add("tf;French Southern Territories".split(";"));
+ this.knownCountries.add("ga;Gabon".split(";"));
+ this.knownCountries.add("gm;Gambia".split(";"));
+ this.knownCountries.add("ge;Georgia".split(";"));
+ this.knownCountries.add("de;Germany".split(";"));
+ this.knownCountries.add("gh;Ghana".split(";"));
+ this.knownCountries.add("gi;Gibraltar".split(";"));
+ this.knownCountries.add("gr;Greece".split(";"));
+ this.knownCountries.add("gl;Greenland".split(";"));
+ this.knownCountries.add("gd;Grenada".split(";"));
+ this.knownCountries.add("gp;Guadeloupe".split(";"));
+ this.knownCountries.add("gu;Guam".split(";"));
+ this.knownCountries.add("gt;Guatemala".split(";"));
+ this.knownCountries.add("gg;Guernsey".split(";"));
+ this.knownCountries.add("gn;Guinea".split(";"));
+ this.knownCountries.add("gw;Guinea-Bissau".split(";"));
+ this.knownCountries.add("gy;Guyana".split(";"));
+ this.knownCountries.add("ht;Haiti".split(";"));
+ this.knownCountries.add("hm;Heard Island and McDonald Islands".
+ split(";"));
+ this.knownCountries.add("va;Vatican City".split(";"));
+ this.knownCountries.add("hn;Honduras".split(";"));
+ this.knownCountries.add("hk;Hong Kong".split(";"));
+ this.knownCountries.add("hu;Hungary".split(";"));
+ this.knownCountries.add("is;Iceland".split(";"));
+ this.knownCountries.add("in;India".split(";"));
+ this.knownCountries.add("id;Indonesia".split(";"));
+ this.knownCountries.add("ir;Iran".split(";"));
+ this.knownCountries.add("iq;Iraq".split(";"));
+ this.knownCountries.add("ie;Ireland".split(";"));
+ this.knownCountries.add("im;Isle of Man".split(";"));
+ this.knownCountries.add("il;Israel".split(";"));
+ this.knownCountries.add("it;Italy".split(";"));
+ this.knownCountries.add("jm;Jamaica".split(";"));
+ this.knownCountries.add("jp;Japan".split(";"));
+ this.knownCountries.add("je;Jersey".split(";"));
+ this.knownCountries.add("jo;Jordan".split(";"));
+ this.knownCountries.add("kz;Kazakhstan".split(";"));
+ this.knownCountries.add("ke;Kenya".split(";"));
+ this.knownCountries.add("ki;Kiribati".split(";"));
+ this.knownCountries.add("kp;North Korea".split(";"));
+ this.knownCountries.add("kr;Korea, Republic of".split(";"));
+ this.knownCountries.add("kw;Kuwait".split(";"));
+ this.knownCountries.add("kg;Kyrgyzstan".split(";"));
+ this.knownCountries.add("la;Laos".split(";"));
+ this.knownCountries.add("lv;Latvia".split(";"));
+ this.knownCountries.add("lb;Lebanon".split(";"));
+ this.knownCountries.add("ls;Lesotho".split(";"));
+ this.knownCountries.add("lr;Liberia".split(";"));
+ this.knownCountries.add("ly;Libya".split(";"));
+ this.knownCountries.add("li;Liechtenstein".split(";"));
+ this.knownCountries.add("lt;Lithuania".split(";"));
+ this.knownCountries.add("lu;Luxembourg".split(";"));
+ this.knownCountries.add("mo;Macau".split(";"));
+ this.knownCountries.add("mk;Macedonia".split(";"));
+ this.knownCountries.add("mg;Madagascar".split(";"));
+ this.knownCountries.add("mw;Malawi".split(";"));
+ this.knownCountries.add("my;Malaysia".split(";"));
+ this.knownCountries.add("mv;Maldives".split(";"));
+ this.knownCountries.add("ml;Mali".split(";"));
+ this.knownCountries.add("mt;Malta".split(";"));
+ this.knownCountries.add("mh;Marshall Islands".split(";"));
+ this.knownCountries.add("mq;Martinique".split(";"));
+ this.knownCountries.add("mr;Mauritania".split(";"));
+ this.knownCountries.add("mu;Mauritius".split(";"));
+ this.knownCountries.add("yt;Mayotte".split(";"));
+ this.knownCountries.add("mx;Mexico".split(";"));
+ this.knownCountries.add("fm;Micronesia, Federated States of".
+ split(";"));
+ this.knownCountries.add("md;Moldova, Republic of".split(";"));
+ this.knownCountries.add("mc;Monaco".split(";"));
+ this.knownCountries.add("mn;Mongolia".split(";"));
+ this.knownCountries.add("me;Montenegro".split(";"));
+ this.knownCountries.add("ms;Montserrat".split(";"));
+ this.knownCountries.add("ma;Morocco".split(";"));
+ this.knownCountries.add("mz;Mozambique".split(";"));
+ this.knownCountries.add("mm;Burma".split(";"));
+ this.knownCountries.add("na;Namibia".split(";"));
+ this.knownCountries.add("nr;Nauru".split(";"));
+ this.knownCountries.add("np;Nepal".split(";"));
+ this.knownCountries.add("an;Netherlands Antilles".split(";"));
+ this.knownCountries.add("nl;Netherlands".split(";"));
+ this.knownCountries.add("nc;New Caledonia".split(";"));
+ this.knownCountries.add("nz;New Zealand".split(";"));
+ this.knownCountries.add("ni;Nicaragua".split(";"));
+ this.knownCountries.add("ne;Niger".split(";"));
+ this.knownCountries.add("ng;Nigeria".split(";"));
+ this.knownCountries.add("nu;Niue".split(";"));
+ this.knownCountries.add("nf;Norfolk Island".split(";"));
+ this.knownCountries.add("mp;Northern Mariana Islands".split(";"));
+ this.knownCountries.add("no;Norway".split(";"));
+ this.knownCountries.add("om;Oman".split(";"));
+ this.knownCountries.add("pk;Pakistan".split(";"));
+ this.knownCountries.add("pw;Palau".split(";"));
+ this.knownCountries.add("ps;Palestinian Territory".split(";"));
+ this.knownCountries.add("pa;Panama".split(";"));
+ this.knownCountries.add("pg;Papua New Guinea".split(";"));
+ this.knownCountries.add("py;Paraguay".split(";"));
+ this.knownCountries.add("pe;Peru".split(";"));
+ this.knownCountries.add("ph;Philippines".split(";"));
+ this.knownCountries.add("pn;Pitcairn Islands".split(";"));
+ this.knownCountries.add("pl;Poland".split(";"));
+ this.knownCountries.add("pt;Portugal".split(";"));
+ this.knownCountries.add("pr;Puerto Rico".split(";"));
+ this.knownCountries.add("qa;Qatar".split(";"));
+ this.knownCountries.add("re;Reunion".split(";"));
+ this.knownCountries.add("ro;Romania".split(";"));
+ this.knownCountries.add("ru;Russia".split(";"));
+ this.knownCountries.add("rw;Rwanda".split(";"));
+ this.knownCountries.add("bl;Saint Bartelemey".split(";"));
+ this.knownCountries.add("sh;Saint Helena".split(";"));
+ this.knownCountries.add("kn;Saint Kitts and Nevis".split(";"));
+ this.knownCountries.add("lc;Saint Lucia".split(";"));
+ this.knownCountries.add("mf;Saint Martin".split(";"));
+ this.knownCountries.add("pm;Saint Pierre and Miquelon".split(";"));
+ this.knownCountries.add("vc;Saint Vincent and the Grenadines".
+ split(";"));
+ this.knownCountries.add("ws;Samoa".split(";"));
+ this.knownCountries.add("sm;San Marino".split(";"));
+ this.knownCountries.add("st:São Tomé and Príncipe".
+ split(":"));
+ this.knownCountries.add("sa;Saudi Arabia".split(";"));
+ this.knownCountries.add("sn;Senegal".split(";"));
+ this.knownCountries.add("rs;Serbia".split(";"));
+ this.knownCountries.add("sc;Seychelles".split(";"));
+ this.knownCountries.add("sl;Sierra Leone".split(";"));
+ this.knownCountries.add("sg;Singapore".split(";"));
+ this.knownCountries.add("sk;Slovakia".split(";"));
+ this.knownCountries.add("si;Slovenia".split(";"));
+ this.knownCountries.add("sb;Solomon Islands".split(";"));
+ this.knownCountries.add("so;Somalia".split(";"));
+ this.knownCountries.add("za;South Africa".split(";"));
+ this.knownCountries.add(("gs;South Georgia and the South Sandwich "
+ + "Islands").split(";"));
+ this.knownCountries.add("es;Spain".split(";"));
+ this.knownCountries.add("lk;Sri Lanka".split(";"));
+ this.knownCountries.add("sd;Sudan".split(";"));
+ this.knownCountries.add("sr;Suriname".split(";"));
+ this.knownCountries.add("sj;Svalbard and Jan Mayen".split(";"));
+ this.knownCountries.add("sz;Swaziland".split(";"));
+ this.knownCountries.add("se;Sweden".split(";"));
+ this.knownCountries.add("ch;Switzerland".split(";"));
+ this.knownCountries.add("sy;Syrian Arab Republic".split(";"));
+ this.knownCountries.add("tw;Taiwan".split(";"));
+ this.knownCountries.add("tj;Tajikistan".split(";"));
+ this.knownCountries.add("tz;Tanzania, United Republic of".split(";"));
+ this.knownCountries.add("th;Thailand".split(";"));
+ this.knownCountries.add("tl;East Timor".split(";"));
+ this.knownCountries.add("tg;Togo".split(";"));
+ this.knownCountries.add("tk;Tokelau".split(";"));
+ this.knownCountries.add("to;Tonga".split(";"));
+ this.knownCountries.add("tt;Trinidad and Tobago".split(";"));
+ this.knownCountries.add("tn;Tunisia".split(";"));
+ this.knownCountries.add("tr;Turkey".split(";"));
+ this.knownCountries.add("tm;Turkmenistan".split(";"));
+ this.knownCountries.add("tc;Turks and Caicos Islands".split(";"));
+ this.knownCountries.add("tv;Tuvalu".split(";"));
+ this.knownCountries.add("ug;Uganda".split(";"));
+ this.knownCountries.add("ua;Ukraine".split(";"));
+ this.knownCountries.add("ae;United Arab Emirates".split(";"));
+ this.knownCountries.add("gb;United Kingdom".split(";"));
+ this.knownCountries.add("um;United States Minor Outlying Islands".
+ split(";"));
+ this.knownCountries.add("us;United States".split(";"));
+ this.knownCountries.add("uy;Uruguay".split(";"));
+ this.knownCountries.add("uz;Uzbekistan".split(";"));
+ this.knownCountries.add("vu;Vanuatu".split(";"));
+ this.knownCountries.add("ve;Venezuela".split(";"));
+ this.knownCountries.add("vn;Vietnam".split(";"));
+ this.knownCountries.add("vg;Virgin Islands, British".split(";"));
+ this.knownCountries.add("vi;Virgin Islands, U.S.".split(";"));
+ this.knownCountries.add("wf;Wallis and Futuna".split(";"));
+ this.knownCountries.add("eh;Western Sahara".split(";"));
+ this.knownCountries.add("ye;Yemen".split(";"));
+ this.knownCountries.add("zm;Zambia".split(";"));
+ this.knownCountries.add("zw;Zimbabwe".split(";"));
+ }
+
+ public List<String[]> getCountryList() {
+ return this.knownCountries;
+ }
+}
+
diff --git a/task-6471/java/src/org/torproject/task6471/Database.java b/task-6471/java/src/org/torproject/task6471/Database.java
index 02fb9a2..62a5e15 100644
--- a/task-6471/java/src/org/torproject/task6471/Database.java
+++ b/task-6471/java/src/org/torproject/task6471/Database.java
@@ -34,4 +34,25 @@ public interface Database {
*/
public String lookupCountryCodeFromIpv4AddressAndDate(String address,
String date);
+
+ /**
+ * Resolve the country code to the corresponding country name.
+ *
+ * @param countryCode Country code to be resolved.
+ * @return Country name.
+ */
+ public String getCountryNameForCountryCode(String countryCode);
+
+ /**
+ * Query the database for the country name assigned to an IPv4 address
+ * and date. This is a convenience method that first looks up the
+ * country code and then resolves it to the country name.
+ *
+ * @param address IPv4 address in dotted-quad notation.
+ * @param date Assignment date in format yyyymmdd.
+ * @return Assigned country name, or null if no assignment could be
+ * found.
+ */
+ public String lookupCountryNameFromIpv4AddressAndDate(String address,
+ String date);
}
diff --git a/task-6471/java/src/org/torproject/task6471/DatabaseImpl.java b/task-6471/java/src/org/torproject/task6471/DatabaseImpl.java
index 0229d10..7fa6f13 100644
--- a/task-6471/java/src/org/torproject/task6471/DatabaseImpl.java
+++ b/task-6471/java/src/org/torproject/task6471/DatabaseImpl.java
@@ -8,6 +8,7 @@ import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.SortedSet;
@@ -272,4 +273,31 @@ public class DatabaseImpl implements Database {
}
return true;
}
+
+ /** Mapping from country codes to country names. */
+ private static SortedMap<String, String> countryNames;
+ static {
+ countryNames = new TreeMap<String, String>();
+ List<String[]> countryList = Countries.getInstance().getCountryList();
+ for (String[] country : countryList) {
+ countryNames.put(country[0], country[1]);
+ }
+ }
+
+ /** Resolve country codes to country names. */
+ public String getCountryNameForCountryCode(String countryCode) {
+ if (countryCode == null) {
+ return null;
+ } else {
+ return countryNames.get(countryCode);
+ }
+ }
+
+ /** Lookup IPv4 address and date and return the country name. */
+ public String lookupCountryNameFromIpv4AddressAndDate(
+ String addressString, String dateString) {
+ return getCountryNameForCountryCode(
+ lookupCountryCodeFromIpv4AddressAndDate(addressString,
+ dateString));
+ }
}
diff --git a/task-6471/java/src/org/torproject/task6471/DatabaseTest.java b/task-6471/java/src/org/torproject/task6471/DatabaseTest.java
index b90ebd0..daba414 100644
--- a/task-6471/java/src/org/torproject/task6471/DatabaseTest.java
+++ b/task-6471/java/src/org/torproject/task6471/DatabaseTest.java
@@ -25,6 +25,9 @@ public class DatabaseTest {
"2.255.255.255", "20220901"));
assertEquals("us", database.lookupCountryCodeFromIpv4AddressAndDate(
"3.0.0.0", "19920901"));
+ assertEquals("United States",
+ database.lookupCountryNameFromIpv4AddressAndDate(
+ "3.0.0.0", "19920901"));
assertEquals("us", database.lookupCountryCodeFromIpv4AddressAndDate(
"3.0.0.0", "20020901"));
assertEquals("us", database.lookupCountryCodeFromIpv4AddressAndDate(
1
0
26 Oct '12
commit 04a718c38e44d0d47223fcffeec8e31a7308d3f8
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Oct 25 12:35:29 2012 -0400
Export test cases to a file (#6471).
---
.../torproject/task6471/DatabaseImporterImpl.java | 5 +
.../task6471/DatabasePerformanceExample.java | 190 ++++++++++++--------
2 files changed, 116 insertions(+), 79 deletions(-)
diff --git a/task-6471/java/src/org/torproject/task6471/DatabaseImporterImpl.java b/task-6471/java/src/org/torproject/task6471/DatabaseImporterImpl.java
index 384b2d0..b562c29 100644
--- a/task-6471/java/src/org/torproject/task6471/DatabaseImporterImpl.java
+++ b/task-6471/java/src/org/torproject/task6471/DatabaseImporterImpl.java
@@ -123,6 +123,11 @@ public class DatabaseImporterImpl extends DatabaseImpl
void addRange(String databaseFileName, String countryCode,
String startAddressString, long addresses) {
+ if (countryCode.length() != 2) {
+ /* Don't import illegal range. */
+ return;
+ }
+
this.rangeImports++;
String databaseDateString =
databaseFileName.substring(databaseFileName.length() - 8);
diff --git a/task-6471/java/src/org/torproject/task6471/DatabasePerformanceExample.java b/task-6471/java/src/org/torproject/task6471/DatabasePerformanceExample.java
index 4338fad..77808c8 100644
--- a/task-6471/java/src/org/torproject/task6471/DatabasePerformanceExample.java
+++ b/task-6471/java/src/org/torproject/task6471/DatabasePerformanceExample.java
@@ -1,104 +1,132 @@
package org.torproject.task6471;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Random;
-import java.util.SortedMap;
import java.util.SortedSet;
import java.util.Stack;
-import java.util.TreeMap;
import java.util.TreeSet;
public class DatabasePerformanceExample {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IOException {
- System.out.print("Generating test cases... ");
- long startMillis = System.currentTimeMillis();
- List<Long> tests = new ArrayList<Long>();
- SortedMap<Long, String> results = new TreeMap<Long, String>();
- Random rnd = new Random(1L);
- int startDate = DatabaseImpl.convertDateStringToNumber("20071001");
- int endDate = DatabaseImpl.convertDateStringToNumber("20120930");
- /* Skipping Dec 1--3, 2009, because the first available database from
- * December 2009 was published on the 4th, and generating test cases
- * was just too confusing when taking that into account. */
- List<Integer> skipDates = new ArrayList<Integer>();
- skipDates.add(DatabaseImpl.convertDateStringToNumber("20091201"));
- skipDates.add(DatabaseImpl.convertDateStringToNumber("20091202"));
- skipDates.add(DatabaseImpl.convertDateStringToNumber("20091203"));
- for (int i = 0; i < 100000; i++) {
- long testAddress = rnd.nextLong() & ((1L << 32) - 1L);
- int testDate = startDate + rnd.nextInt(endDate - startDate);
- if (skipDates.contains(testDate)) {
- i--;
- } else {
- tests.add((testAddress << 16) + testDate);
+ File testCasesCsvFile = new File("test-cases.csv");
+ if (!testCasesCsvFile.exists()) {
+ System.out.print("Generating test cases... ");
+ long startMillis = System.currentTimeMillis();
+ List<Long> tests = new ArrayList<Long>();
+ Random rnd = new Random(1L);
+ int startDate = DatabaseImpl.convertDateStringToNumber("20071001");
+ int endDate = DatabaseImpl.convertDateStringToNumber("20120930");
+ /* Skipping Dec 1--3, 2009, because the first available database
+ * from December 2009 was published on the 4th, and generating test
+ * cases was just too confusing when taking that into account. */
+ List<Integer> skipDates = new ArrayList<Integer>();
+ skipDates.add(DatabaseImpl.convertDateStringToNumber("20091201"));
+ skipDates.add(DatabaseImpl.convertDateStringToNumber("20091202"));
+ skipDates.add(DatabaseImpl.convertDateStringToNumber("20091203"));
+ for (int i = 0; i < 100000; i++) {
+ long testAddress = rnd.nextLong() & ((1L << 32) - 1L);
+ int testDate = startDate + rnd.nextInt(endDate - startDate);
+ if (skipDates.contains(testDate)) {
+ i--;
+ } else {
+ tests.add((testAddress << 16) + testDate);
+ }
}
- }
- Stack<File> stackedFiles = new Stack<File>();
- stackedFiles.add(new File("../data"));
- SortedSet<File> files = new TreeSet<File>();
- while (!stackedFiles.isEmpty()) {
- File file = stackedFiles.pop();
- if (file.isDirectory()) {
- stackedFiles.addAll(Arrays.asList(file.listFiles()));
- } else if (!file.getName().endsWith(".md5") &&
- !file.getName().endsWith(".md5.gz") &&
- !file.getName().endsWith(".asc") &&
- !file.getName().endsWith(".asc.gz")) {
- files.add(file);
+ Stack<File> stackedFiles = new Stack<File>();
+ stackedFiles.add(new File("../data"));
+ SortedSet<File> files = new TreeSet<File>();
+ while (!stackedFiles.isEmpty()) {
+ File file = stackedFiles.pop();
+ if (file.isDirectory()) {
+ stackedFiles.addAll(Arrays.asList(file.listFiles()));
+ } else if (!file.getName().endsWith(".md5") &&
+ !file.getName().endsWith(".md5.gz") &&
+ !file.getName().endsWith(".asc") &&
+ !file.getName().endsWith(".asc.gz")) {
+ files.add(file);
+ }
}
- }
- for (File file : files) {
- String dbMonth = file.getName().substring(
- file.getName().length() - 8);
- dbMonth = dbMonth.substring(0, 6);
- DatabaseImporter temp = new DatabaseImporterImpl();
- temp.importRegionalRegistryStatsFileOrDirectory(
- file.getAbsolutePath());
+ Map<Long, String> results = new HashMap<Long, String>();
for (long test : tests) {
- int testDate = (int) (test & ((1 << 16) - 1));
- String testMonth = DatabaseImpl.convertDateNumberToString(
- testDate).substring(0, 6);
- if (testMonth.equals(dbMonth)) {
- String testAddressString = DatabaseImpl.
- convertAddressNumberToString(test >> 16);
- String testDateString = DatabaseImpl.convertDateNumberToString(
- testDate);
- String countryCode =
- temp.lookupCountryCodeFromIpv4AddressAndDate(
- testAddressString, testDateString);
- if (countryCode != null) {
- results.put(test, countryCode);
+ results.put(test, "??");
+ }
+ for (File file : files) {
+ String dbMonth = file.getName().substring(
+ file.getName().length() - 8);
+ dbMonth = dbMonth.substring(0, 6);
+ DatabaseImporter temp = new DatabaseImporterImpl();
+ temp.importRegionalRegistryStatsFileOrDirectory(
+ file.getAbsolutePath());
+ for (long test : tests) {
+ String testDateString = DatabaseImpl.
+ convertKeyToDateString(test);
+ String testMonth = testDateString.substring(0, 6);
+ if (testMonth.equals(dbMonth)) {
+ String testAddressString = DatabaseImpl.
+ convertKeyToAddressString(test);
+ String countryCode =
+ temp.lookupCountryCodeFromIpv4AddressAndDate(
+ testAddressString, testDateString);
+ if (countryCode != null) {
+ results.put(test, countryCode);
+ }
}
}
}
+ BufferedWriter bw = new BufferedWriter(new FileWriter(
+ testCasesCsvFile));
+ for (Map.Entry<Long, String> e : results.entrySet()) {
+ String testAddressString = DatabaseImpl.
+ convertKeyToAddressString(e.getKey());
+ String testDateString = DatabaseImpl.
+ convertKeyToDateString(e.getKey());
+ String countryCode = e.getValue();
+ bw.write(testAddressString + "," + testDateString + ","
+ + countryCode + "\n");
+ }
+ bw.close();
+ long endMillis = System.currentTimeMillis();
+ System.out.println((endMillis - startMillis) + " millis.");
}
- long endMillis = System.currentTimeMillis();
- System.out.println((endMillis - startMillis) + " millis.");
System.out.print("Importing files... ");
- startMillis = endMillis;
+ long startMillis = System.currentTimeMillis();
DatabaseImporter combinedDatabase = new DatabaseImporterImpl();
combinedDatabase.importRegionalRegistryStatsFileOrDirectory(
"../data");
- endMillis = System.currentTimeMillis();
+ long endMillis = System.currentTimeMillis();
System.out.println((endMillis - startMillis) + " millis.");
System.out.print("Making test requests... ");
startMillis = endMillis;
- int failures = 0;
- for (long test : tests) {
- String testAddress = DatabaseImpl.convertAddressNumberToString(
- test >> 16);
- String testDate = DatabaseImpl.convertDateNumberToString(
- (int) (test & ((1 << 16) - 1)));
- String expected = results.get(test);
+ BufferedReader br = new BufferedReader(new FileReader(
+ testCasesCsvFile));
+ String line;
+ int tests = 0, failures = 0;
+ while ((line = br.readLine()) != null) {
+ String[] parts = line.split(",");
+ String testAddress = parts[0];
+ String testDate = parts[1];
+ if (parts.length != 3) {
+ System.out.println(line);
+ System.exit(1);
+ }
+ String expected = "??".equals(parts[2]) ? null : parts[2];
String result =
combinedDatabase.lookupCountryCodeFromIpv4AddressAndDate(
testAddress, testDate);
+ tests++;
if ((expected == null && result != null) ||
(expected != null && !expected.equals(result))) {
//System.out.println("Expected " + expected + " for "
@@ -106,9 +134,10 @@ public class DatabasePerformanceExample {
failures++;
}
}
+ br.close();
endMillis = System.currentTimeMillis();
System.out.println((endMillis - startMillis) + " millis, " + failures
- + " out of " + tests.size() + " tests failed.");
+ + " out of " + tests + " tests failed.");
System.out.println(combinedDatabase);
@@ -128,15 +157,17 @@ public class DatabasePerformanceExample {
System.out.print("Making a second round of test requests... ");
startMillis = endMillis;
- failures = 0;
- for (long test : tests) {
- String testAddress = DatabaseImpl.convertAddressNumberToString(
- test >> 16);
- String testDate = DatabaseImpl.convertDateNumberToString(
- (int) (test & ((1 << 16) - 1)));
- String expected = results.get(test);
- String result = database.lookupCountryCodeFromIpv4AddressAndDate(
+ br = new BufferedReader(new FileReader(testCasesCsvFile));
+ tests = failures = 0;
+ while ((line = br.readLine()) != null) {
+ String[] parts = line.split(",");
+ String testAddress = parts[0];
+ String testDate = parts[1];
+ String expected = parts[2].equals("??") ? null : parts[2];
+ String result =
+ combinedDatabase.lookupCountryCodeFromIpv4AddressAndDate(
testAddress, testDate);
+ tests++;
if ((expected == null && result != null) ||
(expected != null && !expected.equals(result))) {
//System.out.println("Expected " + expected + " for "
@@ -144,8 +175,9 @@ public class DatabasePerformanceExample {
failures++;
}
}
+ br.close();
endMillis = System.currentTimeMillis();
System.out.println((endMillis - startMillis) + " millis, " + failures
- + " out of " + tests.size() + " tests failed.");
+ + " out of " + tests + " tests failed.");
}
}
1
0
26 Oct '12
commit e5fc352f60b5113705aa7bbd1700664abec18120
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Oct 25 18:24:58 2012 -0400
Remove "Resolution" drop-downs.
Implements #7165.
---
rserve/graphs.R | 69 ++++++++++----------
.../ernie/web/GraphParameterChecker.java | 19 ------
src/org/torproject/ernie/web/RObjectGenerator.java | 35 +++++-----
web/WEB-INF/fast-exits.jsp | 12 ----
web/WEB-INF/network.jsp | 60 -----------------
web/WEB-INF/performance.jsp | 18 -----
web/WEB-INF/users.jsp | 12 ----
7 files changed, 51 insertions(+), 174 deletions(-)
diff --git a/rserve/graphs.R b/rserve/graphs.R
index af186f2..4e61a8d 100644
--- a/rserve/graphs.R
+++ b/rserve/graphs.R
@@ -277,7 +277,7 @@ date_breaks <- function(days) {
list(major = major, minor = minor, format = format)
}
-plot_networksize <- function(start, end, path, dpi) {
+plot_networksize <- function(start, end, path) {
end <- min(end, as.character(Sys.Date() - 2))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -321,10 +321,10 @@ plot_networksize <- function(start, end, path, dpi) {
scale_colour_hue("", breaks = c("relays", "bridges"),
labels = c("Relays", "Bridges")) +
opts(title = "Number of relays\n")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_cloudbridges <- function(start, end, path, dpi) {
+plot_cloudbridges <- function(start, end, path) {
end <- min(end, as.character(Sys.Date() - 2))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -355,10 +355,10 @@ plot_cloudbridges <- function(start, end, path, dpi) {
scale_y_continuous(name = "", limits = c(0,
max(bridges$avg_running_ec2, na.rm = TRUE))) +
opts(title = "Number of Tor Cloud bridges\n")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_relaycountries <- function(start, end, country, path, dpi) {
+plot_relaycountries <- function(start, end, country, path) {
end <- min(end, as.character(Sys.Date() - 2))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -399,10 +399,10 @@ plot_relaycountries <- function(start, end, country, path, dpi) {
scale_y_continuous(name = "", limits = c(0, max(u$relays,
na.rm = TRUE)), formatter = formatter) +
opts(title = title)
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_versions <- function(start, end, path, dpi) {
+plot_versions <- function(start, end, path) {
end <- min(end, as.character(Sys.Date() - 2))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -435,10 +435,10 @@ plot_versions <- function(start, end, path, dpi) {
values = colours[colours$breaks %in% visible_versions, 2],
breaks = visible_versions) +
opts(title = "Relay versions\n")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_platforms <- function(start, end, path, dpi) {
+plot_platforms <- function(start, end, path) {
end <- min(end, as.character(Sys.Date() - 2))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user=dbuser, password=dbpassword, dbname=db)
@@ -468,10 +468,10 @@ plot_platforms <- function(start, end, path, dpi) {
values = c("#E69F00", "#56B4E9", "#009E73", "#0072B2", "#333333"),
labels = c("Linux", "Darwin", "FreeBSD", "Windows", "Other")) +
opts(title = "Relay platforms\n")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_bandwidth <- function(start, end, path, dpi) {
+plot_bandwidth <- function(start, end, path) {
end <- min(end, as.character(Sys.Date() - 4))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -505,10 +505,10 @@ plot_bandwidth <- function(start, end, path, dpi) {
breaks = c("bwadv", "bwhist"),
labels = c("Advertised bandwidth", "Bandwidth history")) +
opts(title = "Total relay bandwidth", legend.position = "top")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_bwhist_flags <- function(start, end, path, dpi) {
+plot_bwhist_flags <- function(start, end, path) {
end <- min(end, as.character(Sys.Date() - 4))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -552,10 +552,10 @@ plot_bwhist_flags <- function(start, end, path, dpi) {
values = c("#E69F00", "#56B4E9", "#009E73", "#0072B2")) +
opts(title = "Bandwidth history by relay flags",
legend.position = "top")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_dirbytes <- function(start, end, path, dpi) {
+plot_dirbytes <- function(start, end, path) {
end <- min(end, as.character(Sys.Date() - 4))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -588,10 +588,10 @@ plot_dirbytes <- function(start, end, path, dpi) {
labels = c("Written dir bytes", "Read dir bytes")) +
opts(title = "Number of bytes spent on answering directory requests",
legend.position = "top")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_relayflags <- function(start, end, flags, granularity, path, dpi) {
+plot_relayflags <- function(start, end, flags, granularity, path) {
end <- min(end, as.character(Sys.Date() - 2))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -661,10 +661,10 @@ plot_relayflags <- function(start, end, flags, granularity, path, dpi) {
labels = flags) +
opts(title = "Number of relays with relay flags assigned\n")
}
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_direct_users <- function(start, end, country, events, path, dpi) {
+plot_direct_users <- function(start, end, country, events, path) {
end <- min(end, as.character(Sys.Date() - 4))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -739,10 +739,10 @@ plot_direct_users <- function(start, end, country, events, path, dpi) {
scale_y_continuous(name = "", limits = c(0, max_y),
formatter = formatter) + opts(title = title)
print(plot)
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_bridge_users <- function(start, end, country, path, dpi) {
+plot_bridge_users <- function(start, end, country, path) {
end <- min(end, as.character(Sys.Date() - 4))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -778,10 +778,10 @@ plot_bridge_users <- function(start, end, country, path, dpi) {
ifelse(length(na.omit(bridgeusers$users)) == 0, 0,
max(bridgeusers$users, na.rm = TRUE))), formatter = formatter) +
opts(title = title)
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_torperf <- function(start, end, source, filesize, path, dpi) {
+plot_torperf <- function(start, end, source, filesize, path) {
end <- min(end, as.character(Sys.Date() - 2))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -827,11 +827,10 @@ plot_torperf <- function(start, end, source, filesize, path, dpi) {
values = paste(colour, c("", "66"), sep = "")) +
opts(title = paste("Time in seconds to complete", filesizeStr,
"request"), legend.position = "top")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_torperf_failures <- function(start, end, source, filesize, path,
- dpi) {
+plot_torperf_failures <- function(start, end, source, filesize, path) {
end <- min(end, as.character(Sys.Date() - 2))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -882,10 +881,10 @@ plot_torperf_failures <- function(start, end, source, filesize, path,
labels = c("Timeouts", "Failures")) +
opts(title = paste("Timeouts and failures of", filesizeStr,
"requests"), legend.position = "top")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_connbidirect <- function(start, end, path, dpi) {
+plot_connbidirect <- function(start, end, path) {
end <- min(end, as.character(Sys.Date() - 2))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -915,10 +914,10 @@ plot_connbidirect <- function(start, end, path, dpi) {
"Both reading and writing")) +
opts(title = "Fraction of connections used uni-/bidirectionally",
legend.position = "top")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
-plot_fast_exits <- function(start, end, path, dpi) {
+plot_fast_exits <- function(start, end, path) {
r <- read.csv(paste("/srv/metrics.torproject.org/task-6498-graphs/",
"task-6498/task-6498-results.csv", sep = ""),
stringsAsFactors = FALSE)
@@ -943,10 +942,10 @@ plot_fast_exits <- function(start, end, path, dpi) {
"rate,\n5000+ KB/s advertised bandwidth capacity,\n",
"exit to ports 80, 443, 554, and 1755,\n",
"at most 2 relays per /24 network)\n", sep = ""))
- ggsave(filename = path, width = 8, height = 6, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 6, dpi = 72)
}
-plot_almost_fast_exits <- function(start, end, path, dpi) {
+plot_almost_fast_exits <- function(start, end, path) {
t <- read.csv(paste("/srv/metrics.torproject.org/task-6498-graphs/",
"task-6498/task-6498-results.csv", sep = ""),
stringsAsFactors = FALSE)
@@ -983,10 +982,10 @@ plot_almost_fast_exits <- function(start, end, path, dpi) {
scale_colour_manual(name = "", values = c("orange", "purple")) +
opts(title = "Relays almost meeting the fast-exit requirements",
legend.position = "top")
- ggsave(filename = path, width = 8, height = 6, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 6, dpi = 72)
}
-plot_bandwidth_flags <- function(start, end, path, dpi) {
+plot_bandwidth_flags <- function(start, end, path) {
end <- min(end, as.character(Sys.Date() - 4))
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
@@ -1047,6 +1046,6 @@ plot_bandwidth_flags <- function(start, end, path, dpi) {
values = c("#E69F00", "#D6C827", "#009E73", "#00C34F")) +
opts(title = paste("Advertised bandwidth and bandwidth history by",
"relay flags"), legend.position = "top")
- ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+ ggsave(filename = path, width = 8, height = 5, dpi = 72)
}
diff --git a/src/org/torproject/ernie/web/GraphParameterChecker.java b/src/org/torproject/ernie/web/GraphParameterChecker.java
index 16d0db4..d2386dd 100644
--- a/src/org/torproject/ernie/web/GraphParameterChecker.java
+++ b/src/org/torproject/ernie/web/GraphParameterChecker.java
@@ -60,7 +60,6 @@ public class GraphParameterChecker {
this.knownParameterValues.put("language", "all,en,zh_CN,fa");
this.knownParameterValues.put("source", "all,siv,moria,torperf");
this.knownParameterValues.put("filesize", "50kb,1mb,5mb");
- this.knownParameterValues.put("dpi", "72,150,300");
}
public void setAvailableGraphs(Map<String, String> availableGraphs) {
@@ -291,24 +290,6 @@ public class GraphParameterChecker {
}
}
- /* Parse graph resolution in dpi. The default is 72. */
- if (supportedGraphParameters.contains("dpi")) {
- String[] dpiParameter = (String[]) requestParameters.get("dpi");
- if (dpiParameter != null) {
- List<String> knownDpis = Arrays.asList(
- this.knownParameterValues.get("dpi").split(","));
- if (dpiParameter.length != 1 ||
- dpiParameter[0] == null ||
- !Pattern.matches("[0-9]{1,4}", dpiParameter[0]) ||
- !knownDpis.contains(dpiParameter[0])) {
- return null;
- }
- } else {
- dpiParameter = new String[] { "72" };
- }
- recognizedGraphParameters.put("dpi", dpiParameter);
- }
-
/* We now have a map with all required graph parameters. Return it. */
return recognizedGraphParameters;
}
diff --git a/src/org/torproject/ernie/web/RObjectGenerator.java b/src/org/torproject/ernie/web/RObjectGenerator.java
index c599807..be01d0b 100644
--- a/src/org/torproject/ernie/web/RObjectGenerator.java
+++ b/src/org/torproject/ernie/web/RObjectGenerator.java
@@ -83,30 +83,29 @@ public class RObjectGenerator implements ServletContextListener {
availableTables);
this.availableGraphs = new HashMap<String, String>();
- this.availableGraphs.put("networksize", "start,end,filename,dpi");
- this.availableGraphs.put("cloudbridges", "start,end,filename,dpi");
+ this.availableGraphs.put("networksize", "start,end,filename");
+ this.availableGraphs.put("cloudbridges", "start,end,filename");
this.availableGraphs.put("relaycountries",
- "start,end,country,filename,dpi");
+ "start,end,country,filename");
this.availableGraphs.put("relayflags", "start,end,flag,granularity,"
- + "filename,dpi");
- this.availableGraphs.put("versions", "start,end,filename,dpi");
- this.availableGraphs.put("platforms", "start,end,filename,dpi");
- this.availableGraphs.put("bandwidth", "start,end,filename,dpi");
- this.availableGraphs.put("bandwidth-flags", "start,end,filename,dpi");
- this.availableGraphs.put("bwhist-flags", "start,end,filename,dpi");
- this.availableGraphs.put("dirbytes", "start,end,filename,dpi");
+ + "filename");
+ this.availableGraphs.put("versions", "start,end,filename");
+ this.availableGraphs.put("platforms", "start,end,filename");
+ this.availableGraphs.put("bandwidth", "start,end,filename");
+ this.availableGraphs.put("bandwidth-flags", "start,end,filename");
+ this.availableGraphs.put("bwhist-flags", "start,end,filename");
+ this.availableGraphs.put("dirbytes", "start,end,filename");
this.availableGraphs.put("direct-users",
- "start,end,country,events,filename,dpi");
+ "start,end,country,events,filename");
this.availableGraphs.put("bridge-users",
- "start,end,country,filename,dpi");
+ "start,end,country,filename");
this.availableGraphs.put("torperf",
- "start,end,source,filesize,filename,dpi");
+ "start,end,source,filesize,filename");
this.availableGraphs.put("torperf-failures",
- "start,end,source,filesize,filename,dpi");
- this.availableGraphs.put("connbidirect", "start,end,filename,dpi");
- this.availableGraphs.put("fast-exits", "start,end,filename,dpi");
- this.availableGraphs.put("almost-fast-exits",
- "start,end,filename,dpi");
+ "start,end,source,filesize,filename");
+ this.availableGraphs.put("connbidirect", "start,end,filename");
+ this.availableGraphs.put("fast-exits", "start,end,filename");
+ this.availableGraphs.put("almost-fast-exits", "start,end,filename");
this.availableGraphFileTypes = new HashSet<String>(Arrays.asList(
"png,pdf,svg".split(",")));
GraphParameterChecker.getInstance().setAvailableGraphs(
diff --git a/web/WEB-INF/fast-exits.jsp b/web/WEB-INF/fast-exits.jsp
index d97c8a4..903c88c 100644
--- a/web/WEB-INF/fast-exits.jsp
+++ b/web/WEB-INF/fast-exits.jsp
@@ -37,12 +37,6 @@ requirements</a></h3>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(fast_exits_end) == 0}">${default_end_date}</c:when><c:otherwise>${fast_exits_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${fast_exits_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x432</option>
- <option value="150"<c:if test="${fast_exits_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x900</option>
- <option value="300"<c:if test="${fast_exits_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1800</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -69,12 +63,6 @@ fast-exit requirements</a></h3>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(almost_fast_exits_end) == 0}">${default_end_date}</c:when><c:otherwise>${almost_fast_exits_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${almost_fast_exits_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x432</option>
- <option value="150"<c:if test="${almost_fast_exits_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x900</option>
- <option value="300"<c:if test="${almost_fast_exits_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1800</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
diff --git a/web/WEB-INF/network.jsp b/web/WEB-INF/network.jsp
index 53ed715..cc783d5 100644
--- a/web/WEB-INF/network.jsp
+++ b/web/WEB-INF/network.jsp
@@ -42,12 +42,6 @@ bridges in the network.</p>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(networksize_end) == 0}">${default_end_date}</c:when><c:otherwise>${networksize_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${networksize_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${networksize_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${networksize_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -83,12 +77,6 @@ country.</p>
</c:forEach>
</select>
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${relaycountries_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${relaycountries_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${relaycountries_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -130,12 +118,6 @@ average number of relays with these flags assigned.</p>
<input type="radio" name="granularity" value="day" <c:if test="${fn:length(relayflags_granularity) == 0 or relayflags_granularity[0] eq 'day'}"> checked</c:if>> 1 day
<input type="radio" name="granularity" value="hour" <c:if test="${relayflags_granularity[0] eq 'hour'}"> checked</c:if>> 1 hour
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${relayflags_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${relayflags_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${relayflags_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -169,12 +151,6 @@ The following graph shows the number of relays by version.</p>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(versions_end) == 0}">${default_end_date}</c:when><c:otherwise>${versions_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${versions_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${versions_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${versions_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -204,12 +180,6 @@ platform.</p>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(platforms_end) == 0}">${default_end_date}</c:when><c:otherwise>${platforms_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${platforms_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${platforms_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${platforms_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -239,12 +209,6 @@ network.</p>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(cloudbridges_end) == 0}">${default_end_date}</c:when><c:otherwise>${cloudbridges_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${cloudbridges_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${cloudbridges_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${cloudbridges_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -276,12 +240,6 @@ in the network.</p>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(bandwidth_end) == 0}">${default_end_date}</c:when><c:otherwise>${bandwidth_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${bandwidth_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${bandwidth_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${bandwidth_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -311,12 +269,6 @@ Exit and/or Guard flags assigned by the directory authorities.</p>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(bwhist_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bwhist_flags_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${bwhist_flags_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${bwhist_flags_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${bwhist_flags_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -349,12 +301,6 @@ Guard flag.</p>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(bandwidth_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bandwidth_flags_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${bandwidth_flags_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${bandwidth_flags_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${bandwidth_flags_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -387,12 +333,6 @@ the number of written and read dir bytes by all relays.</p>
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(dirbytes_end) == 0}">${default_end_date}</c:when><c:otherwise>${dirbytes_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${dirbytes_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${dirbytes_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${dirbytes_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
diff --git a/web/WEB-INF/performance.jsp b/web/WEB-INF/performance.jsp
index e6caf8e..d41232f 100644
--- a/web/WEB-INF/performance.jsp
+++ b/web/WEB-INF/performance.jsp
@@ -49,12 +49,6 @@ graph.</p>
<input type="radio" name="filesize" value="1mb"<c:if test="${torperf_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB
<input type="radio" name="filesize" value="5mb"<c:if test="${torperf_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${torperf_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${torperf_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${torperf_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -99,12 +93,6 @@ than 50 KiB (1 MiB, 5 MiB).</p>
<input type="radio" name="filesize" value="1mb"<c:if test="${torperf_failures_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB
<input type="radio" name="filesize" value="5mb"<c:if test="${torperf_failures_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${torperf_failures_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${torperf_failures_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${torperf_failures_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -143,12 +131,6 @@ classifying connections, read and write counters are reset for the next
<input type="text" name="end" size="10"
value="<c:choose><c:when test="${fn:length(connbidirect_end) == 0}">${default_end_date}</c:when><c:otherwise>${connbidirect_end[0]}</c:otherwise></c:choose>">
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${connbidirect_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${connbidirect_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${connbidirect_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
diff --git a/web/WEB-INF/users.jsp b/web/WEB-INF/users.jsp
index 3ef211b..b7fdb13 100644
--- a/web/WEB-INF/users.jsp
+++ b/web/WEB-INF/users.jsp
@@ -54,12 +54,6 @@ based on the requests seen by a few dozen directory mirrors.</p>
<option value="points"<c:if test="${direct_users_events[0] eq 'points'}"> selected</c:if>>On: points only, no expected range</option>
</select>
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${direct_users_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${direct_users_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${direct_users_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
@@ -168,12 +162,6 @@ by a few hundred bridges.</p>
</c:forEach>
</select>
</p><p>
- Resolution: <select name="dpi">
- <option value="72"<c:if test="${bridge_users_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
- <option value="150"<c:if test="${bridge_users_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
- <option value="300"<c:if test="${bridge_users_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
- </select>
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
1
0
26 Oct '12
commit 4f228f39ec74abfa1a806d944a2d84edb63a5757
Author: Roger Dingledine <arma(a)torproject.org>
Date: Thu Oct 25 16:00:59 2012 -0400
last clarification for the changelog
---
ChangeLog | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 5966913..8f3689b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,7 @@
Changes in version 0.2.3.24-rc - 2012-10-25
Tor 0.2.3.24-rc fixes two important security vulnerabilities that
could lead to remotely triggerable relay crashes, and fixes
- a major bug that was preventing clients from choosing good exit
+ a major bug that was preventing clients from choosing suitable exit
nodes.
o Major bugfixes (security):
1
0
commit 4984e60a7f58056ed741bb68308e3b437bd7fdd7
Author: Roger Dingledine <arma(a)torproject.org>
Date: Thu Oct 25 16:00:23 2012 -0400
update the release notes too
---
ChangeLog | 2 +-
ReleaseNotes | 28 ++++++++++++++++------------
2 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index fbeb6d6..5966913 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,7 +7,7 @@ Changes in version 0.2.3.24-rc - 2012-10-25
o Major bugfixes (security):
- Fix a group of remotely triggerable assertion failures related to
incorrect link protocol negotiation. Found, diagnosed, and fixed
- by "some guy from France." Fix for CVE-2012-2250; bugfix on
+ by "some guy from France". Fix for CVE-2012-2250; bugfix on
0.2.3.6-alpha.
- Fix a denial of service attack by which any directory authority
could crash all the others, or by which a single v2 directory
diff --git a/ReleaseNotes b/ReleaseNotes
index db82dc1..5717330 100644
--- a/ReleaseNotes
+++ b/ReleaseNotes
@@ -260,6 +260,22 @@ Changes in version 0.2.3.x - 2012-10-??
was closed. Fixes bug 7139; bugfix on all versions of Tor linked
against OpenSSL 1.0.0 or later. Found by Florent Daignière.
+ o Major bugfixes (crashes and asserts):
+ - Avoid a pair of double-free and use-after-mark bugs that can
+ occur with certain timings in canceled and re-received DNS
+ requests. Fixes bug 6472; bugfix on 0.0.7rc1.
+ - Fix a denial of service attack by which any directory authority
+ could crash all the others, or by which a single v2 directory
+ authority could crash everybody downloading v2 directory
+ information. Fixes bug 7191; bugfix on 0.2.0.10-alpha.
+ - Fix an assert that directory authorities could trigger on sighup
+ during some configuration state transitions. We now don't treat
+ it as a fatal error when the new descriptor we just generated in
+ init_keys() isn't accepted. Fixes bug 4438; bugfix on 0.2.1.9-alpha.
+ - Avoid segfault when starting up having run with an extremely old
+ version of Tor and parsing its state file. Fixes bug 6801; bugfix
+ on 0.2.2.23-alpha.
+
o Major bugfixes (clients):
- If we are unable to find any exit that supports our predicted ports,
stop calling them predicted, so that we don't loop and build
@@ -543,18 +559,6 @@ Changes in version 0.2.3.x - 2012-10-??
structures. Fixes issue 3135; issue noted by "wanoskarnet".
- Shorten links in the tor-exit-notice file. Patch by Christian Kujau.
- o Minor bugfixes (crashes and asserts):
- - Avoid a pair of double-free and use-after-mark bugs that can
- occur with certain timings in canceled and re-received DNS
- requests. Fixes bug 6472; bugfix on 0.0.7rc1.
- - Fix an assert that directory authorities could trigger on sighup
- during some configuration state transitions. We now don't treat
- it as a fatal error when the new descriptor we just generated in
- init_keys() isn't accepted. Fixes bug 4438; bugfix on 0.2.1.9-alpha.
- - Avoid segfault when starting up having run with an extremely old
- version of Tor and parsing its state file. Fixes bug 6801; bugfix
- on 0.2.2.23-alpha.
-
o Minor bugfixes (code security):
- Prevent a null-pointer dereference when receiving a data cell
for a nonexistent stream when the circuit in question has an
1
0
[translation/orbot_completed] Update translations for orbot_completed
by translation@torproject.org 25 Oct '12
by translation@torproject.org 25 Oct '12
25 Oct '12
commit 173a31ad390fc47f3cf742d0af3c3e34e6fdb7f5
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Oct 25 18:15:07 2012 +0000
Update translations for orbot_completed
---
values-zh/strings.xml | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/values-zh/strings.xml b/values-zh/strings.xml
index 2428e2a..88eae70 100644
--- a/values-zh/strings.xml
+++ b/values-zh/strings.xml
@@ -58,7 +58,7 @@
<string name="btn_cancel">取消</string>
<!--Welcome Wizard strings (DJH)-->
<string name="wizard_details">Orbot 详细信息</string>
- <string name="wizard_details_msg">Orbot 是一个包含 Tor、LibEvent 和 Privoxy 的开源程序。它包含并使用了一个本地 HTTP 代理(8118)和 SOCKS 代理(9050)来接入到 Tor 网络。在获得 ROOT 权限的设备上 Orbot 有能力让所有的应用程序都通过 Tor 来进行网络通讯。</string>
+ <string name="wizard_details_msg">Orbot 是一个包含 Tor、LibEvent 和 Privoxy 的开源程序。它包含并使用了一个本地 HTTP 代理(8118)和 SOCKS 代理(9050)来接入到 Tor 网络。在获得 ROOT 权限的设备上 Orbot 有能力让所有的应用程序都通过 Tor 来进行网络通讯。</string>
<string name="wizard_permissions_root">已获取权限</string>
<string name="wizard_permissions_stock">Orbot 权限</string>
<string name="wizard_premissions_msg_root">好极了!我们检测到您已获取 ROOT 权限并可用于 Orbot 。我们将可以在关键时刻使用这个强大的功能。</string>
@@ -117,10 +117,10 @@
<!--Transparent Proxy screen-->
<string name="wizard_transproxy_title">透明代理</string>
<string name="wizard_transproxy_msg">这可以使您的应用程序无需进行任何配置就能自动通过 Tor 连接网络</string>
- <string name="wizard_transproxy_hint">(如果您不明白我们所说的问题就请选中此项好了)</string>
+ <string name="wizard_transproxy_hint">(如果您不明白我们所说的问题就请选中此项好了)</string>
<string name="wizard_transproxy_none">不使用</string>
<string name="pref_transparent_tethering_title">Tor 网络共享</string>
- <string name="pref_transparent_tethering_summary">对 Wifi 和 USB 链接设备启用透明代理(需要重新启动)</string>
+ <string name="pref_transparent_tethering_summary">对 Wifi 和 USB 链接设备启用透明代理(需要重新启动)</string>
<string name="button_grant_superuser">请求 ROOT 权限</string>
<string name="pref_select_apps">选择应用程序</string>
<string name="pref_select_apps_summary">选择通过 Tor 连接网络的应用程序</string>
@@ -190,8 +190,8 @@
<string name="run_servers_accessible_via_the_tor_network">允许打开的设备作为服务器接入 Tor 网络</string>
<string name="enter_localhost_ports_for_hidden_services">输入〖隐藏服务〗的本地主机端口</string>
<string name="hidden_service_ports">〖隐藏服务〗端口</string>
- <string name="the_addressable_name_for_your_hidden_service_generated_automatically_">您的〖隐藏服务〗主机的可访问地址名称(自动生成)</string>
- <string name="enable_debug_log_to_output_must_use_adb_or_alogcat_to_view_">启用调试日志输出(需要 adb 或 aLongCat 来查看)</string>
+ <string name="the_addressable_name_for_your_hidden_service_generated_automatically_">您的〖隐藏服务〗主机的可访问地址名称(自动生成)</string>
+ <string name="enable_debug_log_to_output_must_use_adb_or_alogcat_to_view_">启用调试日志输出(需要 adb 或 aLongCat 来查看)</string>
<string name="project_home">产品主页(s):</string>
<string name="project_urls">https://www.torproject.org/docs/android\nhttps://guardianproject.info/apps/…</string>
<string name="the_tor_license">Tor 许可证</string>
1
0
25 Oct '12
commit acd1c9cb2a739e219cd9bc4afca17e357ebfdc08
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Oct 25 18:15:06 2012 +0000
Update translations for orbot
---
values-zh/strings.xml | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/values-zh/strings.xml b/values-zh/strings.xml
index 2428e2a..88eae70 100644
--- a/values-zh/strings.xml
+++ b/values-zh/strings.xml
@@ -58,7 +58,7 @@
<string name="btn_cancel">取消</string>
<!--Welcome Wizard strings (DJH)-->
<string name="wizard_details">Orbot 详细信息</string>
- <string name="wizard_details_msg">Orbot 是一个包含 Tor、LibEvent 和 Privoxy 的开源程序。它包含并使用了一个本地 HTTP 代理(8118)和 SOCKS 代理(9050)来接入到 Tor 网络。在获得 ROOT 权限的设备上 Orbot 有能力让所有的应用程序都通过 Tor 来进行网络通讯。</string>
+ <string name="wizard_details_msg">Orbot 是一个包含 Tor、LibEvent 和 Privoxy 的开源程序。它包含并使用了一个本地 HTTP 代理(8118)和 SOCKS 代理(9050)来接入到 Tor 网络。在获得 ROOT 权限的设备上 Orbot 有能力让所有的应用程序都通过 Tor 来进行网络通讯。</string>
<string name="wizard_permissions_root">已获取权限</string>
<string name="wizard_permissions_stock">Orbot 权限</string>
<string name="wizard_premissions_msg_root">好极了!我们检测到您已获取 ROOT 权限并可用于 Orbot 。我们将可以在关键时刻使用这个强大的功能。</string>
@@ -117,10 +117,10 @@
<!--Transparent Proxy screen-->
<string name="wizard_transproxy_title">透明代理</string>
<string name="wizard_transproxy_msg">这可以使您的应用程序无需进行任何配置就能自动通过 Tor 连接网络</string>
- <string name="wizard_transproxy_hint">(如果您不明白我们所说的问题就请选中此项好了)</string>
+ <string name="wizard_transproxy_hint">(如果您不明白我们所说的问题就请选中此项好了)</string>
<string name="wizard_transproxy_none">不使用</string>
<string name="pref_transparent_tethering_title">Tor 网络共享</string>
- <string name="pref_transparent_tethering_summary">对 Wifi 和 USB 链接设备启用透明代理(需要重新启动)</string>
+ <string name="pref_transparent_tethering_summary">对 Wifi 和 USB 链接设备启用透明代理(需要重新启动)</string>
<string name="button_grant_superuser">请求 ROOT 权限</string>
<string name="pref_select_apps">选择应用程序</string>
<string name="pref_select_apps_summary">选择通过 Tor 连接网络的应用程序</string>
@@ -190,8 +190,8 @@
<string name="run_servers_accessible_via_the_tor_network">允许打开的设备作为服务器接入 Tor 网络</string>
<string name="enter_localhost_ports_for_hidden_services">输入〖隐藏服务〗的本地主机端口</string>
<string name="hidden_service_ports">〖隐藏服务〗端口</string>
- <string name="the_addressable_name_for_your_hidden_service_generated_automatically_">您的〖隐藏服务〗主机的可访问地址名称(自动生成)</string>
- <string name="enable_debug_log_to_output_must_use_adb_or_alogcat_to_view_">启用调试日志输出(需要 adb 或 aLongCat 来查看)</string>
+ <string name="the_addressable_name_for_your_hidden_service_generated_automatically_">您的〖隐藏服务〗主机的可访问地址名称(自动生成)</string>
+ <string name="enable_debug_log_to_output_must_use_adb_or_alogcat_to_view_">启用调试日志输出(需要 adb 或 aLongCat 来查看)</string>
<string name="project_home">产品主页(s):</string>
<string name="project_urls">https://www.torproject.org/docs/android\nhttps://guardianproject.info/apps/…</string>
<string name="the_tor_license">Tor 许可证</string>
1
0
[translation/orbot_completed] Update translations for orbot_completed
by translation@torproject.org 25 Oct '12
by translation@torproject.org 25 Oct '12
25 Oct '12
commit 4770cbb50eaaac7492824a096699f6f11627f35c
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Oct 25 17:45:09 2012 +0000
Update translations for orbot_completed
---
values-zh/strings.xml | 224 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 224 insertions(+), 0 deletions(-)
diff --git a/values-zh/strings.xml b/values-zh/strings.xml
new file mode 100644
index 0000000..2428e2a
--- /dev/null
+++ b/values-zh/strings.xml
@@ -0,0 +1,224 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">启动和停止 Tor</string>
+ <string name="tor_proxy_service_process">Tor 代理服务</string>
+ <string name="status_starting_up">Orbot 正在启动...</string>
+ <string name="status_activated">已连接到 Tor 网络</string>
+ <string name="status_disabled">Orbot 已停用</string>
+ <string name="status_shutting_down">Orbot 正在关闭</string>
+ <string name="tor_process_starting">正在启动 Tor 客户端...</string>
+ <string name="tor_process_complete">完成。</string>
+ <string name="tor_process_waiting">等待。</string>
+ <string name="not_anonymous_yet">警告:您的网络通讯还不是匿名的! 请设置您的应用程序使用 HTTP 代理服务器 127.0.0.1:8118 或者 SOCKS4A、SOCKS5 代理服务器 127.0.0.1:9050</string>
+ <string name="menu_home">首页</string>
+ <string name="menu_browse">浏览</string>
+ <string name="menu_settings">设置</string>
+ <string name="menu_log">日志</string>
+ <string name="menu_info">帮助</string>
+ <string name="menu_apps">应用</string>
+ <string name="menu_start">启动</string>
+ <string name="menu_stop">停止</string>
+ <string name="menu_about">关于</string>
+ <string name="menu_wizard">向导</string>
+ <string name="main_layout_download">下载</string>
+ <string name="main_layout_upload">上传</string>
+ <string name="button_help">帮助</string>
+ <string name="button_close">关闭</string>
+ <string name="button_about">关于</string>
+ <string name="button_clear_log">清除日志</string>
+ <string name="menu_verify">检查</string>
+ <string name="menu_exit">退出</string>
+ <string name="press_to_start">- 长按开始启动 -</string>
+ <string name="pref_trans_proxy_group">透明代理(需要 ROOT 权限)</string>
+ <string name="pref_trans_proxy_title">透明代理</string>
+ <string name="pref_trans_proxy_summary">启用后可以自动对应用程序进行代理配置</string>
+ <string name="pref_transparent_all_title">所有应用程序</string>
+ <string name="pref_transparent_all_summary">所有应用程序都通过 Tor 连接网络</string>
+ <string name="pref_transparent_port_fallback_title">备用代理端口</string>
+ <string name="pref_transparent_port_fallback_summary">警告:这会避开常用的端口(80、443 等)。如果【所有应用程序】或【选择应用程序】模式都不能正常工作,请启用【锁定节点】模式。</string>
+ <string name="pref_transparent_port_title">端口列表</string>
+ <string name="pref_transparent_port_summary">代理端口列表。如果【所有应用程序】或【选择应用程序】模式都不能正常工作,请启用【锁定节点】模式。</string>
+ <string name="pref_transparent_port_dialog">输入代理端口</string>
+ <string name="pref_has_root">请求 ROOT 权限</string>
+ <string name="pref_has_root_summary">获取 ROOT 权限后才能启用透明代理</string>
+ <string name="status_install_success">Tor 程序安装成功!</string>
+ <string name="status_install_fail">Tor 程序无法安装。请查看日志并将其发送到 tor-assistants(a)torproject.org</string>
+ <string name="title_error">应用程序错误</string>
+ <string name="wizard_title">欢迎使用 Orbot</string>
+ <string name="wizard_btn_tell_me_more">关于 Orbot</string>
+ <string name="btn_next">下一步</string>
+ <string name="btn_back">上一步</string>
+ <string name="btn_finish">完成</string>
+ <string name="btn_okay">确定</string>
+ <string name="btn_cancel">取消</string>
+ <!--Welcome Wizard strings (DJH)-->
+ <string name="wizard_details">Orbot 详细信息</string>
+ <string name="wizard_details_msg">Orbot 是一个包含 Tor、LibEvent 和 Privoxy 的开源程序。它包含并使用了一个本地 HTTP 代理(8118)和 SOCKS 代理(9050)来接入到 Tor 网络。在获得 ROOT 权限的设备上 Orbot 有能力让所有的应用程序都通过 Tor 来进行网络通讯。</string>
+ <string name="wizard_permissions_root">已获取权限</string>
+ <string name="wizard_permissions_stock">Orbot 权限</string>
+ <string name="wizard_premissions_msg_root">好极了!我们检测到您已获取 ROOT 权限并可用于 Orbot 。我们将可以在关键时刻使用这个强大的功能。</string>
+ <string name="wizard_permissions_msg_stock">虽然并非必须,但如果您的设备拥有 ROOT 权限将使 Orbot 成为更强大的工具。使用下面的按钮来让 Orbot 获得超强的能力吧!</string>
+ <string name="wizard_permissions_no_root">如果您没有 ROOT 权限或不明白我们所说的东西,那只能使用那些 Orbot 能支持的应用程序了。</string>
+ <string name="wizard_permissions_consent">我知道并要在无 ROOT 权限下继续</string>
+ <string name="wizard_permission_enable_root">获取用于 Orbot 的 ROOT 权限</string>
+ <string name="wizard_configure">配置 Tor 强度</string>
+ <string name="wizard_configure_msg">Orbot 可以让您设定所有的应用程序都通过 Tor 进行网络通讯或选择使用 Tor 进行网络通讯的单独应用程序。</string>
+ <string name="wizard_configure_all">通过 Tor 代理所有应用程序</string>
+ <string name="wizard_configure_select_apps">选择需要使用 Tor 的应用程序</string>
+ <string name="wizard_tips_tricks">Orbot 支持的应用</string>
+ <string name="wizard_tips_msg">下面的应用程序是针对 Orbot 开发的。您可以点击下面的按钮进行安装或到 Google Play 商店、\nGuardianProject.info 网站和通过 F-Droid.org 进行查找。</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Android 上安全的即时通讯客户端</string>
+ <string name="wizard_tips_proxy">代理设置 - 学习如何配置应用程序来使之与 Orbot 协同工作</string>
+ <string name="wizard_tips_duckgo">DuckDuckGo 搜索引擎:注重隐私保护的综合搜索引擎,它不会记录用户的个人信息。</string>
+ <string name="duckgo_apk_url">https://duckduckgo.com/android/latest.apk</string>
+ <string name="wizard_tips_firefox">Firefox 移动客户端代理插件</string>
+ <string name="proxymob_setup_url">https://guardianproject.info/releases/proxymob-latest.xpi</string>
+ <string name="wizard_tips_twitter">Twitter 的代理设置为主机:localhost ,端口:8118 。</string>
+ <string name="twitter_setup_url">https://guardianproject.info/2012/05/02/orbot-your-twitter/</string>
+ <string name="wizard_proxy_help_info">代理设置</string>
+ <string name="wizard_proxy_help_msg">如果您正在使用的 Android 应用程序支持使用 HTTP 或 SOCKS 代理,那么您可以将它与 Orbot 进行关联配置后再使用 Tor。\n\n\n 主机设置为 127.0.0.1 或 localhost。对于 HTTP,端口应设置为 8118;对于 SOCKS,端口应设置为 9050。如果有可能您应该尽量使用 SOCKS4A 或 SOCKS5 代理。\n \n\n\n 您可以在 http://tinyurl.com/proxyandroid 的 FAQ(常见问题)中了解更多在 Android 上使用代理的知识。</string>
+ <string name="wizard_final">Orbot 已就绪!</string>
+ <string name="wizard_final_msg">由于各种原因全世界有数以万计的人在使用 Tor:\n\n\n 记者和博客、人权工作者、法律工作者、军人、企业、专制政权下的人民,以及像你我一样的普通公民...\n\n 现在您亦已准备就绪,欢迎您!</string>
+ <!--END Welcome Wizard strings (DJH)-->
+ <string name="connect_first_time">您已成功连接到 Tor 网络 \n- 但这并不意味着您的设备是安全的,您可以在菜单中使用【检查】选项来测试您的浏览器。\n\n\n访问 https://guardianproject.info/apps/orbot 或发送邮件到 help(a)guardianproject.info 来了解更多信息。</string>
+ <string name="tor_check">将启动您的浏览器访问:\nhttps://check.torproject.org \n\n这用于测试您的 Orbot 配置是否正确和是否可以连接到 Tor 网络。</string>
+ <string name="pref_hs_group">〖隐藏服务〗主机</string>
+ <string name="pref_general_group">常规</string>
+ <string name="pref_start_boot_title">开机时启动 Orbot</string>
+ <string name="pref_start_boot_summary">当您的 Android 设备开机时自动启动 Orbot 并连接到 Tor 网络</string>
+ <!--New Wizard Strings-->
+ <!--Title Screen-->
+ <string name="wizard_title_msg">Orbot 已将 Tor 引入 Android!\n\n\nTor 可以帮助您绕过内容过滤、抵御通讯分析和防范那些威胁个人信息和人际关系等隐私的网络监控行为。\n\n\n此向导将帮助您在您的设备上配置 Orbot 和 Tor 。</string>
+ <!--Warning screen-->
+ <string name="wizard_warning_title">警告</string>
+ <string name="wizard_warning_msg">只简单地安装 Orbot 并不能自动隐匿您的移动网络通讯。\n\n\n您必需正确配置 Orbot 后您的设备和其它应用程序才能成功使用 Tor 。</string>
+ <!--Permissions screen-->
+ <string name="wizard_permissions_title">权限</string>
+ <string name="wizard_permissions_root_msg1">您可以让【Superuser】允许 Orbot 获取 ROOT 权限以便启用高级功能,例如透明代理。</string>
+ <string name="wizard_permissions_root_msg2">如果您不想这样做,请确保使用的应用程序能与 Orbot 协同工作。</string>
+ <string name="wizard_permissions_no_root_msg">您的设备似乎没有 ROOT 权限或未让【Superuser】允许 Tor 获取 ROOT 权限。\n\n\n要让 Tor 为您提供帮助,您必须使应用程序能和 Orbot 一起协同工作或设置好它们的 HTTP 和 SOCKS 代理。\n\n</string>
+ <!--TipsAndTricks screen-->
+ <string name="wizard_tips_title">Orbot 支持的应用</string>
+ <string name="wizard_tips_gibberbot">Gibberbot:可以加密聊天记录的安全聊天应用程序</string>
+ <string name="gibberbot_apk_url">https://guardianproject.info/releases/gibberbot-latest.apk</string>
+ <string name="wizard_tips_orweb">Orweb:可以通过 Tor 进行工作的能保护隐私的浏览器</string>
+ <string name="orweb_apk_url">https://guardianproject.info/releases/orweb-latest.xpi</string>
+ <string name="wizard_tips_play">在 Google Play 商店查找所有基于 Guardian Project 的应用程序</string>
+ <string name="wizard_tips_play_url">https://play.google.com/store/search?q=guardianproject</string>
+ <!--<string name="wizard_tips_firefox">Firefox - Android browser - To be used along with ProxyMob Add-on </string>
+ <string name="wizard_tips_proxymob">ProxyMob - Simple Firefox Add-on for setting HTTP, SOCKS and SSL proxy settings</string>
+ <string name="firefox_apk_url">https://market.android.com/details?id=org.mozilla.firefox</string>
+ <string name="proxymob_url">https://addons.mozilla.org/mobile/downloads/latest/251558/type:attachment/a…</string>-->
+ <!--Transparent Proxy screen-->
+ <string name="wizard_transproxy_title">透明代理</string>
+ <string name="wizard_transproxy_msg">这可以使您的应用程序无需进行任何配置就能自动通过 Tor 连接网络</string>
+ <string name="wizard_transproxy_hint">(如果您不明白我们所说的问题就请选中此项好了)</string>
+ <string name="wizard_transproxy_none">不使用</string>
+ <string name="pref_transparent_tethering_title">Tor 网络共享</string>
+ <string name="pref_transparent_tethering_summary">对 Wifi 和 USB 链接设备启用透明代理(需要重新启动)</string>
+ <string name="button_grant_superuser">请求 ROOT 权限</string>
+ <string name="pref_select_apps">选择应用程序</string>
+ <string name="pref_select_apps_summary">选择通过 Tor 连接网络的应用程序</string>
+ <string name="pref_node_configuration">节点配置</string>
+ <string name="pref_node_configuration_summary">这些高级设置会降低您的匿名度</string>
+ <string name="pref_entrance_node">入口节点</string>
+ <string name="pref_entrance_node_summary">用于进行首次跳转的“密匙指纹,昵称,国家和地址”</string>
+ <string name="pref_entrance_node_dialog">输入入口节点</string>
+ <!--<string name="pref_use_whispercore">Use WhisperCore</string>
+<string name="pref_use_whispercore_summary">Use the proprietary NetFilter APIs provided by WhisperSystems (required device with WhisperCore installed)</string>-->
+ <string name="pref_proxy_title">出站网络代理</string>
+ <string name="pref_proxy_type_title">出站代理类型</string>
+ <string name="pref_proxy_type_summary">代理服务器使用的协议:\n\nHTTP,HTTPS,Socks4,Socks5</string>
+ <string name="pref_proxy_type_dialog">输入代理类型</string>
+ <string name="pref_proxy_host_title">出站代理主机</string>
+ <string name="pref_proxy_host_summary">代理服务器主机名</string>
+ <string name="pref_proxy_host_dialog">输入代理主机</string>
+ <string name="pref_proxy_port_title">出站代理端口</string>
+ <string name="pref_proxy_port_summary">代理服务器端口</string>
+ <string name="pref_proxy_port_dialog">输入代理端口</string>
+ <string name="status">状态</string>
+ <string name="setting_up_full_transparent_proxying_">正在设置所有应用程序的透明代理...</string>
+ <string name="setting_up_app_based_transparent_proxying_">正在设置所选应用程序的透明代理...</string>
+ <string name="transparent_proxying_enabled">透明代理已启用</string>
+ <string name="transproxy_enabled_for_tethering_">已对网络共享启用透明代理!</string>
+ <string name="warning_error_starting_transparent_proxying_">警告:启动透明代理时发生错误!</string>
+ <string name="transproxy_rules_cleared">已清除透明代理规则</string>
+ <string name="couldn_t_start_tor_process_">无法启动 Tor 进程:</string>
+ <string name="privoxy_is_running_on_port_">正在启动代理端口:</string>
+ <string name="setting_up_port_based_transparent_proxying_">正在设置所选应用程序的透明代理...</string>
+ <string name="bridge_error">网桥错误</string>
+ <string name="bridge_requires_ip">要使用网桥功能,您至少需要输入一个网桥的 IP 地址。</string>
+ <string name="send_email_for_bridges">请使用自己的邮箱账号发送文字 \\"get bridges\\" 到邮箱 bridges(a)torproject.org 来获取网桥地址。</string>
+ <string name="error">错误</string>
+ <string name="your_reachableaddresses_settings_caused_an_exception_">您的可访问地址设置导致了一个意外!</string>
+ <string name="your_relay_settings_caused_an_exception_">您的中继设置导致了一个意外!</string>
+ <string name="exit_nodes">出口节点</string>
+ <string name="fingerprints_nicks_countries_and_addresses_for_the_last_hop">用于进行最后跳转的“密匙指纹,昵称,国家和地址”</string>
+ <string name="enter_exit_nodes">输入出口节点</string>
+ <string name="exclude_nodes">排除节点</string>
+ <string name="fingerprints_nicks_countries_and_addresses_to_exclude">需要排除的“密匙指纹,昵称,国家和地址”</string>
+ <string name="enter_exclude_nodes">输入排除节点</string>
+ <string name="strict_nodes">锁定节点</string>
+ <string name="use_only_these_specified_nodes">只使用指定的节点</string>
+ <string name="bridges">网桥</string>
+ <string name="use_bridges">使用网桥</string>
+ <string name="bridges_obfuscated">模糊网桥</string>
+ <string name="enable_alternate_entrance_nodes_into_the_tor_network">使用备用入口节点连接到 Tor 网络</string>
+ <string name="enable_if_configured_bridges_are_obfuscated_bridges">如果配置的网桥是模糊网桥就请启用</string>
+ <string name="ip_address_and_port_of_bridges">网桥的 IP 地址和端口</string>
+ <string name="enter_bridge_addresses">输入网桥地址</string>
+ <string name="relays">中继</string>
+ <string name="relaying">中继</string>
+ <string name="enable_your_device_to_be_a_non_exit_relay">启用您的设备作为一个常驻中继</string>
+ <string name="relay_port">中继端口</string>
+ <string name="listening_port_for_your_tor_relay">您的 Tor 中继的侦听端口</string>
+ <string name="enter_or_port">输入 OR 端口</string>
+ <string name="relay_nickname">中继昵称</string>
+ <string name="the_nickname_for_your_tor_relay">您的 Tor 中继的昵称</string>
+ <string name="enter_a_custom_relay_nickname">输入一个喜欢的中继昵称</string>
+ <string name="reachable_addresses">可访问地址</string>
+ <string name="run_as_a_client_behind_a_firewall_with_restrictive_policies">防火墙对运行的客户端使用了限制策略</string>
+ <string name="reachable_ports">可访问端口</string>
+ <string name="ports_reachable_behind_a_restrictive_firewall">防火墙限定的可访问端口</string>
+ <string name="enter_ports">输入端口</string>
+ <string name="enable_hidden_services">〖隐藏服务〗主机</string>
+ <string name="run_servers_accessible_via_the_tor_network">允许打开的设备作为服务器接入 Tor 网络</string>
+ <string name="enter_localhost_ports_for_hidden_services">输入〖隐藏服务〗的本地主机端口</string>
+ <string name="hidden_service_ports">〖隐藏服务〗端口</string>
+ <string name="the_addressable_name_for_your_hidden_service_generated_automatically_">您的〖隐藏服务〗主机的可访问地址名称(自动生成)</string>
+ <string name="enable_debug_log_to_output_must_use_adb_or_alogcat_to_view_">启用调试日志输出(需要 adb 或 aLongCat 来查看)</string>
+ <string name="project_home">产品主页(s):</string>
+ <string name="project_urls">https://www.torproject.org/docs/android\nhttps://guardianproject.info/apps/…</string>
+ <string name="the_tor_license">Tor 许可证</string>
+ <string name="https_torproject_org">https://torproject.org</string>
+ <string name="third_party_software">第3方软件:</string>
+ <string name="tor_version">Tor v0.2.4.3-alpha: https://www.torproject.org</string>
+ <string name="libevent_version">LibEvent v2.1.1-alpha: http://www.monkey.org/~provos/libevent/</string>
+ <string name="privoxy_version">Privoxy v3.0.12: http://www.privoxy.org</string>
+ <string name="iptables_version">Iptables v1.4.7: http://www.netfilter.org</string>
+ <string name="openssl_version">OpenSSL v0.9.8h: http://www.openssl.org</string>
+ <string name="hidden_service_request">一个应用程序试图打开〖隐藏服务〗主机的端口 %S 连接到 Tor 网络。如果您信任此应用程序那就应该是安全的。</string>
+ <string name="found_existing_tor_process">查找当前 Tor 进程...</string>
+ <string name="something_bad_happened">发生某些错误,请检查日志。</string>
+ <string name="hidden_service_on">隐藏服务打开:</string>
+ <string name="unable_to_read_hidden_service_name">无法读取隐藏服务主机名称</string>
+ <string name="unable_to_start_tor">无法启动 Tor:</string>
+ <string name="pref_use_sys_iptables_title">使用默认 Iptables</string>
+ <string name="pref_use_sys_iptables_summary">使用内置的 Iptables 程序替代 Orbot 的绑定设置</string>
+ <string name="error_installing_binares">无法安装或更新 Tor 程序。</string>
+ <string name="pref_use_persistent_notifications">Orbot 连接后始终在通知栏显示图标</string>
+ <string name="pref_use_persistent_notifications_title">始终显示通知</string>
+ <string name="notification_using_bridges">已启用网桥</string>
+ <string name="default_bridges"/>
+ <string name="set_locale_title">选择语言</string>
+ <string name="set_locale_summary">选择 Orbot 使用的本地区语言</string>
+ <string name="wizard_locale_title">选择语言</string>
+ <string name="wizard_locale_msg">保持默认或切换为本地区语言</string>
+ <string name="powered_by">由 Tor 项目强力驱动</string>
+ <string name="btn_save_settings">保存设置</string>
+</resources>
1
0
25 Oct '12
commit 5a07181ece166bac24c05834fa0069df3ddaf780
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Oct 25 17:45:05 2012 +0000
Update translations for orbot
---
values-zh/strings.xml | 16 ++++++++++++++--
1 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/values-zh/strings.xml b/values-zh/strings.xml
index 7635a94..2428e2a 100644
--- a/values-zh/strings.xml
+++ b/values-zh/strings.xml
@@ -25,6 +25,8 @@
<string name="menu_stop">停止</string>
<string name="menu_about">关于</string>
<string name="menu_wizard">向导</string>
+ <string name="main_layout_download">下载</string>
+ <string name="main_layout_upload">上传</string>
<string name="button_help">帮助</string>
<string name="button_close">关闭</string>
<string name="button_about">关于</string>
@@ -32,13 +34,13 @@
<string name="menu_verify">检查</string>
<string name="menu_exit">退出</string>
<string name="press_to_start">- 长按开始启动 -</string>
- <string name="pref_trans_proxy_group">透明代理(需要 ROOT 权限)</string>
+ <string name="pref_trans_proxy_group">透明代理(需要 ROOT 权限)</string>
<string name="pref_trans_proxy_title">透明代理</string>
<string name="pref_trans_proxy_summary">启用后可以自动对应用程序进行代理配置</string>
<string name="pref_transparent_all_title">所有应用程序</string>
<string name="pref_transparent_all_summary">所有应用程序都通过 Tor 连接网络</string>
<string name="pref_transparent_port_fallback_title">备用代理端口</string>
- <string name="pref_transparent_port_fallback_summary">警告:这会避开常用的端口(80、443 等)。如果【所有应用程序】或【选择应用程序】模式都不能正常工作,请启用【锁定节点】模式。</string>
+ <string name="pref_transparent_port_fallback_summary">警告:这会避开常用的端口(80、443 等)。如果【所有应用程序】或【选择应用程序】模式都不能正常工作,请启用【锁定节点】模式。</string>
<string name="pref_transparent_port_title">端口列表</string>
<string name="pref_transparent_port_summary">代理端口列表。如果【所有应用程序】或【选择应用程序】模式都不能正常工作,请启用【锁定节点】模式。</string>
<string name="pref_transparent_port_dialog">输入代理端口</string>
@@ -72,6 +74,12 @@
<string name="wizard_tips_msg">下面的应用程序是针对 Orbot 开发的。您可以点击下面的按钮进行安装或到 Google Play 商店、\nGuardianProject.info 网站和通过 F-Droid.org 进行查找。</string>
<string name="wizard_tips_otrchat">Gibberbot - Android 上安全的即时通讯客户端</string>
<string name="wizard_tips_proxy">代理设置 - 学习如何配置应用程序来使之与 Orbot 协同工作</string>
+ <string name="wizard_tips_duckgo">DuckDuckGo 搜索引擎:注重隐私保护的综合搜索引擎,它不会记录用户的个人信息。</string>
+ <string name="duckgo_apk_url">https://duckduckgo.com/android/latest.apk</string>
+ <string name="wizard_tips_firefox">Firefox 移动客户端代理插件</string>
+ <string name="proxymob_setup_url">https://guardianproject.info/releases/proxymob-latest.xpi</string>
+ <string name="wizard_tips_twitter">Twitter 的代理设置为主机:localhost ,端口:8118 。</string>
+ <string name="twitter_setup_url">https://guardianproject.info/2012/05/02/orbot-your-twitter/</string>
<string name="wizard_proxy_help_info">代理设置</string>
<string name="wizard_proxy_help_msg">如果您正在使用的 Android 应用程序支持使用 HTTP 或 SOCKS 代理,那么您可以将它与 Orbot 进行关联配置后再使用 Tor。\n\n\n 主机设置为 127.0.0.1 或 localhost。对于 HTTP,端口应设置为 8118;对于 SOCKS,端口应设置为 9050。如果有可能您应该尽量使用 SOCKS4A 或 SOCKS5 代理。\n \n\n\n 您可以在 http://tinyurl.com/proxyandroid 的 FAQ(常见问题)中了解更多在 Android 上使用代理的知识。</string>
<string name="wizard_final">Orbot 已就绪!</string>
@@ -100,6 +108,8 @@
<string name="gibberbot_apk_url">https://guardianproject.info/releases/gibberbot-latest.apk</string>
<string name="wizard_tips_orweb">Orweb:可以通过 Tor 进行工作的能保护隐私的浏览器</string>
<string name="orweb_apk_url">https://guardianproject.info/releases/orweb-latest.xpi</string>
+ <string name="wizard_tips_play">在 Google Play 商店查找所有基于 Guardian Project 的应用程序</string>
+ <string name="wizard_tips_play_url">https://play.google.com/store/search?q=guardianproject</string>
<!--<string name="wizard_tips_firefox">Firefox - Android browser - To be used along with ProxyMob Add-on </string>
<string name="wizard_tips_proxymob">ProxyMob - Simple Firefox Add-on for setting HTTP, SOCKS and SSL proxy settings</string>
<string name="firefox_apk_url">https://market.android.com/details?id=org.mozilla.firefox</string>
@@ -121,6 +131,7 @@
<string name="pref_entrance_node_dialog">输入入口节点</string>
<!--<string name="pref_use_whispercore">Use WhisperCore</string>
<string name="pref_use_whispercore_summary">Use the proprietary NetFilter APIs provided by WhisperSystems (required device with WhisperCore installed)</string>-->
+ <string name="pref_proxy_title">出站网络代理</string>
<string name="pref_proxy_type_title">出站代理类型</string>
<string name="pref_proxy_type_summary">代理服务器使用的协议:\n\nHTTP,HTTPS,Socks4,Socks5</string>
<string name="pref_proxy_type_dialog">输入代理类型</string>
@@ -209,4 +220,5 @@
<string name="wizard_locale_title">选择语言</string>
<string name="wizard_locale_msg">保持默认或切换为本地区语言</string>
<string name="powered_by">由 Tor 项目强力驱动</string>
+ <string name="btn_save_settings">保存设置</string>
</resources>
1
0
25 Oct '12
commit abb25210ec46a2e026633e21ec47f1ffe4685d25
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Oct 25 17:15:05 2012 +0000
Update translations for orbot
---
values-zh/strings.xml | 95 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 94 insertions(+), 1 deletions(-)
diff --git a/values-zh/strings.xml b/values-zh/strings.xml
index db61c14..7635a94 100644
--- a/values-zh/strings.xml
+++ b/values-zh/strings.xml
@@ -85,12 +85,18 @@
<string name="pref_start_boot_summary">当您的 Android 设备开机时自动启动 Orbot 并连接到 Tor 网络</string>
<!--New Wizard Strings-->
<!--Title Screen-->
- <string name="wizard_title_msg">Orbot 已将 Tor 引入 Android!\n\n\nTor 可以帮助您绕过内容过滤、抵御通讯分析和防范那些威胁到隐私(个人信息和人际关系)的网络监控行为。\n\n\n此向导将帮助您在您的设备上配置 Orbot 和 Tor 。</string>
+ <string name="wizard_title_msg">Orbot 已将 Tor 引入 Android!\n\n\nTor 可以帮助您绕过内容过滤、抵御通讯分析和防范那些威胁个人信息和人际关系等隐私的网络监控行为。\n\n\n此向导将帮助您在您的设备上配置 Orbot 和 Tor 。</string>
<!--Warning screen-->
<string name="wizard_warning_title">警告</string>
+ <string name="wizard_warning_msg">只简单地安装 Orbot 并不能自动隐匿您的移动网络通讯。\n\n\n您必需正确配置 Orbot 后您的设备和其它应用程序才能成功使用 Tor 。</string>
<!--Permissions screen-->
<string name="wizard_permissions_title">权限</string>
+ <string name="wizard_permissions_root_msg1">您可以让【Superuser】允许 Orbot 获取 ROOT 权限以便启用高级功能,例如透明代理。</string>
+ <string name="wizard_permissions_root_msg2">如果您不想这样做,请确保使用的应用程序能与 Orbot 协同工作。</string>
+ <string name="wizard_permissions_no_root_msg">您的设备似乎没有 ROOT 权限或未让【Superuser】允许 Tor 获取 ROOT 权限。\n\n\n要让 Tor 为您提供帮助,您必须使应用程序能和 Orbot 一起协同工作或设置好它们的 HTTP 和 SOCKS 代理。\n\n</string>
<!--TipsAndTricks screen-->
+ <string name="wizard_tips_title">Orbot 支持的应用</string>
+ <string name="wizard_tips_gibberbot">Gibberbot:可以加密聊天记录的安全聊天应用程序</string>
<string name="gibberbot_apk_url">https://guardianproject.info/releases/gibberbot-latest.apk</string>
<string name="wizard_tips_orweb">Orweb:可以通过 Tor 进行工作的能保护隐私的浏览器</string>
<string name="orweb_apk_url">https://guardianproject.info/releases/orweb-latest.xpi</string>
@@ -99,21 +105,108 @@
<string name="firefox_apk_url">https://market.android.com/details?id=org.mozilla.firefox</string>
<string name="proxymob_url">https://addons.mozilla.org/mobile/downloads/latest/251558/type:attachment/a…</string>-->
<!--Transparent Proxy screen-->
+ <string name="wizard_transproxy_title">透明代理</string>
+ <string name="wizard_transproxy_msg">这可以使您的应用程序无需进行任何配置就能自动通过 Tor 连接网络</string>
+ <string name="wizard_transproxy_hint">(如果您不明白我们所说的问题就请选中此项好了)</string>
+ <string name="wizard_transproxy_none">不使用</string>
+ <string name="pref_transparent_tethering_title">Tor 网络共享</string>
+ <string name="pref_transparent_tethering_summary">对 Wifi 和 USB 链接设备启用透明代理(需要重新启动)</string>
+ <string name="button_grant_superuser">请求 ROOT 权限</string>
+ <string name="pref_select_apps">选择应用程序</string>
+ <string name="pref_select_apps_summary">选择通过 Tor 连接网络的应用程序</string>
+ <string name="pref_node_configuration">节点配置</string>
+ <string name="pref_node_configuration_summary">这些高级设置会降低您的匿名度</string>
+ <string name="pref_entrance_node">入口节点</string>
+ <string name="pref_entrance_node_summary">用于进行首次跳转的“密匙指纹,昵称,国家和地址”</string>
+ <string name="pref_entrance_node_dialog">输入入口节点</string>
<!--<string name="pref_use_whispercore">Use WhisperCore</string>
<string name="pref_use_whispercore_summary">Use the proprietary NetFilter APIs provided by WhisperSystems (required device with WhisperCore installed)</string>-->
+ <string name="pref_proxy_type_title">出站代理类型</string>
+ <string name="pref_proxy_type_summary">代理服务器使用的协议:\n\nHTTP,HTTPS,Socks4,Socks5</string>
+ <string name="pref_proxy_type_dialog">输入代理类型</string>
+ <string name="pref_proxy_host_title">出站代理主机</string>
+ <string name="pref_proxy_host_summary">代理服务器主机名</string>
+ <string name="pref_proxy_host_dialog">输入代理主机</string>
+ <string name="pref_proxy_port_title">出站代理端口</string>
+ <string name="pref_proxy_port_summary">代理服务器端口</string>
+ <string name="pref_proxy_port_dialog">输入代理端口</string>
<string name="status">状态</string>
+ <string name="setting_up_full_transparent_proxying_">正在设置所有应用程序的透明代理...</string>
+ <string name="setting_up_app_based_transparent_proxying_">正在设置所选应用程序的透明代理...</string>
+ <string name="transparent_proxying_enabled">透明代理已启用</string>
+ <string name="transproxy_enabled_for_tethering_">已对网络共享启用透明代理!</string>
+ <string name="warning_error_starting_transparent_proxying_">警告:启动透明代理时发生错误!</string>
+ <string name="transproxy_rules_cleared">已清除透明代理规则</string>
+ <string name="couldn_t_start_tor_process_">无法启动 Tor 进程:</string>
+ <string name="privoxy_is_running_on_port_">正在启动代理端口:</string>
+ <string name="setting_up_port_based_transparent_proxying_">正在设置所选应用程序的透明代理...</string>
<string name="bridge_error">网桥错误</string>
+ <string name="bridge_requires_ip">要使用网桥功能,您至少需要输入一个网桥的 IP 地址。</string>
+ <string name="send_email_for_bridges">请使用自己的邮箱账号发送文字 \\"get bridges\\" 到邮箱 bridges(a)torproject.org 来获取网桥地址。</string>
<string name="error">错误</string>
+ <string name="your_reachableaddresses_settings_caused_an_exception_">您的可访问地址设置导致了一个意外!</string>
+ <string name="your_relay_settings_caused_an_exception_">您的中继设置导致了一个意外!</string>
+ <string name="exit_nodes">出口节点</string>
+ <string name="fingerprints_nicks_countries_and_addresses_for_the_last_hop">用于进行最后跳转的“密匙指纹,昵称,国家和地址”</string>
+ <string name="enter_exit_nodes">输入出口节点</string>
+ <string name="exclude_nodes">排除节点</string>
+ <string name="fingerprints_nicks_countries_and_addresses_to_exclude">需要排除的“密匙指纹,昵称,国家和地址”</string>
+ <string name="enter_exclude_nodes">输入排除节点</string>
+ <string name="strict_nodes">锁定节点</string>
+ <string name="use_only_these_specified_nodes">只使用指定的节点</string>
<string name="bridges">网桥</string>
<string name="use_bridges">使用网桥</string>
+ <string name="bridges_obfuscated">模糊网桥</string>
+ <string name="enable_alternate_entrance_nodes_into_the_tor_network">使用备用入口节点连接到 Tor 网络</string>
+ <string name="enable_if_configured_bridges_are_obfuscated_bridges">如果配置的网桥是模糊网桥就请启用</string>
<string name="ip_address_and_port_of_bridges">网桥的 IP 地址和端口</string>
+ <string name="enter_bridge_addresses">输入网桥地址</string>
+ <string name="relays">中继</string>
+ <string name="relaying">中继</string>
+ <string name="enable_your_device_to_be_a_non_exit_relay">启用您的设备作为一个常驻中继</string>
+ <string name="relay_port">中继端口</string>
+ <string name="listening_port_for_your_tor_relay">您的 Tor 中继的侦听端口</string>
+ <string name="enter_or_port">输入 OR 端口</string>
+ <string name="relay_nickname">中继昵称</string>
+ <string name="the_nickname_for_your_tor_relay">您的 Tor 中继的昵称</string>
+ <string name="enter_a_custom_relay_nickname">输入一个喜欢的中继昵称</string>
+ <string name="reachable_addresses">可访问地址</string>
+ <string name="run_as_a_client_behind_a_firewall_with_restrictive_policies">防火墙对运行的客户端使用了限制策略</string>
+ <string name="reachable_ports">可访问端口</string>
+ <string name="ports_reachable_behind_a_restrictive_firewall">防火墙限定的可访问端口</string>
+ <string name="enter_ports">输入端口</string>
+ <string name="enable_hidden_services">〖隐藏服务〗主机</string>
+ <string name="run_servers_accessible_via_the_tor_network">允许打开的设备作为服务器接入 Tor 网络</string>
+ <string name="enter_localhost_ports_for_hidden_services">输入〖隐藏服务〗的本地主机端口</string>
+ <string name="hidden_service_ports">〖隐藏服务〗端口</string>
+ <string name="the_addressable_name_for_your_hidden_service_generated_automatically_">您的〖隐藏服务〗主机的可访问地址名称(自动生成)</string>
+ <string name="enable_debug_log_to_output_must_use_adb_or_alogcat_to_view_">启用调试日志输出(需要 adb 或 aLongCat 来查看)</string>
+ <string name="project_home">产品主页(s):</string>
<string name="project_urls">https://www.torproject.org/docs/android\nhttps://guardianproject.info/apps/…</string>
<string name="the_tor_license">Tor 许可证</string>
<string name="https_torproject_org">https://torproject.org</string>
+ <string name="third_party_software">第3方软件:</string>
<string name="tor_version">Tor v0.2.4.3-alpha: https://www.torproject.org</string>
+ <string name="libevent_version">LibEvent v2.1.1-alpha: http://www.monkey.org/~provos/libevent/</string>
<string name="privoxy_version">Privoxy v3.0.12: http://www.privoxy.org</string>
<string name="iptables_version">Iptables v1.4.7: http://www.netfilter.org</string>
<string name="openssl_version">OpenSSL v0.9.8h: http://www.openssl.org</string>
+ <string name="hidden_service_request">一个应用程序试图打开〖隐藏服务〗主机的端口 %S 连接到 Tor 网络。如果您信任此应用程序那就应该是安全的。</string>
+ <string name="found_existing_tor_process">查找当前 Tor 进程...</string>
+ <string name="something_bad_happened">发生某些错误,请检查日志。</string>
+ <string name="hidden_service_on">隐藏服务打开:</string>
+ <string name="unable_to_read_hidden_service_name">无法读取隐藏服务主机名称</string>
+ <string name="unable_to_start_tor">无法启动 Tor:</string>
+ <string name="pref_use_sys_iptables_title">使用默认 Iptables</string>
+ <string name="pref_use_sys_iptables_summary">使用内置的 Iptables 程序替代 Orbot 的绑定设置</string>
+ <string name="error_installing_binares">无法安装或更新 Tor 程序。</string>
+ <string name="pref_use_persistent_notifications">Orbot 连接后始终在通知栏显示图标</string>
+ <string name="pref_use_persistent_notifications_title">始终显示通知</string>
+ <string name="notification_using_bridges">已启用网桥</string>
<string name="default_bridges"/>
+ <string name="set_locale_title">选择语言</string>
+ <string name="set_locale_summary">选择 Orbot 使用的本地区语言</string>
+ <string name="wizard_locale_title">选择语言</string>
+ <string name="wizard_locale_msg">保持默认或切换为本地区语言</string>
<string name="powered_by">由 Tor 项目强力驱动</string>
</resources>
1
0