We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Some translation strings missing/not applied
**Describe the bug**
Some translations are not being applied.

**To Reproduce**

change Bookwyrm language to other than English (tested with Lithuanian)

https://ziurkes.group.lt/user/athinkingmeat/books/read
https://ziurkes.group.lt/user/athinkingmeat/books/reading
https://ziurkes.group.lt/user/athinkingmeat/books/to-read

**Expected behavior**
All these links should have "read", "currently reading" and "to read" strings translated, but they are shown in English

**Screenshots**

![image](https://user-images.githubusercontent.com/81133/143778383-c5e6f8b2-4925-4060-a886-e40b9b6361fb.png)

![image](https://user-images.githubusercontent.com/81133/143778390-5ba3cc06-6744-4a60-a855-27fb3202f690.png)

![image](https://user-images.githubusercontent.com/81133/143778375-e799c900-1737-4025-8d1e-80ea99b3df81.png)


**Instance**

https://ziurkes.group.lt/

**Additional context**
Probably is a problem with other languages as well


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `bookwyrm/utils/isni.py`
Content:
```
1 """ISNI author checking utilities"""
2 import xml.etree.ElementTree as ET
3 import requests
4 
5 from bookwyrm import activitypub, models
6 
7 
8 def request_isni_data(search_index, search_term, max_records=5):
9     """Request data from the ISNI API"""
10 
11     search_string = f'{search_index}="{search_term}"'
12     query_params = {
13         "query": search_string,
14         "version": "1.1",
15         "operation": "searchRetrieve",
16         "recordSchema": "isni-b",
17         "maximumRecords": max_records,
18         "startRecord": "1",
19         "recordPacking": "xml",
20         "sortKeys": "RLV,pica,0,,",
21     }
22     result = requests.get("http://isni.oclc.org/sru/", params=query_params, timeout=10)
23     # the OCLC ISNI server asserts the payload is encoded
24     # in latin1, but we know better
25     result.encoding = "utf-8"
26     return result.text
27 
28 
29 def make_name_string(element):
30     """create a string of form 'personal_name surname'"""
31 
32     # NOTE: this will often be incorrect, many naming systems
33     # list "surname" before personal name
34     forename = element.find(".//forename")
35     surname = element.find(".//surname")
36     if forename is not None:
37         return "".join([forename.text, " ", surname.text])
38     return surname.text
39 
40 
41 def get_other_identifier(element, code):
42     """Get other identifiers associated with an author from their ISNI record"""
43 
44     identifiers = element.findall(".//otherIdentifierOfIdentity")
45     for section_head in identifiers:
46         if (
47             section_head.find(".//type") is not None
48             and section_head.find(".//type").text == code
49             and section_head.find(".//identifier") is not None
50         ):
51             return section_head.find(".//identifier").text
52 
53     # if we can't find it in otherIdentifierOfIdentity,
54     # try sources
55     for source in element.findall(".//sources"):
56         code_of_source = source.find(".//codeOfSource")
57         if code_of_source is not None and code_of_source.text.lower() == code.lower():
58             return source.find(".//sourceIdentifier").text
59 
60     return ""
61 
62 
63 def get_external_information_uri(element, match_string):
64     """Get URLs associated with an author from their ISNI record"""
65 
66     sources = element.findall(".//externalInformation")
67     for source in sources:
68         information = source.find(".//information")
69         uri = source.find(".//URI")
70         if (
71             uri is not None
72             and information is not None
73             and information.text.lower() == match_string.lower()
74         ):
75             return uri.text
76     return ""
77 
78 
79 def find_authors_by_name(name_string, description=False):
80     """Query the ISNI database for possible author matches by name"""
81 
82     payload = request_isni_data("pica.na", name_string)
83     # parse xml
84     root = ET.fromstring(payload)
85     # build list of possible authors
86     possible_authors = []
87     for element in root.iter("responseRecord"):
88         personal_name = element.find(".//forename/..")
89         if not personal_name:
90             continue
91 
92         author = get_author_from_isni(element.find(".//isniUnformatted").text)
93 
94         if bool(description):
95 
96             titles = []
97             # prefer title records from LoC+ coop, Australia, Ireland, or Singapore
98             # in that order
99             for source in ["LCNACO", "NLA", "N6I", "NLB"]:
100                 for parent in element.findall(f'.//titleOfWork/[@source="{source}"]'):
101                     titles.append(parent.find(".//title"))
102                 for parent in element.findall(f'.//titleOfWork[@subsource="{source}"]'):
103                     titles.append(parent.find(".//title"))
104             # otherwise just grab the first title listing
105             titles.append(element.find(".//title"))
106 
107             if titles is not None:
108                 # some of the "titles" in ISNI are a little ...iffy
109                 # '@' is used by ISNI/OCLC to index the starting point ignoring stop words
110                 # (e.g. "The @Government of no one")
111                 title_elements = [
112                     e for e in titles if not e.text.replace("@", "").isnumeric()
113                 ]
114                 if len(title_elements):
115                     author.bio = title_elements[0].text.replace("@", "")
116                 else:
117                     author.bio = None
118 
119         possible_authors.append(author)
120 
121     return possible_authors
122 
123 
124 def get_author_from_isni(isni):
125     """Find data to populate a new author record from their ISNI"""
126 
127     payload = request_isni_data("pica.isn", isni)
128     # parse xml
129     root = ET.fromstring(payload)
130     # there should only be a single responseRecord
131     # but let's use the first one just in case
132     element = root.find(".//responseRecord")
133     name = make_name_string(element.find(".//forename/.."))
134     viaf = get_other_identifier(element, "viaf")
135     # use a set to dedupe aliases in ISNI
136     aliases = set()
137     aliases_element = element.findall(".//personalNameVariant")
138     for entry in aliases_element:
139         aliases.add(make_name_string(entry))
140     # aliases needs to be list not set
141     aliases = list(aliases)
142     bio = element.find(".//nameTitle")
143     bio = bio.text if bio is not None else ""
144     wikipedia = get_external_information_uri(element, "Wikipedia")
145 
146     author = activitypub.Author(
147         id=element.find(".//isniURI").text,
148         name=name,
149         isni=isni,
150         viafId=viaf,
151         aliases=aliases,
152         bio=bio,
153         wikipediaLink=wikipedia,
154     )
155 
156     return author
157 
158 
159 def build_author_from_isni(match_value):
160     """Build basic author class object from ISNI URL"""
161 
162     # if it is an isni value get the data
163     if match_value.startswith("https://isni.org/isni/"):
164         isni = match_value.replace("https://isni.org/isni/", "")
165         return {"author": get_author_from_isni(isni)}
166     # otherwise it's a name string
167     return {}
168 
169 
170 def augment_author_metadata(author, isni):
171     """Update any missing author fields from ISNI data"""
172 
173     isni_author = get_author_from_isni(isni)
174     isni_author.to_model(model=models.Author, instance=author, overwrite=False)
175 
176     # we DO want to overwrite aliases because we're adding them to the
177     # existing aliases and ISNI will usually have more.
178     # We need to dedupe because ISNI records often have lots of dupe aliases
179     aliases = set(isni_author.aliases)
180     for alias in author.aliases:
181         aliases.add(alias)
182     author.aliases = list(aliases)
183     author.save()
184
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/bookwyrm/utils/isni.py b/bookwyrm/utils/isni.py
--- a/bookwyrm/utils/isni.py
+++ b/bookwyrm/utils/isni.py
@@ -19,7 +19,7 @@
         "recordPacking": "xml",
         "sortKeys": "RLV,pica,0,,",
     }
-    result = requests.get("http://isni.oclc.org/sru/", params=query_params, timeout=10)
+    result = requests.get("http://isni.oclc.org/sru/", params=query_params, timeout=15)
     # the OCLC ISNI server asserts the payload is encoded
     # in latin1, but we know better
     result.encoding = "utf-8"

{"golden_diff": "diff --git a/bookwyrm/utils/isni.py b/bookwyrm/utils/isni.py\n--- a/bookwyrm/utils/isni.py\n+++ b/bookwyrm/utils/isni.py\n@@ -19,7 +19,7 @@\n         \"recordPacking\": \"xml\",\n         \"sortKeys\": \"RLV,pica,0,,\",\n     }\n-    result = requests.get(\"http://isni.oclc.org/sru/\", params=query_params, timeout=10)\n+    result = requests.get(\"http://isni.oclc.org/sru/\", params=query_params, timeout=15)\n     # the OCLC ISNI server asserts the payload is encoded\n     # in latin1, but we know better\n     result.encoding = \"utf-8\"\n", "issue": "Some translation strings missing/not applied\n**Describe the bug**\r\nSome translations are not being applied.\r\n\r\n**To Reproduce**\r\n\r\nchange Bookwyrm language to other than English (tested with Lithuanian)\r\n\r\nhttps://ziurkes.group.lt/user/athinkingmeat/books/read\r\nhttps://ziurkes.group.lt/user/athinkingmeat/books/reading\r\nhttps://ziurkes.group.lt/user/athinkingmeat/books/to-read\r\n\r\n**Expected behavior**\r\nAll these links should have \"read\", \"currently reading\" and \"to read\" strings translated, but they are shown in English\r\n\r\n**Screenshots**\r\n\r\n![image](https://user-images.githubusercontent.com/81133/143778383-c5e6f8b2-4925-4060-a886-e40b9b6361fb.png)\r\n\r\n![image](https://user-images.githubusercontent.com/81133/143778390-5ba3cc06-6744-4a60-a855-27fb3202f690.png)\r\n\r\n![image](https://user-images.githubusercontent.com/81133/143778375-e799c900-1737-4025-8d1e-80ea99b3df81.png)\r\n\r\n\r\n**Instance**\r\n\r\nhttps://ziurkes.group.lt/\r\n\r\n**Additional context**\r\nProbably is a problem with other languages as well\r\n\n", "before_files": [{"content": "\"\"\"ISNI author checking utilities\"\"\"\nimport xml.etree.ElementTree as ET\nimport requests\n\nfrom bookwyrm import activitypub, models\n\n\ndef request_isni_data(search_index, search_term, max_records=5):\n    \"\"\"Request data from the ISNI API\"\"\"\n\n    search_string = f'{search_index}=\"{search_term}\"'\n    query_params = {\n        \"query\": search_string,\n        \"version\": \"1.1\",\n        \"operation\": \"searchRetrieve\",\n        \"recordSchema\": \"isni-b\",\n        \"maximumRecords\": max_records,\n        \"startRecord\": \"1\",\n        \"recordPacking\": \"xml\",\n        \"sortKeys\": \"RLV,pica,0,,\",\n    }\n    result = requests.get(\"http://isni.oclc.org/sru/\", params=query_params, timeout=10)\n    # the OCLC ISNI server asserts the payload is encoded\n    # in latin1, but we know better\n    result.encoding = \"utf-8\"\n    return result.text\n\n\ndef make_name_string(element):\n    \"\"\"create a string of form 'personal_name surname'\"\"\"\n\n    # NOTE: this will often be incorrect, many naming systems\n    # list \"surname\" before personal name\n    forename = element.find(\".//forename\")\n    surname = element.find(\".//surname\")\n    if forename is not None:\n        return \"\".join([forename.text, \" \", surname.text])\n    return surname.text\n\n\ndef get_other_identifier(element, code):\n    \"\"\"Get other identifiers associated with an author from their ISNI record\"\"\"\n\n    identifiers = element.findall(\".//otherIdentifierOfIdentity\")\n    for section_head in identifiers:\n        if (\n            section_head.find(\".//type\") is not None\n            and section_head.find(\".//type\").text == code\n            and section_head.find(\".//identifier\") is not None\n        ):\n            return section_head.find(\".//identifier\").text\n\n    # if we can't find it in otherIdentifierOfIdentity,\n    # try sources\n    for source in element.findall(\".//sources\"):\n        code_of_source = source.find(\".//codeOfSource\")\n        if code_of_source is not None and code_of_source.text.lower() == code.lower():\n            return source.find(\".//sourceIdentifier\").text\n\n    return \"\"\n\n\ndef get_external_information_uri(element, match_string):\n    \"\"\"Get URLs associated with an author from their ISNI record\"\"\"\n\n    sources = element.findall(\".//externalInformation\")\n    for source in sources:\n        information = source.find(\".//information\")\n        uri = source.find(\".//URI\")\n        if (\n            uri is not None\n            and information is not None\n            and information.text.lower() == match_string.lower()\n        ):\n            return uri.text\n    return \"\"\n\n\ndef find_authors_by_name(name_string, description=False):\n    \"\"\"Query the ISNI database for possible author matches by name\"\"\"\n\n    payload = request_isni_data(\"pica.na\", name_string)\n    # parse xml\n    root = ET.fromstring(payload)\n    # build list of possible authors\n    possible_authors = []\n    for element in root.iter(\"responseRecord\"):\n        personal_name = element.find(\".//forename/..\")\n        if not personal_name:\n            continue\n\n        author = get_author_from_isni(element.find(\".//isniUnformatted\").text)\n\n        if bool(description):\n\n            titles = []\n            # prefer title records from LoC+ coop, Australia, Ireland, or Singapore\n            # in that order\n            for source in [\"LCNACO\", \"NLA\", \"N6I\", \"NLB\"]:\n                for parent in element.findall(f'.//titleOfWork/[@source=\"{source}\"]'):\n                    titles.append(parent.find(\".//title\"))\n                for parent in element.findall(f'.//titleOfWork[@subsource=\"{source}\"]'):\n                    titles.append(parent.find(\".//title\"))\n            # otherwise just grab the first title listing\n            titles.append(element.find(\".//title\"))\n\n            if titles is not None:\n                # some of the \"titles\" in ISNI are a little ...iffy\n                # '@' is used by ISNI/OCLC to index the starting point ignoring stop words\n                # (e.g. \"The @Government of no one\")\n                title_elements = [\n                    e for e in titles if not e.text.replace(\"@\", \"\").isnumeric()\n                ]\n                if len(title_elements):\n                    author.bio = title_elements[0].text.replace(\"@\", \"\")\n                else:\n                    author.bio = None\n\n        possible_authors.append(author)\n\n    return possible_authors\n\n\ndef get_author_from_isni(isni):\n    \"\"\"Find data to populate a new author record from their ISNI\"\"\"\n\n    payload = request_isni_data(\"pica.isn\", isni)\n    # parse xml\n    root = ET.fromstring(payload)\n    # there should only be a single responseRecord\n    # but let's use the first one just in case\n    element = root.find(\".//responseRecord\")\n    name = make_name_string(element.find(\".//forename/..\"))\n    viaf = get_other_identifier(element, \"viaf\")\n    # use a set to dedupe aliases in ISNI\n    aliases = set()\n    aliases_element = element.findall(\".//personalNameVariant\")\n    for entry in aliases_element:\n        aliases.add(make_name_string(entry))\n    # aliases needs to be list not set\n    aliases = list(aliases)\n    bio = element.find(\".//nameTitle\")\n    bio = bio.text if bio is not None else \"\"\n    wikipedia = get_external_information_uri(element, \"Wikipedia\")\n\n    author = activitypub.Author(\n        id=element.find(\".//isniURI\").text,\n        name=name,\n        isni=isni,\n        viafId=viaf,\n        aliases=aliases,\n        bio=bio,\n        wikipediaLink=wikipedia,\n    )\n\n    return author\n\n\ndef build_author_from_isni(match_value):\n    \"\"\"Build basic author class object from ISNI URL\"\"\"\n\n    # if it is an isni value get the data\n    if match_value.startswith(\"https://isni.org/isni/\"):\n        isni = match_value.replace(\"https://isni.org/isni/\", \"\")\n        return {\"author\": get_author_from_isni(isni)}\n    # otherwise it's a name string\n    return {}\n\n\ndef augment_author_metadata(author, isni):\n    \"\"\"Update any missing author fields from ISNI data\"\"\"\n\n    isni_author = get_author_from_isni(isni)\n    isni_author.to_model(model=models.Author, instance=author, overwrite=False)\n\n    # we DO want to overwrite aliases because we're adding them to the\n    # existing aliases and ISNI will usually have more.\n    # We need to dedupe because ISNI records often have lots of dupe aliases\n    aliases = set(isni_author.aliases)\n    for alias in author.aliases:\n        aliases.add(alias)\n    author.aliases = list(aliases)\n    author.save()\n", "path": "bookwyrm/utils/isni.py"}], "after_files": [{"content": "\"\"\"ISNI author checking utilities\"\"\"\nimport xml.etree.ElementTree as ET\nimport requests\n\nfrom bookwyrm import activitypub, models\n\n\ndef request_isni_data(search_index, search_term, max_records=5):\n    \"\"\"Request data from the ISNI API\"\"\"\n\n    search_string = f'{search_index}=\"{search_term}\"'\n    query_params = {\n        \"query\": search_string,\n        \"version\": \"1.1\",\n        \"operation\": \"searchRetrieve\",\n        \"recordSchema\": \"isni-b\",\n        \"maximumRecords\": max_records,\n        \"startRecord\": \"1\",\n        \"recordPacking\": \"xml\",\n        \"sortKeys\": \"RLV,pica,0,,\",\n    }\n    result = requests.get(\"http://isni.oclc.org/sru/\", params=query_params, timeout=15)\n    # the OCLC ISNI server asserts the payload is encoded\n    # in latin1, but we know better\n    result.encoding = \"utf-8\"\n    return result.text\n\n\ndef make_name_string(element):\n    \"\"\"create a string of form 'personal_name surname'\"\"\"\n\n    # NOTE: this will often be incorrect, many naming systems\n    # list \"surname\" before personal name\n    forename = element.find(\".//forename\")\n    surname = element.find(\".//surname\")\n    if forename is not None:\n        return \"\".join([forename.text, \" \", surname.text])\n    return surname.text\n\n\ndef get_other_identifier(element, code):\n    \"\"\"Get other identifiers associated with an author from their ISNI record\"\"\"\n\n    identifiers = element.findall(\".//otherIdentifierOfIdentity\")\n    for section_head in identifiers:\n        if (\n            section_head.find(\".//type\") is not None\n            and section_head.find(\".//type\").text == code\n            and section_head.find(\".//identifier\") is not None\n        ):\n            return section_head.find(\".//identifier\").text\n\n    # if we can't find it in otherIdentifierOfIdentity,\n    # try sources\n    for source in element.findall(\".//sources\"):\n        code_of_source = source.find(\".//codeOfSource\")\n        if code_of_source is not None and code_of_source.text.lower() == code.lower():\n            return source.find(\".//sourceIdentifier\").text\n\n    return \"\"\n\n\ndef get_external_information_uri(element, match_string):\n    \"\"\"Get URLs associated with an author from their ISNI record\"\"\"\n\n    sources = element.findall(\".//externalInformation\")\n    for source in sources:\n        information = source.find(\".//information\")\n        uri = source.find(\".//URI\")\n        if (\n            uri is not None\n            and information is not None\n            and information.text.lower() == match_string.lower()\n        ):\n            return uri.text\n    return \"\"\n\n\ndef find_authors_by_name(name_string, description=False):\n    \"\"\"Query the ISNI database for possible author matches by name\"\"\"\n\n    payload = request_isni_data(\"pica.na\", name_string)\n    # parse xml\n    root = ET.fromstring(payload)\n    # build list of possible authors\n    possible_authors = []\n    for element in root.iter(\"responseRecord\"):\n        personal_name = element.find(\".//forename/..\")\n        if not personal_name:\n            continue\n\n        author = get_author_from_isni(element.find(\".//isniUnformatted\").text)\n\n        if bool(description):\n\n            titles = []\n            # prefer title records from LoC+ coop, Australia, Ireland, or Singapore\n            # in that order\n            for source in [\"LCNACO\", \"NLA\", \"N6I\", \"NLB\"]:\n                for parent in element.findall(f'.//titleOfWork/[@source=\"{source}\"]'):\n                    titles.append(parent.find(\".//title\"))\n                for parent in element.findall(f'.//titleOfWork[@subsource=\"{source}\"]'):\n                    titles.append(parent.find(\".//title\"))\n            # otherwise just grab the first title listing\n            titles.append(element.find(\".//title\"))\n\n            if titles is not None:\n                # some of the \"titles\" in ISNI are a little ...iffy\n                # '@' is used by ISNI/OCLC to index the starting point ignoring stop words\n                # (e.g. \"The @Government of no one\")\n                title_elements = [\n                    e for e in titles if not e.text.replace(\"@\", \"\").isnumeric()\n                ]\n                if len(title_elements):\n                    author.bio = title_elements[0].text.replace(\"@\", \"\")\n                else:\n                    author.bio = None\n\n        possible_authors.append(author)\n\n    return possible_authors\n\n\ndef get_author_from_isni(isni):\n    \"\"\"Find data to populate a new author record from their ISNI\"\"\"\n\n    payload = request_isni_data(\"pica.isn\", isni)\n    # parse xml\n    root = ET.fromstring(payload)\n    # there should only be a single responseRecord\n    # but let's use the first one just in case\n    element = root.find(\".//responseRecord\")\n    name = make_name_string(element.find(\".//forename/..\"))\n    viaf = get_other_identifier(element, \"viaf\")\n    # use a set to dedupe aliases in ISNI\n    aliases = set()\n    aliases_element = element.findall(\".//personalNameVariant\")\n    for entry in aliases_element:\n        aliases.add(make_name_string(entry))\n    # aliases needs to be list not set\n    aliases = list(aliases)\n    bio = element.find(\".//nameTitle\")\n    bio = bio.text if bio is not None else \"\"\n    wikipedia = get_external_information_uri(element, \"Wikipedia\")\n\n    author = activitypub.Author(\n        id=element.find(\".//isniURI\").text,\n        name=name,\n        isni=isni,\n        viafId=viaf,\n        aliases=aliases,\n        bio=bio,\n        wikipediaLink=wikipedia,\n    )\n\n    return author\n\n\ndef build_author_from_isni(match_value):\n    \"\"\"Build basic author class object from ISNI URL\"\"\"\n\n    # if it is an isni value get the data\n    if match_value.startswith(\"https://isni.org/isni/\"):\n        isni = match_value.replace(\"https://isni.org/isni/\", \"\")\n        return {\"author\": get_author_from_isni(isni)}\n    # otherwise it's a name string\n    return {}\n\n\ndef augment_author_metadata(author, isni):\n    \"\"\"Update any missing author fields from ISNI data\"\"\"\n\n    isni_author = get_author_from_isni(isni)\n    isni_author.to_model(model=models.Author, instance=author, overwrite=False)\n\n    # we DO want to overwrite aliases because we're adding them to the\n    # existing aliases and ISNI will usually have more.\n    # We need to dedupe because ISNI records often have lots of dupe aliases\n    aliases = set(isni_author.aliases)\n    for alias in author.aliases:\n        aliases.add(alias)\n    author.aliases = list(aliases)\n    author.save()\n", "path": "bookwyrm/utils/isni.py"}]}