commit 3b2a31bd2d005d73df3907d74a0a452ddbe11ed5
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sun May 24 13:18:15 2015 -0700
Simplify setup.py
We read rather than imported our stem/__init__.py constants because importing
our python2 codebase could result in syntax errors for python3. Now that we
have a unified python2/3 codebase this is no longer a concern so we can drop
this hack! \o/
---
setup.py | 47 +++++++++--------------------------------------
1 file changed, 9 insertions(+), 38 deletions(-)
diff --git a/setup.py b/setup.py
index 774ee10..4d0df77 100644
--- a/setup.py
+++ b/setup.py
@@ -2,47 +2,18 @@
# Copyright 2012-2015, Damian Johnson and The Tor Project
# See LICENSE for licensing information
-# We cannot import anything from the stem module since this would risk
-# importing code that does not work under python 3 *without* being converted.
-#
-# I hate to do this, but reading our module file's information directly.
+import distutils.core
+import stem
-import os
-import re
-from distutils.core import setup
-STAT_LINE = re.compile(r"^__(.+)__ = '(.+)'$")
-
-DESCRIPTION = """\
-Stem is a Python controller library that allows applications to interact with
-Tor <https://www.torproject.org/>."""
-
-def get_module_info():
- # reads the basic __stat__ strings from our module's init
-
- result = {}
- cwd = os.path.sep.join(__file__.split(os.path.sep)[:-1])
-
- with open(os.path.join(cwd, 'stem', '__init__.py')) as init_file:
- for line in init_file.readlines():
- line_match = STAT_LINE.match(line)
-
- if line_match:
- keyword, value = line_match.groups()
- result[keyword] = value
-
- return result
-
-module_info = get_module_info()
-
-setup(
+distutils.core.setup(
name = 'stem',
- version = module_info['version'],
- description = DESCRIPTION,
- license = module_info['license'],
- author = module_info['author'],
- author_email = module_info['contact'],
- url = module_info['url'],
+ version = stem.__version__,
+ description = "Python controller library that allows applications to interact with Tor <https://www.torproject.org/>.",
+ license = stem.__license__,
+ author = stem.__author__,
+ author_email = stem.__contact__,
+ url = stem.__url__,
packages = ['stem', 'stem.descriptor', 'stem.interpreter', 'stem.response', 'stem.util'],
provides = ['stem'],
keywords = 'tor onion controller',
commit 4a1b312bc42f1bd4ed2c60e3391db6cc42096dd1
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sun May 24 10:42:09 2015 -0700
IPv6 addresses could trigger errors in several methods and classes
Routinely we do...
address, port = my_input.split(':', 1)
if stem.util.connection.is_valid_port(port):
raise ValueError('%s is an invalid port' % port)
Fine for IPv4, but IPv6 has ':' within the address...
2607:ff58::d053:df22:52773
Trivial to fix, changing those split() calls to rsplit().
---
docs/change_log.rst | 5 +++++
stem/control.py | 6 +++---
stem/descriptor/extrainfo_descriptor.py | 2 +-
stem/descriptor/networkstatus.py | 2 +-
stem/exit_policy.py | 2 +-
stem/interpreter/arguments.py | 2 +-
stem/interpreter/commands.py | 2 +-
stem/response/events.py | 6 +++---
stem/util/proc.py | 2 +-
9 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/docs/change_log.rst b/docs/change_log.rst
index edc60ea..643f5bd 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -47,6 +47,11 @@ The following are only available within Stem's `git repository
* Dramatic, `300x performance improvement <https://github.com/DonnchaC/stem/pull/1>`_ for reading from the control port with python 3
* :func:`~stem.connection.connect` and :func:`~stem.control.Controller.from_port` now connect to both port 9051 (relay's default) and 9151 (Tor Browser's default) (:trac:`16075`)
* Added `support for NETWORK_LIVENESS events <api/response.html#stem.response.events.NetworkLivenessEvent>`_ (:spec:`44aac63`)
+ * IPv6 addresses could trigger errors in :func:`~stem.control.Controller.get_listeners`, :class:`~stem.response.events.ORConnEvent`, and quite a few other things (:trac:`16174`)
+
+ * **Website**
+
+ * Example for `custom path selection for circuits <tutorials/to_russia_with_love.html#custom-path-selection>`_ (:trac:`8728`)
.. _version_1.4:
diff --git a/stem/control.py b/stem/control.py
index 544e3a2..8b0363f 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -1253,7 +1253,7 @@ class Controller(BaseController):
raise stem.ProtocolError("'GETINFO %s' had a listener without a colon: %s" % (query, listener))
listener = listener[1:-1] # strip quotes
- addr, port = listener.split(':')
+ addr, port = listener.rsplit(':', 1)
# Skip unix sockets, for instance...
#
@@ -1294,7 +1294,7 @@ class Controller(BaseController):
for listener in self.get_conf(listener_option, multiple = True):
if ':' in listener:
- addr, port = listener.split(':')
+ addr, port = listener.rsplit(':', 1)
proxy_addrs.append((addr, port))
else:
proxy_addrs.append((listener, port_value))
@@ -2307,7 +2307,7 @@ class Controller(BaseController):
if target.isdigit():
target_port = target
else:
- target_address, target_port = target.split(':')
+ target_address, target_port = target.rsplit(':', 1)
if not stem.util.connection.is_valid_port(port):
raise stem.ProtocolError('GETCONF provided an invalid HiddenServicePort port (%s): %s' % (port, content))
diff --git a/stem/descriptor/extrainfo_descriptor.py b/stem/descriptor/extrainfo_descriptor.py
index 607bbbe..56c042a 100644
--- a/stem/descriptor/extrainfo_descriptor.py
+++ b/stem/descriptor/extrainfo_descriptor.py
@@ -280,7 +280,7 @@ def _parse_transport_line(descriptor, entries):
raise ValueError("Transport line's address:port entry is missing a colon: transport %s" % value)
name = value_comp[0]
- address, port_str = value_comp[1].split(':', 1)
+ address, port_str = value_comp[1].rsplit(':', 1)
if not stem.util.connection.is_valid_ipv4_address(address) or \
stem.util.connection.is_valid_ipv6_address(address):
diff --git a/stem/descriptor/networkstatus.py b/stem/descriptor/networkstatus.py
index f82e9e8..2db94a6 100644
--- a/stem/descriptor/networkstatus.py
+++ b/stem/descriptor/networkstatus.py
@@ -1256,7 +1256,7 @@ def _parse_dir_address_line(descriptor, entries):
if ':' not in value:
raise ValueError("Key certificate's 'dir-address' is expected to be of the form ADDRESS:PORT: dir-address %s" % value)
- address, dirport = value.split(':', 1)
+ address, dirport = value.rsplit(':', 1)
if not stem.util.connection.is_valid_ipv4_address(address):
raise ValueError("Key certificate's address isn't a valid IPv4 address: dir-address %s" % value)
diff --git a/stem/exit_policy.py b/stem/exit_policy.py
index 62b9a12..4d0f249 100644
--- a/stem/exit_policy.py
+++ b/stem/exit_policy.py
@@ -137,7 +137,7 @@ def get_config_policy(rules, ip_address = None):
if 'private' in rule:
acceptance = rule.split(' ', 1)[0]
- port = rule.split(':', 1)[1]
+ port = rule.rsplit(':', 1)[1]
addresses = list(PRIVATE_ADDRESSES)
if ip_address:
diff --git a/stem/interpreter/arguments.py b/stem/interpreter/arguments.py
index eeae504..2da6410 100644
--- a/stem/interpreter/arguments.py
+++ b/stem/interpreter/arguments.py
@@ -50,7 +50,7 @@ def parse(argv):
for opt, arg in recognized_args:
if opt in ('-i', '--interface'):
if ':' in arg:
- address, port = arg.split(':', 1)
+ address, port = arg.rsplit(':', 1)
else:
address, port = None, arg
diff --git a/stem/interpreter/commands.py b/stem/interpreter/commands.py
index 4047517..ffca9ab 100644
--- a/stem/interpreter/commands.py
+++ b/stem/interpreter/commands.py
@@ -51,7 +51,7 @@ def _get_fingerprint(arg, controller):
raise ValueError("Unable to find a relay with the nickname of '%s'" % arg)
elif ':' in arg or stem.util.connection.is_valid_ipv4_address(arg):
if ':' in arg:
- address, port = arg.split(':', 1)
+ address, port = arg.rsplit(':', 1)
if not stem.util.connection.is_valid_ipv4_address(address):
raise ValueError("'%s' isn't a valid IPv4 address" % address)
diff --git a/stem/response/events.py b/stem/response/events.py
index 464dd61..c760b98 100644
--- a/stem/response/events.py
+++ b/stem/response/events.py
@@ -862,7 +862,7 @@ class ORConnEvent(Event):
if ':' not in self.endpoint:
raise stem.ProtocolError("ORCONN endpoint is neither a relay nor 'address:port': %s" % self)
- address, port = self.endpoint.split(':', 1)
+ address, port = self.endpoint.rsplit(':', 1)
if not connection.is_valid_port(port):
raise stem.ProtocolError("ORCONN's endpoint location's port is invalid: %s" % self)
@@ -1009,7 +1009,7 @@ class StreamEvent(Event):
if ':' not in self.source_addr:
raise stem.ProtocolError("Source location must be of the form 'address:port': %s" % self)
- address, port = self.source_addr.split(':', 1)
+ address, port = self.source_addr.rsplit(':', 1)
if not connection.is_valid_port(port, allow_zero = True):
raise stem.ProtocolError("Source location's port is invalid: %s" % self)
@@ -1296,7 +1296,7 @@ def _parse_cell_type_mapping(mapping):
if ':' not in entry:
raise stem.ProtocolError("Mappings are expected to be of the form 'key:value', got '%s': %s" % (entry, mapping))
- key, value = entry.split(':', 1)
+ key, value = entry.rsplit(':', 1)
if not CELL_TYPE.match(key):
raise stem.ProtocolError("Key had invalid characters, got '%s': %s" % (key, mapping))
diff --git a/stem/util/proc.py b/stem/util/proc.py
index e4a826e..a03b83b 100644
--- a/stem/util/proc.py
+++ b/stem/util/proc.py
@@ -429,7 +429,7 @@ def _decode_proc_address_encoding(addr):
:returns: **tuple** of the form **(addr, port)**, with addr as a string and port an int
"""
- ip, port = addr.split(':')
+ ip, port = addr.rsplit(':', 1)
# the port is represented as a two-byte hexadecimal number
port = int(port, 16)
commit d6e775041ff2190567ccc1d3e92396d9f04c6dcf
Author: Translation commit bot <translation(a)torproject.org>
Date: Sun May 24 16:45:50 2015 +0000
Update translations for tails-misc
---
id.po | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/id.po b/id.po
index 54cb01c..d4f1e75 100644
--- a/id.po
+++ b/id.po
@@ -13,7 +13,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-05-02 23:47+0200\n"
-"PO-Revision-Date: 2015-05-22 20:20+0000\n"
+"PO-Revision-Date: 2015-05-24 16:27+0000\n"
"Last-Translator: cholif yulian <cholifyulian123(a)gmail.com>\n"
"Language-Team: Indonesian (http://www.transifex.com/projects/p/torproject/language/id/)\n"
"MIME-Version: 1.0\n"
@@ -45,7 +45,7 @@ msgid ""
"an opportunity for eavesdroppers, like your email or Internet provider, to\n"
"confirm that you are using Tails.\n"
"</p>\n"
-msgstr ""
+msgstr "<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\nneeded!</strong></p>\n<h2>About giving us an email address</h2>\n<p>\nBeri kami alamat email yang memungkinkan kami untuk mengontak anda untuk klarifikasi masalah . Ini dibutuhkan untuk sebagian besar pada laporan yang kami terima sebagai kebanyakan laporan tanpa informasi kontak yang berguna , dengan kata lain juga menyediakan kesempatan untuk para penyadap , seperti email anda atau provider internet untuk konfirmasi bahwa anda sedang menggunakan Tails.\n</p>\n"
#: config/chroot_local-includes/usr/local/bin/electrum:14
msgid "Persistence is disabled for Electrum"
commit e5f807ca6a9a25f8ef788810b450988e668936e6
Author: Translation commit bot <translation(a)torproject.org>
Date: Sun May 24 16:45:27 2015 +0000
Update translations for tails-persistence-setup_completed
---
id/id.po | 328 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 328 insertions(+)
diff --git a/id/id.po b/id/id.po
new file mode 100644
index 0000000..bc84311
--- /dev/null
+++ b/id/id.po
@@ -0,0 +1,328 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Tails developers
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# cholif yulian <cholifyulian123(a)gmail.com>, 2015
+# hermawan <hermawanadhis(a)gmail.com>, 2014
+# Lucas Susanto <susantolucas(a)yahoo.com>, 2015
+# km242saya <pencurimangga(a)gmail.com>, 2014
+# Rendiyono Wahyu Saputro <rendi.7936(a)gmail.com>, 2015
+# Riza Fadholi Pasha <riza.pasha(a)mail.ugm.ac.id>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: The Tor Project\n"
+"Report-Msgid-Bugs-To: Tails developers <tails(a)boum.org>\n"
+"POT-Creation-Date: 2015-05-02 21:08+0200\n"
+"PO-Revision-Date: 2015-05-24 16:17+0000\n"
+"Last-Translator: cholif yulian <cholifyulian123(a)gmail.com>\n"
+"Language-Team: Indonesian (http://www.transifex.com/projects/p/torproject/language/id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:48
+msgid "Personal Data"
+msgstr "Data Pribadi"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:50
+msgid "Keep files stored in the `Persistent' directory"
+msgstr "Tetapkan file-file tersimpan pada direktori 'persistent'"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:58
+msgid "GnuPG"
+msgstr "GnuPG"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:60
+msgid "GnuPG keyrings and configuration"
+msgstr "GnuPG keyrings dan konfigurasinya"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:68
+msgid "SSH Client"
+msgstr "Klien SSH"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:70
+msgid "SSH keys, configuration and known hosts"
+msgstr "Kunci SSH, konfigurasi dan host yang diketahui"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:78
+msgid "Pidgin"
+msgstr "Aplikasi Pidgin"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:80
+msgid "Pidgin profiles and OTR keyring"
+msgstr "Profil Pidgin dan keyrings OTR"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:88
+msgid "Claws Mail"
+msgstr "Claws Mail"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:90
+msgid "Claws Mail profiles and locally stored email"
+msgstr "Profil Claws Mail dan email tersimpan secara lokal"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:98
+msgid "GNOME Keyring"
+msgstr "GNOME Keyrings"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:100
+msgid "Secrets stored by GNOME Keyring"
+msgstr "Rahasia-rahasia tersimpan dengan GNOME Keyring"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:108
+msgid "Network Connections"
+msgstr "Koneksi jaringan"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:110
+msgid "Configuration of network devices and connections"
+msgstr "Pengaturan perangkat jaringan dan koneksi"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr "Favorit"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in the Tor Browser"
+msgstr "Favorit yang tersimpan dalam peramban Tor"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+msgid "Printers"
+msgstr "Pencetak"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+msgid "Printers configuration"
+msgstr "Pengaturan pencetak"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+msgid "Bitcoin client"
+msgstr "Klien bitcoin"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+msgid "Electrum's bitcoin wallet and configuration"
+msgstr "Dompet bitcoin elektrum dan konfigurasi"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
+msgid "APT Packages"
+msgstr "Paket APT"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
+msgid "Packages downloaded by APT"
+msgstr "Paket yang diunduh APT"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:158
+msgid "APT Lists"
+msgstr "Daftar APT"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:160
+msgid "Lists downloaded by APT"
+msgstr "Daftar yang diunduh APT"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:168
+msgid "Dotfiles"
+msgstr "Berkas titik"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:170
+msgid ""
+"Symlink into $HOME every file or directory found in the `dotfiles' directory"
+msgstr "Symlink ke dalam $HOME setiap file atau direktori di peroleh dalam direktori 'dotfiles'"
+
+#: ../lib/Tails/Persistence/Setup.pm:227
+msgid "Setup Tails persistent volume"
+msgstr "Seting volume Tail persistent"
+
+#: ../lib/Tails/Persistence/Setup.pm:307 ../lib/Tails/Persistence/Setup.pm:451
+msgid "Error"
+msgstr "Error"
+
+#: ../lib/Tails/Persistence/Setup.pm:338
+#, perl-format
+msgid "Device %s already has a persistent volume."
+msgstr "Device %s sudah memiliki volume persistent"
+
+#: ../lib/Tails/Persistence/Setup.pm:346
+#, perl-format
+msgid "Device %s has not enough unallocated space."
+msgstr "Perangkat %s tidak memiliki ruang tidak teralokasi yang cukup."
+
+#: ../lib/Tails/Persistence/Setup.pm:354 ../lib/Tails/Persistence/Setup.pm:368
+#, perl-format
+msgid "Device %s has no persistent volume."
+msgstr "Device %s tidak memiliki volume persistent"
+
+#: ../lib/Tails/Persistence/Setup.pm:360
+msgid ""
+"Cannot delete the persistent volume while in use. You should restart Tails "
+"without persistence."
+msgstr "Tidak dapat menghapus volume persistent selagi dalam penggunaan. Anda harus restart Tails tanpa persistent"
+
+#: ../lib/Tails/Persistence/Setup.pm:379
+msgid "Persistence volume is not unlocked."
+msgstr "Volume persistent tidak terkunci"
+
+#: ../lib/Tails/Persistence/Setup.pm:384
+msgid "Persistence volume is not mounted."
+msgstr "Volume persistent tidak terpasang"
+
+#: ../lib/Tails/Persistence/Setup.pm:389
+msgid "Persistence volume is not readable. Permissions or ownership problems?"
+msgstr "Volume persistent tidak terbaca. masalah Izin atau kepemilikan"
+
+#: ../lib/Tails/Persistence/Setup.pm:394
+msgid "Persistence volume is not writable. Maybe it was mounted read-only?"
+msgstr "Volume persistent tidak bisa di tulis. kemungkinan hanya bisa dibaca"
+
+#: ../lib/Tails/Persistence/Setup.pm:403
+#, perl-format
+msgid "Tails is running from non-USB / non-SDIO device %s."
+msgstr "Tails dijalankan dari perangkat non-USB atau non-SDIO (perangkat %s)."
+
+#: ../lib/Tails/Persistence/Setup.pm:409
+#, perl-format
+msgid "Device %s is optical."
+msgstr "Perangkat %s adalah CD/DVD."
+
+#: ../lib/Tails/Persistence/Setup.pm:416
+#, perl-format
+msgid "Device %s was not created using Tails Installer."
+msgstr "Perangkat %s tidak dibuat dengan aplikasi instalasi Tails."
+
+#: ../lib/Tails/Persistence/Setup.pm:676
+msgid "Persistence wizard - Finished"
+msgstr "Wizard persistent - selesai"
+
+#: ../lib/Tails/Persistence/Setup.pm:679
+msgid ""
+"Any changes you have made will only take effect after restarting Tails.\n"
+"\n"
+"You may now close this application."
+msgstr "Perubahan-perubahan yang telah Anda buat hanya akan berlaku setelah Tails dijalankan ulang.\n\nAnda dapat menutup aplikasi ini sekarang."
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:54
+msgid "Persistence wizard - Persistent volume creation"
+msgstr "Wizard persistent - persistent volume creation"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:57
+msgid "Choose a passphrase to protect the persistent volume"
+msgstr "Pilih kata kunci untuk memprotect volume persistent"
+
+#. TRANSLATORS: size, device vendor, device model
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:61
+#, perl-format
+msgid ""
+"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr "A %s volume persistent akan dibuat pada perangkat <b>%s %s</b>. Data pada volume ini akan disimpan pada bentuk proteksi terenkripsi dengan sebuah Passphrase"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
+msgid "Create"
+msgstr "Buat"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:110
+msgid ""
+"<b>Beware!</b> Using persistence has consequences that must be well "
+"understood. Tails can't help you if you use it wrong! See <a "
+"href='file:///usr/share/doc/tails/website/doc/first_steps/persistence.en.html'>Tails"
+" documentation about persistence</a> to learn more."
+msgstr "<b>Hati-hati!</b> Penggunaan persistence memiliki konsekwensi yang harus dipahami dengan baik . Tails tidak dapat membantu anda jika anda menggunakannya dengan salah ! Lihat <a href='file:///usr/share/doc/tails/website/doc/first_steps/persistence.en.html'>Tails dokumentasi Tails tentang persistence</a> untuk dipelajari lebih lanjut ."
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:144
+msgid "Passphrase:"
+msgstr "Kata Kunci:"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:154
+msgid "Verify Passphrase:"
+msgstr "Verifikasi Kalimat:"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:167
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:231
+msgid "Passphrase can't be empty"
+msgstr "Kalimat tidak boleh kosong"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:222
+msgid "Passphrases do not match"
+msgstr "Kalimat tidak cocok"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:262
+#: ../lib/Tails/Persistence/Step/Configure.pm:129
+msgid "Failed"
+msgstr "Gagal"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:271
+msgid "Mounting Tails persistence partition."
+msgstr "Pemasangan Partisi Tail persistent"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:274
+msgid "The Tails persistence partition will be mounted."
+msgstr "Partisi persistent akan di pasang"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:283
+msgid "Correcting permissions of the persistent volume."
+msgstr "Koreksi izin/permisi dari volume persistent"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:286
+msgid "The permissions of the persistent volume will be corrected."
+msgstr "Izin volume persistent akan dikoreksi"
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:308
+msgid "Creating..."
+msgstr "Membuat...."
+
+#: ../lib/Tails/Persistence/Step/Bootstrap.pm:311
+msgid "Creating the persistent volume..."
+msgstr "Pembuatan volume persistent"
+
+#: ../lib/Tails/Persistence/Step/Configure.pm:61
+msgid "Persistence wizard - Persistent volume configuration"
+msgstr "Wizard Persistent - konfigurasi persisent volume"
+
+#: ../lib/Tails/Persistence/Step/Configure.pm:64
+msgid "Specify the files that will be saved in the persistent volume"
+msgstr "File spesifik yang tersimpan di dalam persistent volume"
+
+#. TRANSLATORS: partition, size, device vendor, device model
+#: ../lib/Tails/Persistence/Step/Configure.pm:68
+#, perl-format
+msgid ""
+"The selected files will be stored in the encrypted partition %s (%s), on the"
+" <b>%s %s</b> device."
+msgstr "Berkas-berkas yang terseleksi akan disimpan di dalam partisi terenkripsi %s (%s), di perangkat <b>%s %s</b>."
+
+#: ../lib/Tails/Persistence/Step/Configure.pm:74
+msgid "Save"
+msgstr "Simpan"
+
+#: ../lib/Tails/Persistence/Step/Configure.pm:143
+msgid "Saving..."
+msgstr "Sedang menyimpan...."
+
+#: ../lib/Tails/Persistence/Step/Configure.pm:146
+msgid "Saving persistence configuration..."
+msgstr "konfigurasi penyimpanan persistent"
+
+#: ../lib/Tails/Persistence/Step/Delete.pm:41
+msgid "Persistence wizard - Persistent volume deletion"
+msgstr "Wizard Persistence - Penghapusan volume persistent"
+
+#: ../lib/Tails/Persistence/Step/Delete.pm:44
+msgid "Your persistent data will be deleted."
+msgstr "Data Persistent anda akan dihapus"
+
+#: ../lib/Tails/Persistence/Step/Delete.pm:48
+#, perl-format
+msgid ""
+"The persistent volume %s (%s), on the <b>%s %s</b> device, will be deleted."
+msgstr "Volume persistent %s (%s), pada perangkat <b>%s %s</b> , akan dihapus ."
+
+#: ../lib/Tails/Persistence/Step/Delete.pm:54
+msgid "Delete"
+msgstr "Hapus"
+
+#: ../lib/Tails/Persistence/Step/Delete.pm:101
+msgid "Deleting..."
+msgstr "Sedang menghapus...."
+
+#: ../lib/Tails/Persistence/Step/Delete.pm:104
+msgid "Deleting the persistent volume..."
+msgstr "Penghapusan persistent volume"