tor-commits
Threads by month
- ----- 2025 -----
- 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
February 2014
- 23 participants
- 1529 discussions

[translation/tails-greeter_completed] Update translations for tails-greeter_completed
by translation@torproject.org 24 Feb '14
by translation@torproject.org 24 Feb '14
24 Feb '14
commit 4a1bcd9d55071153eb8e7f412976968294ed58c6
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Feb 24 14:45:27 2014 +0000
Update translations for tails-greeter_completed
---
fa/fa.po | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fa/fa.po b/fa/fa.po
index 07f61e2..4d3a15b 100644
--- a/fa/fa.po
+++ b/fa/fa.po
@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-02-21 19:40+0100\n"
-"PO-Revision-Date: 2014-02-24 13:15+0000\n"
+"PO-Revision-Date: 2014-02-24 14:29+0000\n"
"Last-Translator: desmati <desmati(a)gmail.com>\n"
"Language-Team: Persian (http://www.transifex.com/projects/p/torproject/language/fa/)\n"
"MIME-Version: 1.0\n"
1
0

[translation/tails-greeter] Update translations for tails-greeter
by translation@torproject.org 24 Feb '14
by translation@torproject.org 24 Feb '14
24 Feb '14
commit 49d9f6a6f29d271866eb73caa74570b2fc6a020c
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Feb 24 14:45:23 2014 +0000
Update translations for tails-greeter
---
fa/fa.po | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/fa/fa.po b/fa/fa.po
index cae9946..4d3a15b 100644
--- a/fa/fa.po
+++ b/fa/fa.po
@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-02-21 19:40+0100\n"
-"PO-Revision-Date: 2014-02-24 13:14+0000\n"
+"PO-Revision-Date: 2014-02-24 14:29+0000\n"
"Last-Translator: desmati <desmati(a)gmail.com>\n"
"Language-Team: Persian (http://www.transifex.com/projects/p/torproject/language/fa/)\n"
"MIME-Version: 1.0\n"
@@ -129,11 +129,11 @@ msgstr "جعل کردن آدرس مک، شماره سریال کارت شبکه
msgid ""
"It is generally safer to spoof MAC addresses, but it might also raise "
"suspicion or cause network connection problems. See the documentation."
-msgstr ""
+msgstr "اگر آدرس مک را جعل کنید، خیلی امن تر است، اما ممکن است شک برانگیز باشد و یا مشکلاتی در اتصال به اینترنت ایجاد کند. به مستندات مراجعه کنید."
#: ../glade/optionswindow.glade.h:18
msgid "Spoof all MAC addresses"
-msgstr ""
+msgstr "همه آدرس های مک را جعل کن"
#: ../glade/langpanel.glade.h:1
msgid " "
1
0

[translation/tails-greeter_completed] Update translations for tails-greeter_completed
by translation@torproject.org 24 Feb '14
by translation@torproject.org 24 Feb '14
24 Feb '14
commit 248c18a96506de8914b736796ddc791d69dde990
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Feb 24 13:45:25 2014 +0000
Update translations for tails-greeter_completed
---
fa/fa.po | 69 +++++++++++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 55 insertions(+), 14 deletions(-)
diff --git a/fa/fa.po b/fa/fa.po
index 18e89e6..07f61e2 100644
--- a/fa/fa.po
+++ b/fa/fa.po
@@ -3,14 +3,15 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# desmati <desmati(a)gmail.com>, 2014
# zendegi <hamahangi(a)posteo.eu>, 2013
msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-29 14:26+0100\n"
-"PO-Revision-Date: 2014-02-19 09:01+0000\n"
-"Last-Translator: runasand <runa.sandvik(a)gmail.com>\n"
+"POT-Creation-Date: 2014-02-21 19:40+0100\n"
+"PO-Revision-Date: 2014-02-24 13:15+0000\n"
+"Last-Translator: desmati <desmati(a)gmail.com>\n"
"Language-Team: Persian (http://www.transifex.com/projects/p/torproject/language/fa/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -35,26 +36,30 @@ msgid "Use persistence?"
msgstr "تداوم دادهها بكار بردن؟"
#: ../glade/persistencewindow.glade.h:5
+msgid "<a href=\"doc/first_steps/persistence/use.en.html\">Help</a>"
+msgstr "<a href=\"doc/first_steps/persistence/use.en.html\">راهنما</a>"
+
+#: ../glade/persistencewindow.glade.h:6
msgid "Yes"
msgstr "بلى"
-#: ../glade/persistencewindow.glade.h:6
+#: ../glade/persistencewindow.glade.h:7
msgid "No"
msgstr "نه"
-#: ../glade/persistencewindow.glade.h:7
+#: ../glade/persistencewindow.glade.h:8
msgid "Passphrase:"
msgstr "عبارت عبور"
-#: ../glade/persistencewindow.glade.h:8
+#: ../glade/persistencewindow.glade.h:9
msgid "Read-Only?"
msgstr "فقط خواندنى؟"
-#: ../glade/persistencewindow.glade.h:9
+#: ../glade/persistencewindow.glade.h:10
msgid "<i>Wrong passphrase. Please try again.</i>"
msgstr "<i>عبارت عبور درست نیست. لطفاً دوباره سعیکنید.</i>"
-#: ../glade/persistencewindow.glade.h:10
+#: ../glade/persistencewindow.glade.h:11
msgid "More options?"
msgstr "گزینههای بیشتری؟"
@@ -64,36 +69,72 @@ msgstr "رمز عبور مديريت"
#: ../glade/optionswindow.glade.h:4
msgid ""
+"<a "
+"href=\"doc/first_steps/startup_options/administration_password.en.html\">Help</a>"
+msgstr "<a href=\"doc/first_steps/startup_options/administration_password.en.html\">راهنما</a>"
+
+#: ../glade/optionswindow.glade.h:5
+msgid ""
"Enter an administration password in case you need to perform administration tasks.\n"
"Otherwise it will be disabled for better security."
msgstr "لطفاً رمز عبور مديريتى واردكنيد، در صورتى كه لازماست كارهاى مديريت انجام بدهيد.\nوگرنه، اين گزينه براى امنيت بيشتر غيرفعال مىشود."
-#: ../glade/optionswindow.glade.h:6
+#: ../glade/optionswindow.glade.h:7
msgid "Password:"
msgstr "رمز عبور"
-#: ../glade/optionswindow.glade.h:7
+#: ../glade/optionswindow.glade.h:8
msgid "Verify Password:"
msgstr "تاييد رمز عبور"
-#: ../glade/optionswindow.glade.h:8
+#: ../glade/optionswindow.glade.h:9
msgid "<i>Passwords do not match</i>"
msgstr "<i>رمزهاى عبور با هم مطابقت ندارند</i>"
-#: ../glade/optionswindow.glade.h:9
+#: ../glade/optionswindow.glade.h:10
msgid "Windows Camouflage"
msgstr "پوشش ویندوز"
-#: ../glade/optionswindow.glade.h:10
+#: ../glade/optionswindow.glade.h:11
+msgid ""
+"<a "
+"href=\"doc/first_steps/startup_options/windows_camouflage.en.html\">Help</a>"
+msgstr "<a href=\"doc/first_steps/startup_options/windows_camouflage.en.html\">راهنما</a>"
+
+#: ../glade/optionswindow.glade.h:12
msgid ""
"This option makes Tails look more like Microsoft Windows XP. This may be "
"useful in public places in order to avoid attracting suspicion."
msgstr "این گزینه کار میکند که تیلزرا بيشتر شابه مایکروسافت ویندوز اکس پی به نظر برسد. این گزینه شاید در محلات عامه به دردتان بخورد براى اين كه از ظن ديگران طفرهرويد."
-#: ../glade/optionswindow.glade.h:11
+#: ../glade/optionswindow.glade.h:13
msgid "Activate Microsoft Windows XP Camouflage"
msgstr "پوشش مايكروسافت ويندوز اكس پى فعالكردن"
+#: ../glade/optionswindow.glade.h:14
+msgid "MAC address spoofing"
+msgstr "جعل آدرس مک"
+
+#: ../glade/optionswindow.glade.h:15
+msgid "<a href=\"doc/advanced_topics/mac_changer.en.html\">Help</a>"
+msgstr "<a href=\"doc/advanced_topics/mac_changer.en.html\">راهنما</a>"
+
+#: ../glade/optionswindow.glade.h:16
+msgid ""
+"Spoofing MAC addresses hides the serial number of your network cards to the "
+"local networks. This can help you hide your geographical location."
+msgstr "جعل کردن آدرس مک، شماره سریال کارت شبکه شما را در شبکه مخفی می کند. به این ترتیب می توانید موقعیت جغرافیایی خود را پنهان کنید."
+
+#: ../glade/optionswindow.glade.h:17
+msgid ""
+"It is generally safer to spoof MAC addresses, but it might also raise "
+"suspicion or cause network connection problems. See the documentation."
+msgstr "اگر آدرس مک را جعل کنید، خیلی امن تر است، اما ممکن است شک برانگیز باشد و یا مشکلاتی در اتصال به اینترنت ایجاد کند. به مستندات مراجعه کنید."
+
+#: ../glade/optionswindow.glade.h:18
+msgid "Spoof all MAC addresses"
+msgstr "همه آدرس های مک را جعل کن"
+
#: ../glade/langpanel.glade.h:1
msgid " "
msgstr " "
1
0

