Merge branch 'main' into list-not-loading

This commit is contained in:
Mouse Reeve 2021-12-15 09:56:33 -08:00
commit 5e932711f9
24 changed files with 207 additions and 74 deletions

View file

@ -256,9 +256,7 @@ def get_data(url, params=None, timeout=10):
params=params, params=params,
headers={ # pylint: disable=line-too-long headers={ # pylint: disable=line-too-long
"Accept": ( "Accept": (
"application/activity+json," 'application/json, application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"; charset=utf-8'
' application/ld+json; profile="https://www.w3.org/ns/activitystreams",'
" application/json; charset=utf-8"
), ),
"User-Agent": settings.USER_AGENT, "User-Agent": settings.USER_AGENT,
}, },
@ -266,7 +264,7 @@ def get_data(url, params=None, timeout=10):
) )
except RequestException as err: except RequestException as err:
logger.exception(err) logger.exception(err)
raise ConnectorException() raise ConnectorException(err)
if not resp.ok: if not resp.ok:
raise ConnectorException() raise ConnectorException()
@ -274,7 +272,7 @@ def get_data(url, params=None, timeout=10):
data = resp.json() data = resp.json()
except ValueError as err: except ValueError as err:
logger.exception(err) logger.exception(err)
raise ConnectorException() raise ConnectorException(err)
return data return data

View file

@ -3,4 +3,5 @@
from .importer import Importer from .importer import Importer
from .goodreads_import import GoodreadsImporter from .goodreads_import import GoodreadsImporter
from .librarything_import import LibrarythingImporter from .librarything_import import LibrarythingImporter
from .openlibrary_import import OpenLibraryImporter
from .storygraph_import import StorygraphImporter from .storygraph_import import StorygraphImporter

View file

@ -26,7 +26,7 @@ class Importer:
("authors", ["author", "authors", "primary author"]), ("authors", ["author", "authors", "primary author"]),
("isbn_10", ["isbn10", "isbn"]), ("isbn_10", ["isbn10", "isbn"]),
("isbn_13", ["isbn13", "isbn", "isbns"]), ("isbn_13", ["isbn13", "isbn", "isbns"]),
("shelf", ["shelf", "exclusive shelf", "read status"]), ("shelf", ["shelf", "exclusive shelf", "read status", "bookshelf"]),
("review_name", ["review name"]), ("review_name", ["review name"]),
("review_body", ["my review", "review"]), ("review_body", ["my review", "review"]),
("rating", ["my rating", "rating", "star rating"]), ("rating", ["my rating", "rating", "star rating"]),
@ -36,9 +36,9 @@ class Importer:
] ]
date_fields = ["date_added", "date_started", "date_finished"] date_fields = ["date_added", "date_started", "date_finished"]
shelf_mapping_guesses = { shelf_mapping_guesses = {
"to-read": ["to-read"], "to-read": ["to-read", "want to read"],
"read": ["read"], "read": ["read", "already read"],
"reading": ["currently-reading", "reading"], "reading": ["currently-reading", "reading", "currently reading"],
} }
def create_job(self, user, csv_file, include_reviews, privacy): def create_job(self, user, csv_file, include_reviews, privacy):
@ -90,7 +90,10 @@ class Importer:
def get_shelf(self, normalized_row): def get_shelf(self, normalized_row):
"""determine which shelf to use""" """determine which shelf to use"""
shelf_name = normalized_row["shelf"] shelf_name = normalized_row.get("shelf")
if not shelf_name:
return None
shelf_name = shelf_name.lower()
shelf = [ shelf = [
s for (s, gs) in self.shelf_mapping_guesses.items() if shelf_name in gs s for (s, gs) in self.shelf_mapping_guesses.items() if shelf_name in gs
] ]
@ -106,6 +109,7 @@ class Importer:
user=user, user=user,
include_reviews=original_job.include_reviews, include_reviews=original_job.include_reviews,
privacy=original_job.privacy, privacy=original_job.privacy,
source=original_job.source,
# TODO: allow users to adjust mappings # TODO: allow users to adjust mappings
mappings=original_job.mappings, mappings=original_job.mappings,
retry=True, retry=True,

View file

@ -0,0 +1,13 @@
""" handle reading a csv from openlibrary"""
from . import Importer
class OpenLibraryImporter(Importer):
"""csv downloads from OpenLibrary"""
service = "OpenLibrary"
def __init__(self, *args, **kwargs):
self.row_mappings_guesses.append(("openlibrary_key", ["edition id"]))
self.row_mappings_guesses.append(("openlibrary_work_key", ["work id"]))
super().__init__(*args, **kwargs)

View file

@ -3,6 +3,6 @@ from . import Importer
class StorygraphImporter(Importer): class StorygraphImporter(Importer):
"""csv downloads from librarything""" """csv downloads from Storygraph"""
service = "Storygraph" service = "Storygraph"

View file

@ -25,7 +25,7 @@ def construct_search_term(title, author):
# Strip brackets (usually series title from search term) # Strip brackets (usually series title from search term)
title = re.sub(r"\s*\([^)]*\)\s*", "", title) title = re.sub(r"\s*\([^)]*\)\s*", "", title)
# Open library doesn't like including author initials in search term. # Open library doesn't like including author initials in search term.
author = re.sub(r"(\w\.)+\s*", "", author) author = re.sub(r"(\w\.)+\s*", "", author) if author else ""
return " ".join([title, author]) return " ".join([title, author])
@ -88,7 +88,9 @@ class ImportItem(models.Model):
return return
if self.isbn: if self.isbn:
self.book = self.get_book_from_isbn() self.book = self.get_book_from_identifier()
elif self.openlibrary_key:
self.book = self.get_book_from_identifier(field="openlibrary_key")
else: else:
# don't fall back on title/author search if isbn is present. # don't fall back on title/author search if isbn is present.
# you're too likely to mismatch # you're too likely to mismatch
@ -98,10 +100,10 @@ class ImportItem(models.Model):
else: else:
self.book_guess = book self.book_guess = book
def get_book_from_isbn(self): def get_book_from_identifier(self, field="isbn"):
"""search by isbn""" """search by isbn or other unique identifier"""
search_result = connector_manager.first_search_result( search_result = connector_manager.first_search_result(
self.isbn, min_confidence=0.999 getattr(self, field), min_confidence=0.999
) )
if search_result: if search_result:
# it's already in the right format # it's already in the right format
@ -114,6 +116,8 @@ class ImportItem(models.Model):
def get_book_from_title_author(self): def get_book_from_title_author(self):
"""search by title and author""" """search by title and author"""
if not self.title:
return None, 0
search_term = construct_search_term(self.title, self.author) search_term = construct_search_term(self.title, self.author)
search_result = connector_manager.first_search_result( search_result = connector_manager.first_search_result(
search_term, min_confidence=0.1 search_term, min_confidence=0.1
@ -145,6 +149,13 @@ class ImportItem(models.Model):
self.normalized_data.get("isbn_10") self.normalized_data.get("isbn_10")
) )
@property
def openlibrary_key(self):
"""the edition identifier is preferable to the work key"""
return self.normalized_data.get("openlibrary_key") or self.normalized_data.get(
"openlibrary_work_key"
)
@property @property
def shelf(self): def shelf(self):
"""the goodreads shelf field""" """the goodreads shelf field"""

View file

@ -31,6 +31,9 @@
<option value="LibraryThing" {% if current == 'LibraryThing' %}selected{% endif %}> <option value="LibraryThing" {% if current == 'LibraryThing' %}selected{% endif %}>
LibraryThing (TSV) LibraryThing (TSV)
</option> </option>
<option value="OpenLibrary" {% if current == 'OpenLibrary' %}selected{% endif %}>
OpenLibrary (CSV)
</option>
</select> </select>
</div> </div>
<div class="field"> <div class="field">

View file

@ -105,6 +105,11 @@
<th> <th>
{% trans "ISBN" %} {% trans "ISBN" %}
</th> </th>
{% if job.source == "OpenLibrary" %}
<th>
{% trans "Openlibrary key" %}
</th>
{% endif %}
<th> <th>
{% trans "Author" %} {% trans "Author" %}
</th> </th>
@ -145,6 +150,11 @@
<td> <td>
{{ item.isbn|default:'' }} {{ item.isbn|default:'' }}
</td> </td>
{% if job.source == "OpenLibrary" %}
<td>
{{ item.openlibrary_key }}
</td>
{% endif %}
<td> <td>
{{ item.normalized_data.authors }} {{ item.normalized_data.authors }}
</td> </td>

View file

@ -0,0 +1,5 @@
Work Id,Edition Id,Bookshelf
OL102749W,,Currently Reading
OL361393W,OL7798182M,Currently Reading
OL1652392W,OL7194114M,Want to Read
OL17062644W,OL25726365M,Already Read
1 Work Id Edition Id Bookshelf
2 OL102749W Currently Reading
3 OL361393W OL7798182M Currently Reading
4 OL1652392W OL7194114M Want to Read
5 OL17062644W OL25726365M Already Read