[onionoo/master] Switch to using MaxMind's GeoLite2 city database.
by karsten@torproject.org 24 Feb '14
by karsten@torproject.org 24 Feb '14
24 Feb '14
commit c0f47f7896ebd1db2461e57dd0bca32238f0fb0d
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Fri Feb 21 20:03:48 2014 +0000
Switch to using MaxMind's GeoLite2 city database.
---
geoip/deanonymind.py | 228 ----------------------
geoip/geoip-manual | 91 ---------
src/org/torproject/onionoo/LookupService.java | 254 +++++++++----------------
3 files changed, 92 insertions(+), 481 deletions(-)
diff --git a/geoip/deanonymind.py b/geoip/deanonymind.py
deleted file mode 100755
index 1137031..0000000
--- a/geoip/deanonymind.py
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/usr/bin/env python
-import optparse
-import os
-import sys
-import zipfile
-
-"""
-Take a MaxMind GeoLite City blocks file as input and replace A1 entries
-with the block number of the preceding entry iff the preceding
-(subsequent) entry ends (starts) directly before (after) the A1 entry and
-both preceding and subsequent entries contain the same block number.
-
-Then apply manual changes, either replacing A1 entries that could not be
-replaced automatically or overriding previously made automatic changes.
-"""
-
-def main():
- options = parse_options()
- country_blocks = read_location_file(options.in_location)
- assignments = read_file(options.in_maxmind)
- assignments = apply_automatic_changes(assignments,
- options.block_number, country_blocks)
- write_file(options.out_automatic, assignments)
- manual_assignments = read_file(options.in_manual, must_exist=False)
- assignments = apply_manual_changes(assignments, manual_assignments,
- options.block_number)
- write_file(options.out_manual, assignments)
-
-def parse_options():
- parser = optparse.OptionParser()
- parser.add_option('-i', action='store', dest='in_maxmind',
- default='GeoLiteCity-Blocks.csv', metavar='FILE',
- help='use the specified MaxMind GeoLite City blocks .csv '
- 'file as input [default: %default]')
- parser.add_option('-l', action='store', dest='in_location',
- default='GeoLiteCity-Location.csv', metavar='FILE',
- help='use the specified MaxMind GeoLite City location .csv '
- 'file as input [default: %default]')
- parser.add_option('-b', action='store', dest='block_number',
- default=242, metavar='NUM',
- help='replace entries with this block number [default: '
- '%default]')
- parser.add_option('-g', action='store', dest='in_manual',
- default='geoip-manual', metavar='FILE',
- help='use the specified .csv file for manual changes or to '
- 'override automatic changes [default: %default]')
- parser.add_option('-a', action='store', dest='out_automatic',
- default="Automatic-GeoLiteCity-Blocks.csv", metavar='FILE',
- help='write full input file plus automatic changes to the '
- 'specified .csv file [default: %default]')
- parser.add_option('-m', action='store', dest='out_manual',
- default='Manual-GeoLiteCity-Blocks.csv', metavar='FILE',
- help='write full input file plus automatic and manual '
- 'changes to the specified .csv file [default: %default]')
- (options, args) = parser.parse_args()
- return options
-
-def read_location_file(path):
- if not os.path.exists(path):
- print 'File %s does not exist. Exiting.' % (path, )
- sys.exit(1)
- countries = {}
- country_blocks = {}
- for line in open(path):
- if line.startswith('C') or line.startswith('l'):
- continue
- keys = ['locId', 'country', 'region', 'city', 'postalCode',
- 'latitude', 'longitude', 'metroCode', 'areaCode']
- stripped_line = line.replace('"', '').strip()
- parts = stripped_line.split(',')
- entry = dict((k, v) for k, v in zip(keys, parts))
- if entry['region'] == '':
- countries[entry['country']] = entry['locId']
- country_blocks[entry['locId']] = entry['locId']
- elif entry['country'] in countries:
- country_blocks[entry['locId']] = countries[entry['country']]
- return country_blocks
-
-def read_file(path, must_exist=True):
- if not os.path.exists(path):
- if must_exist:
- print 'File %s does not exist. Exiting.' % (path, )
- sys.exit(1)
- else:
- return
- csv_file = open(path)
- csv_content = csv_file.read()
- csv_file.close()
- assignments = []
- for line in csv_content.split('\n'):
- stripped_line = line.strip()
- if len(stripped_line) > 0 and not stripped_line.startswith('#'):
- assignments.append(stripped_line)
- return assignments
-
-def apply_automatic_changes(assignments, block_number, country_blocks):
- print '\nApplying automatic changes...'
- result_lines = []
- prev_line = None
- a1_lines = []
- block_number_str = '"%d"' % (block_number, )
- for line in assignments:
- if block_number_str in line:
- a1_lines.append(line)
- else:
- if len(a1_lines) > 0:
- new_a1_lines = process_a1_lines(prev_line, a1_lines, line,
- country_blocks)
- for new_a1_line in new_a1_lines:
- result_lines.append(new_a1_line)
- a1_lines = []
- result_lines.append(line)
- prev_line = line
- if len(a1_lines) > 0:
- new_a1_lines = process_a1_lines(prev_line, a1_lines, None,
- country_blocks)
- for new_a1_line in new_a1_lines:
- result_lines.append(new_a1_line)
- return result_lines
-
-def process_a1_lines(prev_line, a1_lines, next_line, country_blocks):
- if not prev_line or not next_line:
- return a1_lines # Can't merge first or last line in file.
- if len(a1_lines) > 1:
- return a1_lines # Can't merge more than 1 line at once.
- a1_line = a1_lines[0].strip()
- prev_entry = parse_line(prev_line)
- a1_entry = parse_line(a1_line)
- next_entry = parse_line(next_line)
- touches_prev_entry = int(prev_entry['end_num']) + 1 == \
- int(a1_entry['start_num'])
- touches_next_entry = int(a1_entry['end_num']) + 1 == \
- int(next_entry['start_num'])
- same_block_number = prev_entry['block_number'] == \
- next_entry['block_number']
- same_country = country_blocks[prev_entry['block_number']] == \
- country_blocks[next_entry['block_number']]
- if touches_prev_entry and touches_next_entry:
- if same_block_number:
- new_line = format_line_with_other_country(a1_entry, prev_entry)
- print '-%s\n+%s' % (a1_line, new_line, )
- return [new_line]
- elif same_country:
- new_line = format_line_with_other_country_block(a1_entry,
- country_blocks[prev_entry['block_number']])
- print '-%s\n+%s' % (a1_line, new_line, )
- return [new_line]
- return a1_lines
-
-def parse_line(line):
- if not line:
- return None
- keys = ['start_num', 'end_num', 'block_number']
- stripped_line = line.replace('"', '').strip()
- parts = stripped_line.split(',')
- entry = dict((k, v) for k, v in zip(keys, parts))
- return entry
-
-def format_line_with_other_country(original_entry, other_entry):
- return '"%s","%s","%s"' % (original_entry['start_num'],
- original_entry['end_num'], other_entry['block_number'], )
-
-def format_line_with_other_country_block(original_entry, country_block):
- return '"%s","%s","%s"' % (original_entry['start_num'],
- original_entry['end_num'], country_block, )
-
-def apply_manual_changes(assignments, manual_assignments, block_number):
- if not manual_assignments:
- return assignments
- print '\nApplying manual changes...'
- block_number_str = '%d' % (block_number, )
- manual_dict = {}
- for line in manual_assignments:
- start_num = parse_line(line)['start_num']
- if start_num in manual_dict:
- print ('Warning: duplicate start number in manual '
- 'assignments:\n %s\n %s\nDiscarding first entry.' %
- (manual_dict[start_num], line, ))
- manual_dict[start_num] = line
- result = []
- for line in assignments:
- entry = parse_line(line)
- start_num = entry['start_num']
- if start_num in manual_dict:
- manual_line = manual_dict[start_num]
- manual_entry = parse_line(manual_line)
- if entry['end_num'] == manual_entry['end_num']:
- if len(manual_entry['block_number']) == 0:
- print '-%s' % (line, ) # only remove, don't replace
- del manual_dict[start_num]
- elif entry['block_number'] != manual_entry['block_number']:
- new_line = format_line_with_other_country(entry,
- manual_entry)
- print '-%s\n+%s' % (line, new_line, )
- result.append(new_line)
- del manual_dict[start_num]
- else:
- print ('Warning: automatic and manual replacement '
- 'already match:\n %s\n %s\nNot applying '
- 'manual change.' % (line, manual_line, ))
- result.append(line)
- else:
- print ('Warning: only partial match between '
- 'original/automatically replaced assignment and '
- 'manual assignment:\n %s\n %s\nNot applying '
- 'manual change.' % (line, manual_line, ))
- result.append(line)
- elif 'block_number' in entry and \
- entry['block_number'] == block_number_str:
- print ('Warning: no manual replacement for A1 entry:\n %s'
- % (line, ))
- result.append(line)
- else:
- result.append(line)
- if len(manual_dict) > 0:
- print 'Warning: could not apply all manual assignments:'
- for line in manual_dict.values():
- print ' %s' % (line, )
- return result
-
-def write_file(path, assignments):
- out_file = open(path, 'w')
- out_file.write('\n'.join(assignments))
- out_file.close()
-
-if __name__ == '__main__':
- main()
-
diff --git a/geoip/geoip-manual b/geoip/geoip-manual
deleted file mode 100644
index e174dde..0000000
--- a/geoip/geoip-manual
+++ /dev/null
@@ -1,91 +0,0 @@
-# This file contains manual overrides of A1 entries (and possibly others)
-# in MaxMind's GeoLite City database. Use deanonymind.py in the same
-# directory to process this file when producing a new geoip file. See
-# INSTALL for details.
-
-# GB, taken from GeoLite Country February database. -KL 2013-02-21
-"772808704","772810751","77"
-
-# From geoip-manual (country):
-# CH, because previous MaxMind entry 46.19.141.0-46.19.142.255 is CH, and
-# RIR delegation files say 46.19.136.0-46.19.143.255 is CH.
-# -KL 2012-11-27
-"773033728","773033983","44"
-
-# From geoip-manual (country):
-# GB, because next MaxMind entry 46.166.129.0-46.166.134.255 is GB, and
-# RIR delegation files say 46.166.128.0-46.166.191.255 is GB.
-# -KL 2012-11-27
-"782663680","782663935","77"
-
-# From geoip-manual (country):
-# US, because previous MaxMind entry 70.159.21.51-70.232.244.255 is US,
-# because next MaxMind entry 70.232.245.58-70.232.245.59 is A2 ("Satellite
-# Provider") which is a country information about as useless as A1, and
-# because RIR delegation files say 70.224.0.0-70.239.255.255 is US.
-# -KL 2012-11-27
-"1189672192","1189672249","223"
-
-# From geoip-manual (country):
-# US, because next MaxMind entry 70.232.246.0-70.240.141.255 is US,
-# because previous MaxMind entry 70.232.245.58-70.232.245.59 is A2
-# ("Satellite Provider") which is a country information about as useless
-# as A1, and because RIR delegation files say 70.224.0.0-70.239.255.255 is
-# US. -KL 2012-11-27
-"1189672252","1189672447","223"
-
-# From geoip-manual (country):
-# GB, despite neither previous (GE) nor next (LV) MaxMind entry being GB,
-# but because RIR delegation files agree with both previous and next
-# MaxMind entry and say GB for 91.228.0.0-91.228.3.255. -KL 2012-11-27
-"1541668864","1541669887","77"
-
-# NL, even though previous entry is CY, but because next entry is NL and
-# RIR says entire range 176.56.160.0-176.56.191.255 is NL. -KL 2013-05-13
-"2956504064","2956504319","161"
-
-# NL, even though previous entry is RU and next entry is GB, but because
-# RIR says entire range 176.56.160.0-176.56.191.255 is NL. -KL 2013-05-13
-"2956504576","2956504831","161"
-
-# GB, even though previous entry is NL and next entry is RU, but because
-# RIR says entire range 185.25.84.0-185.25.87.255 is GB. -KL 2013-05-13
-"3105444864","3105445887","77"
-
-# US, even though previous entry is MF, but because next entry is US and
-# RIR says entire range 199.101.192.0-199.101.199.255 is US. -KL 2013-05-13
-"3345334272","3345334527","223"
-
-# From geoip-manual (country):
-# US, because ARIN says 199.255.208.0-199.255.215.255 is US.
-# -KL 2013-07-08
-# Changed entry start from 199.255.213.0 to 199.255.208.0 on 2013-08-12.
-# -KL 2013-08-12
-# Split up into 199.255.208.0-199.255.209.127 and
-# 199.255.210.0-199.255.215.255 on 2013-10-11. -KL 2013-10-11
-"3355430912","3355431295","223"
-"3355431424","3355432959","223"
-
-# US, because previous entry is US, next entry is not adjacent, and RIR
-# says 204.14.72.0-204.14.79.255 is US. -KL 2013-05-13
-"3423488000","3423490047","223"
-
-# US, even though previous entry is CA, but because next entry is US and
-# RIR says entire range 204.12.160.0-204.12.191.255 is US. -KL 2013-05-13
-"3423379456","3423379967","223"
-
-# RU, even though next entry is SE and even though RIR says
-# 217.15.160.0-217.15.175.255 is EU (which isn't really a country), but
-# because previous entry is RU and RIR says 217.15.144.0-217.15.159.255 is
-# RU. -KL 2013-05-13
-"3641679872","3641681151","184"
-
-# From geoip-manual (country):
-# FR, because previous MaxMind entry 217.15.166.0-217.15.166.255 is FR,
-# and RIR delegation files contain a block 217.15.160.0-217.15.175.255
-# which, however, is EU, not FR. But merging with next MaxMind entry
-# 217.15.176.0-217.15.191.255 which is KZ and which fully matches what
-# the RIR delegation files say seems unlikely to be correct.
-# -KL 2012-11-27
-"3641681664","3641683967","75"
-
diff --git a/src/org/torproject/onionoo/LookupService.java b/src/org/torproject/onionoo/LookupService.java
index 43971b5..928a550 100644
--- a/src/org/torproject/onionoo/LookupService.java
+++ b/src/org/torproject/onionoo/LookupService.java
@@ -20,10 +20,8 @@ import java.util.regex.Pattern;
public class LookupService {
File geoipDir;
- File geoLiteCityBlocksCsvFile;
- File geoLiteCityLocationCsvFile;
- File iso3166CsvFile;
- File regionCsvFile;
+ File geoLite2CityBlocksCsvFile;
+ File geoLite2CityLocationsCsvFile;
File geoIPASNum2CsvFile;
private boolean hasAllFiles = false;
public LookupService(File geoipDir) {
@@ -33,34 +31,17 @@ public class LookupService {
/* Make sure we have all required .csv files. */
private void findRequiredCsvFiles() {
- File[] geoLiteCityBlocksCsvFiles = new File[] {
- new File(this.geoipDir, "Manual-GeoLiteCity-Blocks.csv"),
- new File(this.geoipDir, "Automatic-GeoLiteCity-Blocks.csv"),
- new File(this.geoipDir, "GeoLiteCity-Blocks.csv") };
- for (File file : geoLiteCityBlocksCsvFiles) {
- if (file.exists()) {
- this.geoLiteCityBlocksCsvFile = file;
- break;
- }
- }
- if (this.geoLiteCityBlocksCsvFile == null) {
- System.err.println("No *GeoLiteCity-Blocks.csv file in geoip/.");
- return;
- }
- this.geoLiteCityLocationCsvFile = new File(this.geoipDir,
- "GeoLiteCity-Location.csv");
- if (!this.geoLiteCityLocationCsvFile.exists()) {
- System.err.println("No GeoLiteCity-Location.csv file in geoip/.");
- return;
- }
- this.iso3166CsvFile = new File(this.geoipDir, "iso3166.csv");
- if (!this.iso3166CsvFile.exists()) {
- System.err.println("No iso3166.csv file in geoip/.");
+ this.geoLite2CityBlocksCsvFile = new File(this.geoipDir,
+ "GeoLite2-City-Blocks.csv");
+ if (!this.geoLite2CityBlocksCsvFile.exists()) {
+ System.err.println("No GeoLite2-City-Blocks.csv file in geoip/.");
return;
}
- this.regionCsvFile = new File(this.geoipDir, "region.csv");
- if (!this.regionCsvFile.exists()) {
- System.err.println("No region.csv file in geoip/.");
+ this.geoLite2CityLocationsCsvFile = new File(this.geoipDir,
+ "GeoLite2-City-Locations.csv");
+ if (!this.geoLite2CityLocationsCsvFile.exists()) {
+ System.err.println("No GeoLite2-City-Locations.csv file in "
+ + "geoip/.");
return;
}
this.geoIPASNum2CsvFile = new File(this.geoipDir, "GeoIPASNum2.csv");
@@ -71,6 +52,31 @@ public class LookupService {
this.hasAllFiles = true;
}
+ private Pattern ipv4Pattern = Pattern.compile("^[0-9\\.]{7,15}$");
+ private long parseAddressString(String addressString) {
+ long addressNumber = -1L;
+ if (ipv4Pattern.matcher(addressString).matches()) {
+ String[] parts = addressString.split("\\.", 4);
+ if (parts.length == 4) {
+ addressNumber = 0L;
+ for (int i = 0; i < 4; i++) {
+ addressNumber *= 256L;
+ int octetValue = -1;
+ try {
+ octetValue = Integer.parseInt(parts[i]);
+ } catch (NumberFormatException e) {
+ }
+ if (octetValue < 0 || octetValue > 255) {
+ addressNumber = -1L;
+ break;
+ }
+ addressNumber += octetValue;
+ }
+ }
+ }
+ return addressNumber;
+ }
+
public SortedMap<String, LookupResult> lookup(
SortedSet<String> addressStrings) {
@@ -83,28 +89,8 @@ public class LookupService {
/* Obtain a map from relay IP address strings to numbers. */
Map<String, Long> addressStringNumbers = new HashMap<String, Long>();
- Pattern ipv4Pattern = Pattern.compile("^[0-9\\.]{7,15}$");
for (String addressString : addressStrings) {
- long addressNumber = -1L;
- if (ipv4Pattern.matcher(addressString).matches()) {
- String[] parts = addressString.split("\\.", 4);
- if (parts.length == 4) {
- addressNumber = 0L;
- for (int i = 0; i < 4; i++) {
- addressNumber *= 256L;
- int octetValue = -1;
- try {
- octetValue = Integer.parseInt(parts[i]);
- } catch (NumberFormatException e) {
- }
- if (octetValue < 0 || octetValue > 255) {
- addressNumber = -1L;
- break;
- }
- addressNumber += octetValue;
- }
- }
- }
+ long addressNumber = this.parseAddressString(addressString);
if (addressNumber >= 0L) {
addressStringNumbers.put(addressString, addressNumber);
}
@@ -113,65 +99,57 @@ public class LookupService {
return lookupResults;
}
- /* Obtain a map from IP address numbers to blocks. */
+ /* Obtain a map from IP address numbers to blocks and to latitudes and
+ longitudes. */
Map<Long, Long> addressNumberBlocks = new HashMap<Long, Long>();
+ Map<Long, String[]> addressNumberLatLong =
+ new HashMap<Long, String[]>();
try {
SortedSet<Long> sortedAddressNumbers = new TreeSet<Long>(
addressStringNumbers.values());
- long firstAddressNumber = sortedAddressNumbers.first();
BufferedReader br = new BufferedReader(new InputStreamReader(
- new FileInputStream(geoLiteCityBlocksCsvFile), "ISO-8859-1"));
- String line;
- long previousStartIpNum = -1L;
+ new FileInputStream(geoLite2CityBlocksCsvFile), "ISO-8859-1"));
+ String line = br.readLine();
while ((line = br.readLine()) != null) {
- if (!line.startsWith("\"")) {
+ if (!line.startsWith("::ffff:")) {
+ /* TODO Make this less hacky and IPv6-ready at some point. */
continue;
}
- String[] parts = line.replaceAll("\"", "").split(",", 3);
- if (parts.length != 3) {
+ String[] parts = line.replaceAll("\"", "").split(",", 10);
+ if (parts.length != 10) {
System.err.println("Illegal line '" + line + "' in "
- + geoLiteCityBlocksCsvFile.getAbsolutePath() + ".");
+ + geoLite2CityBlocksCsvFile.getAbsolutePath() + ".");
br.close();
return lookupResults;
}
try {
- long startIpNum = Long.parseLong(parts[0]);
- if (startIpNum <= previousStartIpNum) {
- System.err.println("Line '" + line + "' not sorted in "
- + geoLiteCityBlocksCsvFile.getAbsolutePath() + ".");
+ String startAddressString = parts[0].substring(7); /* ::ffff: */
+ long startIpNum = this.parseAddressString(startAddressString);
+ int networkMaskLength = Integer.parseInt(parts[1]);
+ if (networkMaskLength < 96 || networkMaskLength > 128) {
+ System.err.println("Illegal network mask in '" + line
+ + "' in " + geoLite2CityBlocksCsvFile.getAbsolutePath()
+ + ".");
br.close();
return lookupResults;
}
- previousStartIpNum = startIpNum;
- while (firstAddressNumber < startIpNum &&
- firstAddressNumber != -1L) {
- sortedAddressNumbers.remove(firstAddressNumber);
- if (sortedAddressNumbers.isEmpty()) {
- firstAddressNumber = -1L;
- } else {
- firstAddressNumber = sortedAddressNumbers.first();
- }
+ long endIpNum = startIpNum + (1 << (128 - networkMaskLength))
+ - 1;
+ for (long addressNumber : sortedAddressNumbers.
+ tailSet(startIpNum).headSet(endIpNum + 1L)) {
+ String blockString = parts[2].length() > 0 ? parts[2] :
+ parts[3];
+ long blockNumber = Long.parseLong(blockString);
+ addressNumberBlocks.put(addressNumber, blockNumber);
+ String latitude = parts[6];
+ String longitude = parts[7];
+ addressNumberLatLong.put(addressNumber,
+ new String[] { latitude, longitude });
}
- long endIpNum = Long.parseLong(parts[1]);
- while (firstAddressNumber <= endIpNum &&
- firstAddressNumber != -1L) {
- long blockNumber = Long.parseLong(parts[2]);
- addressNumberBlocks.put(firstAddressNumber, blockNumber);
- sortedAddressNumbers.remove(firstAddressNumber);
- if (sortedAddressNumbers.isEmpty()) {
- firstAddressNumber = -1L;
- } else {
- firstAddressNumber = sortedAddressNumbers.first();
- }
- }
- if (firstAddressNumber == -1L) {
- break;
- }
- }
- catch (NumberFormatException e) {
+ } catch (NumberFormatException e) {
System.err.println("Number format exception while parsing line "
+ "'" + line + "' in "
- + geoLiteCityBlocksCsvFile.getAbsolutePath() + ".");
+ + geoLite2CityBlocksCsvFile.getAbsolutePath() + ".");
br.close();
return lookupResults;
}
@@ -179,7 +157,7 @@ public class LookupService {
br.close();
} catch (IOException e) {
System.err.println("I/O exception while reading "
- + geoLiteCityBlocksCsvFile.getAbsolutePath() + ".");
+ + geoLite2CityBlocksCsvFile.getAbsolutePath() + ".");
return lookupResults;
}
@@ -189,16 +167,14 @@ public class LookupService {
Set<Long> blockNumbers = new HashSet<Long>(
addressNumberBlocks.values());
BufferedReader br = new BufferedReader(new InputStreamReader(
- new FileInputStream(geoLiteCityLocationCsvFile), "ISO-8859-1"));
- String line;
+ new FileInputStream(geoLite2CityLocationsCsvFile),
+ "ISO-8859-1"));
+ String line = br.readLine();
while ((line = br.readLine()) != null) {
- if (line.startsWith("C") || line.startsWith("l")) {
- continue;
- }
- String[] parts = line.replaceAll("\"", "").split(",", 9);
- if (parts.length != 9) {
+ String[] parts = line.replaceAll("\"", "").split(",", 10);
+ if (parts.length != 10) {
System.err.println("Illegal line '" + line + "' in "
- + geoLiteCityLocationCsvFile.getAbsolutePath() + ".");
+ + geoLite2CityLocationsCsvFile.getAbsolutePath() + ".");
br.close();
return lookupResults;
}
@@ -207,66 +183,18 @@ public class LookupService {
if (blockNumbers.contains(locId)) {
blockLocations.put(locId, line);
}
- }
- catch (NumberFormatException e) {
+ } catch (NumberFormatException e) {
System.err.println("Number format exception while parsing line "
+ "'" + line + "' in "
- + geoLiteCityLocationCsvFile.getAbsolutePath() + ".");
- br.close();
- return lookupResults;
- }
- }
- br.close();
- } catch (IOException e) {
- System.err.println("I/O exception while reading "
- + geoLiteCityLocationCsvFile.getAbsolutePath() + ".");
- return lookupResults;
- }
-
- /* Read country names to memory. */
- Map<String, String> countryNames = new HashMap<String, String>();
- try {
- BufferedReader br = new BufferedReader(new InputStreamReader(
- new FileInputStream(iso3166CsvFile), "ISO-8859-1"));
- String line;
- while ((line = br.readLine()) != null) {
- String[] parts = line.replaceAll("\"", "").split(",", 2);
- if (parts.length != 2) {
- System.err.println("Illegal line '" + line + "' in "
- + iso3166CsvFile.getAbsolutePath() + ".");
- br.close();
- return lookupResults;
- }
- countryNames.put(parts[0].toLowerCase(), parts[1]);
- }
- br.close();
- } catch (IOException e) {
- System.err.println("I/O exception while reading "
- + iso3166CsvFile.getAbsolutePath() + ".");
- return lookupResults;
- }
-
- /* Read region names to memory. */
- Map<String, String> regionNames = new HashMap<String, String>();
- try {
- BufferedReader br = new BufferedReader(new InputStreamReader(
- new FileInputStream(regionCsvFile), "ISO-8859-1"));
- String line;
- while ((line = br.readLine()) != null) {
- String[] parts = line.replaceAll("\"", "").split(",", 3);
- if (parts.length != 3) {
- System.err.println("Illegal line '" + line + "' in "
- + regionCsvFile.getAbsolutePath() + ".");
+ + geoLite2CityLocationsCsvFile.getAbsolutePath() + ".");
br.close();
return lookupResults;
}
- regionNames.put(parts[0].toLowerCase() + ","
- + parts[1].toLowerCase(), parts[2]);
}
br.close();
} catch (IOException e) {
System.err.println("I/O exception while reading "
- + regionCsvFile.getAbsolutePath() + ".");
+ + geoLite2CityLocationsCsvFile.getAbsolutePath() + ".");
return lookupResults;
}
@@ -346,6 +274,7 @@ public class LookupService {
}
long addressNumber = addressStringNumbers.get(addressString);
if (!addressNumberBlocks.containsKey(addressNumber) &&
+ !addressNumberLatLong.containsKey(addressNumber) &&
!addressNumberASN.containsKey(addressNumber)) {
continue;
}
@@ -355,22 +284,23 @@ public class LookupService {
if (blockLocations.containsKey(blockNumber)) {
String[] parts = blockLocations.get(blockNumber).
replaceAll("\"", "").split(",", -1);
- String countryCode = parts[1].toLowerCase();
- lookupResult.countryCode = countryCode;
- if (countryNames.containsKey(countryCode)) {
- lookupResult.countryName = countryNames.get(countryCode);
+ lookupResult.countryCode = parts[3].toLowerCase();
+ if (parts[4].length() > 0) {
+ lookupResult.countryName = parts[4];
}
- String regionCode = countryCode + "," + parts[2].toLowerCase();
- if (regionNames.containsKey(regionCode)) {
- lookupResult.regionName = regionNames.get(regionCode);
+ if (parts[6].length() > 0) {
+ lookupResult.regionName = parts[6];
}
- if (parts[3].length() > 0) {
- lookupResult.cityName = parts[3];
+ if (parts[7].length() > 0) {
+ lookupResult.cityName = parts[7];
}
- lookupResult.latitude = parts[5];
- lookupResult.longitude = parts[6];
}
}
+ if (addressNumberLatLong.containsKey(addressNumber)) {
+ String[] latLong = addressNumberLatLong.get(addressNumber);
+ lookupResult.latitude = latLong[0];
+ lookupResult.longitude = latLong[1];
+ }
if (addressNumberASN.containsKey(addressNumber)) {
String[] parts = addressNumberASN.get(addressNumber).split(" ",
2);
1
0

[onionoo/master] Add unit tests for new GeoIP2 code, and fix a bug.
by karsten@torproject.org 24 Feb '14
by karsten@torproject.org 24 Feb '14
24 Feb '14
commit 0b09a6dd60b8d9d6465e9004274b4ec468db4346
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon Feb 24 11:54:07 2014 +0100
Add unit tests for new GeoIP2 code, and fix a bug.
---
src/org/torproject/onionoo/LookupService.java | 10 +
test/org/torproject/onionoo/LookupServiceTest.java | 343 +++++++-------------
2 files changed, 128 insertions(+), 225 deletions(-)
diff --git a/src/org/torproject/onionoo/LookupService.java b/src/org/torproject/onionoo/LookupService.java
index 928a550..3cfe3f2 100644
--- a/src/org/torproject/onionoo/LookupService.java
+++ b/src/org/torproject/onionoo/LookupService.java
@@ -125,6 +125,13 @@ public class LookupService {
try {
String startAddressString = parts[0].substring(7); /* ::ffff: */
long startIpNum = this.parseAddressString(startAddressString);
+ if (startIpNum < 0L) {
+ System.err.println("Illegal IP address in '" + line
+ + "' in " + geoLite2CityBlocksCsvFile.getAbsolutePath()
+ + ".");
+ br.close();
+ return lookupResults;
+ }
int networkMaskLength = Integer.parseInt(parts[1]);
if (networkMaskLength < 96 || networkMaskLength > 128) {
System.err.println("Illegal network mask in '" + line
@@ -133,6 +140,9 @@ public class LookupService {
br.close();
return lookupResults;
}
+ if (parts[2].length() == 0 && parts[3].length() == 0) {
+ continue;
+ }
long endIpNum = startIpNum + (1 << (128 - networkMaskLength))
- 1;
for (long addressNumber : sortedAddressNumbers.
diff --git a/test/org/torproject/onionoo/LookupServiceTest.java b/test/org/torproject/onionoo/LookupServiceTest.java
index 4834092..ae220f8 100644
--- a/test/org/torproject/onionoo/LookupServiceTest.java
+++ b/test/org/torproject/onionoo/LookupServiceTest.java
@@ -26,10 +26,8 @@ import org.torproject.onionoo.LookupService.LookupResult;
public class LookupServiceTest {
- private List<String> manualGeoLiteCityBlocksLines,
- automaticGeoLiteCityBlocksLines, geoLiteCityBlocksLines,
- geoLiteCityLocationLines, iso3166Lines, regionLines,
- geoipASNum2Lines;
+ private List<String> geoLite2CityBlocksLines,
+ geoLite2CityLocationsLines, geoipASNum2Lines;
private LookupService lookupService;
@@ -38,29 +36,27 @@ public class LookupServiceTest {
private SortedMap<String, LookupResult> lookupResults;
private void populateLines() {
- this.manualGeoLiteCityBlocksLines = new ArrayList<String>();
- this.manualGeoLiteCityBlocksLines.add(
- "Copyright (c) 2011 MaxMind Inc. All Rights Reserved.");
- this.manualGeoLiteCityBlocksLines.add("startIpNum,endIpNum,locId");
- this.manualGeoLiteCityBlocksLines.add("\"134739200\",\"134744063\","
- + "\"223\"");
- this.manualGeoLiteCityBlocksLines.add("\"134744064\",\"134744319\","
- + "\"32191\"");
- this.manualGeoLiteCityBlocksLines.add("\"134744320\",\"134751743\","
- + "\"223\"");
- this.geoLiteCityLocationLines = new ArrayList<String>();
- this.geoLiteCityLocationLines.add("Copyright (c) 2012 MaxMind "
- + "LLC. All Rights Reserved.");
- this.geoLiteCityLocationLines.add("locId,country,region,city,"
- + "postalCode,latitude,longitude,metroCode,areaCode");
- this.geoLiteCityLocationLines.add("223,\"US\",\"\",\"\",\"\","
- + "38.0000,-97.0000,,");
- this.geoLiteCityLocationLines.add("32191,\"US\",\"CA\","
- + "\"Mountain View\",\"\",37.3860,-122.0838,807,650");
- this.iso3166Lines = new ArrayList<String>();
- this.iso3166Lines.add("US,\"United States\"");
- this.regionLines = new ArrayList<String>();
- this.regionLines.add("US,CA,\"California\"");
+ this.geoLite2CityBlocksLines = new ArrayList<String>();
+ this.geoLite2CityBlocksLines.add("network_start_ip,"
+ + "network_mask_length,geoname_id,registered_country_geoname_id,"
+ + "represented_country_geoname_id,postal_code,latitude,longitude,"
+ + "is_anonymous_proxy,is_satellite_provider");
+ this.geoLite2CityBlocksLines.add("::ffff:8.8.9.0,120,6252001,6252001,"
+ + ",,38.0000,-97.0000,0,0");
+ this.geoLite2CityBlocksLines.add("::ffff:8.8.8.0,120,5375480,6252001,"
+ + ",94043,37.3860,-122.0838,0,0");
+ this.geoLite2CityBlocksLines.add("::ffff:8.8.7.0,120,6252001,6252001,"
+ + ",,38.0000,-97.0000,0,0");
+ this.geoLite2CityLocationsLines = new ArrayList<String>();
+ this.geoLite2CityLocationsLines.add("geoname_id,continent_code,"
+ + "continent_name,country_iso_code,country_name,"
+ + "subdivision_iso_code,subdivision_name,city_name,metro_code,"
+ + "time_zone");
+ this.geoLite2CityLocationsLines.add("6252001,NA,\"North America\",US,"
+ + "\"United States\",,,,,");
+ this.geoLite2CityLocationsLines.add("5375480,NA,\"North America\",US,"
+ + "\"United States\",CA,California,\"Mountain View\",807,"
+ + "America/Los_Angeles");
this.geoipASNum2Lines = new ArrayList<String>();
this.geoipASNum2Lines.add("134743296,134744063,\"AS3356 Level 3 "
+ "Communications\"");
@@ -72,16 +68,10 @@ public class LookupServiceTest {
private void writeCsvFiles() {
try {
- this.writeCsvFile(this.manualGeoLiteCityBlocksLines,
- "Manual-GeoLiteCity-Blocks.csv");
- this.writeCsvFile(this.automaticGeoLiteCityBlocksLines,
- "Automatic-GeoLiteCity-Blocks.csv");
- this.writeCsvFile(this.geoLiteCityBlocksLines,
- "GeoLiteCity-Blocks.csv");
- this.writeCsvFile(this.geoLiteCityLocationLines,
- "GeoLiteCity-Location.csv");
- this.writeCsvFile(this.iso3166Lines, "iso3166.csv");
- this.writeCsvFile(this.regionLines, "region.csv");
+ this.writeCsvFile(this.geoLite2CityBlocksLines,
+ "GeoLite2-City-Blocks.csv");
+ this.writeCsvFile(this.geoLite2CityLocationsLines,
+ "GeoLite2-City-Locations.csv");
this.writeCsvFile(this.geoipASNum2Lines, "GeoIPASNum2.csv");
} catch (IOException e) {
throw new RuntimeException(e);
@@ -105,36 +95,19 @@ public class LookupServiceTest {
this.lookupResults = this.lookupService.lookup(this.addressStrings);
}
- private void assertLookupResult(
- List<String> manualGeoLiteCityBlocksLines,
- List<String> automaticGeoLiteCityBlocksLines,
- List<String> geoLiteCityBlocksLines,
- List<String> geoLiteCityLocationLines, List<String> iso3166Lines,
- List<String> regionLines, List<String> geoipASNum2Lines,
- String addressString, String countryCode, String countryName,
- String regionName, String cityName, String latitude,
- String longitude, String aSNumber, String aSName) {
+ private void assertLookupResult(List<String> geoLite2CityBlocksLines,
+ List<String> geoLite2CityLocationsLines,
+ List<String> geoipASNum2Lines, String addressString,
+ String countryCode, String countryName, String regionName,
+ String cityName, String latitude, String longitude, String aSNumber,
+ String aSName) {
this.addressStrings.add(addressString);
this.populateLines();
- if (manualGeoLiteCityBlocksLines != null) {
- this.manualGeoLiteCityBlocksLines =
- manualGeoLiteCityBlocksLines;
+ if (geoLite2CityBlocksLines != null) {
+ this.geoLite2CityBlocksLines = geoLite2CityBlocksLines;
}
- if (automaticGeoLiteCityBlocksLines != null) {
- this.automaticGeoLiteCityBlocksLines =
- automaticGeoLiteCityBlocksLines;
- }
- if (geoLiteCityBlocksLines != null) {
- this.geoLiteCityBlocksLines = geoLiteCityBlocksLines;
- }
- if (geoLiteCityLocationLines != null) {
- this.geoLiteCityLocationLines = geoLiteCityLocationLines;
- }
- if (iso3166Lines != null) {
- this.iso3166Lines = iso3166Lines;
- }
- if (regionLines != null) {
- this.regionLines = regionLines;
+ if (geoLite2CityLocationsLines != null) {
+ this.geoLite2CityLocationsLines = geoLite2CityLocationsLines;
}
if (geoipASNum2Lines != null) {
this.geoipASNum2Lines = geoipASNum2Lines;
@@ -216,230 +189,154 @@ public class LookupServiceTest {
@Test()
public void testLookup8888() {
- this.assertLookupResult(null,
- null, null, null, null, null, null, "8.8.8.8", "us",
+ this.assertLookupResult(null, null, null, "8.8.8.8", "us",
"United States", "California", "Mountain View", "37.3860",
"-122.0838", "AS15169", "Google Inc.");
}
@Test()
public void testLookup8880() {
- this.assertLookupResult(null,
- null, null, null, null, null, null, "8.8.8.0", "us",
+ this.assertLookupResult(null, null, null, "8.8.8.0", "us",
"United States", "California", "Mountain View", "37.3860",
"-122.0838", "AS15169", "Google Inc.");
}
@Test()
public void testLookup888255() {
- this.assertLookupResult(null,
- null, null, null, null, null, null, "8.8.8.255", "us",
+ this.assertLookupResult(null, null, null, "8.8.8.255", "us",
"United States", "California", "Mountain View", "37.3860",
"-122.0838", "AS15169", "Google Inc.");
}
@Test()
public void testLookup888256() {
- this.assertLookupResult(null,
- null, null, null, null, null, null, "8.8.8.256", null, null, null,
- null, null, null, null, null);
+ this.assertLookupResult(null, null, null, "8.8.8.256", null, null,
+ null, null, null, null, null, null);
}
@Test()
public void testLookup888Minus1() {
- this.assertLookupResult(null,
- null, null, null, null, null, null, "8.8.8.-1", null, null, null,
- null, null, null, null, null);
+ this.assertLookupResult(null, null, null, "8.8.8.-1", null, null,
+ null, null, null, null, null, null);
}
@Test()
public void testLookup000() {
- this.assertLookupResult(null,
- null, null, null, null, null, null, "0.0.0.0", null, null, null,
+ this.assertLookupResult(null, null, null, "0.0.0.0", null, null, null,
null, null, null, null, null);
}
@Test()
public void testLookupNoBlocksLines() {
- this.assertLookupResult(
- new ArrayList<String>(), null, null, null, null, null, null,
+ this.assertLookupResult(new ArrayList<String>(), null, null,
"8.8.8.8", null, null, null, null, null, null, null, null);
}
@Test()
public void testLookupNoLocationLines() {
- this.assertLookupResult(null,
- null, null, new ArrayList<String>(), null, null, null, "8.8.8.8",
- null, null, null, null, null, null, null, null);
- }
-
- @Test()
- public void testLookupNoIso3166Lines() {
- this.assertLookupResult(null,
- null, null, null, new ArrayList<String>(), null, null, "8.8.8.8",
- null, null, null, null, null, null, null, null);
- }
-
- @Test()
- public void testLookupNoRegionLines() {
- this.assertLookupResult(null,
- null, null, null, null, new ArrayList<String>(), null, "8.8.8.8",
- null, null, null, null, null, null, null, null);
+ this.assertLookupResult(null, new ArrayList<String>(), null,
+ "8.8.8.8", null, null, null, null, null, null, null, null);
}
@Test()
public void testLookupNoGeoipASNum2Lines() {
- this.assertLookupResult(null,
- null, null, null, null, null, new ArrayList<String>(), "8.8.8.8",
- null, null, null, null, null, null, null, null);
+ this.assertLookupResult(null, null, new ArrayList<String>(),
+ "8.8.8.8", null, null, null, null, null, null, null, null);
}
@Test()
public void testLookupNoCorrespondingLocation() {
- List<String> geoLiteCityLocationLines = new ArrayList<String>();
- geoLiteCityLocationLines.add("Copyright (c) 2012 MaxMind LLC. All "
- + "Rights Reserved.");
- geoLiteCityLocationLines.add("locId,country,region,city,postalCode,"
- + "latitude,longitude,metroCode,areaCode");
- geoLiteCityLocationLines.add("223,\"US\",\"\",\"\",\"\",38.0000,"
- + "-97.0000,,");
- this.assertLookupResult(null,
- null, null, geoLiteCityLocationLines, null, null, null, "8.8.8.8",
- null, null, null, null, null, null, "AS15169", "Google Inc.");
- }
-
- @Test()
- public void testLookupNoCorrespondingCountryName() {
- List<String> iso3166Lines = new ArrayList<String>();
- iso3166Lines.add("UY,\"Uruguay\"");
- this.assertLookupResult(null,
- null, null, null, iso3166Lines, null, null, "8.8.8.8", "us",
- null, "California", "Mountain View", "37.3860", "-122.0838",
- "AS15169", "Google Inc.");
- }
-
- @Test()
- public void testLookupNoCorrespondingRegionName() {
- List<String> regionLines = new ArrayList<String>();
- regionLines.add("US,CO,\"Colorado\"");
- this.assertLookupResult(null,
- null, null, null, null, regionLines, null, "8.8.8.8", "us",
- "United States", null, "Mountain View", "37.3860", "-122.0838",
+ List<String> geoLite2CityLocationsLines = new ArrayList<String>();
+ geoLite2CityLocationsLines.add("geoname_id,continent_code,"
+ + "continent_name,country_iso_code,country_name,"
+ + "subdivision_iso_code,subdivision_name,city_name,metro_code,"
+ + "time_zone");
+ geoLite2CityLocationsLines.add("6252001,NA,\"North America\",US,"
+ + "\"United States\",,,,,");
+ this.assertLookupResult(null, geoLite2CityLocationsLines, null,
+ "8.8.8.8", null, null, null, null, "37.3860", "-122.0838",
"AS15169", "Google Inc.");
}
@Test()
- public void testLookupBlocksEndBeforeStart() {
- List<String> manualGeoLiteCityBlocksLines = new ArrayList<String>();
- manualGeoLiteCityBlocksLines.add("Copyright (c) 2011 MaxMind Inc. "
- + "All Rights Reserved.");
- manualGeoLiteCityBlocksLines.add("startIpNum,endIpNum,locId");
- manualGeoLiteCityBlocksLines.add("\"134739200\",\"134744063\","
- + "\"223\"");
- manualGeoLiteCityBlocksLines.add("\"134744319\",\"134744064\","
- + "\"32191\"");
- manualGeoLiteCityBlocksLines.add("\"134744320\",\"134751743\","
- + "\"223\"");
- this.assertLookupResult(
- manualGeoLiteCityBlocksLines, null, null, null, null, null, null,
- "8.8.8.8", null, null, null, null, null, null, "AS15169",
- "Google Inc.");
- }
-
- @Test()
public void testLookupBlocksStartNotANumber() {
- List<String> manualGeoLiteCityBlocksLines = new ArrayList<String>();
- manualGeoLiteCityBlocksLines.add("Copyright (c) 2011 MaxMind Inc. "
- + "All Rights Reserved.");
- manualGeoLiteCityBlocksLines.add("startIpNum,endIpNum,locId");
- manualGeoLiteCityBlocksLines.add("\"one\",\"134744319\","
- + "\"32191\"");
+ List<String> geoLite2CityBlocksLines = new ArrayList<String>();
+ geoLite2CityBlocksLines.add("network_start_ip,"
+ + "network_mask_length,geoname_id,registered_country_geoname_id,"
+ + "represented_country_geoname_id,postal_code,latitude,longitude,"
+ + "is_anonymous_proxy,is_satellite_provider");
+ geoLite2CityBlocksLines.add("::ffff:one,120,5375480,6252001,,94043,"
+ + "37.3860,-122.0838,0,0");
this.assertLookupResult(
- manualGeoLiteCityBlocksLines, null, null, null, null, null, null,
+ geoLite2CityBlocksLines, null, null,
"8.8.8.8", null, null, null, null, null, null, null, null);
}
@Test()
- public void testLookupBlocksStartTooLarge() {
- List<String> manualGeoLiteCityBlocksLines = new ArrayList<String>();
- manualGeoLiteCityBlocksLines.add("Copyright (c) 2011 MaxMind Inc. "
- + "All Rights Reserved.");
- manualGeoLiteCityBlocksLines.add("startIpNum,endIpNum,locId");
- manualGeoLiteCityBlocksLines.add("\"1"
- + String.valueOf(Long.MAX_VALUE) + "\",\"134744319\",\"32191\"");
- this.assertLookupResult(
- manualGeoLiteCityBlocksLines, null, null, null, null, null, null,
+ public void testLookupBlocksLocationX() {
+ List<String> geoLite2CityBlocksLines = new ArrayList<String>();
+ geoLite2CityBlocksLines.add("network_start_ip,"
+ + "network_mask_length,geoname_id,registered_country_geoname_id,"
+ + "represented_country_geoname_id,postal_code,latitude,longitude,"
+ + "is_anonymous_proxy,is_satellite_provider");
+ geoLite2CityBlocksLines.add("::ffff:8.8.8.0,120,X,X,,94043,37.3860,"
+ + "-122.0838,0,0");
+ this.assertLookupResult(geoLite2CityBlocksLines, null, null,
"8.8.8.8", null, null, null, null, null, null, null, null);
}
@Test()
- public void testLookupBlocksLocationX() {
- List<String> manualGeoLiteCityBlocksLines = new ArrayList<String>();
- manualGeoLiteCityBlocksLines.add("Copyright (c) 2011 MaxMind Inc. "
- + "All Rights Reserved.");
- manualGeoLiteCityBlocksLines.add("startIpNum,endIpNum,locId");
- manualGeoLiteCityBlocksLines.add("\"134744064\",\"134744319\",\"X\"");
- this.assertLookupResult(
- manualGeoLiteCityBlocksLines, null, null, null, null, null, null,
- "8.8.8.8", null, null, null, null, null, null, null, null);
+ public void testLookupBlocksLocationEmpty() {
+ List<String> geoLite2CityBlocksLines = new ArrayList<String>();
+ geoLite2CityBlocksLines.add("network_start_ip,"
+ + "network_mask_length,geoname_id,registered_country_geoname_id,"
+ + "represented_country_geoname_id,postal_code,latitude,longitude,"
+ + "is_anonymous_proxy,is_satellite_provider");
+ geoLite2CityBlocksLines.add("::ffff:8.8.8.0,120,,,,,,,1,0");
+ this.assertLookupResult(geoLite2CityBlocksLines, null, null,
+ "8.8.8.8", null, null, null, null, null, null, "AS15169",
+ "Google Inc.");
}
@Test()
public void testLookupBlocksTooFewFields() {
- List<String> manualGeoLiteCityBlocksLines = new ArrayList<String>();
- manualGeoLiteCityBlocksLines.add("Copyright (c) 2011 MaxMind Inc. "
- + "All Rights Reserved.");
- manualGeoLiteCityBlocksLines.add("startIpNum,endIpNum,locId");
- manualGeoLiteCityBlocksLines.add("\"134744064\",\"134744319\"");
- this.assertLookupResult(
- manualGeoLiteCityBlocksLines, null, null, null, null, null, null,
+ List<String> geoLite2CityBlocksLines = new ArrayList<String>();
+ geoLite2CityBlocksLines.add("network_start_ip,"
+ + "network_mask_length,geoname_id,registered_country_geoname_id,"
+ + "represented_country_geoname_id,postal_code,latitude,longitude,"
+ + "is_anonymous_proxy,is_satellite_provider");
+ geoLite2CityBlocksLines.add("::ffff:8.8.8.0,120,5375480,6252001,"
+ + ",94043,37.3860,-122.0838,0");
+ this.assertLookupResult(geoLite2CityBlocksLines, null, null,
"8.8.8.8", null, null, null, null, null, null, null, null);
}
@Test()
public void testLookupLocationLocIdNotANumber() {
- List<String> geoLiteCityLocationLines = new ArrayList<String>();
- geoLiteCityLocationLines.add("Copyright (c) 2012 MaxMind LLC. All "
- + "Rights Reserved.");
- geoLiteCityLocationLines.add("locId,country,region,city,postalCode,"
- + "latitude,longitude,metroCode,areaCode");
- geoLiteCityLocationLines.add("threetwoonenineone,\"US\",\"CA\","
- + "\"Mountain View\",\"\",37.3860,-122.0838,807,650");
- this.assertLookupResult(null,
- null, null, geoLiteCityLocationLines, null, null, null, "8.8.8.8",
- null, null, null, null, null, null, null, null);
+ List<String> geoLite2CityLocationsLines = new ArrayList<String>();
+ geoLite2CityLocationsLines = new ArrayList<String>();
+ geoLite2CityLocationsLines.add("geoname_id,continent_code,"
+ + "continent_name,country_iso_code,country_name,"
+ + "subdivision_iso_code,subdivision_name,city_name,metro_code,"
+ + "time_zone");
+ geoLite2CityLocationsLines.add("threetwoonenineone,NA,"
+ + "\"North America\",US,\"United States\",CA,California,"
+ + "\"Mountain View\",807,America/Los_Angeles");
+ this.assertLookupResult(null, geoLite2CityLocationsLines, null,
+ "8.8.8.8", null, null, null, null, null, null, null, null);
}
@Test()
public void testLookupLocationTooFewFields() {
- List<String> geoLiteCityLocationLines = new ArrayList<String>();
- geoLiteCityLocationLines.add("Copyright (c) 2012 MaxMind LLC. All "
- + "Rights Reserved.");
- geoLiteCityLocationLines.add("locId,country,region,city,postalCode,"
- + "latitude,longitude,metroCode,areaCode");
- geoLiteCityLocationLines.add("32191,\"US\",\"CA\",\"Mountain View\","
- + "\"\",37.3860,-122.0838,807");
- this.assertLookupResult(null,
- null, null, geoLiteCityLocationLines, null, null, null, "8.8.8.8",
- null, null, null, null, null, null, null, null);
- }
-
- @Test()
- public void testLookupIso3166TooFewFields() {
- List<String> iso3166Lines = new ArrayList<String>();
- iso3166Lines.add("US");
- this.assertLookupResult(null,
- null, null, null, iso3166Lines, null, null, "8.8.8.8", null, null,
- null, null, null, null, null, null);
- }
-
- @Test()
- public void testLookupRegionTooFewFields() {
- List<String> regionLines = new ArrayList<String>();
- regionLines.add("US,CA");
- this.assertLookupResult(null,
- null, null, null, null, regionLines, null, "8.8.8.8", null, null,
- null, null, null, null, null, null);
+ List<String> geoLite2CityLocationsLines = new ArrayList<String>();
+ geoLite2CityLocationsLines.add("geoname_id,continent_code,"
+ + "continent_name,country_iso_code,country_name,"
+ + "subdivision_iso_code,subdivision_name,city_name,metro_code,"
+ + "time_zone");
+ geoLite2CityLocationsLines.add("5375480,NA,\"North America\",US,"
+ + "\"United States\",CA,California,\"Mountain View\",807");
+ this.assertLookupResult(null, geoLite2CityLocationsLines, null,
+ "8.8.8.8", null, null, null, null, null, null, null, null);
}
@Test()
@@ -450,8 +347,7 @@ public class LookupServiceTest {
geoipASNum2Lines.add("134744319,134744064,\"AS15169 Google Inc.\"");
geoipASNum2Lines.add("134744320,134750463,\"AS3356 Level 3 "
+ "Communications\"");
- this.assertLookupResult(null,
- null, null, null, null, null, geoipASNum2Lines, "8.8.8.8", "us",
+ this.assertLookupResult(null, null, geoipASNum2Lines, "8.8.8.8", "us",
"United States", "California", "Mountain View", "37.3860",
"-122.0838", null, null);
}
@@ -460,8 +356,7 @@ public class LookupServiceTest {
public void testLookupGeoipASNum2StartNotANumber() {
List<String> geoipASNum2Lines = new ArrayList<String>();
geoipASNum2Lines.add("one,134744319,\"AS15169 Google Inc.\"");
- this.assertLookupResult(null,
- null, null, null, null, null, geoipASNum2Lines, "8.8.8.8", null,
+ this.assertLookupResult(null, null, geoipASNum2Lines, "8.8.8.8", null,
null, null, null, null, null, null, null);
}
@@ -470,8 +365,7 @@ public class LookupServiceTest {
List<String> geoipASNum2Lines = new ArrayList<String>();
geoipASNum2Lines.add("1" + String.valueOf(Long.MAX_VALUE)
+ ",134744319,\"AS15169 Google Inc.\"");
- this.assertLookupResult(null,
- null, null, null, null, null, geoipASNum2Lines, "8.8.8.8", null,
+ this.assertLookupResult(null, null, geoipASNum2Lines, "8.8.8.8", null,
null, null, null, null, null, null, null);
}
@@ -479,8 +373,7 @@ public class LookupServiceTest {
public void testLookupGeoipASNum2TooFewFields() {
List<String> geoipASNum2Lines = new ArrayList<String>();
geoipASNum2Lines.add("134744064,134744319");
- this.assertLookupResult(null,
- null, null, null, null, null, geoipASNum2Lines, "8.8.8.8", null,
+ this.assertLookupResult(null, null, geoipASNum2Lines, "8.8.8.8", null,
null, null, null, null, null, null, null);
}
}
1
0

24 Feb '14
commit 2d970fdb60f8b6378d663c967f877194efcabd38
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon Feb 24 10:12:49 2014 +0100
Include bridges when filtering by flag.
Fixes #10908.
---
src/org/torproject/onionoo/ResponseBuilder.java | 29 ++++++++++++++++++--
.../torproject/onionoo/ResourceServletTest.java | 4 +--
2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/src/org/torproject/onionoo/ResponseBuilder.java b/src/org/torproject/onionoo/ResponseBuilder.java
index 898f957..502b928 100644
--- a/src/org/torproject/onionoo/ResponseBuilder.java
+++ b/src/org/torproject/onionoo/ResponseBuilder.java
@@ -28,7 +28,7 @@ public class ResponseBuilder {
private static Map<String, String> relayFingerprintSummaryLines = null,
bridgeFingerprintSummaryLines = null;
private static Map<String, Set<String>> relaysByCountryCode = null,
- relaysByASNumber = null, relaysByFlag = null,
+ relaysByASNumber = null, relaysByFlag = null, bridgesByFlag = null,
relaysByContact = null;
private static SortedMap<Integer, Set<String>>
relaysByFirstSeenDays = null, bridgesByFirstSeenDays = null,
@@ -84,6 +84,7 @@ public class ResponseBuilder {
newRelaysByCountryCode = new HashMap<String, Set<String>>(),
newRelaysByASNumber = new HashMap<String, Set<String>>(),
newRelaysByFlag = new HashMap<String, Set<String>>(),
+ newBridgesByFlag = new HashMap<String, Set<String>>(),
newRelaysByContact = new HashMap<String, Set<String>>();
SortedMap<Integer, Set<String>>
newRelaysByFirstSeenDays = new TreeMap<Integer, Set<String>>(),
@@ -200,6 +201,15 @@ public class ResponseBuilder {
newBridgeFingerprintSummaryLines.put(hashedFingerprint, line);
newBridgeFingerprintSummaryLines.put(hashedHashedFingerprint,
line);
+ for (String flag : entry.getRelayFlags()) {
+ String flagLowerCase = flag.toLowerCase();
+ if (!newBridgesByFlag.containsKey(flagLowerCase)) {
+ newBridgesByFlag.put(flagLowerCase, new HashSet<String>());
+ }
+ newBridgesByFlag.get(flagLowerCase).add(hashedFingerprint);
+ newBridgesByFlag.get(flagLowerCase).add(
+ hashedHashedFingerprint);
+ }
int daysSinceFirstSeen = (int) ((newSummaryFileLastModified
- entry.getFirstSeenMillis()) / 86400000L);
if (!newBridgesByFirstSeenDays.containsKey(daysSinceFirstSeen)) {
@@ -227,6 +237,7 @@ public class ResponseBuilder {
relaysByCountryCode = newRelaysByCountryCode;
relaysByASNumber = newRelaysByASNumber;
relaysByFlag = newRelaysByFlag;
+ bridgesByFlag = newBridgesByFlag;
relaysByContact = newRelaysByContact;
relaysByFirstSeenDays = newRelaysByFirstSeenDays;
relaysByLastSeenDays = newRelaysByLastSeenDays;
@@ -569,7 +580,21 @@ public class ResponseBuilder {
filteredRelays.remove(fingerprint);
}
}
- filteredBridges.clear();
+ if (!this.bridgesByFlag.containsKey(flag)) {
+ filteredBridges.clear();
+ } else {
+ Set<String> bridgesWithFlag = bridgesByFlag.get(flag);
+ Set<String> removeBridges = new HashSet<String>();
+ for (Map.Entry<String, String> e : filteredBridges.entrySet()) {
+ String fingerprint = e.getKey();
+ if (!bridgesWithFlag.contains(fingerprint)) {
+ removeBridges.add(fingerprint);
+ }
+ }
+ for (String fingerprint : removeBridges) {
+ filteredBridges.remove(fingerprint);
+ }
+ }
}
private void filterNodesByFirstSeenDays(
diff --git a/test/org/torproject/onionoo/ResourceServletTest.java b/test/org/torproject/onionoo/ResourceServletTest.java
index 51ea1b5..37963c8 100644
--- a/test/org/torproject/onionoo/ResourceServletTest.java
+++ b/test/org/torproject/onionoo/ResourceServletTest.java
@@ -819,13 +819,13 @@ public class ResourceServletTest {
@Test()
public void testFlagRunning() {
this.assertSummaryDocument(
- "/summary?flag=Running", 3, null, 0, null);
+ "/summary?flag=Running", 3, null, 1, null);
}
@Test()
public void testFlagValid() {
this.assertSummaryDocument(
- "/summary?flag=Valid", 3, null, 0, null);
+ "/summary?flag=Valid", 3, null, 3, null);
}
@Test()
1
0

[translation/tails-iuk_completed] Update translations for tails-iuk_completed
by translation@torproject.org 24 Feb '14
by translation@torproject.org 24 Feb '14
24 Feb '14
commit 0fddedd04c3a56bc9d0717aeb0fb55d8c16895ca
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Feb 24 13:16:02 2014 +0000
Update translations for tails-iuk_completed
---
fa.po | 236 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 236 insertions(+)
diff --git a/fa.po b/fa.po
new file mode 100644
index 0000000..2f7d3a2
--- /dev/null
+++ b/fa.po
@@ -0,0 +1,236 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Tails developers
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# desmati <desmati(a)gmail.com>, 2014
+# terra.geogra <e.jahan(a)gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: The Tor Project\n"
+"Report-Msgid-Bugs-To: Tails developers <tails(a)boum.org>\n"
+"POT-Creation-Date: 2014-02-21 17:38+0100\n"
+"PO-Revision-Date: 2014-02-24 13:09+0000\n"
+"Last-Translator: desmati <desmati(a)gmail.com>\n"
+"Language-Team: Persian (http://www.transifex.com/projects/p/torproject/language/fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fa\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../lib/Tails/IUK/Frontend.pm:146 ../lib/Tails/IUK/Frontend.pm:523
+#: ../lib/Tails/IUK/Frontend.pm:667
+msgid "For debugging information, see ~/.xsession-errors."
+msgstr "برای جزییات دیباگ ~/.xsession-errors را ببینید."
+
+#: ../lib/Tails/IUK/Frontend.pm:216
+msgid "Error while checking for upgrades"
+msgstr "در حین بررسی موجود بودن بسته به روز رسانی خطا رخ داد"
+
+#: ../lib/Tails/IUK/Frontend.pm:219
+msgid ""
+"<b>Could not determine whether an upgrade is available from our website.</b>\n"
+"\n"
+"Check your network connection, and restart Tails to try upgrading again.\n"
+"\n"
+"If the problem persists, go to file:///usr/share/doc/tails/website/doc/upgrade/error/check.en.html"
+msgstr "<b>نتوانستیم بررسی کنیم که آیا بر روی سایت ما بسته به روز رسانی موجود است یا نه.</b>\n\nاتصال خود را به شبکه بررسی کنید، تیلز را راه ادازی مجدد کرده و مجدداً تلاش کنید.\n\nاگر مشکل حل نشد، این جا را بخوانید: file:///usr/share/doc/tails/website/doc/upgrade/error/check.en.html"
+
+#: ../lib/Tails/IUK/Frontend.pm:234
+msgid "no automatic upgrade is available from our website for this version"
+msgstr "به روز رسانی خودکار برای این نسخه در وب سایت ما موجود نیست"
+
+#: ../lib/Tails/IUK/Frontend.pm:240
+msgid "your device was not created using Tails Installer"
+msgstr "دستگاه شما به وسیله برنامه نصب تیلز ساخته نشده است"
+
+#: ../lib/Tails/IUK/Frontend.pm:245
+msgid "Tails was started from a DVD or a read-only device"
+msgstr "تیلز از روی یک دی وی دی و یا یک دستگاهی که فقط می شود از روی آن خواند اجرا شده است"
+
+#: ../lib/Tails/IUK/Frontend.pm:250
+msgid "there is not enough free space on the Tails system partition"
+msgstr "فضای خالی کافی بر روی پارتیشن سیستم تلیز موجود نیست"
+
+#: ../lib/Tails/IUK/Frontend.pm:255
+msgid "not enough memory is available on this system"
+msgstr "حافظه رم کافی روی این سیستم موجود نیست"
+
+#: ../lib/Tails/IUK/Frontend.pm:261
+#, perl-brace-format
+msgid "No explanation available for reason '%{reason}s'."
+msgstr "هیچ شرحی برای '%{reason}s' وجود ندارد."
+
+#: ../lib/Tails/IUK/Frontend.pm:281
+msgid "The system is up-to-date"
+msgstr "سیستم به روز است"
+
+#: ../lib/Tails/IUK/Frontend.pm:286
+msgid "This version of Tails is outdated, and may have security issues."
+msgstr "این نسخه تِیلز کهنه است و ممکن است کاستی های امنینی داشته باشد"
+
+#: ../lib/Tails/IUK/Frontend.pm:318
+#, perl-brace-format
+msgid ""
+"The available incremental upgrade requires %{space_needed}s of free space on"
+" Tails system partition, but only %{free_space}s is available."
+msgstr "این بسته به روز رسانی %{space_needed}s فضای خالی روی پارتیشنی که تیلز نصب شده است لازم دارد. اما فقط %{free_space}s فضای خالی موجود است."
+
+#: ../lib/Tails/IUK/Frontend.pm:334
+#, perl-brace-format
+msgid ""
+"The available incremental upgrade requires %{memory_needed}s of free memory,"
+" but only %{free_memory}s is available."
+msgstr "این بسته به روز رسانی نیاز به %{memory_needed}s حافظه رم دارد. اما رم شما %{free_memory}s است."
+
+#: ../lib/Tails/IUK/Frontend.pm:356
+msgid ""
+"An incremental upgrade is available, but no full upgrade is.\n"
+"This should not happen. Please report a bug."
+msgstr "یک به روز رسانی موجود است اما یک بسته به روز رسانی کامل موجود نیست. \nاین وضعیت عادی نیست. لطفاً یک گزارش باگ ارسال کنید."
+
+#: ../lib/Tails/IUK/Frontend.pm:360
+msgid "Error while detecting available upgrades"
+msgstr "ایرادی در هنگام پیدا کردن بروز رسانی های موجود پیدا شد"
+
+#: ../lib/Tails/IUK/Frontend.pm:370
+#, perl-brace-format
+msgid ""
+"<b>You should upgrade to %{name}s %{version}s.</b>\n"
+"\n"
+"For more information about this new version, go to %{details_url}s.\n"
+"\n"
+"It is recommended to close all the open applications during the upgrade.\n"
+"Downloading the upgrade might take a long time, from several minutes to a few hours.\n"
+"The networking will be disabled after downloading the upgrade.\n"
+"\n"
+"Download size: %{size}s\n"
+"\n"
+"Do you want to upgrade now?"
+msgstr "<b>شما باید نسخه خود را به %{name}s و نسخه %{version}s ارتقا دهید.</b>\n\nبرای اطلاعات بیشتر درباره این نسخه، به این جا مراجعه کنید: %{details_url}s.\n\nتوصیه می کنیم همه برنامه های در حال اجرا را ببندید.\nدانلود کردن ممکن است زمان بر باشد. از چند دقیقه تا چند ساعت.\nشبکه شما پس از کامل شدن دانلود قطع خواهد شد.\n\nحجم دانلود: %{size}s\n\nآیا می خواهید همین الآن به روز رسانی کنید؟"
+
+#: ../lib/Tails/IUK/Frontend.pm:385
+msgid "Upgrade available"
+msgstr "بروز رسانی موجود است"
+
+#: ../lib/Tails/IUK/Frontend.pm:386
+msgid "Upgrade now"
+msgstr "الآن به روز رسانی کن"
+
+#: ../lib/Tails/IUK/Frontend.pm:387
+msgid "Upgrade later"
+msgstr "بعداً به روز رسانی کن"
+
+#: ../lib/Tails/IUK/Frontend.pm:395
+#, perl-brace-format
+msgid ""
+"<b>You should do a manual upgrade to %{name}s %{version}s.</b>\n"
+"\n"
+"For more information about this new version, go to %{details_url}s.\n"
+"\n"
+"It is not possible to automatically upgrade your device to this new version: %{explanation}s.\n"
+"\n"
+"To learn how to do a manual upgrade, go to https://tails.boum.org/doc/first_steps/upgrade/#manual"
+msgstr "<b>شما باید خودتان به صورت دستی به %{name}s %{version}s به روز رسانی کنید.</b>\n\nبرای اطلاعات بیشتر در مورد این به روز رسانی، به این آدرس مراجعه کنید: %{details_url}s.\n\nامکان به روز رسانی کردن به صورت خودکار نبود: %{explanation}s.\n\nبرای این که یاد بگیرید چگونه به صورت دستی به روز رسانی کنید، به این آدرس بروید: https://tails.boum.org/doc/first_steps/upgrade/#manual"
+
+#: ../lib/Tails/IUK/Frontend.pm:411
+msgid "New version available"
+msgstr "نسخه جدیدی موجود است"
+
+#: ../lib/Tails/IUK/Frontend.pm:468
+msgid "Downloading upgrade"
+msgstr "بارگذاری بروزرسانیها"
+
+#: ../lib/Tails/IUK/Frontend.pm:471
+#, perl-brace-format
+msgid "Downloading the upgrade to %{name}s %{version}s..."
+msgstr "در حال دانلود بسته به روز رسانی به %{name}s %{version}s..."
+
+#: ../lib/Tails/IUK/Frontend.pm:512
+msgid ""
+"<b>The upgrade could not be downloaded.</b>\\n\\nCheck your network "
+"connection, and restart Tails to try upgrading again.\\n\\nIf the problem "
+"persists, go to "
+"file:///usr/share/doc/tails/website/doc/upgrade/error/download.en.html"
+msgstr "<b>بسته به روز رسانی دانلود نشد!</b> \\n\\n\nلطفاً اتصال خود را به شبکه بررسی کنید و تیلز را مجدداً راه اندازی کرده و دوباره اقدام به به روز رسانی کنید.\\n\\n\nاگر مشکل حل نشد، به این جا سر بزنید: file:///usr/share/doc/tails/website/doc/upgrade/error/download.en.html"
+
+#: ../lib/Tails/IUK/Frontend.pm:528 ../lib/Tails/IUK/Frontend.pm:547
+msgid "Error while downloading the upgrade"
+msgstr "خطا در هنگام دانلود به روز رسانی رخ داده است."
+
+#: ../lib/Tails/IUK/Frontend.pm:540
+#, perl-brace-format
+msgid ""
+"Output file '%{output_file}s' does not exist, but tails-iuk-get-target-file "
+"did not complain. Please report a bug."
+msgstr "فایل خروجی با عنوان '%{output_file}s' موجود نیست، و tails-iuk-get-target-file از این موضوع ایراد نگرفته است. لطفاً گزارش یک باگ ارسال کنید."
+
+#: ../lib/Tails/IUK/Frontend.pm:559
+msgid "Error while creating temporary downloading directory"
+msgstr "خطا در هنگام ساختن پوشه موقت برای دانلود رخ داده است"
+
+#: ../lib/Tails/IUK/Frontend.pm:562
+msgid "Failed to create temporary download directory"
+msgstr "ساختن پوشه موقت برای دانلود با شکست مواجه شد"
+
+#: ../lib/Tails/IUK/Frontend.pm:574
+msgid ""
+"<b>Your Tails device was successfully upgraded.</b>\n"
+"\n"
+"Some security features were temporarily disabled.\n"
+"You should restart Tails on the new version as soon as possible.\n"
+"\n"
+"Do you want to restart now?"
+msgstr "<b>دستگاه تیلز شما با موفقیت به روز رسانی شد.</b>\n\nبعضی از امکانات امنیتی موقتاً غیر فعال شدند.\nدر اولین فرصت تیلز را مجدداً راه اندازی کنید.\n\nآیا می خواهید همین الآن تیلز راه اندازی مجدد شود؟"
+
+#: ../lib/Tails/IUK/Frontend.pm:579
+msgid "Restart Tails"
+msgstr "راه اندازی مجدد تیلز"
+
+#: ../lib/Tails/IUK/Frontend.pm:580
+msgid "Restart now"
+msgstr "الآن راه اندازی مجدد کن"
+
+#: ../lib/Tails/IUK/Frontend.pm:581
+msgid "Restart later"
+msgstr "بعداً راه اندازی مجدد کن"
+
+#: ../lib/Tails/IUK/Frontend.pm:592
+msgid "Error while restarting the system"
+msgstr "در حین راه اندازی مجدد سیستم خطا رخ داد"
+
+#: ../lib/Tails/IUK/Frontend.pm:595
+msgid "Failed to restart the system"
+msgstr "راه اندازی مجدد سیستم شکست خورد"
+
+#: ../lib/Tails/IUK/Frontend.pm:610
+msgid "Error while shutting down the network"
+msgstr "در حین از کار انداخت شبکه خطا رخ داد"
+
+#: ../lib/Tails/IUK/Frontend.pm:613
+msgid "Failed to shutdown network"
+msgstr "از کار انداختن شبکه با شسکت مواجه شد"
+
+#: ../lib/Tails/IUK/Frontend.pm:623
+msgid "Upgrading the system"
+msgstr "به روز رسانی سیستم"
+
+#: ../lib/Tails/IUK/Frontend.pm:625
+msgid ""
+"<b>Your Tails device is being upgraded...</b>\n"
+"\n"
+"For security reasons, the networking is now disabled."
+msgstr "<b>دستگاه تیلز شما در حال به روز رسانی است...</b>\n\nبرای یک سری مسایل امنیتی، شبکه موقتاً غیر فعال می شود."
+
+#: ../lib/Tails/IUK/Frontend.pm:662
+msgid ""
+"<b>An error occured while installing the upgrade.</b>\\n\\nYour Tails device"
+" needs to be repaired and might be unable to restart.\\n\\nPlease follow the"
+" instructions at "
+"file:///usr/share/doc/tails/website/doc/upgrade/error/install.en.html"
+msgstr "<b>در حین به روز رسانی خطایی رخ داد</b>\\n\\n\nدستگاه تیلز شما نیاز به تعمیر شدن دارد و ممکن است دیگر بالا نیاید.\\n\\n\nلطفاً طبق این دستورالعمل اقدام کنید: file:///usr/share/doc/tails/website/doc/upgrade/error/install.en.html"
+
+#: ../lib/Tails/IUK/Frontend.pm:672
+msgid "Error while installing the upgrade"
+msgstr "در حین نصب بسته به روز رسانی خطا رخ داد"
1
0

24 Feb '14
commit f5414759bf8f68a19056800c0855589fe23be77e
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Feb 24 13:16:00 2014 +0000
Update translations for tails-iuk
---
fa.po | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/fa.po b/fa.po
index 0bbc5fc..2f7d3a2 100644
--- a/fa.po
+++ b/fa.po
@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: Tails developers <tails(a)boum.org>\n"
"POT-Creation-Date: 2014-02-21 17:38+0100\n"
-"PO-Revision-Date: 2014-02-24 12:44+0000\n"
+"PO-Revision-Date: 2014-02-24 13:09+0000\n"
"Last-Translator: desmati <desmati(a)gmail.com>\n"
"Language-Team: Persian (http://www.transifex.com/projects/p/torproject/language/fa/)\n"
"MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
#: ../lib/Tails/IUK/Frontend.pm:146 ../lib/Tails/IUK/Frontend.pm:523
#: ../lib/Tails/IUK/Frontend.pm:667
msgid "For debugging information, see ~/.xsession-errors."
-msgstr ""
+msgstr "برای جزییات دیباگ ~/.xsession-errors را ببینید."
#: ../lib/Tails/IUK/Frontend.pm:216
msgid "Error while checking for upgrades"
@@ -39,28 +39,28 @@ msgstr "<b>نتوانستیم بررسی کنیم که آیا بر روی سای
#: ../lib/Tails/IUK/Frontend.pm:234
msgid "no automatic upgrade is available from our website for this version"
-msgstr ""
+msgstr "به روز رسانی خودکار برای این نسخه در وب سایت ما موجود نیست"
#: ../lib/Tails/IUK/Frontend.pm:240
msgid "your device was not created using Tails Installer"
-msgstr ""
+msgstr "دستگاه شما به وسیله برنامه نصب تیلز ساخته نشده است"
#: ../lib/Tails/IUK/Frontend.pm:245
msgid "Tails was started from a DVD or a read-only device"
-msgstr ""
+msgstr "تیلز از روی یک دی وی دی و یا یک دستگاهی که فقط می شود از روی آن خواند اجرا شده است"
#: ../lib/Tails/IUK/Frontend.pm:250
msgid "there is not enough free space on the Tails system partition"
-msgstr ""
+msgstr "فضای خالی کافی بر روی پارتیشن سیستم تلیز موجود نیست"
#: ../lib/Tails/IUK/Frontend.pm:255
msgid "not enough memory is available on this system"
-msgstr ""
+msgstr "حافظه رم کافی روی این سیستم موجود نیست"
#: ../lib/Tails/IUK/Frontend.pm:261
#, perl-brace-format
msgid "No explanation available for reason '%{reason}s'."
-msgstr ""
+msgstr "هیچ شرحی برای '%{reason}s' وجود ندارد."
#: ../lib/Tails/IUK/Frontend.pm:281
msgid "The system is up-to-date"
@@ -132,7 +132,7 @@ msgid ""
"It is not possible to automatically upgrade your device to this new version: %{explanation}s.\n"
"\n"
"To learn how to do a manual upgrade, go to https://tails.boum.org/doc/first_steps/upgrade/#manual"
-msgstr ""
+msgstr "<b>شما باید خودتان به صورت دستی به %{name}s %{version}s به روز رسانی کنید.</b>\n\nبرای اطلاعات بیشتر در مورد این به روز رسانی، به این آدرس مراجعه کنید: %{details_url}s.\n\nامکان به روز رسانی کردن به صورت خودکار نبود: %{explanation}s.\n\nبرای این که یاد بگیرید چگونه به صورت دستی به روز رسانی کنید، به این آدرس بروید: https://tails.boum.org/doc/first_steps/upgrade/#manual"
#: ../lib/Tails/IUK/Frontend.pm:411
msgid "New version available"
@@ -221,7 +221,7 @@ msgid ""
"<b>Your Tails device is being upgraded...</b>\n"
"\n"
"For security reasons, the networking is now disabled."
-msgstr ""
+msgstr "<b>دستگاه تیلز شما در حال به روز رسانی است...</b>\n\nبرای یک سری مسایل امنیتی، شبکه موقتاً غیر فعال می شود."
#: ../lib/Tails/IUK/Frontend.pm:662
msgid ""
@@ -229,7 +229,7 @@ msgid ""
" needs to be repaired and might be unable to restart.\\n\\nPlease follow the"
" instructions at "
"file:///usr/share/doc/tails/website/doc/upgrade/error/install.en.html"
-msgstr ""
+msgstr "<b>در حین به روز رسانی خطایی رخ داد</b>\\n\\n\nدستگاه تیلز شما نیاز به تعمیر شدن دارد و ممکن است دیگر بالا نیاید.\\n\\n\nلطفاً طبق این دستورالعمل اقدام کنید: file:///usr/share/doc/tails/website/doc/upgrade/error/install.en.html"
#: ../lib/Tails/IUK/Frontend.pm:672
msgid "Error while installing the upgrade"
1
0

[translation/tails-misc_completed] Update translations for tails-misc_completed
by translation@torproject.org 24 Feb '14
by translation@torproject.org 24 Feb '14
24 Feb '14
commit 11eabb740dec3d3518637431a70a28c69c4e3634
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Feb 24 13:15:47 2014 +0000
Update translations for tails-misc_completed
---
fa.po | 455 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 455 insertions(+)
diff --git a/fa.po b/fa.po
new file mode 100644
index 0000000..c5ca375
--- /dev/null
+++ b/fa.po
@@ -0,0 +1,455 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Eb <eb.ae(a)aol.com>, 2013
+# Daanial <dani(a)daanial.com>, 2013
+# desmati <desmati(a)gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: The Tor Project\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-01-29 15:05+0100\n"
+"PO-Revision-Date: 2014-02-24 12:52+0000\n"
+"Last-Translator: desmati <desmati(a)gmail.com>\n"
+"Language-Team: Persian (http://www.transifex.com/projects/p/torproject/language/fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fa\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: config/chroot_local-includes/etc/NetworkManager/dispatcher.d/60-tor-ready-notification.sh:31
+msgid "Tor is ready"
+msgstr "ØªÙØ± Ø¢Ù
اد٠است"
+
+#: config/chroot_local-includes/etc/NetworkManager/dispatcher.d/60-tor-ready-notification.sh:32
+msgid "You can now access the Internet."
+msgstr "ØØ§Ùا Ù
Û ØªÙØ§ÙÛØ¯ ؚ٠اÛÙØªØ±Ùت Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§ØŽØªÙ ØšØ§ØŽÛØ¯."
+
+#: config/chroot_local-includes/etc/whisperback/config.py:64
+#, python-format
+msgid ""
+"<h1>Help us fix your bug!</h1>\n"
+"<p>Read <a href=\"%s\">our bug reporting instructions</a>.</p>\n"
+"<p><strong>Do not include more personal information than\n"
+"needed!</strong></p>\n"
+"<h2>About giving us an email address</h2>\n"
+"<p>If you don't mind disclosing some bits of your identity\n"
+"to Tails developers, you can provide an email address to\n"
+"let us ask more details about the bug. Additionally entering\n"
+"a public PGP key enables us to encrypt such future\n"
+"communication.</p>\n"
+"<p>Anyone who can see this reply will probably infer you are\n"
+"a Tails user. Time to wonder how much you trust your\n"
+"Internet and mailbox providers?</p>\n"
+msgstr "<h1>ØšÙ Ù
ا Ú©Ù
Ú© Ú©ÙÛØ¯ تا ؚاگ ØŽÙ
ا را Ø±ÙØ¹ Ú©ÙÛÙ
!</h1>\n<p><a href=\"%s\">Ø¯Ø³ØªÙØ±Ø§ÙعÙ
Ù Ø§Ø¹ÙØ§Ù
ؚاگ</a> را Ù
Ø·Ø§ÙØ¹Ù Ú©ÙÛØ¯.</p>\n<p><strong>از Ø§Ø±Ø³Ø§Ù Ø§Ø·ÙØ§Ø¹Ø§Øª ØŽØ®ØµÛ ØšÛØŽ Ø§Ø² Ø§ÙØ¯Ø§Ø²Ù Ø®ÙØ¯Ø¯Ø§Ø±Û Ú©ÙÛØ¯!</strong></p>\n<h2>Ø§Ø¹ÙØ§Ù
آدرس اÛÙ
ÛÙ</h2>\n<p>اگر ØŽÙ
ا ؚا اراÛ٠ؚخ؎ Ú©ÙÚÚ©Û Ø§Ø² ÙÙÛØª Ø®ÙØ¯ØªØ§Ù ؚ٠تÛÙ
Tails Ù
ØŽÚ©ÙÛ ÙØ¯Ø§Ø±ÛØ¯Ø Ù
ÛâØªÙØ§ÙÛØ¯ آدرس اÛÙ
ÛÙ Ø®ÙØ¯ØªØ§Ù را Ø§Ø¹ÙØ§Ù
Ú©ÙÛØ¯ تا اÛ٠اÙ
کا٠را ØšÙ Ù
ا ؚدÙÛØ¯ ک٠در ØµÙØ±Øª ÙØ²ÙÙ
Ø§Ø·ÙØ§Ø¹Ø§Øª ØšÛØŽØªØ±Û در Ù
ÙØ±Ø¯ ؚاگ از ØŽÙ
ا ؚٟرسÛÙ
. Ø¹ÙØ§Ù٠ؚر آ٠ؚا ÙØ§Ø±Ø¯ کرد٠کÙÛØ¯ عÙ
ÙÙ
Û PGP Ø®ÙØ¯ØªØ§Ù Ù
ÛâØªÙØ§ÙÛØ¯ ؚ٠رÙ
زÙÚ¯Ø§Ø±Û Ø§Ø±ØªØšØ§Ø·Ø§Øª Ø¢ÛÙØ¯Ù Ú©Ù
Ú© Ú©ÙÛØ¯.</p>\n<p>ÙØ± Ú©Ø³Û Ú©Ù Ø§Û٠ٟاسخ را ؚؚÛÙØ¯ Ù
ÛâØªÙØ§Ùد ØØ¯Ø³ ØšØ²ÙØ¯ Ú©Ù ØŽÙ
ا ÛÚ© کارؚر Tails ÙØ³ØªÛد. زÙ
Ø
§Ù Ø¢Ù Ø±Ø³ÛØ¯Ù است Ú©Ù ØšØ±Ø±Ø³Û Ú©ÙÛØ¯ Ú©Ù ØŽÙ
ا ÚÙØ¯Ø± ؚ٠ارا؊٠کÙÙØ¯Ú¯Ø§Ù سرÙÛØ³ اÛÙØªØ±Ùت ٠اÛÙ
ÛÙ Ø®ÙØ¯ اطÙ
ÛÙØ§Ù Ø¯Ø§Ø±ÛØ¯Ø</p>\n"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:136
+msgid "OpenPGP encryption applet"
+msgstr "ØšØ§Ø²Ú©Ø±Ø¯Ù Ø§ÙŸÙØª OpenPGP"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:139
+msgid "Exit"
+msgstr "Ø®Ø±ÙØ¬"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:141
+msgid "About"
+msgstr "درؚارÙ"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:192
+msgid "Encrypt Clipboard with _Passphrase"
+msgstr "Ú©ÙÛÙŸ ؚرد را ØšÙ ÙØ³ÛÙÙ ÛÚ© Ø¹ØšÙØ±ÙاÚ٠رÙ
Ø²Ú¯Ø°Ø§Ø±Û Ú©ÙÛØ¯."
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:195
+msgid "Sign/Encrypt Clipboard with Public _Keys"
+msgstr "Ú©ÙÛÙŸ ؚرد را ØšÙ ÙØ³ÛÙÙ ÛÚ© Ú©ÙÛØ¯ عÙ
ÙÙ
Û Ø±Ù
Ø²Ú¯Ø°Ø§Ø±Û /اÙ
ضا Ú©ÙÛØ¯."
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:200
+msgid "_Decrypt/Verify Clipboard"
+msgstr "رÙ
زÙگ؎اÛÛ/ØªØ§ØŠÛØ¯ Clipboard"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:204
+msgid "_Manage Keys"
+msgstr "Ú©ÙÛØ¯Ùا را Ù
Ø¯ÛØ±Ûت Ú©ÙÛØ¯."
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:244
+msgid "The clipboard does not contain valid input data."
+msgstr "Clipboard ÙÛÚ Ø¯Ø§Ø¯Ù Ù
Ø¹ØªØšØ±Û ÙØ¯Ø§Ø±Ø¯"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:294
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:296
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:298
+msgid "Unknown Trust"
+msgstr "ÙØ§ØšÙ اطÙ
ÛÙØ§Ù ÙÛØ³Øª"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:300
+msgid "Marginal Trust"
+msgstr "ØšÙ Ø³Ø®ØªÛ ÙØ§ØšÙ اطÙ
ÛÙØ§Ù است"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:302
+msgid "Full Trust"
+msgstr "ÙØ§ØšÙ اطÙ
ÛÙØ§Ù است"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:304
+msgid "Ultimate Trust"
+msgstr "کاÙ
ÙØ§Ù ÙØ§ØšÙ اطÙ
ÛÙØ§Ù است"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:357
+msgid "Name"
+msgstr "ÙØ§Ù
"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:358
+msgid "Key ID"
+msgstr "Ø¢Û Ø¯Û Ú©ÙÛØ¯"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:359
+msgid "Status"
+msgstr "ÙØ¶Ø¹Ûت"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:391
+msgid "Fingerprint:"
+msgstr "اثر اÙگ؎ت:"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:394
+msgid "User ID:"
+msgid_plural "User IDs:"
+msgstr[0] "ØŽÙØ§Ø³Ù کارؚر:"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:424
+msgid "None (Don't sign)"
+msgstr "ÙÛÚ Ú©Ø¯Ø§Ù
(اÙ
ضا ÙÚ©Ù)"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:487
+msgid "Select recipients:"
+msgstr "Ø¯Ø±ÛØ§Ùت Ú©ÙÙØ¯Ù ÙØ§ را Ø§ÙØªØ®Ø§Øš Ú©Ù:"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:495
+msgid "Hide recipients"
+msgstr "Ø¯Ø±ÛØ§Ùت Ú©ÙÙØ¯Ù ÙØ§ را Ù
Ø®ÙÛ Ú©Ù"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:498
+msgid ""
+"Hide the user IDs of all recipients of an encrypted message. Otherwise "
+"anyone that sees the encrypted message can see who the recipients are."
+msgstr "ØŽÙØ§Ø³Ù Ú©Ø§Ø±ØšØ±Û ØªÙ
اÙ
Ø¯Ø±Ø³Ø§ÙØª Ú©ÙÙØ¯Ù ÙØ§Û ÛÚ© ÙŸÛØºØ§Ù
رÙ
زÙÚ¯Ø§Ø±Û ØŽØ¯Ù Ø±Ø§ ÙŸÙÙØ§Ù Ú©Ù. در ØºÛØ± اÛÙØµÙرت ÙØ± Ú©Ø³Û Ú©Ù Ø§ÛÙ ÙŸÛØºØ§Ù
رÙ
زÙÚ¯Ø§Ø±Û ØŽØ¯Ù Ø±Ø§ Ø¯Ø±ÛØ§Ùت Ù
Û Ú©ÙØ¯Ø Ù
Û ØªÙØ§Ùد ØšÙÙÙ
د Ú٠کسا٠دÛÚ¯Ø±Û Ø¢Ù Ø±Ø§ Ø¯Ø±ÛØ§Ùت Ú©Ø±Ø¯Ù Ø§ÙØ¯."
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:504
+msgid "Sign message as:"
+msgstr "ÙŸÛØ§Ù
را ؚ٠اÛ٠عÙÙØ§Ù اÙ
ضا Ú©Ù:"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:508
+msgid "Choose keys"
+msgstr "Ú©ÙÛØ¯ رÙ
زÙÚ¯Ø§Ø±Û Ø±Ø§ Ø§ÙØªØ®Ø§Øš Ú©Ù"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:548
+msgid "Do you trust these keys?"
+msgstr "Ø¢ÛØ§ ؚ٠اÛÙ Ú©ÙÛØ¯ÙØ§Û Ø±Ù
زÙÚ¯Ø§Ø±Û Ø§Ø·Ù
ÛÙØ§Ù Ø¯Ø§Ø±ÛØ¯Ø"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:551
+msgid "The following selected key is not fully trusted:"
+msgid_plural "The following selected keys are not fully trusted:"
+msgstr[0] "Ú©ÙÛØ¯ÙاÛÛ Ú©Ù Ø¯Ø± اداÙ
Ù Ø§ÙØªØ®Ø§Øš ØŽØ¯Ù Ø§ÙØ¯Ø کاÙ
ÙØ§Ù ÙØ§ØšÙ اطÙ
ÛÙØ§Ù ÙØ³ØªÙد:"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:569
+msgid "Do you trust this key enough to use it anyway?"
+msgid_plural "Do you trust these keys enough to use them anyway?"
+msgstr[0] "Ø¢ÛØ§ ØšÙ Ø§ÙØ¯Ø§Ø²Û کاÙÛ ØšÙ Ø§ÛÙ Ú©ÙÛØ¯Ùا اطÙ
ÛÙØ§Ù Ø¯Ø§Ø±ÛØ¯ تا ØšÙ ÙØ± ØØ§Ù Ø§Ø³ØªÙØ§Ø¯Ù ØŽÙÙØ¯Ø"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:582
+msgid "No keys selected"
+msgstr "Ú©ÙÛØ¯Û Ø§ÙØªØ®Ø§Øš ÙØŽØ¯Ù است"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:584
+msgid ""
+"You must select a private key to sign the message, or some public keys to "
+"encrypt the message, or both."
+msgstr "ØŽÙ
ا ØšØ§ÛØ¯ ÛÚ© Ú©ÙÛØ¯ Ø§Ø®ØªØµØ§ØµÛ Ø§ÙØªØ®Ø§Øš Ú©ÙÛØ¯ تا اÛÙ ÙŸÛØ§Ù
ؚا Ø§Ø³ØªÙØ§Ø¯Ù از آ٠اÙ
ضا ØŽÙØ¯Ø Ù ÛØ§ ÛÚ© Ú©ÙÛØ¯ عÙ
ÙÙ
Û Ø§ÙØªØ®Ø§Øš Ú©ÙÛØ¯ تا اÛÙ ÙŸÛØ§Ù
ؚا Ø§Ø³ØªÙØ§Ø¯Ù از آ٠رÙ
زÙÚ¯Ø§Ø±Û Ù ÙÙÙ ØŽÙØ¯Ø Ù ÛØ§ ÙØ±Ø¯Ù."
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:612
+msgid "No keys available"
+msgstr "ÙÛÚ Ú©ÙÛØ¯Û در دسترس ÙÛØ³Øª"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:614
+msgid ""
+"You need a private key to sign messages or a public key to encrypt messages."
+msgstr "ØŽÙ
ا ÛÚ© Ú©ÙÛØ¯ Ø®ØµÙØµÛ ÙÛØ§Ø² Ø¯Ø§Ø±ÛØ¯ تا ÙŸÛØ§Ù
ÙØ§ را اÙ
ضا Ú©ÙÛØ¯ Ù ÛØ§ ÛÚ© Ú©ÙÛØ¯ عÙ
ÙÙ
Û ÙÛØ§Ø² Ø¯Ø§Ø±ÛØ¯ تا ØšØªÙØ§ÙÛØ¯ ÙŸÛØ§Ù
ÙØ§ را رÙ
زÙÚ¯Ø§Ø±Û Ú©ÙÛØ¯."
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:742
+msgid "GnuPG error"
+msgstr "Ø®Ø·Ø§Û GnuPG"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:763
+msgid "Therefore the operation cannot be performed."
+msgstr "از اÛ٠ر٠اÛ٠عÙ
ÙÛØ§Øª ÙÙ
Û ØªÙØ§Ùد اجراÛÛ ØŽÙØ¯."
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:813
+msgid "GnuPG results"
+msgstr "ÙØªØ§Ûج GnuPG"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:819
+msgid "Output of GnuPG:"
+msgstr "Ø®Ø±ÙØ¬Û GnuPG:"
+
+#: config/chroot_local-includes/usr/local/bin/gpgApplet:844
+msgid "Other messages provided by GnuPG:"
+msgstr "Ø³Ø§ÛØ± ÙŸÛØºØ§Ù
ÙØ§ÛÛ Ú©Ù GnuPG Ù
ØÛا کرد٠است:"
+
+#: config/chroot_local-includes/usr/local/bin/iceweasel:12
+msgid "Tor is not ready"
+msgstr "ØªÙØ± Ø¢Ù
اد٠ÙÛØ³Øª"
+
+#: config/chroot_local-includes/usr/local/bin/iceweasel:13
+msgid "Tor is not ready. Start Tor Browser anyway?"
+msgstr "ØªÙØ± Ø¢Ù
اد٠ÙÛØ³Øª. Ù
Ø±ÙØ±Ú¯Ø± ØªÙØ± ØšÙ ÙØ± ØØ§Ù اجرا ØŽÙØ¯Ø"
+
+#: config/chroot_local-includes/usr/local/bin/iceweasel:14
+msgid "Start Tor Browser"
+msgstr "Ø§Ø¬Ø±Ø§Û Ù
Ø±ÙØ±Ú¯Ø± ØªÙØ±"
+
+#: config/chroot_local-includes/usr/local/bin/iceweasel:15
+msgid "Cancel"
+msgstr "ÙØºÙ"
+
+#: config/chroot_local-includes/usr/local/bin/shutdown_helper_applet:34
+msgid "Shutdown Immediately"
+msgstr "ÙÙØ±Ø§Ù خاÙ
ÙØŽ Ú©Ù"
+
+#: config/chroot_local-includes/usr/local/bin/shutdown_helper_applet:35
+msgid "Reboot Immediately"
+msgstr "ÙÙØ±Ø§Ù Ø±Ø§Ù Ø§ÙØ¯Ø§Ø²Û Ù
جدد Ú©Ù"
+
+#: config/chroot_local-includes/usr/local/bin/shutdown_helper_applet:72
+msgid "Shutdown Helper"
+msgstr "Ú©Ù
Ú© ÛØ§Ø± خاÙ
ÙØŽ Ú©Ø±Ø¯Ù"
+
+#: config/chroot_local-includes/usr/local/bin/tails-about:13
+msgid "not available"
+msgstr "اÙ
Ú©Ø§Ù ÙŸØ°ÛØ± ÙÛØ³Øª"
+
+#: config/chroot_local-includes/usr/local/bin/tails-about:16
+#: ../config/chroot_local-includes/usr/share/desktop-directories/Tails.directory.in.h:1
+msgid "Tails"
+msgstr "Tails"
+
+#: config/chroot_local-includes/usr/local/bin/tails-about:17
+msgid "The Amnesic Incognito Live System"
+msgstr "Ø³ÛØ³ØªÙ
عاÙ
Ù ÙØ§ØŽÙاخت٠Ù
ØšØªÙØ§ ØšÙ ÙØ±Ø§Ù
ÙØŽÛ"
+
+#: config/chroot_local-includes/usr/local/bin/tails-about:18
+#, python-format
+msgid ""
+"Build information:\n"
+"%s"
+msgstr "Ø§Ø·ÙØ§Ø¹Ø§Øª ساخت:\n %s"
+
+#: config/chroot_local-includes/usr/local/bin/tails-about:20
+msgid "About Tails"
+msgstr "در Ù
ÙØ±Ø¯ Tails"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:115
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:121
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:125
+msgid "Your additional software"
+msgstr "ÙØ±Ù
Ø§ÙØ²Ø§Ø± اضاÙÛ ØŽÙ
ا"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:116
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:126
+msgid ""
+"The upgrade failed. This might be due to a network problem. Please check "
+"your network connection, try to restart Tails, or read the system log to "
+"understand better the problem."
+msgstr "Ø§Ø±ØªÙØ§Ø¹ Ù
ÙØªÙÛ ØŽØ¯. اÛÙ Ù
Ù
ک٠است ؚخاطر Ù
ØŽÚ©ÙÛ Ø¯Ø± ؎ؚک٠ؚا؎د. ÙØ·Ùا Ø§ØªØµØ§Ù ØŽØšÚ©Ù Ø®ÙØ¯ را ÚÚ© Ú©ÙÛØ¯. Ø¯ÙØšØ§Ø±Ù اجرا کرد٠Tail ÙØ§ را اÙ
ØªØØ§Ù Ú©ÙÛØ¯, ÛØ§ log Ø³ÛØ³ØªÙ
را ØšØ®ÙØ§ÙÛØ¯ تا Ù
؎ک٠را ØšÙØªØ± درک Ú©ÙÛØ¯."
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:122
+msgid "The upgrade was successful."
+msgstr "ØšÙ Ø±ÙØ² رساÙÛ Ù
ÙÙÙÛØª Ø¢Ù
ÛØ² ØšÙØ¯."
+
+#: config/chroot_local-includes/usr/local/bin/tails-htp-notify-user:52
+msgid "Synchronizing the system's clock"
+msgstr "در ØØ§Ù ÙÙ
زÙ
ا٠کرد٠ساعت Ø³ÛØ³ØªÙ
"
+
+#: config/chroot_local-includes/usr/local/bin/tails-htp-notify-user:53
+msgid ""
+"Tor needs an accurate clock to work properly, especially for Hidden "
+"Services. Please wait..."
+msgstr "ØªÙØ± ØšØ±Ø§Û Ø¯Ø±Ø³Øª کار Ú©Ø§Ø±Ø¯ÙØ Ù
Ø®ØµÙØµØ§ ØšØ±Ø§Û Ø®Ø¯Ù
ات Ù
Ø®ÙÛ ØšÙ ÛÚ© ساعت دÙÛÙ Ø§ØØªÛاج Ø¯Ø§Ø±Ø¯Ø ÙØ·Ùا صؚر Ú©ÙÛØ¯..."
+
+#: config/chroot_local-includes/usr/local/bin/tails-htp-notify-user:87
+msgid "Failed to synchronize the clock!"
+msgstr "ÙÙ
زÙ
Ø§Ù Ø³Ø§Ø²Û Ø³Ø§Ø¹Øª Ù
ÙÙÙÛØª Ø¢Ù
ÛØ² ÙØšÙد!"
+
+#: config/chroot_local-includes/usr/local/bin/tails-security-check:145
+msgid "This version of Tails has known security issues:"
+msgstr "اÛÙ ÙØ³Ø®Ù از Tails اÛÙ Ù
ØŽÚ©ÙØ§Øª اÙ
ÙÛØª ØŽÙØ§Ø®ØªÙ ؎د٠را دارد:"
+
+#: config/chroot_local-includes/usr/local/bin/tails-start-i2p:62
+msgid "Starting I2P..."
+msgstr "ØŽØ±ÙØ¹ I2PØ ÙŸØ±ÙÚ٠اÛÙØªØ±Ùت ÙØ§ØŽÙاختÙ..."
+
+#: config/chroot_local-includes/usr/local/bin/tails-start-i2p:63
+msgid "The I2P router console will be opened on start."
+msgstr "Ú©ÙØ³ÙÙ I2P در زÙ
ا٠اجرا ؚاز Ø®ÙØ§Ùد ؎د."
+
+#: config/chroot_local-includes/usr/local/bin/tails-start-i2p:82
+#: config/chroot_local-includes/usr/local/bin/tails-start-i2p:124
+msgid "I2P failed to start"
+msgstr "I2P ÙØªÙØ§ÙØ³Øª ØŽØ±ÙØ¹ Ú©ÙØ¯"
+
+#: config/chroot_local-includes/usr/local/bin/tails-start-i2p:83
+msgid ""
+"Make sure that you have a working Internet connection, then try to start I2P"
+" again."
+msgstr "Ù
Ø·Ù
ØŠÙ ØŽÙÛØ¯ ک٠ؚ٠اÛÙØªØ±Ùت ÙØµÙ ÙØ³ØªÛد Ù Ø¯ÙØšØ§Ø±Ù ØªÙØ§ØŽ Ú©ÙÛØ¯ I2P را Ø±Ø§Ù Ø§ÙØ¯Ø§Ø²Û Ú©ÙÛØ¯."
+
+#: config/chroot_local-includes/usr/local/bin/tails-start-i2p:125
+msgid ""
+"Something went wrong when I2P was starting. Look in the logs in the "
+"following directory for more information:"
+msgstr "در ÙÙگاÙ
ØŽØ±ÙØ¹ ؚ٠کار I2P ÙÙ
Ù ÚÛØ² ØšÙ Ø®ÙØšÛ ÙŸÛØŽ ÙØ±Ùت. ؚ٠گزار؎ ÙØ§Û تÙÛÙ ØŽØ¯Ù Ù ÙØ§ÛÙ ÙØ§Û ÙØ§Ú¯ در اÛÙ Ù
Ø³ÛØ± Ùگا٠کÙÛØ¯:"
+
+#: config/chroot_local-includes/usr/local/bin/tails-virt-notify-user:53
+msgid "Warning: virtual machine detected!"
+msgstr "ÙØŽØ¯Ø§Ø±: Ù
ا؎ÛÙ Ù
Ø¬Ø§Ø²Û Ú©ØŽÙ ØŽØ¯!"
+
+#: config/chroot_local-includes/usr/local/bin/tails-virt-notify-user:55
+msgid ""
+"Both the host operating system and the virtualization software are able to "
+"monitor what you are doing in Tails."
+msgstr "ÙÙ
Ø³ÛØ³ØªÙ
Ù
ÛØ²ØšØ§Ù Ù ÙÙ
ÙØ±Ù
Ø§ÙØ²Ø§Ø± Ù
Ø¬Ø§Ø²Û Ø³Ø§Ø²Û Ù
Û ØªÙØ§ÙÙØ¯ ÙØ± Ú©Ø§Ø±Û Ú©Ù Ø¯Ø± Tails Ø§ÙØ¬Ø§Ù
Ù
Û Ø¯ÙÛØ¯Ø Ù
ØŽØ§ÙØ¯Ù Ú©ÙÙØ¯."
+
+#: config/chroot_local-includes/usr/local/bin/tails-virt-notify-user:57
+msgid ""
+"<a "
+"href='file:///usr/share/doc/tails/website/doc/advanced_topics/virtualization.en.html'>Learn"
+" more...</a>"
+msgstr "<a href='file:///usr/share/doc/tails/website/doc/advanced_topics/virtualization.en.html'>ØšÛØŽØªØ± ؚداÙÛØ¯...</a>"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:57
+msgid "error:"
+msgstr "خطا"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:58
+msgid "Error"
+msgstr "خطا"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:68
+msgid "Do you really want to launch the Unsafe Browser?"
+msgstr "Ø¢ÛØ§ ÙØ§Ùعا ÙØµØ¯ Ø¯Ø§Ø±ÛØ¯ Ú©Ù Ù
Ø±ÙØ±Ú¯Ø± ÙØ§ اÙ
٠را اجرا Ú©ÙÛØ¯Ø"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:70
+msgid ""
+"Network activity within the Unsafe Browser is <b>not anonymous</b>. Only use"
+" the Unsafe Browser if necessary, for example if you have to login or "
+"register to activate your Internet connection."
+msgstr "اÙ
ÙÛØª ؎ؚک٠در Ù
Ø±ÙØ±Ú¯Ø± ÙØ§ اÙ
٠در ØØ§Ùت <b> ÙØ§ØŽÙاس ÙÛØ³Øª</b> ÙØ±Ø§Ø± دارد. ÙÙØ· در ØµÙØ±Øª ÙØ²ÙÙ
از Ù
Ø±ÙØ±Ú¯Ø± ÙØ§ اÙ
Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯, ؚعÙÙØ§Ù Ù
Ø«Ø§Ù Ø¯Ø±ØŽØ±Ø§ÛØ·Û Ú©Ù ØšØ§ÛØ¯ ÙØ§Ø±Ø¯ ØŽÙÛØ¯ ÛØ§ ثؚت ÙØ§Ù
Ú©ÙÛØ¯ تا اتصا٠اÛÙØªØ±Ùت را ØšØ±ÙØ±Ø§Ø± Ú©ÙÛØ¯."
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:71
+msgid "_Launch"
+msgstr "اجرا"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:72
+msgid "_Exit"
+msgstr "Ø®Ø±ÙØ¬"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:82
+msgid "Starting the Unsafe Browser..."
+msgstr "Ø¯Ø±ØØ§Ù Ø§Ø¬Ø±Ø§Û Ù
Ø±ÙØ±Ú¯Ø± ÙØ§ اÙ
Ù"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:83
+msgid "This may take a while, so please be patient."
+msgstr "اÛÙ Ù
Ù
ک٠است Ù
Ø¯ØªÛ Ø·Ù٠ؚک؎د, ØšÙØ§ØšØ±Ø§ÛÙ ÙØ·Ùا ØŽÚ©ÛØšØ§ ØšØ§ØŽÛØ¯."
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:101
+msgid "Failed to setup chroot."
+msgstr "عدÙ
Ù
ÙÙÙÛØª در Ø±Ø§Ù Ø§ÙØ¯Ø§Ø²Û Chroot"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:175
+#: ../config/chroot_local-includes/usr/share/applications/unsafe-browser.desktop.in.h:1
+msgid "Unsafe Browser"
+msgstr "Ù
Ø±ÙØ±Ú¯Ø± ÙØ§ اÙ
Ù"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:215
+msgid "Shutting down the Unsafe Browser..."
+msgstr "Ø¯Ø±ØØ§Ù ؚست٠Ù
Ø±ÙØ±Ú¯Ø± ÙØ§ اÙ
Ù"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:216
+msgid ""
+"This may take a while, and you may not restart the Unsafe Browser until it "
+"is properly shut down."
+msgstr "اÛÙ Ù
Ù
ک٠است Ù
Ø¯ØªÛ Ø·Ù٠ؚک؎د, ٠تا زÙ
اÙÛ Ú©Ù ØšÙ Ø¯Ø±Ø³ØªÛ Ø®Ø§Ù
ÙØŽ ØŽÙØ¯ ÙØ·Ùا Ù
Ø±ÙØ±Ú¯Ø± ÙØ§Ø§Ù
٠را Ø±Û Ø§Ø³ØªØ§Ø±Øª ÙÚ©ÙÛØ¯"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:228
+msgid "Failed to restart Tor."
+msgstr "عدÙ
Ù
ÙÙÙÛØª در Ø±Û Ø§Ø³ØªØ§Ø±Øª کرد٠Tor"
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:236
+msgid ""
+"Another Unsafe Browser is currently running, or being cleaned up. Please "
+"retry in a while."
+msgstr "ÛÚ© Ù
Ø±ÙØ±Ú¯Ø± ÙØ§ اÙ
٠دÛگر Ø¯Ø±ØØ§Ù اجرا, ÛØ§ در ØØ§Ù ÙŸØ§Ú©Ø³Ø§Ø²Û Ø§Ø³Øª. ÙØ·Ùا Ú©Ù
Û Ø¯ÛØ±ØªØ± Ø¯ÙØšØ§Ø±Ù اÙ
ØªØØ§Ù Ú©ÙÛØ¯."
+
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:249
+msgid ""
+"No DNS server was obtained through DHCP or manually configured in "
+"NetworkManager."
+msgstr "ÙÛÚ Ø³Ø±ÙØ± DNS از طرÛÙ DHCP ÛØ§ ØªÙØžÛÙ
Ø¯Ø³ØªÛ Ø¯Ø± NetworkManager ؚدست ÙÛØ§Ù
د."
+
+#: config/chroot_local-includes/usr/share/tails/truecrypt-wrapper.disabled:11
+msgid "TrueCrypt will soon be removed from Tails"
+msgstr "TrueCrypt ØšÙ Ø²ÙØ¯Û از Tails ØØ°Ù Ù
ÛØŽÙد."
+
+#: config/chroot_local-includes/usr/share/tails/truecrypt-wrapper.disabled:12
+msgid ""
+"TrueCrypt will soon be removed from Tails due to license and development "
+"concerns."
+msgstr "TrueCrypt ؚ٠دÙÛÙ Ù
سا؊٠Ù
Ø±ØšÙØ· ØšÙ ØªÙØ³Ø¹Ù Ù ÙÛØ³Ø§Ùس ØšÙ Ø²ÙØ¯Û از Tails ØØ°Ù Ù
ÛØŽÙد."
+
+#: ../config/chroot_local-includes/etc/skel/Desktop/Report_an_error.desktop.in.h:1
+msgid "Report an error"
+msgstr "ÛÚ© خطا را گزار؎ Ú©ÙÛØ¯"
+
+#: ../config/chroot_local-includes/etc/skel/Desktop/Tails_documentation.desktop.in.h:1
+msgid "Tails documentation"
+msgstr "Ù
Ø³ØªÙØ¯Ø§Øª Tails"
+
+#: ../config/chroot_local-includes/usr/share/applications/i2p.desktop.in.h:1
+msgid "Anonymous overlay network "
+msgstr "ØŽØšÚ©Ù ÙÙ
ÙŸÙØŽØ§Ù ÙØ§ØŽÙاس"
+
+#: ../config/chroot_local-includes/usr/share/applications/i2p.desktop.in.h:2
+msgid "i2p"
+msgstr "I2P ٟرÙÚ٠اÛÙØªØ±Ùت ÙØ§ØŽÙاس"
+
+#: ../config/chroot_local-includes/usr/share/applications/i2p.desktop.in.h:3
+msgid "Anonymous overlay network"
+msgstr "ØŽØšÚ©Ù ÙÙ
ÙŸÙØŽØ§Ù ÙØ§ØŽÙاس"
+
+#: ../config/chroot_local-includes/usr/share/applications/tails-reboot.desktop.in.h:1
+msgid "Reboot"
+msgstr "Ø±Û Ø§Ø³ØªØ§Ø±Øª."
+
+#: ../config/chroot_local-includes/usr/share/applications/tails-reboot.desktop.in.h:2
+msgid "Immediately reboot computer"
+msgstr "ÙÙØ±Ø§ Ø±Ø§ÛØ§Ù٠را Ø±ÛØ³ØªØ§Ø±Øª Ú©Ù"
+
+#: ../config/chroot_local-includes/usr/share/applications/tails-shutdown.desktop.in.h:1
+msgid "Power Off"
+msgstr "ÙØ·Ø¹ ØšØ±Ù Ø±Ø§ÛØ§ÙÙ"
+
+#: ../config/chroot_local-includes/usr/share/applications/tails-shutdown.desktop.in.h:2
+msgid "Immediately shut down computer"
+msgstr "ÙÙØ±Ø§ Ø±Ø§ÛØ§Ù٠را خاÙ
ÙØŽ Ú©Ù."
+
+#: ../config/chroot_local-includes/usr/share/applications/unsafe-browser.desktop.in.h:2
+msgid "Browse the World Wide Web without anonymity"
+msgstr "ØŽØšÚ©Ù Ø¬ÙØ§ÙÛ Ø±Ø§ ؚدÙÙ ÙØ§ØŽÙاس ØšÙØ¯Ù Ù
Ø±ÙØ± Ú©ÙÛØ¯."
+
+#: ../config/chroot_local-includes/usr/share/applications/unsafe-browser.desktop.in.h:3
+msgid "Unsafe Web Browser"
+msgstr "Ù
Ø±ÙØ±Ú¯Ø± ÙØš ÙØ§ اÙ
Ù."
+
+#: ../config/chroot_local-includes/usr/share/desktop-directories/Tails.directory.in.h:2
+msgid "Tails specific tools"
+msgstr "اؚزار ÙØ§Û ؚارز Tails"
1
0

[translation/tails-misc] Update translations for tails-misc
by translation@torproject.org 24 Feb '14
by translation@torproject.org 24 Feb '14
24 Feb '14
commit 8ef088222fec665fa525ced4e541eb0ed5f823d8
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Feb 24 13:15:45 2014 +0000
Update translations for tails-misc
---
fa.po | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/fa.po b/fa.po
index 2e20886..c5ca375 100644
--- a/fa.po
+++ b/fa.po
@@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-29 15:05+0100\n"
-"PO-Revision-Date: 2014-02-24 11:26+0000\n"
+"PO-Revision-Date: 2014-02-24 12:52+0000\n"
"Last-Translator: desmati <desmati(a)gmail.com>\n"
"Language-Team: Persian (http://www.transifex.com/projects/p/torproject/language/fa/)\n"
"MIME-Version: 1.0\n"
@@ -22,11 +22,11 @@ msgstr ""
#: config/chroot_local-includes/etc/NetworkManager/dispatcher.d/60-tor-ready-notification.sh:31
msgid "Tor is ready"
-msgstr ""
+msgstr "تور آماده است"
#: config/chroot_local-includes/etc/NetworkManager/dispatcher.d/60-tor-ready-notification.sh:32
msgid "You can now access the Internet."
-msgstr ""
+msgstr "حالا می توانید به اینترنت دسترسی داشته باشید."
#: config/chroot_local-includes/etc/whisperback/config.py:64
#, python-format
@@ -198,15 +198,15 @@ msgstr "سایر پیغام هایی که GnuPG محیا کرده است:"
#: config/chroot_local-includes/usr/local/bin/iceweasel:12
msgid "Tor is not ready"
-msgstr ""
+msgstr "تور آماده نیست"
#: config/chroot_local-includes/usr/local/bin/iceweasel:13
msgid "Tor is not ready. Start Tor Browser anyway?"
-msgstr ""
+msgstr "تور آماده نیست. مرورگر تور به هر حال اجرا شود؟"
#: config/chroot_local-includes/usr/local/bin/iceweasel:14
msgid "Start Tor Browser"
-msgstr ""
+msgstr "اجرای مرورگر تور"
#: config/chroot_local-includes/usr/local/bin/iceweasel:15
msgid "Cancel"
1
0