View file

@ -128,7 +128,7 @@ class GenericImporter(TestCase):
import_item = models.ImportItem.objects.get(job=import_job, index=0) import_item = models.ImportItem.objects.get(job=import_job, index=0)
with patch( with patch(
"bookwyrm.models.import_job.ImportItem.get_book_from_isbn" "bookwyrm.models.import_job.ImportItem.get_book_from_identifier"
) as resolve: ) as resolve:
resolve.return_value = self.book resolve.return_value = self.book
@ -158,7 +158,7 @@ class GenericImporter(TestCase):
).exists() ).exists()
) )
item = items[3] item = items.last()
item.fail_reason = "hello" item.fail_reason = "hello"
item.save() item.save()
item.update_job() item.update_job()

View file

@ -0,0 +1,85 @@
""" testing import """
import pathlib
from unittest.mock import patch
import datetime
import pytz
from django.test import TestCase
from bookwyrm import models
from bookwyrm.importers import OpenLibraryImporter
from bookwyrm.importers.importer import handle_imported_book
def make_date(*args):
"""helper function to easily generate a date obj"""
return datetime.datetime(*args, tzinfo=pytz.UTC)
# pylint: disable=consider-using-with
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
class OpenLibraryImport(TestCase):
"""importing from openlibrary csv"""
def setUp(self):
"""use a test csv"""
self.importer = OpenLibraryImporter()
datafile = pathlib.Path(__file__).parent.joinpath("../data/openlibrary.csv")
self.csv = open(datafile, "r", encoding=self.importer.encoding)
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
"bookwyrm.activitystreams.populate_stream_task.delay"
):
self.local_user = models.User.objects.create_user(
"mouse", "mouse@mouse.mouse", "password", local=True
)
work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
title="Example Edition",
remote_id="https://example.com/book/1",
parent_work=work,
)
def test_create_job(self, *_):
"""creates the import job entry and checks csv"""
import_job = self.importer.create_job(
self.local_user, self.csv, False, "public"
)
import_items = models.ImportItem.objects.filter(job=import_job).all()
self.assertEqual(len(import_items), 4)
self.assertEqual(import_items[0].index, 0)
self.assertEqual(import_items[0].data["Work Id"], "OL102749W")
self.assertEqual(import_items[1].data["Work Id"], "OL361393W")
self.assertEqual(import_items[1].data["Edition Id"], "OL7798182M")
self.assertEqual(import_items[0].normalized_data["shelf"], "reading")
self.assertEqual(import_items[0].normalized_data["openlibrary_key"], "")
self.assertEqual(
import_items[0].normalized_data["openlibrary_work_key"], "OL102749W"
)
self.assertEqual(
import_items[1].normalized_data["openlibrary_key"], "OL7798182M"
)
self.assertEqual(import_items[2].normalized_data["shelf"], "to-read")
self.assertEqual(import_items[3].normalized_data["shelf"], "read")
def test_handle_imported_book(self, *_):
"""openlibrary import added a book, this adds related connections"""
shelf = self.local_user.shelf_set.filter(identifier="reading").first()
self.assertIsNone(shelf.books.first())
import_job = self.importer.create_job(
self.local_user, self.csv, False, "public"
)
import_item = import_job.items.first()
import_item.book = self.book
import_item.save()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
handle_imported_book(import_item)
shelf.refresh_from_db()
self.assertEqual(shelf.books.first(), self.book)

View file

@ -139,7 +139,7 @@ class ImportJob(TestCase):
self.assertEqual(item.reads, expected) self.assertEqual(item.reads, expected)
@responses.activate @responses.activate
def test_get_book_from_isbn(self): def test_get_book_from_identifier(self):
"""search and load books by isbn (9780356506999)""" """search and load books by isbn (9780356506999)"""
item = models.ImportItem.objects.create( item = models.ImportItem.objects.create(
index=1, index=1,
@ -197,6 +197,6 @@ class ImportJob(TestCase):
with patch( with patch(
"bookwyrm.connectors.openlibrary.Connector." "get_authors_from_data" "bookwyrm.connectors.openlibrary.Connector." "get_authors_from_data"
): ):
book = item.get_book_from_isbn() book = item.get_book_from_identifier()
self.assertEqual(book.title, "Sabriel") self.assertEqual(book.title, "Sabriel")

View file

@ -14,6 +14,7 @@ from bookwyrm.importers import (
LibrarythingImporter, LibrarythingImporter,
GoodreadsImporter, GoodreadsImporter,
StorygraphImporter, StorygraphImporter,
OpenLibraryImporter,
) )
# pylint: disable= no-self-use # pylint: disable= no-self-use
@ -49,6 +50,8 @@ class Import(View):
importer = LibrarythingImporter() importer = LibrarythingImporter()
elif source == "Storygraph": elif source == "Storygraph":
importer = StorygraphImporter() importer = StorygraphImporter()
elif source == "OpenLibrary":
importer = OpenLibraryImporter()
else: else:
# Default : Goodreads # Default : Goodreads
importer = GoodreadsImporter() importer = GoodreadsImporter()

Binary file not shown.

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 0.0.1\n" "Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-09 19:05+0000\n" "POT-Creation-Date: 2021-12-15 02:53+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n" "PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: English <LL@li.org>\n" "Language-Team: English <LL@li.org>\n"

Binary file not shown.

Binary file not shown.

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n" "POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-09 18:56\n" "PO-Revision-Date: 2021-12-10 05:04\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Galician\n" "Language-Team: Galician\n"
"Language: gl\n" "Language: gl\n"
@ -1131,7 +1131,7 @@ msgstr "Restablece o contrasinal en %(site_name)s"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37 #: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#, python-format #, python-format
msgid "%(site_name)s home page" msgid "%(site_name)s home page"
msgstr "" msgstr "Páxina de inicio de %(site_name)s"
#: bookwyrm/templates/embed-layout.html:34 #: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
@ -1145,7 +1145,7 @@ msgstr "Contacta coa administración"
#: bookwyrm/templates/embed-layout.html:46 #: bookwyrm/templates/embed-layout.html:46
msgid "Join Bookwyrm" msgid "Join Bookwyrm"
msgstr "" msgstr "Únete a BookWyrm"
#: bookwyrm/templates/feed/direct_messages.html:8 #: bookwyrm/templates/feed/direct_messages.html:8
#, python-format #, python-format
@ -1511,7 +1511,7 @@ msgstr "Ficheiro de datos:"
#: bookwyrm/templates/import/import.html:45 #: bookwyrm/templates/import/import.html:45
msgid "Include reviews" msgid "Include reviews"
msgstr "Incluir recensións" msgstr "Incluír recensións"
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:50
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
@ -1942,12 +1942,12 @@ msgstr "Editar lista"
#: bookwyrm/templates/lists/embed-list.html:7 #: bookwyrm/templates/lists/embed-list.html:7
#, python-format #, python-format
msgid "%(list_name)s, a list by %(owner)s" msgid "%(list_name)s, a list by %(owner)s"
msgstr "" msgstr "%(list_name)s, unha lista de %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17 #: bookwyrm/templates/lists/embed-list.html:17
#, python-format #, python-format
msgid "on <a href=\"/\">%(site_name)s</a>" msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "" msgstr "en <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26 #: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:29 #: bookwyrm/templates/lists/list.html:29
@ -2073,20 +2073,20 @@ msgstr "Suxire"
#: bookwyrm/templates/lists/list.html:191 #: bookwyrm/templates/lists/list.html:191
msgid "Embed this list on a website" msgid "Embed this list on a website"
msgstr "" msgstr "Utiliza esta lista nunha páxina web"
#: bookwyrm/templates/lists/list.html:193 #: bookwyrm/templates/lists/list.html:193
msgid "Copy embed code" msgid "Copy embed code"
msgstr "" msgstr "Copia o código a incluír"
#: bookwyrm/templates/lists/list.html:193 #: bookwyrm/templates/lists/list.html:193
msgid "Copied!" msgid "Copied!"
msgstr "" msgstr "Copiado!"
#: bookwyrm/templates/lists/list.html:193 #: bookwyrm/templates/lists/list.html:193
#, python-format #, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s" msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "" msgstr "%(list_name)s, unha lista de %(owner)s en %(site_name)s"
#: bookwyrm/templates/lists/list_items.html:15 #: bookwyrm/templates/lists/list_items.html:15
msgid "Saved" msgid "Saved"

Binary file not shown.

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n" "POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-09 18:56\n" "PO-Revision-Date: 2021-12-13 20:56\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Lithuanian\n" "Language-Team: Lithuanian\n"
"Language: lt\n" "Language: lt\n"
@ -1137,7 +1137,7 @@ msgstr "Keisti %(site_name)s slaptažodį"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37 #: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#, python-format #, python-format
msgid "%(site_name)s home page" msgid "%(site_name)s home page"
msgstr "" msgstr "%(site_name)s pagrindinis puslapis"
#: bookwyrm/templates/embed-layout.html:34 #: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
@ -1151,7 +1151,7 @@ msgstr "Puslapio administratorius"
#: bookwyrm/templates/embed-layout.html:46 #: bookwyrm/templates/embed-layout.html:46
msgid "Join Bookwyrm" msgid "Join Bookwyrm"
msgstr "" msgstr "Prisijunkite prie „Bookwyrm“"
#: bookwyrm/templates/feed/direct_messages.html:8 #: bookwyrm/templates/feed/direct_messages.html:8
#, python-format #, python-format
@ -1956,12 +1956,12 @@ msgstr "Redaguoti sąrašą"
#: bookwyrm/templates/lists/embed-list.html:7 #: bookwyrm/templates/lists/embed-list.html:7
#, python-format #, python-format
msgid "%(list_name)s, a list by %(owner)s" msgid "%(list_name)s, a list by %(owner)s"
msgstr "" msgstr "%(list_name)s, sąrašą sudarė %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17 #: bookwyrm/templates/lists/embed-list.html:17
#, python-format #, python-format
msgid "on <a href=\"/\">%(site_name)s</a>" msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "" msgstr "per <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26 #: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:29 #: bookwyrm/templates/lists/list.html:29
@ -2087,20 +2087,20 @@ msgstr "Siūlyti"
#: bookwyrm/templates/lists/list.html:191 #: bookwyrm/templates/lists/list.html:191
msgid "Embed this list on a website" msgid "Embed this list on a website"
msgstr "" msgstr "Įdėkite šį sąrašą į tinklalapį"
#: bookwyrm/templates/lists/list.html:193 #: bookwyrm/templates/lists/list.html:193
msgid "Copy embed code" msgid "Copy embed code"
msgstr "" msgstr "Nukopijuokite įterptinį kodą"
#: bookwyrm/templates/lists/list.html:193 #: bookwyrm/templates/lists/list.html:193
msgid "Copied!" msgid "Copied!"
msgstr "" msgstr "Nukopijuota"
#: bookwyrm/templates/lists/list.html:193 #: bookwyrm/templates/lists/list.html:193
#, python-format #, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s" msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "" msgstr "%(list_name)s, sąrašą sudarė %(owner)s, per %(site_name)s"
#: bookwyrm/templates/lists/list_items.html:15 #: bookwyrm/templates/lists/list_items.html:15
msgid "Saved" msgid "Saved"

Binary file not shown.

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n" "POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-09 18:55\n" "PO-Revision-Date: 2021-12-11 15:41\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Portuguese, Brazilian\n" "Language-Team: Portuguese, Brazilian\n"
"Language: pt\n" "Language: pt\n"
@ -246,7 +246,7 @@ msgstr "Algo deu errado! Foi mal."
#: bookwyrm/templates/author/author.html:18 #: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19 #: bookwyrm/templates/author/author.html:19
msgid "Edit Author" msgid "Edit Author"
msgstr "Editar autor" msgstr "Editar autor/a"
#: bookwyrm/templates/author/author.html:40 #: bookwyrm/templates/author/author.html:40
msgid "Author details" msgid "Author details"
@ -282,7 +282,7 @@ msgstr "Ver registro ISNI"
#: bookwyrm/templates/book/book.html:93 #: bookwyrm/templates/book/book.html:93
#: bookwyrm/templates/book/sync_modal.html:5 #: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data" msgid "Load data"
msgstr "Carregar dados" msgstr "Carregar informações"
#: bookwyrm/templates/author/author.html:92 #: bookwyrm/templates/author/author.html:92
#: bookwyrm/templates/book/book.html:96 #: bookwyrm/templates/book/book.html:96
@ -309,7 +309,7 @@ msgstr "Livros de %(name)s"
#: bookwyrm/templates/author/edit_author.html:5 #: bookwyrm/templates/author/edit_author.html:5
msgid "Edit Author:" msgid "Edit Author:"
msgstr "Editar autor:" msgstr "Editar autor/a:"
#: bookwyrm/templates/author/edit_author.html:13 #: bookwyrm/templates/author/edit_author.html:13
#: bookwyrm/templates/book/edit/edit_book.html:19 #: bookwyrm/templates/book/edit/edit_book.html:19
@ -360,7 +360,7 @@ msgstr "Data da morte:"
#: bookwyrm/templates/author/edit_author.html:75 #: bookwyrm/templates/author/edit_author.html:75
msgid "Author Identifiers" msgid "Author Identifiers"
msgstr "Identificadores do autor" msgstr "Identificadores do/a autor/a"
#: bookwyrm/templates/author/edit_author.html:77 #: bookwyrm/templates/author/edit_author.html:77
msgid "Openlibrary key:" msgid "Openlibrary key:"
@ -420,7 +420,7 @@ msgstr "Cancelar"
#: bookwyrm/templates/author/sync_modal.html:15 #: bookwyrm/templates/author/sync_modal.html:15
#, python-format #, python-format
msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten." msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr "Ao carregar os dados nos conectaremos a <strong>%(source_name)s</strong> e buscaremos metadados sobre este/a autor/a que ainda não temos. Metadados já existentes não serão substituídos." msgstr "Para carregar informações nos conectaremos a <strong>%(source_name)s</strong> e buscaremos metadados que ainda não temos sobre este/a autor/a. Metadados já existentes não serão substituídos."
#: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/edit/edit_book.html:108 #: bookwyrm/templates/book/edit/edit_book.html:108
@ -484,11 +484,11 @@ msgstr "Uma <a href=\"%(book_path)s\">edição diferente</a> deste livro está e
#: bookwyrm/templates/book/book.html:201 #: bookwyrm/templates/book/book.html:201
msgid "Your reading activity" msgid "Your reading activity"
msgstr "Sua atividade de leitura" msgstr "Andamento da sua leitura"
#: bookwyrm/templates/book/book.html:204 #: bookwyrm/templates/book/book.html:204
msgid "Add read dates" msgid "Add read dates"
msgstr "Adicionar datas de leitura" msgstr "Adicionar registro de leitura"
#: bookwyrm/templates/book/book.html:213 #: bookwyrm/templates/book/book.html:213
msgid "Create" msgid "Create"
@ -496,7 +496,7 @@ msgstr "Criar"
#: bookwyrm/templates/book/book.html:223 #: bookwyrm/templates/book/book.html:223
msgid "You don't have any reading activity for this book." msgid "You don't have any reading activity for this book."
msgstr "Você ainda não registrou seu progresso para este livro." msgstr "Você ainda não registrou nenhuma atividade neste livro."
#: bookwyrm/templates/book/book.html:249 #: bookwyrm/templates/book/book.html:249
msgid "Your reviews" msgid "Your reviews"
@ -585,7 +585,7 @@ msgstr "\"%(name)s\" é uma das pessoas citadas abaixo?"
#: bookwyrm/templates/book/edit/edit_book.html:67 #: bookwyrm/templates/book/edit/edit_book.html:67
#: bookwyrm/templates/book/edit/edit_book.html:69 #: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Author of " msgid "Author of "
msgstr "Autor de " msgstr "Autor/a de "
#: bookwyrm/templates/book/edit/edit_book.html:69 #: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Find more information at isni.org" msgid "Find more information at isni.org"
@ -593,12 +593,12 @@ msgstr "Conheça mais em isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:79 #: bookwyrm/templates/book/edit/edit_book.html:79
msgid "This is a new author" msgid "This is a new author"
msgstr "Novo autor" msgstr "É um/a novo/a autor/a"
#: bookwyrm/templates/book/edit/edit_book.html:86 #: bookwyrm/templates/book/edit/edit_book.html:86
#, python-format #, python-format
msgid "Creating a new author: %(name)s" msgid "Creating a new author: %(name)s"
msgstr "Criando um novo autor: %(name)s" msgstr "Criando um/a novo/a autor/a: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:93 #: bookwyrm/templates/book/edit/edit_book.html:93
msgid "Is this an edition of an existing work?" msgid "Is this an edition of an existing work?"
@ -652,7 +652,7 @@ msgstr "Data de publicação:"
#: bookwyrm/templates/book/edit/edit_book_form.html:122 #: bookwyrm/templates/book/edit/edit_book_form.html:122
msgid "Authors" msgid "Authors"
msgstr "Autores" msgstr "Autores/as"
#: bookwyrm/templates/book/edit/edit_book_form.html:131 #: bookwyrm/templates/book/edit/edit_book_form.html:131
#, python-format #, python-format
@ -662,11 +662,11 @@ msgstr "Remover %(name)s"
#: bookwyrm/templates/book/edit/edit_book_form.html:134 #: bookwyrm/templates/book/edit/edit_book_form.html:134
#, python-format #, python-format
msgid "Author page for %(name)s" msgid "Author page for %(name)s"
msgstr "Página de autor de %(name)s" msgstr "Página de autor/a de %(name)s"
#: bookwyrm/templates/book/edit/edit_book_form.html:142 #: bookwyrm/templates/book/edit/edit_book_form.html:142
msgid "Add Authors:" msgid "Add Authors:"
msgstr "Adicionar autores:" msgstr "Adicionar autores/as:"
#: bookwyrm/templates/book/edit/edit_book_form.html:145 #: bookwyrm/templates/book/edit/edit_book_form.html:145
#: bookwyrm/templates/book/edit/edit_book_form.html:148 #: bookwyrm/templates/book/edit/edit_book_form.html:148
@ -780,7 +780,7 @@ msgstr "avaliou este livro"
#: bookwyrm/templates/book/readthrough.html:8 #: bookwyrm/templates/book/readthrough.html:8
msgid "Progress Updates:" msgid "Progress Updates:"
msgstr "Atualização de progresso:" msgstr "Registro de leitura:"
#: bookwyrm/templates/book/readthrough.html:13 #: bookwyrm/templates/book/readthrough.html:13
msgid "finished" msgid "finished"
@ -788,11 +788,11 @@ msgstr "terminado"
#: bookwyrm/templates/book/readthrough.html:24 #: bookwyrm/templates/book/readthrough.html:24
msgid "Show all updates" msgid "Show all updates"
msgstr "Mostrar todas as atualizações" msgstr "Mostrar andamento da leitura"
#: bookwyrm/templates/book/readthrough.html:40 #: bookwyrm/templates/book/readthrough.html:40
msgid "Delete this progress update" msgid "Delete this progress update"
msgstr "Excluir esta atualização de progresso" msgstr "Excluir esta atualização de andamento"
#: bookwyrm/templates/book/readthrough.html:51 #: bookwyrm/templates/book/readthrough.html:51
msgid "started" msgid "started"
@ -801,7 +801,7 @@ msgstr "iniciado"
#: bookwyrm/templates/book/readthrough.html:58 #: bookwyrm/templates/book/readthrough.html:58
#: bookwyrm/templates/book/readthrough.html:72 #: bookwyrm/templates/book/readthrough.html:72
msgid "Edit read dates" msgid "Edit read dates"
msgstr "Editar datas de leitura" msgstr "Editar registro de leitura"
#: bookwyrm/templates/book/readthrough.html:62 #: bookwyrm/templates/book/readthrough.html:62
msgid "Delete these read dates" msgid "Delete these read dates"
@ -810,7 +810,7 @@ msgstr "Excluir estas datas de leitura"
#: bookwyrm/templates/book/sync_modal.html:15 #: bookwyrm/templates/book/sync_modal.html:15
#, python-format #, python-format
msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this book which aren't present here. Existing metadata will not be overwritten." msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this book which aren't present here. Existing metadata will not be overwritten."
msgstr "Ao carregar os dados nos conectaremos a <strong>%(source_name)s</strong> e buscaremos metadados sobre este livro que ainda não temos. Metadados já existentes não serão substituídos." msgstr "Para carregar informações nos conectaremos a <strong>%(source_name)s</strong> e buscaremos metadados que ainda não temos sobre este livro. Metadados já existentes não serão substituídos."
#: bookwyrm/templates/components/inline_form.html:8 #: bookwyrm/templates/components/inline_form.html:8
#: bookwyrm/templates/components/modal.html:11 #: bookwyrm/templates/components/modal.html:11
@ -1131,7 +1131,7 @@ msgstr "Redefinir sua senha no %(site_name)s"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37 #: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#, python-format #, python-format
msgid "%(site_name)s home page" msgid "%(site_name)s home page"
msgstr "" msgstr "Página inicial de %(site_name)s"
#: bookwyrm/templates/embed-layout.html:34 #: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
@ -1145,7 +1145,7 @@ msgstr "Falar com a administração"
#: bookwyrm/templates/embed-layout.html:46 #: bookwyrm/templates/embed-layout.html:46
msgid "Join Bookwyrm" msgid "Join Bookwyrm"
msgstr "" msgstr "Participe da BookWyrm"
#: bookwyrm/templates/feed/direct_messages.html:8 #: bookwyrm/templates/feed/direct_messages.html:8
#, python-format #, python-format
@ -1598,7 +1598,7 @@ msgstr "ISBN"
#: bookwyrm/templates/shelf/shelf.html:145 #: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169 #: bookwyrm/templates/shelf/shelf.html:169
msgid "Author" msgid "Author"
msgstr "Autor" msgstr "Autor/a"
#: bookwyrm/templates/import/import_status.html:112 #: bookwyrm/templates/import/import_status.html:112
msgid "Shelf" msgid "Shelf"
@ -1942,12 +1942,12 @@ msgstr "Editar lista"
#: bookwyrm/templates/lists/embed-list.html:7 #: bookwyrm/templates/lists/embed-list.html:7
#, python-format #, python-format
msgid "%(list_name)s, a list by %(owner)s" msgid "%(list_name)s, a list by %(owner)s"
msgstr "" msgstr "%(list_name)s, uma lista de %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17 #: bookwyrm/templates/lists/embed-list.html:17
#, python-format #, python-format
msgid "on <a href=\"/\">%(site_name)s</a>" msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "" msgstr "em <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26 #: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:29 #: bookwyrm/templates/lists/list.html:29
@ -2073,20 +2073,20 @@ msgstr "Sugerir"
#: bookwyrm/templates/lists/list.html:191 #: bookwyrm/templates/lists/list.html:191
msgid "Embed this list on a website" msgid "Embed this list on a website"
msgstr "" msgstr "Incorpore esta lista em um site"
#: bookwyrm/templates/lists/list.html:193 #: bookwyrm/templates/lists/list.html:193
msgid "Copy embed code" msgid "Copy embed code"
msgstr "" msgstr "Copiar código de incorporação"
#: bookwyrm/templates/lists/list.html:193 #: bookwyrm/templates/lists/list.html:193
msgid "Copied!" msgid "Copied!"
msgstr "" msgstr "Copiado!"
#: bookwyrm/templates/lists/list.html:193 #: bookwyrm/templates/lists/list.html:193
#, python-format #, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s" msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "" msgstr "%(list_name)s, uma lista de %(owner)s em %(site_name)s"
#: bookwyrm/templates/lists/list_items.html:15 #: bookwyrm/templates/lists/list_items.html:15
msgid "Saved" msgid "Saved"
@ -3491,7 +3491,7 @@ msgstr "Algumas ideias sobre o livro"
#: bookwyrm/templates/snippets/create_status/comment.html:27 #: bookwyrm/templates/snippets/create_status/comment.html:27
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15 #: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15
msgid "Progress:" msgid "Progress:"
msgstr "Progresso:" msgstr "Andamento:"
#: bookwyrm/templates/snippets/create_status/comment.html:53 #: bookwyrm/templates/snippets/create_status/comment.html:53
#: bookwyrm/templates/snippets/progress_field.html:18 #: bookwyrm/templates/snippets/progress_field.html:18
@ -3585,7 +3585,7 @@ msgstr "Excluir as datas de leitura?"
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:7 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:7
#, python-format #, python-format
msgid "You are deleting this readthrough and its %(count)s associated progress updates." msgid "You are deleting this readthrough and its %(count)s associated progress updates."
msgstr "Você está excluindo este registro de leitura e as %(count)s atualizações de progresso associadas." msgstr "Você está excluindo este registro de leitura e as %(count)s atualizações de andamento associadas."
#: bookwyrm/templates/snippets/fav_button.html:16 #: bookwyrm/templates/snippets/fav_button.html:16
#: bookwyrm/templates/snippets/fav_button.html:17 #: bookwyrm/templates/snippets/fav_button.html:17
@ -3715,7 +3715,7 @@ msgstr "Definir meta"
#: bookwyrm/templates/snippets/goal_progress.html:9 #: bookwyrm/templates/snippets/goal_progress.html:9
#, python-format #, python-format
msgid "%(percent)s%% complete!" msgid "%(percent)s%% complete!"
msgstr "%(percent)s%% lá!" msgstr "%(percent)s%% lido!"
#: bookwyrm/templates/snippets/goal_progress.html:12 #: bookwyrm/templates/snippets/goal_progress.html:12
#, python-format #, python-format
@ -3805,7 +3805,7 @@ msgstr "(Opcional)"
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5 #: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:50 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:50
msgid "Update progress" msgid "Update progress"
msgstr "Atualizar progresso" msgstr "Atualizar andamento"
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6 #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6
#, python-format #, python-format
@ -3819,7 +3819,7 @@ msgstr "Quero ler \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/readthrough_form.html:14 #: bookwyrm/templates/snippets/readthrough_form.html:14
msgid "Progress" msgid "Progress"
msgstr "Progresso" msgstr "Andamento"
#: bookwyrm/templates/snippets/register_form.html:30 #: bookwyrm/templates/snippets/register_form.html:30
msgid "Sign Up" msgid "Sign Up"

Binary file not shown.

Binary file not shown.