From 5ae4eb9b8f2b03baebbb9da1eb2a6bee642c610d Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Mon, 14 Feb 2022 02:56:05 -0800
Subject: [PATCH 01/59] Super messy initial working version. To clean up.
---
bookwyrm/static/js/bookwyrm.js | 59 ++++++++++++++++++++
bookwyrm/static/js/vendor/quagga.min.js | 1 +
bookwyrm/templates/layout.html | 7 +++
bookwyrm/templates/search/barcode_modal.html | 14 +++++
4 files changed, 81 insertions(+)
create mode 100644 bookwyrm/static/js/vendor/quagga.min.js
create mode 100644 bookwyrm/templates/search/barcode_modal.html
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index cf3ce3032..b826a54e2 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -47,6 +47,10 @@ let BookWyrm = new (class {
.forEach((node) =>
node.addEventListener("toggle", this.handleDetailsDropdown.bind(this))
);
+
+ document
+ .querySelector("#barcode_scanner_modal")
+ .addEventListener("open", this.openBarcodeScanner.bind(this));
}
/**
@@ -427,9 +431,11 @@ let BookWyrm = new (class {
});
modalElement.addEventListener("keydown", handleFocusTrap);
+ modalElement.dispatchEvent(new Event('open'));
}
function handleModalClose(modalElement) {
+ modalElement.dispatchEvent(new Event('close'));
modalElement.removeEventListener("keydown", handleFocusTrap);
htmlElement.classList.remove("is-clipped");
modalElement.classList.remove("is-active");
@@ -632,4 +638,57 @@ let BookWyrm = new (class {
}
}
}
+
+ openBarcodeScanner(event) {
+ /*function onScanSuccess(decodedText, decodedResult) {
+ alert(`${decodedText}`, decodedResult);
+ }
+
+ function onScanFailure(error) {
+ alert(error);
+ }*/
+
+ Quagga.init({
+ inputStream : {
+ name: "Live",
+ type: "LiveStream",
+ target: "#barcode_scanner"
+ },
+ decoder : {
+ readers: [
+ "ean_reader",
+ {
+ format: "ean_reader",
+ config: {
+ supplements: [ "ean_2_reader", "ean_5_reader" ]
+ }
+ }
+ ],
+ debug: {
+ drawBoundingBox: true,
+ drawScanline: true,
+ showPattern: true,
+ },
+ multiple: false
+ },
+ debug: true
+ }, function(err) {
+ if (err) {
+ console.log(err);
+ return;
+ }
+
+ console.log('started');
+ Quagga.start();
+ });
+
+ Quagga.onDetected(function(result) {
+ var code = result.codeResult.code;
+
+ location.href = `search?q=${code}`;
+ Quagga.stop();
+
+ console.log(code);
+ });
+ }
})();
diff --git a/bookwyrm/static/js/vendor/quagga.min.js b/bookwyrm/static/js/vendor/quagga.min.js
new file mode 100644
index 000000000..f7a30f41b
--- /dev/null
+++ b/bookwyrm/static/js/vendor/quagga.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(e.toString()).default:"object"==typeof exports?exports.Quagga=e(e.toString()).default:t.Quagga=e(e.toString()).default}(this,function(t){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="/",e(e.s=166)}([function(t,e){function n(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}t.exports=n},function(t,e,n){"use strict";function r(t,e){return this._row=[],this.config=t||{},this.supplements=e,this}var o=n(3);r.prototype._nextUnset=function(t,e){var n;for(void 0===e&&(e=0),n=e;nn)return Number.MAX_VALUE;u+=c}return u/f},r.prototype._nextSet=function(t,e){var n;for(e=e||0,n=e;n1&&(t[n[r]]=o)},r.prototype._matchTrace=function(t,e){var n,r,o=[],i=this,a=i._nextSet(i._row),u=!i._row[a],c=0,s={error:Number.MAX_VALUE,code:-1,start:0};if(t){for(n=0;n=0;r--)e=Math.floor(Math.random()*r),n=t[r],t[r]=t[e],t[e]=n;return t},toPointList:function(t){var e,n,r=[],o=[];for(e=0;e=e&&o.push(t[r]);return o},maxIndex:function(t){var e,n=0;for(e=0;et[n]&&(n=e);return n},max:function t(e){var n,t=0;for(n=0;nt&&(t=e[n]);return t},sum:function t(e){for(var n=e.length,t=0;n--;)t+=e[n];return t}}},function(t,e,n){"use strict";function r(t,e){t=a()(o(),t),u.a.call(this,t,e)}function o(){var t={};return Object.keys(r.CONFIG_KEYS).forEach(function(e){t[e]=r.CONFIG_KEYS[e].default}),t}var i=n(28),a=n.n(i),u=n(1),c=Object.assign||function(t){for(var e=1;ea.AVG_CODE_ERROR?null:f}s++,i[s]=1,c=!c}return null},r.prototype._findPattern=function(t,e,n,r,o){var i,a,u,c,s=[],f=this,l=0,d={error:Number.MAX_VALUE,code:-1,start:0,end:0};for(e||(e=f._nextSet(f._row)),void 0===n&&(n=!1),void 0===r&&(r=!0),void 0===o&&(o=f.AVG_CODE_ERROR),i=0;i=0&&n._matchRange(t,e.start,0))return e;r=e.end,e=null}},r.prototype._verifyTrailingWhitespace=function(t){var e,n=this;return e=t.end+(t.end-t.start),e=i.CODE_G_START?(t.code=t.code-i.CODE_G_START,a|=1<<5-r):a|=0<<5-r,e.push(t.code),n.push(t)}if(null===(o=i._calculateFirstDigit(a)))return null;if(e.unshift(o),null===(t=i._findPattern(i.MIDDLE_PATTERN,t.end,!0,!1)))return null;for(n.push(t),r=0;r<6;r++){if(!(t=i._decodeCode(t.end,i.CODE_G_START)))return null;n.push(t),e.push(t.code)}return t},r.prototype._decode=function(){var t,e,n=this,r=[],o=[],i={};if(!(t=n._findStart()))return null;if(e={code:t.code,start:t.start,end:t.end},o.push(e),!(e=n._decodePayload(e,r,o)))return null;if(!(e=n._findEnd(e.end,!1)))return null;if(o.push(e),!n._checksum(r))return null;if(this.supplements.length>0){var a=this._decodeExtensions(e.end);if(!a)return null;var u=a.decodedCodes[a.decodedCodes.length-1],s={start:u.start+((u.end-u.start)/2|0),end:u.end};if(!n._verifyTrailingWhitespace(s))return null;i={supplement:a,code:r.join("")+a.code}}return c({code:r.join(""),start:t.start,end:e.end,codeset:"",startInfo:t,decodedCodes:o},i)},r.prototype._decodeExtensions=function(t){var e,n,r=this._nextSet(this._row,t),o=this._findPattern(this.EXTENSION_START_PATTERN,r,!1,!1);if(null===o)return null;for(e=0;e=0;e-=2)n+=t[e];for(n*=3,e=t.length-1;e>=0;e-=2)n+=t[e];return n%10==0},r.CONFIG_KEYS={supplements:{type:"arrayOf(string)",default:[],description:"Allowed extensions to be decoded (2 and/or 5)"}},e.a=r},function(t,e,n){var r=n(38),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e){function n(t){return null!=t&&"object"==typeof t}t.exports=n},function(t,e){function n(t){var e=new Float32Array(2);return e[0]=t[0],e[1]=t[1],e}t.exports=n},function(t,e,n){function r(t){return null==t?void 0===t?c:u:s&&s in Object(t)?i(t):a(t)}var o=n(11),i=n(119),a=n(146),u="[object Null]",c="[object Undefined]",s=o?o.toStringTag:void 0;t.exports=r},function(t,e,n){"use strict";e.a={drawRect:function(t,e,n,r){n.strokeStyle=r.color,n.fillStyle=r.color,n.lineWidth=1,n.beginPath(),n.strokeRect(t.x,t.y,e.x,e.y)},drawPath:function(t,e,n,r){n.strokeStyle=r.color,n.fillStyle=r.color,n.lineWidth=r.lineWidth,n.beginPath(),n.moveTo(t[0][e.x],t[0][e.y]);for(var o=1;o-1&&t%1==0&&t0?Math.floor(this.x+.5):Math.floor(this.x-.5),this.y=this.y>0?Math.floor(this.y+.5):Math.floor(this.y-.5),this}}}function o(t,e,n){n||(n=t);for(var r=t.data,o=r.length,i=n.data;o--;)i[o]=r[o]>o]++;return a}function a(t,e){function n(t,e){var n,r=0;for(n=t;n<=e;n++)r+=a[n];return r}function r(t,e){var n,r=0;for(n=t;n<=e;n++)r+=n*a[n];return r}function o(){var o,u,c,s,f,l,d,h=[0],p=(1<c)for(i=s[u],i.score=o,i.item=t[r],c=Number.MAX_VALUE,a=0;ae[r]?r++:n++;return o}function _(t,e){function n(t){for(var e=0,n=t[Math.floor(t.length/2)];e0&&(n=Math.abs(t[e]-d)>Math.abs(t[e-1]-d)?t[e-1]:t[e]),d/nc[f-1]/c[f]?{x:n,y:n}:null}var r,o=p(e.x),i=p(e.y),a=Math.max(e.x,e.y),u=v(o,i),c=[8,10,15,20,32,60,80],s={"x-small":5,small:4,medium:3,large:2,"x-large":1},f=s[t]||s.medium,l=c[f],d=Math.floor(a/l);return r=n(u),r||(r=n(p(a)))||(r=n(p(d*l))),r}function g(t){return{value:parseFloat(t),unit:(t.indexOf("%"),t.length,"%")}}function y(t,e,n){var r={width:t,height:e},o=Object.keys(n).reduce(function(t,e){var o=n[e],i=g(o),a=C[e](i,r);return t[e]=a,t},{});return{sx:o.left,sy:o.top,sw:o.right-o.left,sh:o.bottom-o.top}}var m=n(50),x=n(3);e.b=r,e.f=u,e.g=c,e.h=s,e.c=f,e.d=l,e.i=d,e.a=h,e.e=_,e.j=y;var b={clone:n(7)},E={clone:n(83)},C={top:function(t,e){if("%"===t.unit)return Math.floor(e.height*(t.value/100))},right:function(t,e){if("%"===t.unit)return Math.floor(e.width-e.width*(t.value/100))},bottom:function(t,e){if("%"===t.unit)return Math.floor(e.height-e.height*(t.value/100))},left:function(t,e){if("%"===t.unit)return Math.floor(e.width*(t.value/100))}}},function(t,e,n){"use strict";function r(t,e,n,r){e?this.data=e:n?(this.data=new n(t.x*t.y),n===Array&&r&&a.a.init(this.data,0)):(this.data=new Uint8Array(t.x*t.y),Uint8Array===Array&&r&&a.a.init(this.data,0)),this.size=t}var o=n(53),i=n(19),a=n(3),u={clone:n(7)};r.prototype.inImageWithBorder=function(t,e){return t.x>=e&&t.y>=e&&t.x0&&(a=g[r-1],a.m00+=1,a.m01+=n,a.m10+=e,a.m11+=e*n,a.m02+=o,a.m20+=e*e);for(i=0;i=0?x:-x)+m,a.theta=(180*h/m+90)%180-90,a.theta<0&&(a.theta+=180),a.rad=h>m?h-m:h,a.vec=u.clone([Math.cos(h),Math.sin(h)]),y.push(a));return y},r.prototype.show=function(t,e){var n,r,o,i,a,u,c;for(e||(e=1),n=t.getContext("2d"),t.width=this.size.x,t.height=this.size.y,r=n.getImageData(0,0,t.width,t.height),o=r.data,i=0,c=0;c360)&&(e=360);for(var o=[0,1,1],a=[0,0,0],u=[255,255,255],c=[0,0,0],s=[],f=t.getContext("2d"),l=f.getImageData(r.x,r.y,this.size.x,this.size.y),d=l.data,h=this.data.length;h--;)o[0]=this.data[h]*e,s=o[0]<=0?u:o[0]>=360?c:n.i(i.a)(o,a),d[4*h+0]=s[0],d[4*h+1]=s[1],d[4*h+2]=s[2],d[4*h+3]=255;f.putImageData(l,r.x,r.y)},e.a=r},function(t,e,n){function r(t,e,n){"__proto__"==e&&o?o(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}var o=n(37);t.exports=r},function(t,e,n){function r(t,e){var n=i(t,e);return o(n)?n:void 0}var o=n(97),i=n(120);t.exports=r},function(t,e,n){function r(t){if("string"==typeof t||o(t))return t;var e=t+"";return"0"==e&&1/t==-i?"-0":e}var o=n(27),i=1/0;t.exports=r},function(t,e,n){function r(t){return null!=t&&i(t.length)&&!o(t)}var o=n(25),i=n(26);t.exports=r},function(t,e,n){function r(t){if(!i(t))return!1;var e=o(t);return e==u||e==c||e==a||e==s}var o=n(8),i=n(0),a="[object AsyncFunction]",u="[object Function]",c="[object GeneratorFunction]",s="[object Proxy]";t.exports=r},function(t,e){function n(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=r}var r=9007199254740991;t.exports=n},function(t,e,n){function r(t){return"symbol"==typeof t||i(t)&&o(t)==a}var o=n(8),i=n(6),a="[object Symbol]";t.exports=r},function(t,e,n){var r=n(100),o=n(116),i=o(function(t,e,n){r(t,e,n)});t.exports=i},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){"use strict";var r={searchDirections:[[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[-1,1]],create:function(t,e){function n(t,e,n,r){var o,f,l;for(o=0;o<7;o++){if(f=t.cy+c[t.dir][0],l=t.cx+c[t.dir][1],i=f*s+l,a[i]===e&&(0===u[i]||u[i]===n))return u[i]=n,t.cy=f,t.cx=l,!0;0===u[i]&&(u[i]=r),t.dir=(t.dir+1)%8}return!1}function r(t,e,n){return{dir:n,x:t,y:e,next:null,prev:null}}function o(t,e,o,i,a){var u,c,s,f=null,l={cx:e,cy:t,dir:0};if(n(l,i,o,a)){f=r(e,t,l.dir),u=f,s=l.dir,c=r(l.cx,l.cy,0),c.prev=u,u.next=c,c.next=null,u=c;do l.dir=(l.dir+6)%8,n(l,i,o,a),s!==l.dir?(u.dir=l.dir,c=r(l.cx,l.cy,0),c.prev=u,u.next=c,c.next=null,u=c):(u.dir=s,u.x=l.cx,u.y=l.cy),s=l.dir;while(l.cx!==e||l.cy!==t);f.prev=u.prev,u.prev.next=f}return f}var i,a=t.data,u=e.data,c=this.searchDirections,s=t.size.x;return{trace:function(t,e,r,o){return n(t,e,r,o)},contourTracing:function(t,e,n,r,i){return o(t,e,n,r,i)}}}};e.a=r},function(t,e,n){"use strict";function r(){o.a.call(this)}var o=n(1),i=n(3),a={ALPHABETH_STRING:{value:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"},ALPHABET:{value:[48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,45,46,32,42,36,47,43,37]},CHARACTER_ENCODINGS:{value:[52,289,97,352,49,304,112,37,292,100,265,73,328,25,280,88,13,268,76,28,259,67,322,19,274,82,7,262,70,22,385,193,448,145,400,208,133,388,196,148,168,162,138,42]},ASTERISK:{value:148},FORMAT:{value:"code_39",writeable:!1}};r.prototype=Object.create(o.a.prototype,a),r.prototype.constructor=r,r.prototype._decode=function(){var t,e,n,r,o=this,a=[0,0,0,0,0,0,0,0,0],u=[],c=o._findStart();if(!c)return null;r=o._nextSet(o._row,c.end);do{if(a=o._toCounters(r,a),(n=o._toPattern(a))<0)return null;if((t=o._patternToChar(n))<0)return null;u.push(t),e=r,r+=i.a.sum(a),r=o._nextSet(o._row,r)}while("*"!==t);return u.pop(),u.length&&o._verifyTrailingWhitespace(e,r,a)?{code:u.join(""),start:c.start,end:r,startInfo:c,decodedCodes:u}:null},r.prototype._verifyTrailingWhitespace=function(t,e,n){var r=i.a.sum(n);return 3*(e-t-r)>=r},r.prototype._patternToChar=function(t){var e,n=this;for(e=0;ee&&(r=t[n]);return r},r.prototype._toPattern=function(t){for(var e,n,r=t.length,o=0,i=r,a=0,u=this;i>3;){for(o=u._findNextWidth(t,o),i=0,e=0,n=0;no&&(e|=1<0;n++)if(t[n]>o&&(i--,2*t[n]>=a))return-1;return e}}return-1},r.prototype._findStart=function(){var t,e,n,r=this,o=r._nextSet(r._row),i=o,a=[0,0,0,0,0,0,0,0,0],u=0,c=!1;for(t=o;t0)for(r=0;r0){if(!(t=Y.filter(function(t){return!t.busy})[0]))return;w.attachData(t.imageData)}else w.attachData(S.data);w.grab()&&(t?(t.busy=!0,t.worker.postMessage({cmd:"process",imageData:t.imageData},[t.imageData.buffer])):_())}else _()}function y(){var t=null,e=1e3/($.frequency||60);T=!1,function n(r){t=t||r,T||(r>=t&&(t+=e,g()),window.requestAnimFrame(n))}(performance.now())}function m(){Q&&"LiveStream"===$.inputStream.type?y():g()}function x(t){var e,n={worker:void 0,imageData:new Uint8Array(R.getWidth()*R.getHeight()),busy:!0};e=C(),n.worker=new Worker(e),n.worker.onmessage=function(r){if("initialized"===r.data.event)return URL.revokeObjectURL(e),n.busy=!1,n.imageData=new Uint8Array(r.data.imageData),t(n);"processed"===r.data.event?(n.imageData=new Uint8Array(r.data.imageData),n.busy=!1,v(r.data.result,n.imageData)):r.data.event},n.worker.postMessage({cmd:"init",size:{x:R.getWidth(),y:R.getHeight()},imageData:n.imageData,config:b($)},[n.imageData.buffer])}function b(t){return X({},t,{inputStream:X({},t.inputStream,{target:null})})}function E(t){function e(t){self.postMessage({event:"processed",imageData:o.data,result:t},[o.data.buffer])}function n(){self.postMessage({event:"initialized",imageData:o.data},[o.data.buffer])}if(t){var r=t().default;if(!r)return void self.postMessage({event:"error",message:"Quagga could not be created"})}var o;self.onmessage=function(t){if("init"===t.data.cmd){var i=t.data.config;i.numOfWorkers=0,o=new r.ImageWrapper({x:t.data.size.x,y:t.data.size.y},new Uint8Array(t.data.imageData)),r.init(i,n,o),r.onProcessed(e)}else"process"===t.data.cmd?(o.data=new Uint8Array(t.data.imageData),r.start()):"setReaders"===t.data.cmd&&r.setReaders(t.data.readers)}}function C(){var e,n;return void 0!==t&&(n=t),e=new Blob(["("+E.toString()+")("+n+");"],{type:"text/javascript"}),window.URL.createObjectURL(e)}function O(t){P?P.setReaders(t):Q&&Y.length>0&&Y.forEach(function(e){e.worker.postMessage({cmd:"setReaders",readers:t})})}function A(t,e){var n=t-Y.length;if(0===n)return e&&e();if(n<0){return Y.slice(n).forEach(function(t){t.worker.terminate()}),Y=Y.slice(0,n),e&&e()}for(var r=function(n){Y.push(n),Y.length>=t&&e&&e()},o=0;oe},getPoints:function(){return a},getCenter:function(){return u}}},createPoint:function(t,e,n){return{rad:t[n],point:t,id:e}}}},function(t,e,n){"use strict";e.a=function(){function t(t){return o[t]||(o[t]={subscribers:[]}),o[t]}function e(){o={}}function n(t,e){t.async?setTimeout(function(){t.callback(e)},4):t.callback(e)}function r(e,n,r){var o;if("function"==typeof n)o={callback:n,async:r};else if(o=n,!o.callback)throw"Callback was not specified on options";t(e).subscribers.push(o)}var o={};return{subscribe:function(t,e,n){return r(t,e,n)},publish:function(e,r){var o=t(e),i=o.subscribers;i.filter(function(t){return!!t.once}).forEach(function(t){n(t,r)}),o.subscribers=i.filter(function(t){return!t.once}),o.subscribers.forEach(function(t){n(t,r)})},once:function(t,e,n){r(t,{callback:e,async:n,once:!0})},unsubscribe:function(n,r){var o;n?(o=t(n),o.subscribers=o&&r?o.subscribers.filter(function(t){return t.callback!==r}):[]):e()}}}()},function(t,e,n){"use strict";function r(){return navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.enumerateDevices?navigator.mediaDevices.enumerateDevices():Promise.reject(new Error("enumerateDevices is not defined"))}function o(t){return navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.getUserMedia?navigator.mediaDevices.getUserMedia(t):Promise.reject(new Error("getUserMedia is not defined"))}e.b=r,e.a=o},function(t,e,n){"use strict";function r(t,e,n){n||(n={data:null,size:e}),this.data=n.data,this.originalSize=n.size,this.I=n,this.from=t,this.size=e}r.prototype.show=function(t,e){var n,r,o,i,a,u,c;for(e||(e=1),n=t.getContext("2d"),t.width=this.size.x,t.height=this.size.y,r=n.getImageData(0,0,t.width,t.height),o=r.data,i=0,a=0;a>>16&65535,r=65535&t,o=e>>>16&65535,i=65535&e;return r*i+(n*i+r*o<<16>>>0)|0},"function"!=typeof Object.assign&&(Object.assign=function(t){"use strict";if(null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),n=1;n1&&(!e.inImageWithBorder(t[0],0)||!e.inImageWithBorder(t[1],0));)r-=Math.ceil(r/2),o(-r);return t}function u(t){return[{x:(t[1][0]-t[0][0])/2+t[0][0],y:(t[1][1]-t[0][1])/2+t[0][1]},{x:(t[3][0]-t[2][0])/2+t[2][0],y:(t[3][1]-t[2][1])/2+t[2][1]}]}function c(t){var n,o=null,i=r.a.getBarcodeLine(e,t[0],t[1]);for(r.a.toBinaryLine(i),n=0;nE?l:E,g.push(l)}var o,i,a,u,c,s,f,l,d=0|e.x,h=0|e.y,p=0|n.x,v=0|n.y,_=Math.abs(v-h)>Math.abs(p-d),g=[],y=t.data,m=t.size.x,x=0,b=255,E=0;for(_&&(s=d,d=h,h=s,s=p,p=v,v=s),d>p&&(s=d,d=p,p=s,s=h,h=v,v=s),o=p-d,i=Math.abs(v-h),a=o/2|0,c=h,u=hl?o.DIR.UP:o.DIR.DOWN,d.push({pos:0,val:f[0]}),a=0;ah&&f[a+1]>.5*l?o.DIR.UP:r,r!==i&&(d.push({pos:a,val:f[a]}),r=i);for(d.push({pos:f.length,val:f[f.length-1]}),u=d[0].pos;ul?0:1;for(a=1;ad[a].val?d[a].val+(d[a+1].val-d[a].val)/3*2|0:d[a+1].val+(d[a].val-d[a+1].val)/3|0,u=d[a].pos;uh?0:1;return{line:f,threshold:h}},r.debug={printFrequency:function(t,e){var n,r=e.getContext("2d");for(e.width=t.length,e.height=256,r.beginPath(),r.strokeStyle="blue",n=0;n0?t.videoWidth>10&&t.videoHeight>10?e():window.setTimeout(r,500):n("Unable to play video stream. Is webcam working?"),o--}var o=10;r()})}function o(t,e){return n.i(d.a)(e).then(function(e){return new Promise(function(n){s=e,t.setAttribute("autoplay",!0),t.setAttribute("muted",!0),t.setAttribute("playsinline",!0),t.srcObject=e,t.addEventListener("loadedmetadata",function(){t.play(),n()})})}).then(r.bind(null,t))}function i(t){var e=l()(t,["width","height","facingMode","aspectRatio","deviceId"]);return void 0!==t.minAspectRatio&&t.minAspectRatio>0&&(e.aspectRatio=t.minAspectRatio,console.log("WARNING: Constraint 'minAspectRatio' is deprecated; Use 'aspectRatio' instead")),void 0!==t.facing&&(e.facingMode=t.facing,console.log("WARNING: Constraint 'facing' is deprecated. Use 'facingMode' instead'")),e}function a(t){var e={audio:!1,video:i(t)};return e.video.deviceId&&e.video.facingMode&&delete e.video.facingMode,Promise.resolve(e)}function u(){return n.i(d.b)().then(function(t){return t.filter(function(t){return"videoinput"===t.kind})})}function c(){if(s){var t=s.getVideoTracks();if(t&&t.length)return t[0]}}var s,f=n(162),l=n.n(f),d=n(52);e.a={request:function(t,e){return a(e).then(o.bind(null,t))},release:function(){var t=s&&s.getVideoTracks();t&&t.length&&t[0].stop(),s=null},enumerateVideoDevices:u,getActiveStreamLabel:function(){var t=c();return t?t.label:""},getActiveTrack:c}},function(t,e,n){"use strict";function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:d;return/^blob\:/i.test(t)?i(t).then(o).then(function(t){return a(t,e)}):Promise.resolve(null)}function o(t){return new Promise(function(e){var n=new FileReader;n.onload=function(t){return e(t.target.result)},n.readAsArrayBuffer(t)})}function i(t){return new Promise(function(e,n){var r=new XMLHttpRequest;r.open("GET",t,!0),r.responseType="blob",r.onreadystatechange=function(){r.readyState!==XMLHttpRequest.DONE||200!==r.status&&0!==r.status||e(this.response)},r.onerror=n,r.send()})}function a(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:d,n=new DataView(t),r=t.byteLength,o=e.reduce(function(t,e){var n=Object.keys(l).filter(function(t){return l[t]===e})[0];return n&&(t[n]=e),t},{}),i=2;if(255!==n.getUint8(0)||216!==n.getUint8(1))return!1;for(;i1?i.size:Math.floor(e/o*i.size):e,r=i.size?e/o>1?Math.floor(o/e*i.size):i.size:o,s.x=n,s.y=r}var n,r,o={},i=null,a=["canrecord","ended"],u={},c={x:0,y:0},s={x:0,y:0};return o.getRealWidth=function(){return t.videoWidth},o.getRealHeight=function(){return t.videoHeight},o.getWidth=function(){return n},o.getHeight=function(){return r},o.setWidth=function(t){n=t},o.setHeight=function(t){r=t},o.setInputStream=function(e){i=e,t.src=void 0!==e.src?e.src:""},o.ended=function(){return t.ended},o.getConfig=function(){return i},o.setAttribute=function(e,n){t.setAttribute(e,n)},o.pause=function(){t.pause()},o.play=function(){t.play()},o.setCurrentTime=function(e){"LiveStream"!==i.type&&(t.currentTime=e)},o.addEventListener=function(e,n,r){a.indexOf(e)!==-1?(u[e]||(u[e]=[]),u[e].push(n)):t.addEventListener(e,n,r)},o.clearEventHandlers=function(){a.forEach(function(e){var n=u[e];n&&n.length>0&&n.forEach(function(n){t.removeEventListener(e,n)})})},o.trigger=function(t,n){var r,i=u[t];if("canrecord"===t&&e(),i&&i.length>0)for(r=0;r1?a.size:Math.floor(u/c*a.size):u,o=a.size?u/c>1?Math.floor(c/u*a.size):a.size:c,x.x=n,x.y=o,l=!0,s=0,setTimeout(function(){e("canrecord",[])},0)},p,h,a.sequence)}function e(t,e){var n,r=y[t];if(r&&r.length>0)for(n=0;nf&&(f=o.box[r][0]),o.box[r][1]l&&(l=o.box[r][1]);for(a=[[c,s],[f,s],[f,l],[c,l]],u=p.halfSample?2:1,i=M.invert(i,i),r=0;r<4;r++)I.transformMat2(a[r],a[r],i);for(r=0;r<4;r++)I.scale(a[r],a[r],u);return a}function a(){n.i(w.f)(v,E),E.zeroBorder()}function u(){var t,e,n,r,o,i,a,u=[];for(t=0;t0&&r[x.data[n]-1]++;return r=r.map(function(t,e){return{val:t,label:e+1}}),r.sort(function(t,e){return e.val-t.val}),r.filter(function(t){return t.val>=5})}function s(t,e){var n,r,o,a,u=[],c=[];for(n=0;n=2){for(o=0;ol&&c.push(t[o]);if(c.length>=2){for(a=f(c),i=0,o=0;o1&&a.length>=c.length/4*3&&a.length>t.length/4&&(i/=a.length,u={index:e[1]*z.x+e[0],pos:{x:n,y:r},box:[I.clone([n,r]),I.clone([n+g.size.x,r]),I.clone([n+g.size.x,r+g.size.y]),I.clone([n,r+g.size.y])],moments:a,rad:i,vec:I.clone([Math.cos(i),Math.sin(i)])},s.push(u))}}return s}function h(t){function e(){var t;for(t=0;ta&&n(u):x.data[u]=Number.MAX_VALUE}var r,o,i=0,a=.95,u=0;for(T.a.init(m.data,0),T.a.init(x.data,0),T.a.init(b.data,null),r=0;r0) {length=length - 1|0;images[outImagePtr+length|0]=(images[aImagePtr+length|0]|0) - (images[bImagePtr+length|0]|0)|0;}}function bitwiseOr(aImagePtr, bImagePtr, outImagePtr) {aImagePtr=aImagePtr|0;bImagePtr=bImagePtr|0;outImagePtr=outImagePtr|0;var length=0;length=imul(size, size)|0;while ((length|0)>0) {length=length - 1|0;images[outImagePtr+length|0]=images[aImagePtr+length|0]|0|(images[bImagePtr+length|0]|0)|0;}}function countNonZero(imagePtr) {imagePtr=imagePtr|0;var sum=0,length=0;length=imul(size, size)|0;while ((length|0)>0) {length=length - 1|0;sum=(sum|0)+(images[imagePtr+length|0]|0)|0;}return sum|0;}function init(imagePtr, value) {imagePtr=imagePtr|0;value=value|0;var length=0;length=imul(size, size)|0;while ((length|0)>0) {length=length - 1|0;images[imagePtr+length|0]=value;}}function dilate(inImagePtr, outImagePtr) {inImagePtr=inImagePtr|0;outImagePtr=outImagePtr|0;var v=0,u=0,sum=0,yStart1=0,yStart2=0,xStart1=0,xStart2=0,offset=0;for (v=1; (v|0)<(size - 1|0); v=v+1|0) {offset=offset+size|0;for (u=1; (u|0)<(size - 1|0); u=u+1|0) {yStart1=offset - size|0;yStart2=offset+size|0;xStart1=u - 1|0;xStart2=u+1|0;sum=(images[inImagePtr+yStart1+xStart1|0]|0)+(images[inImagePtr+yStart1+xStart2|0]|0)+(images[inImagePtr+offset+u|0]|0)+(images[inImagePtr+yStart2+xStart1|0]|0)+(images[inImagePtr+yStart2+xStart2|0]|0)|0;if ((sum|0)>(0|0)) {images[outImagePtr+offset+u|0]=1;} else {images[outImagePtr+offset+u|0]=0;}}}return;}function memcpy(srcImagePtr, dstImagePtr) {srcImagePtr=srcImagePtr|0;dstImagePtr=dstImagePtr|0;var length=0;length=imul(size, size)|0;while ((length|0)>0) {length=length - 1|0;images[dstImagePtr+length|0]=images[srcImagePtr+length|0]|0;}}function zeroBorder(imagePtr) {imagePtr=imagePtr|0;var x=0,y=0;for (x=0; (x|0)<(size - 1|0); x=x+1|0) {images[imagePtr+x|0]=0;images[imagePtr+y|0]=0;y=y+size - 1|0;images[imagePtr+y|0]=0;y=y+1|0;}for (x=0; (x|0)<(size|0); x=x+1|0) {images[imagePtr+y|0]=0;y=y+1|0;}}function skeletonize() {var subImagePtr=0,erodedImagePtr=0,tempImagePtr=0,skelImagePtr=0,sum=0,done=0;erodedImagePtr=imul(size, size)|0;tempImagePtr=erodedImagePtr+erodedImagePtr|0;skelImagePtr=tempImagePtr+erodedImagePtr|0;init(skelImagePtr, 0);zeroBorder(subImagePtr);do {erode(subImagePtr, erodedImagePtr);dilate(erodedImagePtr, tempImagePtr);subtract(subImagePtr, tempImagePtr, tempImagePtr);bitwiseOr(skelImagePtr, tempImagePtr, skelImagePtr);memcpy(erodedImagePtr, subImagePtr);sum=countNonZero(subImagePtr)|0;done=(sum|0) == 0|0;} while (!done);}return {skeletonize: skeletonize};} __webpack_exports__["a"]=Skeletonizer; },function(t,e,n){"use strict";function r(t){o.a.call(this,t),this.barSpaceRatio=[1,1]}var o=n(1),i=1,a=3,u={START_PATTERN:{value:[a,i,a,i,i,i]},STOP_PATTERN:{value:[a,i,i,i,a]},CODE_PATTERN:{value:[[i,i,a,a,i],[a,i,i,i,a],[i,a,i,i,a],[a,a,i,i,i],[i,i,a,i,a],[a,i,a,i,i],[i,a,a,i,i],[i,i,i,a,a],[a,i,i,a,i],[i,a,i,a,i]]},SINGLE_CODE_ERROR:{value:.78,writable:!0},AVG_CODE_ERROR:{value:.3,writable:!0},FORMAT:{value:"2of5"}},c=u.START_PATTERN.value.reduce(function(t,e){return t+e},0);r.prototype=Object.create(o.a.prototype,u),r.prototype.constructor=r,r.prototype._findPattern=function(t,e,n,r){var o,i,a,u,c=[],s=this,f=0,l={error:Number.MAX_VALUE,code:-1,start:0,end:0},d=s.AVG_CODE_ERROR;for(n=n||!1,r=r||!1,e||(e=s._nextSet(s._row)),o=0;o=0&&n._matchRange(t,e.start,0))return e;r=e.end,e=null}},r.prototype._verifyTrailingWhitespace=function(t){var e,n=this;return e=t.end+(t.end-t.start)/2,e1&&i._isStartEnd(n))break}while(ri._counters.length?i._counters.length:r,o=t.start+i._sumCounters(t.startCounter,r-8),{code:a.join(""),start:t.start,end:o,startInfo:t,decodedCodes:a}):null},r.prototype._verifyWhitespace=function(t,e){return(t-1<=0||this._counters[t-1]>=this._calculatePatternLength(t)/2)&&(e+8>=this._counters.length||this._counters[e+7]>=this._calculatePatternLength(e)/2)},r.prototype._calculatePatternLength=function(t){var e,n=0;for(e=t;e=0;i--)n=2==(1&i)?c.bar:c.space,r=1==(1&a)?n.wide:n.narrow,r.size+=u._counters[s+i],r.counts++,a>>=1;s+=8}return["space","bar"].forEach(function(t){var e=c[t];e.wide.min=Math.floor((e.narrow.size/e.narrow.counts+e.wide.size/e.wide.counts)/2),e.narrow.max=Math.ceil(e.wide.min),e.wide.max=Math.ceil((e.wide.size*u.MAX_ACCEPTABLE+u.PADDING)/e.wide.counts)}),c},r.prototype._charToPattern=function(t){var e,n=this,r=t.charCodeAt(0);for(e=0;e=0;r--){if(o=0==(1&r)?s.bar:s.space,i=1==(1&u)?o.wide:o.narrow,(a=c._counters[f+r])i.max)return!1;u>>=1}f+=8}return!0},r.prototype._patternToChar=function(t){var e,n=this;for(e=0;ei&&(i=r),rthis._counters.length)return-1;for(e=this._computeAlternatingThreshold(t,a),n=this._computeAlternatingThreshold(t+1,a),r=0;ro&&(c|=u),u>>=1;return c},r.prototype._isStartEnd=function(t){var e;for(e=0;eu.AVG_CODE_ERROR?null:(u.CODE_PATTERN[l.code]&&(l.correction.bar=o(u.CODE_PATTERN[l.code],a,this.MODULE_INDICES.bar),l.correction.space=o(u.CODE_PATTERN[l.code],a,this.MODULE_INDICES.space)),l)}f++,a[f]=1,s=!s}return null},r.prototype._correct=function(t,e){this._correctBars(t,e.bar,this.MODULE_INDICES.bar),this._correctBars(t,e.space,this.MODULE_INDICES.space)},r.prototype._findStart=function(){var t,e,n,r,i,a=[0,0,0,0,0,0],u=this,c=u._nextSet(u._row),s=!1,f=0,l={error:Number.MAX_VALUE,code:-1,start:0,end:0,correction:{bar:1,space:1}};for(t=c;t4)return-1;if(0==(1&i))for(var u=0;u="a"&&o<="d"){if(r>e-2)return null;var i=t[++r],a=i.charCodeAt(0),u=void 0;switch(o){case"a":if(!(i>="A"&&i<="Z"))return null;u=String.fromCharCode(a-64);break;case"b":if(i>="A"&&i<="E")u=String.fromCharCode(a-38);else if(i>="F"&&i<="J")u=String.fromCharCode(a-11);else if(i>="K"&&i<="O")u=String.fromCharCode(a+16);else if(i>="P"&&i<="S")u=String.fromCharCode(a+43);else{if(!(i>="T"&&i<="Z"))return null;u=String.fromCharCode(127)}break;case"c":if(i>="A"&&i<="O")u=String.fromCharCode(a-32);else{if("Z"!==i)return null;u=":"}break;case"d":if(!(i>="A"&&i<="Z"))return null;u=String.fromCharCode(a+32)}n.push(u)}else n.push(o)}return n},r.prototype._verifyChecksums=function(t){return this._matchCheckChar(t,t.length-2,20)&&this._matchCheckChar(t,t.length-1,15)},r.prototype._matchCheckChar=function(t,e,n){var r=this,o=t.slice(0,e),i=o.length,a=o.reduce(function(t,e,o){return t+((o*-1+(i-1))%n+1)*r.ALPHABET.indexOf(e.charCodeAt(0))},0);return this.ALPHABET[a%47]===t[e].charCodeAt(0)},e.a=r},function(t,e,n){"use strict";function r(){o.a.call(this)}var o=n(4),i={FORMAT:{value:"ean_2",writeable:!1}};r.prototype=Object.create(o.a.prototype,i),r.prototype.constructor=r,r.prototype.decode=function(t,e){this._row=t;var n,r=0,o=0,i=e,a=this._row.length,u=[],c=[];for(o=0;o<2&&i=this.CODE_G_START&&(r|=1<<1-o),1!=o&&(i=this._nextSet(this._row,n.end),i=this._nextUnset(this._row,i))}return 2!=u.length||parseInt(u.join(""))%4!==r?null:{code:u.join(""),decodedCodes:c,end:n.end}},e.a=r},function(t,e,n){"use strict";function r(){a.a.call(this)}function o(t){var e;for(e=0;e<10;e++)if(t===c[e])return e;return null}function i(t){var e,n=t.length,r=0;for(e=n-2;e>=0;e-=2)r+=t[e];for(r*=3,e=n-1;e>=0;e-=2)r+=t[e];return(r*=3)%10}var a=n(4),u={FORMAT:{value:"ean_5",writeable:!1}},c=[24,20,18,17,12,6,3,10,9,5];r.prototype=Object.create(a.a.prototype,u),r.prototype.constructor=r,r.prototype.decode=function(t,e){this._row=t;var n,r=0,a=0,u=e,c=this._row.length,s=[],f=[];for(a=0;a<5&&u=this.CODE_G_START&&(r|=1<<4-a),4!=a&&(u=this._nextSet(this._row,n.end),u=this._nextUnset(this._row,u))}return 5!=s.length?null:i(s)!==o(r)?null:{code:s.join(""),decodedCodes:f,end:n.end}},e.a=r},function(t,e,n){"use strict";function r(t,e){o.a.call(this,t,e)}var o=n(4),i={FORMAT:{value:"ean_8",writeable:!1}};r.prototype=Object.create(o.a.prototype,i),r.prototype.constructor=r,r.prototype._decodePayload=function(t,e,n){var r,o=this;for(r=0;r<4;r++){if(!(t=o._decodeCode(t.end,o.CODE_G_START)))return null;e.push(t.code),n.push(t)}if(null===(t=o._findPattern(o.MIDDLE_PATTERN,t.end,!0,!1)))return null;for(n.push(t),r=0;r<4;r++){if(!(t=o._decodeCode(t.end,o.CODE_G_START)))return null;n.push(t),e.push(t.code)}return t},e.a=r},function(t,e,n){"use strict";function r(t){t=a()(o(),t),u.a.call(this,t),this.barSpaceRatio=[1,1],t.normalizeBarSpaceWidth&&(this.SINGLE_CODE_ERROR=.38,this.AVG_CODE_ERROR=.09)}function o(){var t={};return Object.keys(r.CONFIG_KEYS).forEach(function(e){t[e]=r.CONFIG_KEYS[e].default}),t}var i=n(28),a=n.n(i),u=n(1),c=1,s=3,f={START_PATTERN:{value:[c,c,c,c]},STOP_PATTERN:{value:[c,c,s]},CODE_PATTERN:{value:[[c,c,s,s,c],[s,c,c,c,s],[c,s,c,c,s],[s,s,c,c,c],[c,c,s,c,s],[s,c,s,c,c],[c,s,s,c,c],[c,c,c,s,s],[s,c,c,s,c],[c,s,c,s,c]]},SINGLE_CODE_ERROR:{value:.78,writable:!0},AVG_CODE_ERROR:{value:.38,writable:!0},MAX_CORRECTION_FACTOR:{value:5},FORMAT:{value:"i2of5"}};r.prototype=Object.create(u.a.prototype,f),r.prototype.constructor=r,r.prototype._matchPattern=function(t,e){if(this.config.normalizeBarSpaceWidth){var n,r=[0,0],o=[0,0],i=[0,0],a=this.MAX_CORRECTION_FACTOR,c=1/a;for(n=0;n=0&&n._matchRange(t,e.start,0))return e;r=e.end,e=null}},r.prototype._verifyTrailingWhitespace=function(t){var e,n=this;return e=t.end+(t.end-t.start)/2,e=o.CODE_G_START&&(t.code=t.code-o.CODE_G_START,i|=1<<5-r),e.push(t.code),n.push(t)}return o._determineParity(i,e)?t:null},r.prototype._determineParity=function(t,e){var n,r;for(r=0;r0&&n(f)?e>1?r(f,e-1,n,a,u):o(u,f):a||(u[u.length]=f)}return u}var o=n(90),i=n(128);t.exports=r},function(t,e,n){var r=n(117),o=r();t.exports=o},function(t,e,n){function r(t,e){e=o(e,t);for(var n=0,r=e.length;null!=t&&n1?n[o-1]:void 0,u=o>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(o--,a):void 0,u&&i(n[0],n[1],u)&&(a=o<3?void 0:a,o=1),e=Object(e);++r-1}var o=n(12);t.exports=r},function(t,e,n){function r(t,e){var n=this.__data__,r=o(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this}var o=n(12);t.exports=r},function(t,e,n){function r(){this.size=0,this.__data__={hash:new o,map:new(a||i),string:new o}}var o=n(84),i=n(10),a=n(33);t.exports=r},function(t,e,n){function r(t){var e=o(this,t).delete(t);return this.size-=e?1:0,e}var o=n(14);t.exports=r},function(t,e,n){function r(t){return o(this,t).get(t)}var o=n(14);t.exports=r},function(t,e,n){function r(t){return o(this,t).has(t)}var o=n(14);t.exports=r},function(t,e,n){function r(t,e){var n=o(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this}var o=n(14);t.exports=r},function(t,e,n){function r(t){var e=o(t,function(t){return n.size===i&&n.clear(),t}),n=e.cache;return e}var o=n(161),i=500;t.exports=r},function(t,e){function n(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}t.exports=n},function(t,e,n){(function(t){var r=n(38),o="object"==typeof e&&e&&!e.nodeType&&e,i=o&&"object"==typeof t&&t&&!t.nodeType&&t,a=i&&i.exports===o,u=a&&r.process,c=function(){try{return u&&u.binding&&u.binding("util")}catch(t){}}();t.exports=c}).call(e,n(29)(t))},function(t,e){function n(t){return o.call(t)}var r=Object.prototype,o=r.toString;t.exports=n},function(t,e){function n(t,e){return function(n){return t(e(n))}}t.exports=n},function(t,e){function n(t){var e=0,n=0;return function(){var a=i(),u=o-(a-n);if(n=a,u>0){if(++e>=r)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var r=800,o=16,i=Date.now;t.exports=n},function(t,e,n){function r(){this.__data__=new o,this.size=0}var o=n(10);t.exports=r},function(t,e){function n(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}t.exports=n},function(t,e){function n(t){return this.__data__.get(t)}t.exports=n},function(t,e){function n(t){return this.__data__.has(t)}t.exports=n},function(t,e,n){function r(t,e){var n=this.__data__;if(n instanceof o){var r=n.__data__;if(!i||r.length{% trans "Search" %}
+
+ {% include "search/barcode_modal.html" with id="barcode_scanner_modal" %}
-
+
+
{% if task %}
-
+
-
{% trans "Schedule:" %}
@@ -51,7 +53,7 @@
-
+
{% else %}
+
{% trans "Schedule scan" %}
{% endif %}
From 340b306d2e6cc6e6fad36a51f15e4fe8bbe3e3e0 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 26 Feb 2022 18:08:07 -0800
Subject: [PATCH 08/59] Fix path
---
bookwyrm/templates/layout.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html
index 54ccbe276..b059af6d2 100644
--- a/bookwyrm/templates/layout.html
+++ b/bookwyrm/templates/layout.html
@@ -272,7 +272,7 @@
-
+
{% block scripts %}{% endblock %}
From fcc8b6aaabe7df427038d485b3b1a07cf94fd193 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 26 Feb 2022 18:19:12 -0800
Subject: [PATCH 09/59] Move to sass
---
bookwyrm/static/css/bookwyrm.css | 1319 -----------------
bookwyrm/static/css/bookwyrm/_all.scss | 1 +
.../css/bookwyrm/components/_barcode.scss | 14 +
3 files changed, 15 insertions(+), 1319 deletions(-)
delete mode 100644 bookwyrm/static/css/bookwyrm.css
create mode 100644 bookwyrm/static/css/bookwyrm/components/_barcode.scss
diff --git a/bookwyrm/static/css/bookwyrm.css b/bookwyrm/static/css/bookwyrm.css
deleted file mode 100644
index f1faf30c1..000000000
--- a/bookwyrm/static/css/bookwyrm.css
+++ /dev/null
@@ -1,1319 +0,0 @@
-html {
- scroll-behavior: smooth;
-}
-
-body {
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-button {
- border: none;
- margin: 0;
- padding: 0;
- width: auto;
- overflow: visible;
- background: transparent;
-
- /* inherit font, color & alignment from ancestor */
- color: inherit;
- font: inherit;
- text-align: inherit;
-
- /* Normalize `line-height`. Cannot be changed from `normal` in Firefox 4+. */
- line-height: normal;
-
- /* Corrects font smoothing for webkit */
- -webkit-font-smoothing: inherit;
- -moz-osx-font-smoothing: inherit;
-
- /* Corrects inability to style clickable `input` types in iOS */
- -webkit-appearance: none;
-
- /* Generalizes pointer cursor */
- cursor: pointer;
-}
-
-button::-moz-focus-inner {
- /* Remove excess padding and border in Firefox 4+ */
- border: 0;
- padding: 0;
-}
-
-/* Better accessibility for keyboard users */
-*:focus-visible {
- outline-style: auto !important;
-}
-
-.image {
- overflow: hidden;
-}
-
-.navbar .logo {
- max-height: 50px;
-}
-
-.card {
- overflow: visible;
-}
-
-.card.has-border {
- border: 1px solid #eee;
-}
-
-.scroll-x {
- overflow: hidden;
- overflow-x: auto;
-}
-
-.modal-card {
- pointer-events: none;
-}
-
-.modal-card > * {
- pointer-events: all;
-}
-
-/* stylelint-disable no-descending-specificity */
-.modal-card:focus {
- outline-style: auto;
-}
-
-.modal-card:focus:not(:focus-visible) {
- outline-style: initial;
-}
-
-.modal-card:focus-visible {
- outline-style: auto;
-}
-/* stylelint-enable no-descending-specificity */
-
-.modal-card.is-fullwidth {
- min-width: 75% !important;
-}
-
-@media only screen and (min-width: 769px) {
- .modal-card.is-thin {
- width: 350px !important;
- }
-}
-
-.modal-card-body {
- max-height: 70vh;
-}
-
-.clip-text {
- max-height: 35em;
- overflow: hidden;
-}
-
-/** Utilities not covered by Bulma
- ******************************************************************************/
-
-@media only screen and (max-width: 768px) {
- .is-sr-only-mobile {
- border: none !important;
- clip: rect(0, 0, 0, 0) !important;
- height: 0.01em !important;
- overflow: hidden !important;
- padding: 0 !important;
- position: absolute !important;
- white-space: nowrap !important;
- width: 0.01em !important;
- }
-
- .m-0-mobile {
- margin: 0 !important;
- }
-
- .card-footer.is-stacked-mobile {
- flex-direction: column;
- }
-
- .card-footer.is-stacked-mobile .card-footer-item:not(:last-child) {
- border-bottom: 1px solid #ededed;
- border-right: 0;
- }
-
- .is-flex-direction-row-mobile {
- flex-direction: row !important;
- }
-
- .is-flex-direction-column-mobile {
- flex-direction: column !important;
- }
-}
-
-.tag.is-small {
- height: auto;
-}
-
-.button.is-transparent {
- background-color: transparent;
-}
-
-.card.is-stretchable {
- display: flex;
- flex-direction: column;
- height: 100%;
-}
-
-.card.is-stretchable .card-content {
- flex-grow: 1;
-}
-
-.preserve-whitespace p {
- white-space: pre-wrap !important;
-}
-
-.display-inline p {
- display: inline !important;
-}
-
-button .button-invisible-overlay {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- padding: 1rem;
- box-sizing: border-box;
- display: flex;
- align-items: center;
- flex-direction: column;
- justify-content: center;
- background: rgba(0, 0, 0, 66%);
- color: white;
- opacity: 0;
- transition: opacity 0.2s ease;
-}
-
-button:hover .button-invisible-overlay,
-button:active .button-invisible-overlay,
-button:focus-visible .button-invisible-overlay {
- opacity: 1;
-}
-
-/** File input styles
- ******************************************************************************/
-
-input[type="file"]::file-selector-button {
- -moz-appearance: none;
- -webkit-appearance: none;
- background-color: #fff;
- border-radius: 4px;
- border: 1px solid #dbdbdb;
- box-shadow: none;
- color: #363636;
- cursor: pointer;
- font-size: 1rem;
- height: 2.5em;
- justify-content: center;
- line-height: 1.5;
- padding-bottom: calc(0.5em - 1px);
- padding-left: 1em;
- padding-right: 1em;
- padding-top: calc(0.5em - 1px);
- text-align: center;
- white-space: nowrap;
-}
-
-input[type="file"]::file-selector-button:hover {
- border-color: #b5b5b5;
- color: #363636;
-}
-
-/** General `details` element styles
- ******************************************************************************/
-
-details summary {
- cursor: pointer;
-}
-
-summary::-webkit-details-marker {
- display: none;
-}
-
-details summary::marker {
- content: none;
-}
-
-details.detail-pinned-button summary {
- position: absolute;
- right: 0;
-}
-
-details.detail-pinned-button form {
- float: left;
- width: 100%;
- margin-top: 1em;
-}
-
-/** Dropdown w/ Details element
- ******************************************************************************/
-
-details.dropdown[open] summary.dropdown-trigger::before {
- content: "";
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
-}
-
-details.dropdown .dropdown-menu {
- display: block !important;
-}
-
-details.dropdown .dropdown-menu button {
- /* Fix weird Safari defaults */
- box-sizing: border-box;
-}
-
-details.dropdown .dropdown-menu button:focus-visible,
-details.dropdown .dropdown-menu a:focus-visible {
- outline-style: auto;
- outline-offset: -2px;
-}
-
-@media only screen and (max-width: 768px) {
- details.dropdown[open] summary.dropdown-trigger::before {
- background-color: rgba(0, 0, 0, 50%);
- z-index: 30;
- }
-
- details .dropdown-menu {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- display: flex !important;
- align-items: center;
- justify-content: center;
- pointer-events: none;
- z-index: 100;
- }
-
- details .dropdown-menu > * {
- pointer-events: all;
- }
-}
-
-/** Details panel
- ******************************************************************************/
-
-details.details-panel {
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 10%);
- transition: box-shadow 0.2s ease;
- padding: 0.75rem;
-}
-
-details[open].details-panel,
-details.details-panel:hover {
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 20%);
-}
-
-details.details-panel summary {
- position: relative;
-}
-
-details.details-panel summary .details-close {
- position: absolute;
- right: 0;
- top: 0;
- transform: rotate(45deg);
- transition: transform 0.2s ease;
-}
-
-details[open].details-panel summary .details-close {
- transform: rotate(0deg);
-}
-
-@media only screen and (min-width: 769px) {
- .details-panel .filters-field:not(:last-child) {
- border-right: 1px solid rgba(0, 0, 0, 10%);
- margin-top: 0.75rem;
- margin-bottom: 0.75rem;
- padding-top: 0.25rem;
- padding-bottom: 0.25rem;
- }
-}
-
-/** Shelving
- ******************************************************************************/
-
-/** @todo Replace icons with SVG symbols.
- @see https://www.youtube.com/watch?v=9xXBYcWgCHA */
-.shelf-option:disabled > *::after {
- font-family: icomoon; /* stylelint-disable font-family-no-missing-generic-family-keyword */
- content: "\e919"; /* icon-check */
- margin-left: 0.5em;
-}
-
-/** Toggles
- ******************************************************************************/
-
-.toggle-button[aria-pressed="true"],
-.toggle-button[aria-pressed="true"]:hover {
- background-color: hsl(171deg, 100%, 41%);
- color: white;
-}
-
-.hide-active[aria-pressed="true"],
-.hide-inactive[aria-pressed="false"] {
- display: none;
-}
-
-.transition-x.is-hidden,
-.transition-y.is-hidden {
- display: block !important;
- visibility: hidden !important;
- height: 0 !important;
- width: 0 !important;
- margin: 0 !important;
- padding: 0 !important;
- overflow: auto;
-}
-
-.transition-x,
-.transition-y {
- transition-duration: 0.5s;
- transition-timing-function: ease;
-}
-
-.transition-x {
- transition-property: width, margin-left, margin-right, padding-left, padding-right;
-}
-
-.transition-y {
- transition-property: height, margin-top, margin-bottom, padding-top, padding-bottom;
-}
-
-@media (prefers-reduced-motion: reduce) {
- .transition-x,
- .transition-y {
- transition-duration: 0.001ms !important;
- }
-}
-
-/** Stars
- ******************************************************************************/
-
-.stars {
- white-space: nowrap;
-}
-
-/** Stars in a review form
- *
- * Specificity makes hovering taking over checked inputs.
- *
- * \e9d9: filled star
- * \e9d7: empty star;
- * -------------------------------------------------------------------------- */
-
-.form-rate-stars {
- width: max-content;
-}
-
-/* All stars are visually filled by default. */
-.form-rate-stars .icon::before {
- content: "\e9d9"; /* icon-star-full */
-}
-
-/* Icons directly following half star inputs are marked as half */
-.form-rate-stars input.half:checked ~ .icon::before {
- content: "\e9d8"; /* icon-star-half */
-}
-
-/* stylelint-disable no-descending-specificity */
-.form-rate-stars input.half:checked + input + .icon:hover::before {
- content: "\e9d8" !important; /* icon-star-half */
-}
-
-/* Icons directly following half check inputs that follow the checked input are emptied. */
-.form-rate-stars input.half:checked + input + .icon ~ .icon::before {
- content: "\e9d7"; /* icon-star-empty */
-}
-
-/* Icons directly following inputs that follow the checked input are emptied. */
-.form-rate-stars input:checked ~ input + .icon::before {
- content: "\e9d7"; /* icon-star-empty */
-}
-
-/* When a label is hovered, repeat the fill-all-then-empty-following pattern. */
-.form-rate-stars:hover .icon.icon::before {
- content: "\e9d9" !important; /* icon-star-full */
-}
-
-.form-rate-stars .icon:hover ~ .icon::before {
- content: "\e9d7" !important; /* icon-star-empty */
-}
-
-/** Book covers
- *
- * - .is-cover gives the behaviour of the cover and its surrounding. (optional)
- * - .cover-container gives the dimensions and position (for borders, image and other elements).
- * - .book-cover is positioned and sized based on its container.
- *
- * To have the cover within specific dimensions, specify a width or height for
- * standard bulma’s named breapoints:
- *
- * `is-(w|h)-(auto|xs|s|m|l|xl|xxl)[-(mobile|tablet|desktop)]`
- *
- * The cover will be centered horizontally and vertically within those dimensions.
- *
- * When using `.column.is-N`, add `.is-w-auto` to the container so that the flex
- * calculations are not biased by the default `max-content`.
- ******************************************************************************/
-
-.column.is-cover {
- flex-grow: 0 !important;
-}
-
-.column.is-cover,
-.column.is-cover + .column {
- flex-basis: auto !important;
-}
-
-.cover-container {
- display: flex;
- justify-content: center;
- align-items: center;
- position: relative;
- width: max-content;
- max-width: 100%;
- overflow: hidden;
-}
-
-/* Book cover
- * -------------------------------------------------------------------------- */
-
-.book-cover {
- display: block;
- max-width: 100%;
- max-height: 100%;
-
- /* Useful when stretching under-sized images. */
- image-rendering: optimizequality;
- image-rendering: smooth;
-}
-
-/* Cover caption
- * -------------------------------------------------------------------------- */
-
-.no-cover .cover-caption {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 0.5em;
- font-size: 0.75em;
- color: white;
- background-color: #002549;
- display: flex;
- align-items: center;
- justify-content: center;
- flex-direction: column;
- gap: 1em;
- white-space: initial;
- text-align: center;
-}
-
-/** Avatars
- ******************************************************************************/
-
-.avatar {
- vertical-align: middle;
- display: inline;
-}
-
-/** Statuses: Quotes
- *
- * \e906: icon-quote-open
- * \e905: icon-quote-close
- *
- * The `content` class on the blockquote allows to apply styles to markdown
- * generated HTML in the quote: https://bulma.io/documentation/elements/content/
- *
- * ```html
- *
- *
- * User generated quote in markdown…
- *
- *
- *
— Book Title by Author
- *
- * ```
- ******************************************************************************/
-
-.quote > blockquote {
- position: relative;
- padding-left: 2em;
-}
-
-.quote > blockquote::before,
-.quote > blockquote::after {
- font-family: icomoon;
- position: absolute;
-}
-
-.quote > blockquote::before {
- content: "\e907"; /* icon-quote-open */
- top: 0;
- left: 0;
-}
-
-.quote > blockquote::after {
- content: "\e906"; /* icon-quote-close */
- right: 0;
-}
-
-/** Animations and transitions
- ******************************************************************************/
-
-@keyframes turning {
- from { transform: rotateZ(0deg); }
- to { transform: rotateZ(360deg); }
-}
-
-.is-processing .icon-spinner::before {
- animation: turning 1.5s infinite linear;
-}
-
-.icon-spinner {
- display: none;
-}
-
-.is-processing .icon-spinner {
- display: flex;
-}
-
-@media (prefers-reduced-motion: reduce) {
- .is-processing .icon::before {
- transition-duration: 0.001ms !important;
- }
-}
-
-/** Transient notification
- ******************************************************************************/
-
-#live-messages {
- position: fixed;
- bottom: 1em;
- right: 1em;
-}
-
-/** Tooltips
- ******************************************************************************/
-
-.tooltip {
- width: 100%;
-}
-
-/** States
- ******************************************************************************/
-
-/* "disabled" for non-buttons */
-
-.is-disabled {
- background-color: #dbdbdb;
- border-color: #dbdbdb;
- box-shadow: none;
- color: #7a7a7a;
- opacity: 0.5;
- cursor: not-allowed;
-}
-
-/* Book preview table
- ******************************************************************************/
-
-.book-preview td {
- vertical-align: middle;
-}
-
-@media only screen and (max-width: 768px) {
- table.is-mobile,
- table.is-mobile tbody {
- display: block;
- }
-
- table.is-mobile tr {
- display: flex;
- flex-wrap: wrap;
- justify-content: space-between;
- border-top: 1px solid #dbdbdb;
- }
-
- table.is-mobile td {
- display: block;
- box-sizing: border-box;
- flex: 1 0 100%;
- order: 2;
- border-bottom: 0;
- }
-
- table.is-mobile td.book-preview-top-row {
- order: 1;
- flex-basis: auto;
- }
-
- table.is-mobile td[data-title]:not(:empty)::before {
- content: attr(data-title);
- display: block;
- font-size: 0.75em;
- font-weight: bold;
- }
-
- table.is-mobile td:empty {
- padding: 0;
- }
-
- table.is-mobile th,
- table.is-mobile thead {
- display: none;
- }
-}
-
-/* Book list
- ******************************************************************************/
-
-ol.ordered-list {
- list-style: none;
- counter-reset: list-counter;
-}
-
-ol.ordered-list li {
- counter-increment: list-counter;
-}
-
-ol.ordered-list li::before {
- content: counter(list-counter);
- position: absolute;
- left: -20px;
- width: 20px;
- height: 24px;
- background-color: #fff;
- border: 1px solid #dbdbdb;
- border-right: 0;
- border-top-left-radius: 2px;
- border-top-right-radius: 2px;
- display: flex;
- justify-content: center;
- align-items: center;
- color: #888;
- font-size: 0.8em;
- font-weight: bold;
-}
-
-@media only screen and (max-width: 768px) {
- ol.ordered-list li::before {
- left: 0;
- z-index: 1;
- border: 0;
- border-right: 1px solid #dbdbdb;
- border-bottom: 1px solid #dbdbdb;
- border-radius: 0;
- border-bottom-right-radius: 2px;
- }
-}
-
-.overflow-wrap-anywhere {
- overflow-wrap: anywhere;
- min-width: 10em;
-}
-
-/* Threads
- ******************************************************************************/
-
-.thread .is-main .card {
- box-shadow: 0 0.5em 1em -0.125em rgb(50 115 220 / 35%), 0 0 0 1px rgb(50 115 220 / 2%);
-}
-
-.thread::after {
- content: "";
- position: absolute;
- z-index: -1;
- top: 0;
- bottom: 0;
- left: 2.5em;
- border-left: 2px solid #e0e0e0;
-}
-
-/* Breadcrumbs
- ******************************************************************************/
-
-.breadcrumb li:first-child * {
- padding-left: 0;
-}
-
-.breadcrumb li > * {
- align-items: center;
- display: flex;
- justify-content: center;
- padding: 0 0.75em;
-}
-
-/* Notifications page
- ******************************************************************************/
-
-.notification a.icon {
- text-decoration: none !important;
-}
-
-/* Breadcrumbs
- ******************************************************************************/
-
-.books-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 1rem;
- align-items: end;
- justify-items: stretch;
-}
-
-.books-grid > .is-big {
- grid-column: span 2;
- grid-row: span 2;
- justify-self: stretch;
-}
-
-.books-grid .book-cover {
- width: 100%;
-}
-
-.books-grid .book-title {
- --height-basis: 1.35rem;
-
- display: block;
- margin-top: 0.5rem;
- line-height: var(--height-basis);
- min-height: calc(2 * var(--height-basis));
-}
-
-@media only screen and (min-width: 769px) {
- .books-grid {
- gap: 1.5rem;
- grid-template-columns: repeat(auto-fill, minmax(8em, 1fr));
- }
-}
-
-/* Copy
- ******************************************************************************/
-
-.horizontal-copy {
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 0.75rem;
-}
-
-.horizontal-copy textarea {
- min-width: initial;
- white-space: nowrap;
-}
-
-.horizontal-copy button {
- align-self: stretch;
- height: unset;
-}
-
-.vertical-copy {
- display: flex;
- flex-direction: column;
- align-items: stretch;
- gap: 0.75rem;
-}
-
-.vertical-copy button {
- width: 100%;
-}
-
-/* Dimensions
- * @todo These could be in rem.
- ******************************************************************************/
-
-.is-32x32 {
- min-width: 32px !important;
- min-height: 32px !important;
-}
-
-.is-96x96 {
- min-width: 96px !important;
- min-height: 96px !important;
-}
-
-.is-w-auto {
- width: auto !important;
-}
-
-.is-w-xs {
- width: 80px !important;
-}
-
-.is-w-s {
- width: 100px !important;
-}
-
-.is-w-m {
- width: 150px !important;
-}
-
-.is-w-l {
- width: 200px !important;
-}
-
-.is-w-xl {
- width: 250px !important;
-}
-
-.is-w-xxl {
- width: 500px !important;
-}
-
-.is-h-xs {
- height: 80px !important;
-}
-
-.is-h-s {
- height: 100px !important;
-}
-
-.is-h-m {
- height: 150px !important;
-}
-
-.is-h-l {
- height: 200px !important;
-}
-
-.is-h-xl {
- height: 250px !important;
-}
-
-.is-h-xxl {
- height: 500px !important;
-}
-
-@media only screen and (max-width: 768px) {
- .is-w-auto-mobile {
- width: auto !important;
- }
-
- .is-w-xs-mobile {
- width: 80px !important;
- }
-
- .is-w-s-mobile {
- width: 100px !important;
- }
-
- .is-w-m-mobile {
- width: 150px !important;
- }
-
- .is-w-l-mobile {
- width: 200px !important;
- }
-
- .is-w-xl-mobile {
- width: 250px !important;
- }
-
- .is-w-xxl-mobile {
- width: 500px !important;
- }
-
- .is-h-xs-mobile {
- height: 80px !important;
- }
-
- .is-h-s-mobile {
- height: 100px !important;
- }
-
- .is-h-m-mobile {
- height: 150px !important;
- }
-
- .is-h-l-mobile {
- height: 200px !important;
- }
-
- .is-h-xl-mobile {
- height: 250px !important;
- }
-
- .is-h-xxl-mobile {
- height: 500px !important;
- }
-}
-
-@media only screen and (min-width: 769px) {
- .is-w-auto-tablet {
- width: auto !important;
- }
-
- .is-w-xs-tablet {
- width: 80px !important;
- }
-
- .is-w-s-tablet {
- width: 100px !important;
- }
-
- .is-w-m-tablet {
- width: 150px !important;
- }
-
- .is-w-l-tablet {
- width: 200px !important;
- }
-
- .is-w-xl-tablet {
- width: 250px !important;
- }
-
- .is-w-xxl-tablet {
- width: 500px !important;
- }
-
- .is-h-xs-tablet {
- height: 80px !important;
- }
-
- .is-h-s-tablet {
- height: 100px !important;
- }
-
- .is-h-m-tablet {
- height: 150px !important;
- }
-
- .is-h-l-tablet {
- height: 200px !important;
- }
-
- .is-h-xl-tablet {
- height: 250px !important;
- }
-
- .is-h-xxl-tablet {
- height: 500px !important;
- }
-}
-
-@media only screen and (min-width: 1024px) {
- .is-w-auto-desktop {
- width: auto !important;
- }
-
- .is-w-xs-desktop {
- width: 80px !important;
- }
-
- .is-w-s-desktop {
- width: 100px !important;
- }
-
- .is-w-m-desktop {
- width: 150px !important;
- }
-
- .is-w-l-desktop {
- width: 200px !important;
- }
-
- .is-w-xl-desktop {
- width: 250px !important;
- }
-
- .is-w-xxl-desktop {
- width: 500px !important;
- }
-
- .is-h-xs-desktop {
- height: 80px !important;
- }
-
- .is-h-s-desktop {
- height: 100px !important;
- }
-
- .is-h-m-desktop {
- height: 150px !important;
- }
-
- .is-h-l-desktop {
- height: 200px !important;
- }
-
- .is-h-xl-desktop {
- height: 250px !important;
- }
-
- .is-h-xxl-desktop {
- height: 500px !important;
- }
-}
-
-/* Alignments
- *
- * Use them with `.align.to-(c|t|r|b|l)[-(mobile|tablet)]`
- ******************************************************************************/
-
-/* Flex item position
- * -------------------------------------------------------------------------- */
-
-.align {
- display: flex !important;
- flex-direction: row !important;
-}
-
-.align.to-c {
- justify-content: center !important;
-}
-
-.align.to-t {
- align-items: flex-start !important;
-}
-
-.align.to-r {
- justify-content: flex-end !important;
-}
-
-.align.to-b {
- align-items: flex-end !important;
-}
-
-.align.to-l {
- justify-content: flex-start !important;
-}
-
-@media screen and (max-width: 768px) {
- .align.to-c-mobile {
- justify-content: center !important;
- }
-
- .align.to-t-mobile {
- align-items: flex-start !important;
- }
-
- .align.to-r-mobile {
- justify-content: flex-end !important;
- }
-
- .align.to-b-mobile {
- align-items: flex-end !important;
- }
-
- .align.to-l-mobile {
- justify-content: flex-start !important;
- }
-}
-
-@media screen and (min-width: 769px) {
- .align.to-c-tablet {
- justify-content: center !important;
- }
-
- .align.to-t-tablet {
- align-items: flex-start !important;
- }
-
- .align.to-r-tablet {
- justify-content: flex-end !important;
- }
-
- .align.to-b-tablet {
- align-items: flex-end !important;
- }
-
- .align.to-l-tablet {
- justify-content: flex-start !important;
- }
-}
-
-/* Spacings
- *
- * Those are supplementary rules to Bulma’s. They follow the same conventions.
- * Add those you’ll need.
- ******************************************************************************/
-
-.mr-auto {
- margin-right: auto !important;
-}
-
-.ml-auto {
- margin-left: auto !important;
-}
-
-@media screen and (max-width: 768px) {
- .m-0-mobile {
- margin: 0 !important;
- }
-
- .mr-auto-mobile {
- margin-right: auto !important;
- }
-
- .ml-auto-mobile {
- margin-left: auto !important;
- }
-
- .mt-3-mobile {
- margin-top: 0.75rem !important;
- }
-
- .ml-3-mobile {
- margin-left: 0.75rem !important;
- }
-
- .mx-3-mobile {
- margin-right: 0.75rem !important;
- margin-left: 0.75rem !important;
- }
-
- .my-3-mobile {
- margin-top: 0.75rem !important;
- margin-bottom: 0.75rem !important;
- }
-}
-
-@media screen and (min-width: 769px) {
- .m-0-tablet {
- margin: 0 !important;
- }
-
- .mr-auto-tablet {
- margin-right: auto !important;
- }
-
- .ml-auto-tablet {
- margin-left: auto !important;
- }
-
- .mt-3-tablet {
- margin-top: 0.75rem !important;
- }
-
- .ml-3-tablet {
- margin-left: 0.75rem !important;
- }
-
- .mx-3-tablet {
- margin-right: 0.75rem !important;
- margin-left: 0.75rem !important;
- }
-
- .my-3-tablet {
- margin-top: 0.75rem !important;
- margin-bottom: 0.75rem !important;
- }
-}
-
-/* Gaps (for Flexbox and Grid)
- *
- * Those are supplementary rules to Bulma’s. They follow the same conventions.
- * Add those you’ll need.
- ******************************************************************************/
-
-.is-gap-0 {
- gap: 0;
-}
-
-.is-gap-1 {
- gap: 0.25rem;
-}
-
-.is-gap-2 {
- gap: 0.5rem;
-}
-
-.is-gap-3 {
- gap: 0.75rem;
-}
-
-.is-gap-4 {
- gap: 1rem;
-}
-
-.is-gap-5 {
- gap: 1.5rem;
-}
-
-.is-gap-6 {
- gap: 3rem;
-}
-
-.is-row-gap-0 {
- row-gap: 0;
-}
-
-.is-row-gap-1 {
- row-gap: 0.25rem;
-}
-
-.is-row-gap-2 {
- row-gap: 0.5rem;
-}
-
-.is-row-gap-3 {
- row-gap: 0.75rem;
-}
-
-.is-row-gap-4 {
- row-gap: 1rem;
-}
-
-.is-row-gap-5 {
- row-gap: 1.5rem;
-}
-
-.is-row-gap-6 {
- row-gap: 3rem;
-}
-
-.is-column-gap-0 {
- column-gap: 0;
-}
-
-.is-column-gap-1 {
- column-gap: 0.25rem;
-}
-
-.is-column-gap-2 {
- column-gap: 0.5rem;
-}
-
-.is-column-gap-3 {
- column-gap: 0.75rem;
-}
-
-.is-column-gap-4 {
- column-gap: 1rem;
-}
-
-.is-column-gap-5 {
- column-gap: 1.5rem;
-}
-
-.is-column-gap-6 {
- column-gap: 3rem;
-}
-
-/* Barcode scanner CSS */
-#barcode-scanner {
- position: relative;
- min-height: 200px;
-}
-
-#barcode-scanner .drawingBuffer {
- position: absolute;
- top: 0;
- left: 0;
- height: auto;
- width: 100%;
-}
diff --git a/bookwyrm/static/css/bookwyrm/_all.scss b/bookwyrm/static/css/bookwyrm/_all.scss
index 11d7e403d..e9333bd19 100644
--- a/bookwyrm/static/css/bookwyrm/_all.scss
+++ b/bookwyrm/static/css/bookwyrm/_all.scss
@@ -1,6 +1,7 @@
/** Imports
******************************************************************************/
@import "components/avatar";
+@import "components/barcode";
@import "components/book_cover";
@import "components/book_grid";
@import "components/book_list";
diff --git a/bookwyrm/static/css/bookwyrm/components/_barcode.scss b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
new file mode 100644
index 000000000..da1aa721c
--- /dev/null
+++ b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
@@ -0,0 +1,14 @@
+
+/* Barcode scanner CSS */
+#barcode-scanner {
+ position: relative;
+ min-height: 200px;
+
+ .drawingBuffer {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: auto;
+ width: 100%;
+ }
+}
From 649ffe571a96b0bb25249cc846fd8468ea73661a Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 26 Feb 2022 18:29:38 -0800
Subject: [PATCH 10/59] Fix typos with searching
---
bookwyrm/static/js/bookwyrm.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index 10032c557..d7ba9ffe0 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -689,7 +689,7 @@ let BookWyrm = new (class {
statusNode.querySelector('.isbn').innerText = code;
toggleStatus('found');
- const search = new Url('search');
+ const search = new URL('/search', document.location);
search.searchParams.set('q', code);
cleanup();
From 8d0e5494808137d8763ee3f001c629de5c07ffb7 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 26 Feb 2022 20:19:26 -0800
Subject: [PATCH 11/59] Improve visuals and quality of scanning
---
.../css/bookwyrm/components/_barcode.scss | 10 +++++++++
bookwyrm/static/js/bookwyrm.js | 22 +++++++++++--------
bookwyrm/templates/search/barcode_modal.html | 4 ++--
3 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/bookwyrm/static/css/bookwyrm/components/_barcode.scss b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
index da1aa721c..1abbf5d40 100644
--- a/bookwyrm/static/css/bookwyrm/components/_barcode.scss
+++ b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
@@ -12,3 +12,13 @@
width: 100%;
}
}
+
+#barcode-status {
+ :dir(ltr) .select {
+ float: right;
+ }
+
+ :dir(rtl) .select {
+ float: left;
+ }
+}
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index d7ba9ffe0..4944ada65 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -655,10 +655,13 @@ let BookWyrm = new (class {
}
}
- function cleanup() {
+ function cleanup(clearDrawing = true) {
Quagga.stop();
- scannerNode.replaceChildren();
cameraListNode.removeEventListener('change', changeListener);
+
+ if (clearDrawing) {
+ scannerNode.replaceChildren();
+ }
}
Quagga.onProcessed((result) => {
@@ -683,7 +686,14 @@ let BookWyrm = new (class {
}
});
+ let lastDetection = null;
Quagga.onDetected((result) => {
+ // Detect the same code twice as an extra check to avoid bogus scans.
+ if (lastDetection === null || lastDetection !== result.codeResult.code) {
+ lastDetection = result.codeResult.code;
+ return;
+ }
+
const code = result.codeResult.code;
statusNode.querySelector('.isbn').innerText = code;
@@ -692,7 +702,7 @@ let BookWyrm = new (class {
const search = new URL('/search', document.location);
search.searchParams.set('q', code);
- cleanup();
+ cleanup(false);
location.assign(search);
});
@@ -711,12 +721,6 @@ let BookWyrm = new (class {
constraints: {
facingMode: "environment",
},
- area: {
- top: "25%",
- right: "25%",
- left: "25%",
- bottom: "25%",
- }
},
decoder : {
readers: [
diff --git a/bookwyrm/templates/search/barcode_modal.html b/bookwyrm/templates/search/barcode_modal.html
index 17eb8829e..00cc7c027 100644
--- a/bookwyrm/templates/search/barcode_modal.html
+++ b/bookwyrm/templates/search/barcode_modal.html
@@ -12,7 +12,7 @@
- {% trans "Requesting camera" %}
+ {% trans "Requesting camera..." %}
{% trans "Grant access to the camera to scan a book's barcode." %}
{% trans "Could not access camera." %}
@@ -25,7 +25,7 @@
{% trans "Align your book's barcode with the camera." %}
- {% trans "ISBN found" context "barcode scanner" %}
+ {% trans "ISBN scanned, searching..." context "barcode scanner" %}
From fee6ffcbd858b0a54bdadc236d17c448d78a5ba8 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 26 Feb 2022 21:29:18 -0800
Subject: [PATCH 12/59] Fix formatting in chrome
Was using experimental selector, forget about it.
Also reduce jumping around of video size
---
.../static/css/bookwyrm/components/_barcode.scss | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/bookwyrm/static/css/bookwyrm/components/_barcode.scss b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
index 1abbf5d40..c12d59ea4 100644
--- a/bookwyrm/static/css/bookwyrm/components/_barcode.scss
+++ b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
@@ -2,7 +2,7 @@
/* Barcode scanner CSS */
#barcode-scanner {
position: relative;
- min-height: 200px;
+ min-height: 450px;
.drawingBuffer {
position: absolute;
@@ -13,12 +13,6 @@
}
}
-#barcode-status {
- :dir(ltr) .select {
- float: right;
- }
-
- :dir(rtl) .select {
- float: left;
- }
+#barcode-status .select {
+ float: right;
}
From 464050deaa4911bca518a43ee3568df296c257ad Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 26 Feb 2022 21:32:01 -0800
Subject: [PATCH 13/59] Implement switching cameras
Also, use session storage to remember last selected camera deviceId, if any
---
bookwyrm/static/js/bookwyrm.js | 119 +++++++++++++++++++--------------
1 file changed, 67 insertions(+), 52 deletions(-)
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index 4944ada65..0ae950447 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -645,8 +645,7 @@ let BookWyrm = new (class {
const cameraListNode = document.getElementById("barcode-camera-list");
let changeListener = cameraListNode.addEventListener('change', (event) => {
- // TODO
- //event.target.value
+ initBarcodes(event.target.value);
});
function toggleStatus(status) {
@@ -655,6 +654,71 @@ let BookWyrm = new (class {
}
}
+ function initBarcodes(cameraId = null) {
+ if (!cameraId) {
+ cameraId = sessionStorage.getItem('preferredCam');
+ } else {
+ sessionStorage.setItem('preferredCam', cameraId);
+ }
+
+ scannerNode.replaceChildren();
+ Quagga.stop();
+ Quagga.init({
+ inputStream : {
+ name: "Live",
+ type: "LiveStream",
+ target: scannerNode,
+ constraints: {
+ facingMode: "environment",
+ deviceId: cameraId,
+ },
+ },
+ decoder : {
+ readers: [
+ "ean_reader",
+ {
+ format: "ean_reader",
+ config: {
+ supplements: [ "ean_2_reader", "ean_5_reader" ]
+ }
+ }
+ ],
+ multiple: false
+ },
+ }, (err) => {
+ if (err) {
+ console.log(err);
+ toggleStatus('access-denied');
+ return;
+ }
+
+ let activeId = null;
+ const track = Quagga.CameraAccess.getActiveTrack();
+ if (track) {
+ activeId = track.getSettings().deviceId;
+ }
+
+ Quagga.CameraAccess.enumerateVideoDevices().then((devices) => {
+ cameraListNode.replaceChildren();
+
+ for (const device of devices) {
+ const child = document.createElement('option');
+ child.value = device.deviceId;
+ child.innerText = device.label.slice(0, 30);
+
+ if (activeId === child.value) {
+ child.selected = true;
+ }
+
+ cameraListNode.appendChild(child);
+ }
+ });
+
+ toggleStatus('scanning');
+ Quagga.start();
+ });
+ }
+
function cleanup(clearDrawing = true) {
Quagga.stop();
cameraListNode.removeEventListener('change', changeListener);
@@ -709,55 +773,6 @@ let BookWyrm = new (class {
event.target.addEventListener('close', cleanup, { once: true });
toggleStatus('grant-access');
-
- // Clear camera list
- cameraListNode.replaceChildren();
-
- Quagga.init({
- inputStream : {
- name: "Live",
- type: "LiveStream",
- target: scannerNode,
- constraints: {
- facingMode: "environment",
- },
- },
- decoder : {
- readers: [
- "ean_reader",
- {
- format: "ean_reader",
- config: {
- supplements: [ "ean_2_reader", "ean_5_reader" ]
- }
- }
- ],
- multiple: false
- },
- }, (err) => {
- if (err) {
- console.log(err);
- toggleStatus('access-denied');
- return;
- }
-
- const stream = Quagga.CameraAccess.getActiveStreamLabel();
- Quagga.CameraAccess.enumerateVideoDevices().then((devices) => {
- for (const device of devices) {
- const child = document.createElement('option');
- child.value = device.deviceId || device.id;
- child.innerText = device.label.slice(0, 30);
-
- if (stream === child.value) {
- child.selected = true;
- }
-
- cameraListNode.appendChild(child);
- }
- });
-
- Quagga.start();
- toggleStatus('scanning');
- });
+ initBarcodes();
}
})();
From cdddf73e29ea23b72ab988b57dae1647cef8d1b8 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 26 Feb 2022 23:22:44 -0800
Subject: [PATCH 14/59] Improve layout for some camera types
---
.../static/css/bookwyrm/components/_barcode.scss | 14 +++++++++++---
bookwyrm/static/js/bookwyrm.js | 6 +++++-
bookwyrm/templates/search/barcode_modal.html | 2 +-
3 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/bookwyrm/static/css/bookwyrm/components/_barcode.scss b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
index c12d59ea4..b6b416977 100644
--- a/bookwyrm/static/css/bookwyrm/components/_barcode.scss
+++ b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
@@ -2,14 +2,22 @@
/* Barcode scanner CSS */
#barcode-scanner {
position: relative;
- min-height: 450px;
+ max-width: 100%;
+ text-align: center;
+
+ video {
+ height: calc(70vh - 200px);
+ max-width: 100%;
+ }
.drawingBuffer {
position: absolute;
top: 0;
left: 0;
- height: auto;
- width: 100%;
+ right: 0;
+ margin: auto;
+ height: calc(70vh - 200px);
+ max-width: 100%;
}
}
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index 0ae950447..f6811614b 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -751,11 +751,15 @@ let BookWyrm = new (class {
});
let lastDetection = null;
+ let numDetected = 0;
Quagga.onDetected((result) => {
- // Detect the same code twice as an extra check to avoid bogus scans.
+ // Detect the same code 3 times as an extra check to avoid bogus scans.
if (lastDetection === null || lastDetection !== result.codeResult.code) {
+ numDetected = 1;
lastDetection = result.codeResult.code;
return;
+ } else if (numDetected++ < 3) {
+ return;
}
const code = result.codeResult.code;
diff --git a/bookwyrm/templates/search/barcode_modal.html b/bookwyrm/templates/search/barcode_modal.html
index 00cc7c027..93789ae3f 100644
--- a/bookwyrm/templates/search/barcode_modal.html
+++ b/bookwyrm/templates/search/barcode_modal.html
@@ -8,7 +8,7 @@
{% endblock %}
{% block modal-body %}
-
+
From 9b0874f889654321e07d4d5dec0216c68e6c849f Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 26 Feb 2022 23:28:13 -0800
Subject: [PATCH 15/59] Fix barcode button
---
bookwyrm/templates/layout.html | 2 ++
1 file changed, 2 insertions(+)
diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html
index b059af6d2..f352e882e 100644
--- a/bookwyrm/templates/layout.html
+++ b/bookwyrm/templates/layout.html
@@ -55,6 +55,8 @@
{% trans "Search" %}
+
+
{% trans "Scan Barcode" %}
From f4d5b7b4d26d952fe7a050d346954454a754056c Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 26 Feb 2022 23:28:52 -0800
Subject: [PATCH 16/59] Adjusted message
---
bookwyrm/templates/search/barcode_modal.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/bookwyrm/templates/search/barcode_modal.html b/bookwyrm/templates/search/barcode_modal.html
index 93789ae3f..9480197f8 100644
--- a/bookwyrm/templates/search/barcode_modal.html
+++ b/bookwyrm/templates/search/barcode_modal.html
@@ -25,8 +25,8 @@
{% trans "Align your book's barcode with the camera." %}
- {% trans "ISBN scanned, searching..." context "barcode scanner" %}
-
+ {% trans "ISBN scanned" context "barcode scanner" %}
+ {% trans "Searching for book:" context "followed by ISBN" %} ...
{% endblock %}
From e71a5e3bdfe6a4077ddcbbffcf392f09519c44bc Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sun, 27 Feb 2022 00:00:22 -0800
Subject: [PATCH 17/59] Add barcode icon and use other icons
Minor formatting and messaging tweaks
---
.../css/bookwyrm/components/_barcode.scss | 1 +
bookwyrm/static/css/fonts/icomoon.eot | Bin 10460 -> 10688 bytes
bookwyrm/static/css/fonts/icomoon.svg | 1 +
bookwyrm/static/css/fonts/icomoon.ttf | Bin 10296 -> 10524 bytes
bookwyrm/static/css/fonts/icomoon.woff | Bin 10372 -> 10600 bytes
bookwyrm/static/css/vendor/icons.css | 3 +++
bookwyrm/static/js/bookwyrm.js | 1 +
bookwyrm/templates/search/barcode_modal.html | 9 ++++++++-
8 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/bookwyrm/static/css/bookwyrm/components/_barcode.scss b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
index b6b416977..8c77d5252 100644
--- a/bookwyrm/static/css/bookwyrm/components/_barcode.scss
+++ b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
@@ -4,6 +4,7 @@
position: relative;
max-width: 100%;
text-align: center;
+ height: calc(70vh - 200px);
video {
height: calc(70vh - 200px);
diff --git a/bookwyrm/static/css/fonts/icomoon.eot b/bookwyrm/static/css/fonts/icomoon.eot
index 7b1f2d9d9f9d3ff8805e56d83c6c2ceba7654a8f..69628662beb9b527fe62d38c0d177366773ad879 100644
GIT binary patch
delta 613
zcmcZ;cp#YVfF=WjjOIi(GnVu$U+IYs<@JUP3=Df17#I?ga}x`e=Pr+6U|^JCU|{G;
zPb@BAU|Q4-vdbcmfq`)Y1A~f1MrvY;{EI&&3=FC-7#JALGBQ#V
zIk;KO85qLm;ejBN$^#U%{P3=9km8h=3Y49v_IC#Nu0hk~3X
z!63lE%)r6G$e{32^rgZ}^OsdG+g{#!#r4YU|KI=rLAn?eUNXEChss=s%P{_bEY2d%
zEcRAxwb%l&05L_;Zw$-~jFS&)NN#pzvSnmZR#H;l+{P>~S1-W8z~I2b!0f=l%)rjT
z&A`tf%plGn%^=U9%%IMo&7jX<%wW!7&0x>KAZ#qCjEotfd=SlSET{~kS&c=N&7oM;
zSX3E=)uA*)L&E_FhXx0S0}c+13}EVC_yGll0}2X^3ltRoEC35NI5;pmK=6TvhJObd
z8kimaHZV2d#||iffnoDvML`xBY2U2$cz&C&4BRZ>(7NYv2To7EplZ&jJDEdmGAjcM
x1B1on1#04xH>(9mO9-qI6cKb0ED-Dyyd=aSB*VbSz`&r(B*h@GSx$W)BLLigqk8}V
delta 369
zcmX>Qd?%3Yjs^pRg~miSGnPQzr#B}$l-Ci{&P^=1ymsOm1_nkM1_p+f
z^u*!<1_lNJ1_s6j3=9k$={c2YdKcn%FfcH#U|>*A$Vg30kr$F*!@!`*!N9;^mXVQ~
z$idBG#=xNJz`($ul95|dvA~YgnSntyg@J)#Lr#8j;{IJbrZF(6i7+rQMCB${6fl_T
zG08A6sDUg}$V<#ko$1B-n}I=X0s{kMTS0zt2?H|&0|SGG1Oo$u0s}Mig~=(5)!G>h
z3=Con0u0OyYz&MH3NJ-pD!i
+
diff --git a/bookwyrm/static/css/fonts/icomoon.ttf b/bookwyrm/static/css/fonts/icomoon.ttf
index 151f2b782e011873be7120240fc65777f3771917..12c79d551739bdbfe9e7246ae713b4d23545fdce 100644
GIT binary patch
delta 595
zcmdlHFej*50V!3=9kc3=E7b7#J8h(sL@)Om+O$Vg30k$>^0gn>cz1p@qRQq_tZFQ(48rPA
znxUcLfP+JWgTny_2Sx@k^)LK@g2Dj>1;zym3V#-Wg&G_j7#$$^Ktsd70}Tz#4u2b%
z8t`KW6u`i+`M-i7i;T2yR(d?Y%~u9)7Eo|9+;g}Crzh*EnltK7PEnoA$T0bfYPO<;
qz$!rzK^MUS!9KxDLL5Re;6$U#Bn3(e3=9lRlNB|DH&0eu$_N1TgOqUq
delta 367
zcmbOev?HLNfsuiMft#U$ftkU;KUm+0Ux?j+fq`KU0|P@sa&BV5<+T&nFfcI6FfcH*
zq$d^^FfcF(FfcGKU|?Y2NYANE)4LGAgMoo@1p|X}LPlz0ioB5g8U_Yc4h9AWvy6
zL=J8iGX@4#2L=WPm5khyiUoF@&I}ByDGUq@8*=iK9TWHO+A)oRK~02#fgvh4v7&&%
zlu3qxK@DV)LSABS>P#=r-wX_D6Brm6+Y0iFOBk3L7#J8dBp4VN6d0J9FHAg8Eu6u?
zz#zsTz`)GF#=yv+@KW@p!sGx(N#&}SZ7;9C;(BHF|L_0*42=IDi?fI`i>(ryFXk_%
zAo`VonSpWgL`Lz=D;aGWS(KEOl{UX(l9${3P?4WS=H^q~z<7R}uMFHQAPX7pUd^2Y
zVu0w$JZk2QI+I=0CNo-0exN2k`LkMpw4J~Tfg6G>f=YsEf^!5nFff3FR)IWDY7~4R2rWfb$g8bqV1_n(Juo{qBW(EcZ
zX6B2Nc^Ioh3m6y}Bp3u3m>D=27#S2^ioR5MY5ub6W!uYJuee^B{r~&_KPVg+6kamC
z6o<-Ohs!Yje=N=-&Mfv;Y_-?|u>dhe(QgdQ42-Za+x(i*o{>daNlAIL9<#h$y#NCP
zg98f#vjYP&13LpZ13!Z>gE)gUgFJ&WgF1sYgFb^XgE@mWgFOR-u(6;rGG>JGK{T_m
zpfZSNH5OGihhkM@QDqQThtdoU4F?8XO!BI5;pefT@4s2NVrJD>mthRxoJf-Ex9zFFz<{5D@1xLLpc?1YHCR1p5Rp32_L?fRmjrlN19ej2IZ0KtZ_qzS>eo
E0PditHvj+t
delta 413
zcmaD6)DkFC?(gQtz{tSBz@X8>zzwD?CI@PYPt+EvH%QJ+EMQ<@%wS+(XaV8NYbUNr
zPb>zBy)IVGeEW(UIgx?EPc4CgfguWn_wU*b&GrZO<7-Cw5g6LNUW(G!3sBHeqXv@f=q^zv8*^F6UZnLfuKa0%Gr@Ddh{5D@1xLH8q$8h&*
z?i>&UL{E-TGiTJ9JV9;pWOelnMLU5N0yhL%1eFBS1m_5X{0j {
if (err) {
+ scannerNode.replaceChildren();
console.log(err);
toggleStatus('access-denied');
return;
diff --git a/bookwyrm/templates/search/barcode_modal.html b/bookwyrm/templates/search/barcode_modal.html
index 9480197f8..3f7b01cea 100644
--- a/bookwyrm/templates/search/barcode_modal.html
+++ b/bookwyrm/templates/search/barcode_modal.html
@@ -12,19 +12,26 @@
+
{% trans "Requesting camera..." %}
{% trans "Grant access to the camera to scan a book's barcode." %}
-
{% trans "Could not access camera." %}
+
+
+ Access denied
+ {% trans "Could not access camera" %}
+
+
{% trans "Scanning..." context "barcode scanner" %}
{% trans "Align your book's barcode with the camera." %}
+
{% trans "ISBN scanned" context "barcode scanner" %}
{% trans "Searching for book:" context "followed by ISBN" %} ...
From 9f67a74340737a902ffcb6317e03535196804402 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sun, 27 Feb 2022 00:04:25 -0800
Subject: [PATCH 18/59] Show grant access dialog every time we initialize
---
bookwyrm/static/js/bookwyrm.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index efd5cfff0..01c13091a 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -655,6 +655,8 @@ let BookWyrm = new (class {
}
function initBarcodes(cameraId = null) {
+ toggleStatus('grant-access');
+
if (!cameraId) {
cameraId = sessionStorage.getItem('preferredCam');
} else {
@@ -777,7 +779,6 @@ let BookWyrm = new (class {
event.target.addEventListener('close', cleanup, { once: true });
- toggleStatus('grant-access');
initBarcodes();
}
})();
From 43f62ef5d7add5d3a4fc8bc146ea5ed15693812e Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sun, 27 Feb 2022 00:18:38 -0800
Subject: [PATCH 19/59] d'oh, fix event leak
---
bookwyrm/static/js/bookwyrm.js | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index 01c13091a..39d5f6647 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -644,9 +644,11 @@ let BookWyrm = new (class {
const statusNode = document.getElementById("barcode-status");
const cameraListNode = document.getElementById("barcode-camera-list");
- let changeListener = cameraListNode.addEventListener('change', (event) => {
+ cameraListNode.addEventListener('change', onChangeCamera);
+
+ function onChangeCamera(event) {
initBarcodes(event.target.value);
- });
+ }
function toggleStatus(status) {
for (const child of statusNode.children) {
@@ -724,7 +726,7 @@ let BookWyrm = new (class {
function cleanup(clearDrawing = true) {
Quagga.stop();
- cameraListNode.removeEventListener('change', changeListener);
+ cameraListNode.removeEventListener('change', onChangeCamera);
if (clearDrawing) {
scannerNode.replaceChildren();
From f5c66b5b4a9e983426a1ebf2389697224c965df3 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sun, 27 Feb 2022 00:33:54 -0800
Subject: [PATCH 20/59] Adjust layout more
Ensure camera select box is never hidden.
---
.../static/css/bookwyrm/components/_barcode.scss | 2 +-
bookwyrm/static/js/bookwyrm.js | 2 +-
bookwyrm/templates/search/barcode_modal.html | 14 +++++++++-----
3 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/bookwyrm/static/css/bookwyrm/components/_barcode.scss b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
index 8c77d5252..c000a1a89 100644
--- a/bookwyrm/static/css/bookwyrm/components/_barcode.scss
+++ b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
@@ -22,6 +22,6 @@
}
}
-#barcode-status .select {
+#barcode-camera-list {
float: right;
}
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index 39d5f6647..a9cc5c6ca 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -642,7 +642,7 @@ let BookWyrm = new (class {
openBarcodeScanner(event) {
const scannerNode = document.getElementById("barcode-scanner");
const statusNode = document.getElementById("barcode-status");
- const cameraListNode = document.getElementById("barcode-camera-list");
+ const cameraListNode = document.querySelector("#barcode-camera-list > select");
cameraListNode.addEventListener('change', onChangeCamera);
diff --git a/bookwyrm/templates/search/barcode_modal.html b/bookwyrm/templates/search/barcode_modal.html
index 3f7b01cea..cfbb4e1c8 100644
--- a/bookwyrm/templates/search/barcode_modal.html
+++ b/bookwyrm/templates/search/barcode_modal.html
@@ -8,9 +8,17 @@
{% endblock %}
{% block modal-body %}
-
+
+
+
+
+
+
{% trans "Requesting camera..." %}
@@ -22,10 +30,6 @@
{% trans "Could not access camera" %}
-
-
-
{% trans "Scanning..." context "barcode scanner" %}
{% trans "Align your book's barcode with the camera." %}
From 789626a9da77d94b73a5ff839787965a49753b04 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sun, 27 Feb 2022 00:39:45 -0800
Subject: [PATCH 21/59] Stray line
---
bookwyrm/templates/search/barcode_modal.html | 1 -
1 file changed, 1 deletion(-)
diff --git a/bookwyrm/templates/search/barcode_modal.html b/bookwyrm/templates/search/barcode_modal.html
index cfbb4e1c8..07e95f59e 100644
--- a/bookwyrm/templates/search/barcode_modal.html
+++ b/bookwyrm/templates/search/barcode_modal.html
@@ -18,7 +18,6 @@
-
{% trans "Requesting camera..." %}
From fbe7e860e8a97ba356b38cbd7458d559e1460036 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sun, 27 Feb 2022 14:01:25 -0800
Subject: [PATCH 22/59] Prettier
---
bookwyrm/static/js/bookwyrm.js | 159 ++++++++++++++++++---------------
1 file changed, 89 insertions(+), 70 deletions(-)
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index a9cc5c6ca..1ca6bfc25 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -431,11 +431,11 @@ let BookWyrm = new (class {
});
modalElement.addEventListener("keydown", handleFocusTrap);
- modalElement.dispatchEvent(new Event('open'));
+ modalElement.dispatchEvent(new Event("open"));
}
function handleModalClose(modalElement) {
- modalElement.dispatchEvent(new Event('close'));
+ modalElement.dispatchEvent(new Event("close"));
modalElement.removeEventListener("keydown", handleFocusTrap);
htmlElement.classList.remove("is-clipped");
modalElement.classList.remove("is-active");
@@ -644,10 +644,10 @@ let BookWyrm = new (class {
const statusNode = document.getElementById("barcode-status");
const cameraListNode = document.querySelector("#barcode-camera-list > select");
- cameraListNode.addEventListener('change', onChangeCamera);
+ cameraListNode.addEventListener("change", onChangeCamera);
function onChangeCamera(event) {
- initBarcodes(event.target.value);
+ initBarcodes(event.target.value);
}
function toggleStatus(status) {
@@ -657,76 +657,79 @@ let BookWyrm = new (class {
}
function initBarcodes(cameraId = null) {
- toggleStatus('grant-access');
+ toggleStatus("grant-access");
if (!cameraId) {
- cameraId = sessionStorage.getItem('preferredCam');
+ cameraId = sessionStorage.getItem("preferredCam");
} else {
- sessionStorage.setItem('preferredCam', cameraId);
+ sessionStorage.setItem("preferredCam", cameraId);
}
scannerNode.replaceChildren();
Quagga.stop();
- Quagga.init({
- inputStream : {
- name: "Live",
- type: "LiveStream",
- target: scannerNode,
- constraints: {
- facingMode: "environment",
- deviceId: cameraId,
+ Quagga.init(
+ {
+ inputStream: {
+ name: "Live",
+ type: "LiveStream",
+ target: scannerNode,
+ constraints: {
+ facingMode: "environment",
+ deviceId: cameraId,
+ },
+ },
+ decoder: {
+ readers: [
+ "ean_reader",
+ {
+ format: "ean_reader",
+ config: {
+ supplements: ["ean_2_reader", "ean_5_reader"],
+ },
+ },
+ ],
+ multiple: false,
},
},
- decoder : {
- readers: [
- "ean_reader",
- {
- format: "ean_reader",
- config: {
- supplements: [ "ean_2_reader", "ean_5_reader" ]
- }
- }
- ],
- multiple: false
- },
- }, (err) => {
- if (err) {
- scannerNode.replaceChildren();
- console.log(err);
- toggleStatus('access-denied');
- return;
- }
-
- let activeId = null;
- const track = Quagga.CameraAccess.getActiveTrack();
- if (track) {
- activeId = track.getSettings().deviceId;
- }
-
- Quagga.CameraAccess.enumerateVideoDevices().then((devices) => {
- cameraListNode.replaceChildren();
-
- for (const device of devices) {
- const child = document.createElement('option');
- child.value = device.deviceId;
- child.innerText = device.label.slice(0, 30);
-
- if (activeId === child.value) {
- child.selected = true;
- }
-
- cameraListNode.appendChild(child);
+ (err) => {
+ if (err) {
+ scannerNode.replaceChildren();
+ console.log(err);
+ toggleStatus("access-denied");
+ return;
}
- });
- toggleStatus('scanning');
- Quagga.start();
- });
+ let activeId = null;
+ const track = Quagga.CameraAccess.getActiveTrack();
+ if (track) {
+ activeId = track.getSettings().deviceId;
+ }
+
+ Quagga.CameraAccess.enumerateVideoDevices().then((devices) => {
+ cameraListNode.replaceChildren();
+
+ for (const device of devices) {
+ const child = document.createElement("option");
+ child.value = device.deviceId;
+ child.innerText = device.label.slice(0, 30);
+
+ if (activeId === child.value) {
+ child.selected = true;
+ }
+
+ cameraListNode.appendChild(child);
+ }
+ });
+
+ toggleStatus("scanning");
+ Quagga.start();
+ }
+ );
}
function cleanup(clearDrawing = true) {
Quagga.stop();
- cameraListNode.removeEventListener('change', onChangeCamera);
+ cameraListNode.removeEventListener("change", onChangeCamera);
if (clearDrawing) {
scannerNode.replaceChildren();
@@ -739,18 +742,34 @@ let BookWyrm = new (class {
if (result) {
if (result.boxes) {
- drawingCtx.clearRect(0, 0, parseInt(drawingCanvas.getAttribute("width")), parseInt(drawingCanvas.getAttribute("height")));
- result.boxes.filter((box) => box !== result.box).forEach((box) => {
- Quagga.ImageDebug.drawPath(box, {x: 0, y: 1}, drawingCtx, {color: "green", lineWidth: 2});
- });
+ drawingCtx.clearRect(
+ 0,
+ 0,
+ parseInt(drawingCanvas.getAttribute("width")),
+ parseInt(drawingCanvas.getAttribute("height"))
+ );
+ result.boxes
+ .filter((box) => box !== result.box)
+ .forEach((box) => {
+ Quagga.ImageDebug.drawPath(box, { x: 0, y: 1 }, drawingCtx, {
+ color: "green",
+ lineWidth: 2,
+ });
+ });
}
if (result.box) {
- Quagga.ImageDebug.drawPath(result.box, {x: 0, y: 1}, drawingCtx, {color: "#00F", lineWidth: 2});
+ Quagga.ImageDebug.drawPath(result.box, { x: 0, y: 1 }, drawingCtx, {
+ color: "#00F",
+ lineWidth: 2,
+ });
}
if (result.codeResult && result.codeResult.code) {
- Quagga.ImageDebug.drawPath(result.line, {x: 'x', y: 'y'}, drawingCtx, {color: 'red', lineWidth: 3});
+ Quagga.ImageDebug.drawPath(result.line, { x: "x", y: "y" }, drawingCtx, {
+ color: "red",
+ lineWidth: 3,
+ });
}
}
});
@@ -769,17 +788,17 @@ let BookWyrm = new (class {
const code = result.codeResult.code;
- statusNode.querySelector('.isbn').innerText = code;
- toggleStatus('found');
+ statusNode.querySelector(".isbn").innerText = code;
+ toggleStatus("found");
- const search = new URL('/search', document.location);
- search.searchParams.set('q', code);
+ const search = new URL("/search", document.location);
+ search.searchParams.set("q", code);
cleanup(false);
location.assign(search);
});
- event.target.addEventListener('close', cleanup, { once: true });
+ event.target.addEventListener("close", cleanup, { once: true });
initBarcodes();
}
From 1d4539c4c0b087834ec482b2456a43836b8a1537 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sun, 27 Feb 2022 14:03:45 -0800
Subject: [PATCH 23/59] Don't pretty the min.js file
---
.prettierignore | 1 +
1 file changed, 1 insertion(+)
create mode 100644 .prettierignore
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 000000000..dbbfd978b
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1 @@
+*.min.js
From c0380cca5ae1fd6a058fc4d11cf9f4a958383974 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sun, 27 Feb 2022 14:04:30 -0800
Subject: [PATCH 24/59] stylelint
---
bookwyrm/static/css/bookwyrm/components/_barcode.scss | 1 -
1 file changed, 1 deletion(-)
diff --git a/bookwyrm/static/css/bookwyrm/components/_barcode.scss b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
index c000a1a89..c34f0d355 100644
--- a/bookwyrm/static/css/bookwyrm/components/_barcode.scss
+++ b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
@@ -1,4 +1,3 @@
-
/* Barcode scanner CSS */
#barcode-scanner {
position: relative;
From 3a9ff2c2ea6ccc8c9ebc3535e2dfc3639ff00cf2 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sun, 27 Feb 2022 14:08:11 -0800
Subject: [PATCH 25/59] Refer to canvas by type
- Fixes stylelint without adding an exclusion
---
bookwyrm/static/css/bookwyrm/components/_barcode.scss | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bookwyrm/static/css/bookwyrm/components/_barcode.scss b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
index c34f0d355..c9c67e8e5 100644
--- a/bookwyrm/static/css/bookwyrm/components/_barcode.scss
+++ b/bookwyrm/static/css/bookwyrm/components/_barcode.scss
@@ -10,7 +10,7 @@
max-width: 100%;
}
- .drawingBuffer {
+ canvas {
position: absolute;
top: 0;
left: 0;
From 62b4133e5864e14a3306a4a08676a7d8f3fbc975 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Mon, 28 Feb 2022 21:22:49 -0800
Subject: [PATCH 26/59] Move quagga to vendor.
---
bookwyrm/static/js/{ => vendor}/quagga.min.js | 0
bookwyrm/templates/layout.html | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
rename bookwyrm/static/js/{ => vendor}/quagga.min.js (100%)
diff --git a/bookwyrm/static/js/quagga.min.js b/bookwyrm/static/js/vendor/quagga.min.js
similarity index 100%
rename from bookwyrm/static/js/quagga.min.js
rename to bookwyrm/static/js/vendor/quagga.min.js
diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html
index f352e882e..e3a8d2d80 100644
--- a/bookwyrm/templates/layout.html
+++ b/bookwyrm/templates/layout.html
@@ -274,7 +274,7 @@
-
+
{% block scripts %}{% endblock %}
From 40bb9112fd8f4ed8f28901b19253ac6ce3d33677 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Mon, 28 Feb 2022 21:23:44 -0800
Subject: [PATCH 27/59] .prettierignore to vendor
---
.prettierignore | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.prettierignore b/.prettierignore
index dbbfd978b..9fa808eed 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1 +1 @@
-*.min.js
+**/vendor/*
From c0fed31fb02edc318b778eaa1d4726fcbb8c5c55 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Mon, 28 Feb 2022 21:28:33 -0800
Subject: [PATCH 28/59] eslint
---
bookwyrm/static/js/bookwyrm.js | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index 1ca6bfc25..100daa039 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -1,5 +1,5 @@
/* exported BookWyrm */
-/* globals TabGroup */
+/* globals TabGroup, Quagga */
let BookWyrm = new (class {
constructor() {
@@ -696,11 +696,13 @@ let BookWyrm = new (class {
scannerNode.replaceChildren();
console.log(err);
toggleStatus("access-denied");
+
return;
}
let activeId = null;
const track = Quagga.CameraAccess.getActiveTrack();
+
if (track) {
activeId = track.getSettings().deviceId;
}
@@ -710,6 +712,7 @@ let BookWyrm = new (class {
for (const device of devices) {
const child = document.createElement("option");
+
child.value = device.deviceId;
child.innerText = device.label.slice(0, 30);
@@ -776,11 +779,13 @@ let BookWyrm = new (class {
let lastDetection = null;
let numDetected = 0;
+
Quagga.onDetected((result) => {
// Detect the same code 3 times as an extra check to avoid bogus scans.
if (lastDetection === null || lastDetection !== result.codeResult.code) {
numDetected = 1;
lastDetection = result.codeResult.code;
+
return;
} else if (numDetected++ < 3) {
return;
@@ -792,6 +797,7 @@ let BookWyrm = new (class {
toggleStatus("found");
const search = new URL("/search", document.location);
+
search.searchParams.set("q", code);
cleanup(false);
From c7c90f9e9b43ad322b0e382da2fceb2d4790f92f Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Tue, 1 Mar 2022 10:09:53 -0800
Subject: [PATCH 29/59] Removes test print statement
---
bookwyrm/models/antispam.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py
index bce02780d..f506b6f19 100644
--- a/bookwyrm/models/antispam.py
+++ b/bookwyrm/models/antispam.py
@@ -54,7 +54,6 @@ class AutoMod(models.Model):
@app.task(queue="low_priority")
def automod_task():
"""Create reports"""
- print("TASK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
if not AutoMod.objects.exists():
return
reporter = AutoMod.objects.first().created_by
From 0c0d0b6299c222b8e16bd2ab56b9a544c9675daa Mon Sep 17 00:00:00 2001
From: Levi Bard
Date: Wed, 9 Mar 2022 10:33:59 +0100
Subject: [PATCH 30/59] Allow book subjects to be edited
---
bookwyrm/forms.py | 3 +++
bookwyrm/templates/book/edit/edit_book_form.html | 12 ++++++++++++
2 files changed, 15 insertions(+)
diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py
index f152ed4ea..83269def4 100644
--- a/bookwyrm/forms.py
+++ b/bookwyrm/forms.py
@@ -296,6 +296,9 @@ class EditionForm(CustomForm):
"languages": forms.TextInput(
attrs={"aria-describedby": "desc_languages_help desc_languages"}
),
+ "subjects": forms.TextInput(
+ attrs={"aria-describedby": "desc_subjects_help desc_subjects"}
+ ),
"publishers": forms.TextInput(
attrs={"aria-describedby": "desc_publishers_help desc_publishers"}
),
diff --git a/bookwyrm/templates/book/edit/edit_book_form.html b/bookwyrm/templates/book/edit/edit_book_form.html
index fd2516a66..d95aa725e 100644
--- a/bookwyrm/templates/book/edit/edit_book_form.html
+++ b/bookwyrm/templates/book/edit/edit_book_form.html
@@ -77,6 +77,18 @@
{% include 'snippets/form_errors.html' with errors_list=form.languages.errors id="desc_languages" %}
+
+
+
+ {{ form.subjects }}
+
+ {% trans "Separate multiple values with commas." %}
+
+
+ {% include 'snippets/form_errors.html' with errors_list=form.subjects.errors id="desc_subjects" %}
+
From 822868bf8786a0becc68fdb1613684f3598d84cb Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 12 Mar 2022 04:17:11 -0800
Subject: [PATCH 31/59] fish autocompletions
---
bw-dev | 1 +
complete_bwdev.fish | 97 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 98 insertions(+)
create mode 100644 complete_bwdev.fish
diff --git a/bw-dev b/bw-dev
index 41971bb81..1cc930264 100755
--- a/bw-dev
+++ b/bw-dev
@@ -225,6 +225,7 @@ case "$CMD" in
*)
set +x # No need to echo echo
echo "Unrecognised command. Try:"
+ echo " setup"
echo " up [container]"
echo " service_ports_web"
echo " initdb"
diff --git a/complete_bwdev.fish b/complete_bwdev.fish
new file mode 100644
index 000000000..9cd8f2600
--- /dev/null
+++ b/complete_bwdev.fish
@@ -0,0 +1,97 @@
+# bw-dev auto-completions for fish-shell.
+# copy this to ~./.config/fish/completions/ with the name `bw-dev.fish`
+# this will only work if renamed to `bw-dev.fish`.
+
+set -l commands up \
+service_ports_web \
+initdb \
+resetdb \
+makemigrations \
+migrate \
+bash \
+shell \
+dbshell \
+restart_celery \
+pytest \
+collectstatic \
+makemessages \
+compilemessages \
+update_locales \
+build \
+clean \
+black \
+prettier \
+stylelint \
+formatters \
+compilescss \
+collectstatic_watch \
+populate_streams \
+populate_lists_streams \
+populate_suggestions \
+generate_thumbnails \
+generate_preview_images \
+copy_media_to_s3 \
+set_cors_to_s3 \
+setup \
+admin_code \
+runweb
+
+function __bw_complete -a cmds cmd desc
+ complete -f -c bw-dev -n "not __fish_seen_subcommand_from $cmds" -a $cmd -d $desc
+end
+
+
+__bw_complete "$commands" "up" "bring one or all service(s) up"
+__bw_complete "$commands" "service_ports_web" "run command on the web container with its portsenabled and mapped"
+__bw_complete "$commands" "initdb" "initialize database"
+__bw_complete "$commands" "resetdb" "!! WARNING !! reset database"
+__bw_complete "$commands" "makemigrations" "create new migrations"
+__bw_complete "$commands" "migrate" "perform all migrations"
+__bw_complete "$commands" "bash" "open up bash within the web container"
+__bw_complete "$commands" "shell" "open the Python shell within the web container"
+__bw_complete "$commands" "dbshell" "open the database shell within the web container"
+__bw_complete "$commands" "restart_celery" "restart the celery container"
+__bw_complete "$commands" "pytest" "run unit tests"
+__bw_complete "$commands" "collectstatic" "copy changed static files into the installation"
+__bw_complete "$commands" "makemessages" "extract all localizable messages from the code"
+__bw_complete "$commands" "compilemessages" "compile .po localization files to .mo"
+__bw_complete "$commands" "update_locales" "run makemessages and compilemessages for the en_US and additional locales"
+__bw_complete "$commands" "build" "build the containers"
+__bw_complete "$commands" "clean" "bring the cluster down and remove all containers"
+__bw_complete "$commands" "black" "run Python code formatting tool"
+__bw_complete "$commands" "prettier" "run JavaScript code formatting tool"
+__bw_complete "$commands" "stylelint" "run SCSS linting tool"
+__bw_complete "$commands" "formatters" "run multiple formatter tools"
+__bw_complete "$commands" "compilescss" "compile the SCSS layouts to CSS"
+__bw_complete "$commands" "populate_streams" "populate the main streams"
+__bw_complete "$commands" "populate_lists_streams" "populate streams for book lists"
+__bw_complete "$commands" "populate_suggestions" "populate book suggestions"
+__bw_complete "$commands" "generate_thumbnails" "generate book thumbnails"
+__bw_complete "$commands" "generate_preview_images" "generate book preview images"
+__bw_complete "$commands" "collectstatic_watch" "watch filesystem and copy changed static files"
+__bw_complete "$commands" "copy_media_to_s3" "run the `s3 cp` command to copy media to a bucket on S3"
+__bw_complete "$commands" "sync_media_to_s3" "run the `s3 sync` command to sync media with a bucket on S3"
+__bw_complete "$commands" "set_cors_to_s3" "push a CORS configuration defined in .json to s3"
+__bw_complete "$commands" "setup" "perform first-time setup"
+__bw_complete "$commands" "admin_code" "get the admin code"
+__bw_complete "$commands" "runweb" "run a command on the web container"
+
+complete -f -c bw-dev -n "__fish_seen_subcommand_from up"\
+ -a "(docker-compose config --service)"
+
+complete -x -c bw-dev -n "__fish_seen_subcommand_from migrate"
+
+complete -x -c bw-dev -n "__fish_seen_subcommand_from pytest"\
+ -a "bookwyrm/tests/**.py"
+
+complete -x -c bw-dev -n "__fish_seen_subcommand_from populate_streams"\
+ -a "--stream=" -d "pick a single stream to populate"
+
+complete -x -c bw-dev -n "__fish_seen_subcommand_from populate_streams"\
+ -l stream -a "home local books"
+
+complete -x -c bw-dev -n "__fish_seen_subcommand_from generate_preview_images"\
+ -a "--all" -d "Generates images for ALL types: site, users and books. Can use a lot of computing power."
+
+complete -x -c bw-dev -n "__fish_seen_subcommand_from set_cors_to_s3"\
+ -a "**.json"
From 4530d4917a7513beea762b4a68b43013ac9b7815 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 12 Mar 2022 04:24:22 -0800
Subject: [PATCH 32/59] make more compact with a function
---
complete_bwdev.fish | 29 +++++++++++------------------
1 file changed, 11 insertions(+), 18 deletions(-)
diff --git a/complete_bwdev.fish b/complete_bwdev.fish
index 9cd8f2600..426ab0d49 100644
--- a/complete_bwdev.fish
+++ b/complete_bwdev.fish
@@ -40,7 +40,6 @@ function __bw_complete -a cmds cmd desc
complete -f -c bw-dev -n "not __fish_seen_subcommand_from $cmds" -a $cmd -d $desc
end
-
__bw_complete "$commands" "up" "bring one or all service(s) up"
__bw_complete "$commands" "service_ports_web" "run command on the web container with its portsenabled and mapped"
__bw_complete "$commands" "initdb" "initialize database"
@@ -76,22 +75,16 @@ __bw_complete "$commands" "setup" "perform first-time setup"
__bw_complete "$commands" "admin_code" "get the admin code"
__bw_complete "$commands" "runweb" "run a command on the web container"
-complete -f -c bw-dev -n "__fish_seen_subcommand_from up"\
- -a "(docker-compose config --service)"
-complete -x -c bw-dev -n "__fish_seen_subcommand_from migrate"
+function __bw_complete_subcommand -a cmd
+ complete -f -c bw-dev -n "__fish_seen_subcommand_from $cmd" $argv[2..-1]
+end
-complete -x -c bw-dev -n "__fish_seen_subcommand_from pytest"\
- -a "bookwyrm/tests/**.py"
-
-complete -x -c bw-dev -n "__fish_seen_subcommand_from populate_streams"\
- -a "--stream=" -d "pick a single stream to populate"
-
-complete -x -c bw-dev -n "__fish_seen_subcommand_from populate_streams"\
- -l stream -a "home local books"
-
-complete -x -c bw-dev -n "__fish_seen_subcommand_from generate_preview_images"\
- -a "--all" -d "Generates images for ALL types: site, users and books. Can use a lot of computing power."
-
-complete -x -c bw-dev -n "__fish_seen_subcommand_from set_cors_to_s3"\
- -a "**.json"
+__bw_complete_subcommand "up" -a "(docker-compose config --service)"
+__bw_complete_subcommand "migrate"
+__bw_complete_subcommand "pytest" -a "bookwyrm/tests/**.py"
+__bw_complete_subcommand "populate_streams" -a "--stream=" -d "pick a single stream to populate"
+__bw_complete_subcommand "populate_streams" -l stream -a "home local books"
+__bw_complete_subcommand "generate_preview_images" -a "--all"\
+ -d "Generates images for ALL types: site, users and books. Can use a lot of computing power."
+__bw_complete_subcommand "set_cors_to_s3" -a "**.json"
From 3358c233ea9b3c2816eded5bfd306e3ad3df2936 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 12 Mar 2022 04:38:42 -0800
Subject: [PATCH 33/59] remove no-up autocomplete
---
complete_bwdev.fish | 1 -
1 file changed, 1 deletion(-)
diff --git a/complete_bwdev.fish b/complete_bwdev.fish
index 426ab0d49..c1f28dd51 100644
--- a/complete_bwdev.fish
+++ b/complete_bwdev.fish
@@ -81,7 +81,6 @@ function __bw_complete_subcommand -a cmd
end
__bw_complete_subcommand "up" -a "(docker-compose config --service)"
-__bw_complete_subcommand "migrate"
__bw_complete_subcommand "pytest" -a "bookwyrm/tests/**.py"
__bw_complete_subcommand "populate_streams" -a "--stream=" -d "pick a single stream to populate"
__bw_complete_subcommand "populate_streams" -l stream -a "home local books"
From 306f177d5586263228928f4fcde46446c1b47823 Mon Sep 17 00:00:00 2001
From: Vivianne Langdon
Date: Sat, 12 Mar 2022 21:12:25 -0700
Subject: [PATCH 34/59] add SASS_PROCESSOR_ENABLED = True
---
bookwyrm/settings.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py
index 7d04a0466..6911d2325 100644
--- a/bookwyrm/settings.py
+++ b/bookwyrm/settings.py
@@ -188,6 +188,7 @@ STATICFILES_FINDERS = [
]
SASS_PROCESSOR_INCLUDE_FILE_PATTERN = r"^.+\.[s]{0,1}(?:a|c)ss$"
+SASS_PROCESSOR_ENABLED = True
# minify css is production but not dev
if not DEBUG:
From 0c87ee1d4b83b605a2735bf8ddc0cac418386b2b Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Sun, 13 Mar 2022 11:36:31 -0700
Subject: [PATCH 35/59] Fixes instructions on admin themes view
---
bookwyrm/management/commands/compilethemes.py | 32 -------------------
bookwyrm/templates/settings/themes.html | 2 +-
bw-dev | 2 +-
3 files changed, 2 insertions(+), 34 deletions(-)
delete mode 100644 bookwyrm/management/commands/compilethemes.py
diff --git a/bookwyrm/management/commands/compilethemes.py b/bookwyrm/management/commands/compilethemes.py
deleted file mode 100644
index e3fba632b..000000000
--- a/bookwyrm/management/commands/compilethemes.py
+++ /dev/null
@@ -1,32 +0,0 @@
-""" Compile themes """
-import os
-from django.contrib.staticfiles.utils import get_files
-from django.contrib.staticfiles.storage import StaticFilesStorage
-from django.core.files.base import ContentFile
-from django.core.management.base import BaseCommand
-
-import sass
-from sass_processor.processor import SassProcessor
-
-# pylint: disable=line-too-long
-class Command(BaseCommand):
- """Compile themes"""
-
- help = "Compile theme scss files"
-
- # pylint: disable=no-self-use,unused-argument
- def handle(self, *args, **options):
- """compile themes"""
- storage = StaticFilesStorage()
- theme_files = list(get_files(storage, location="css/themes"))
- theme_files = [t for t in theme_files if t[-5:] == ".scss"]
- for filename in theme_files:
- path = storage.path(filename)
- content = sass.compile(
- filename=path,
- include_paths=SassProcessor.include_paths,
- )
- basename, _ = os.path.splitext(path)
- destination_filename = basename + ".css"
- print(f"saving f{destination_filename}")
- storage.save(destination_filename, ContentFile(content))
diff --git a/bookwyrm/templates/settings/themes.html b/bookwyrm/templates/settings/themes.html
index d3dac804f..44d0cecec 100644
--- a/bookwyrm/templates/settings/themes.html
+++ b/bookwyrm/templates/settings/themes.html
@@ -29,7 +29,7 @@
{% trans "Copy the theme file into the bookwyrm/static/css/themes
directory on your server from the command line." %}
-
- {% trans "Run
./bw-dev compilescss
." %}
+ {% trans "Run ./bw-dev collectstatic
." %}
-
{% trans "Add the file name using the form below to make it available in the application interface." %}
diff --git a/bw-dev b/bw-dev
index 1cc930264..b4b8cc0d3 100755
--- a/bw-dev
+++ b/bw-dev
@@ -154,7 +154,7 @@ case "$CMD" in
--config dev-tools/.stylelintrc.js
;;
compilescss)
- runweb python manage.py compilethemes
+ runweb python manage.py compilescss
runweb python manage.py collectstatic --no-input
;;
collectstatic_watch)
From 2f124e00d123a0ecdf932b58ee4331125b826873 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Sun, 13 Mar 2022 11:57:46 -0700
Subject: [PATCH 36/59] Updates locales
---
locale/de_DE/LC_MESSAGES/django.po | 60 +++++++-------
locale/en_US/LC_MESSAGES/django.po | 120 +++++++++++++--------------
locale/es_ES/LC_MESSAGES/django.mo | Bin 83719 -> 83719 bytes
locale/es_ES/LC_MESSAGES/django.po | 60 +++++++-------
locale/fr_FR/LC_MESSAGES/django.po | 60 +++++++-------
locale/gl_ES/LC_MESSAGES/django.mo | Bin 89448 -> 89448 bytes
locale/gl_ES/LC_MESSAGES/django.po | 60 +++++++-------
locale/it_IT/LC_MESSAGES/django.mo | Bin 90758 -> 90758 bytes
locale/it_IT/LC_MESSAGES/django.po | 60 +++++++-------
locale/lt_LT/LC_MESSAGES/django.mo | Bin 84886 -> 84886 bytes
locale/lt_LT/LC_MESSAGES/django.po | 60 +++++++-------
locale/no_NO/LC_MESSAGES/django.mo | Bin 79871 -> 79871 bytes
locale/no_NO/LC_MESSAGES/django.po | 60 +++++++-------
locale/pt_BR/LC_MESSAGES/django.mo | Bin 90058 -> 90058 bytes
locale/pt_BR/LC_MESSAGES/django.po | 60 +++++++-------
locale/pt_PT/LC_MESSAGES/django.mo | Bin 72909 -> 72909 bytes
locale/pt_PT/LC_MESSAGES/django.po | 60 +++++++-------
locale/sv_SE/LC_MESSAGES/django.mo | Bin 87935 -> 87935 bytes
locale/sv_SE/LC_MESSAGES/django.po | 60 +++++++-------
locale/zh_Hans/LC_MESSAGES/django.po | 60 +++++++-------
locale/zh_Hant/LC_MESSAGES/django.po | 60 +++++++-------
21 files changed, 417 insertions(+), 423 deletions(-)
diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po
index e458e84b6..f7ed0969d 100644
--- a/locale/de_DE/LC_MESSAGES/django.po
+++ b/locale/de_DE/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-01 20:16\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: German\n"
"Language: de\n"
@@ -261,73 +261,73 @@ msgstr "Zitate"
msgid "Everything else"
msgstr "Alles andere"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "Start-Zeitleiste"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Startseite"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Bücher-Zeitleiste"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Bücher"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English (Englisch)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español (Spanisch)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (Galizisch)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italiano (Italienisch)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français (Französisch)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisch)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norwegisch)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (brasilianisches Portugiesisch)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugiesisch)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Svenska (Schwedisch)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (vereinfachtes Chinesisch)"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinesisch, traditionell)"
@@ -356,54 +356,54 @@ msgstr "Etwas ist schief gelaufen! Tut uns leid."
msgid "About"
msgstr "Über"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Willkommen auf %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s ist Teil von BookWyrm, ein Netzwerk unabhängiger, selbstverwalteter Gemeinschaften für Leser*innen. Obwohl du dich nahtlos mit anderen Benutzer*innen überall im BookWyrm-Netzwerk austauschen kannst, ist diese Gemeinschaft einzigartig."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s ist mit einer durchschnittlichen Bewertung von %(rating)s (von 5) das beliebtestes Buch auf %(site_name)s."
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "Das Buch %(title)s wollen mehr Benutzer*innen von %(site_name)s lesen als jedes andere Buch."
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "%(title)s hat die unterschiedlichsten Bewertungen aller Bücher auf %(site_name)s."
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "Verfolge deine Lektüre, sprich über Bücher, schreibe Besprechungen und entdecke, was Du als Nächstes lesen könntest. BookWyrm ist eine Software im menschlichen Maßstab, die immer übersichtlich, werbefrei, persönlich, und gemeinschaftsorientiert sein wird. Wenn du Feature-Anfragen, Fehlerberichte oder große Träume hast, wende dich an und verschaffe dir Gehör."
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Lerne deinen Admins kennen"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "Die Moderator*innen und Administrator*innen von %(site_name)s halten diese Seite am Laufen. Beachte den Verhaltenskodex und melde, wenn andere Benutzer*innen dagegen verstoßen oder Spam verbreiten."
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Moderator*in"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Administration"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po
index a6941e87f..76cfb32bd 100644
--- a/locale/en_US/LC_MESSAGES/django.po
+++ b/locale/en_US/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"POT-Creation-Date: 2022-03-13 18:56+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: English \n"
@@ -221,7 +221,7 @@ msgid "Followers"
msgstr ""
#: bookwyrm/models/fields.py:208
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:8
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:6
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
#: bookwyrm/templates/snippets/privacy_select.html:20
@@ -262,73 +262,73 @@ msgstr ""
msgid "Everything else"
msgstr ""
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home Timeline"
msgstr ""
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home"
msgstr ""
-#: bookwyrm/settings.py:208
+#: bookwyrm/settings.py:209
msgid "Books Timeline"
msgstr ""
-#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:209 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr ""
-#: bookwyrm/settings.py:280
+#: bookwyrm/settings.py:281
msgid "English"
msgstr ""
-#: bookwyrm/settings.py:281
+#: bookwyrm/settings.py:282
msgid "Deutsch (German)"
msgstr ""
-#: bookwyrm/settings.py:282
+#: bookwyrm/settings.py:283
msgid "Español (Spanish)"
msgstr ""
-#: bookwyrm/settings.py:283
+#: bookwyrm/settings.py:284
msgid "Galego (Galician)"
msgstr ""
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:285
msgid "Italiano (Italian)"
msgstr ""
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:286
msgid "Français (French)"
msgstr ""
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:287
msgid "Lietuvių (Lithuanian)"
msgstr ""
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:288
msgid "Norsk (Norwegian)"
msgstr ""
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:289
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr ""
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:290
msgid "Português Europeu (European Portuguese)"
msgstr ""
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:291
msgid "Svenska (Swedish)"
msgstr ""
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:292
msgid "简体中文 (Simplified Chinese)"
msgstr ""
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:293
msgid "繁體中文 (Traditional Chinese)"
msgstr ""
@@ -728,14 +728,14 @@ msgstr ""
#: bookwyrm/templates/author/edit_author.html:115
#: bookwyrm/templates/book/book.html:193
#: bookwyrm/templates/book/edit/edit_book.html:121
-#: bookwyrm/templates/book/file_links/add_link_modal.html:58
+#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
-#: bookwyrm/templates/groups/form.html:30
+#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
#: bookwyrm/templates/lists/form.html:130
#: bookwyrm/templates/preferences/edit_user.html:136
-#: bookwyrm/templates/readthrough/readthrough_modal.html:72
+#: bookwyrm/templates/readthrough/readthrough_modal.html:74
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
@@ -749,20 +749,20 @@ msgstr ""
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/book.html:194
-#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/file_links/add_link_modal.html:59
-#: bookwyrm/templates/book/file_links/verification_modal.html:21
+#: bookwyrm/templates/book/file_links/verification_modal.html:25
#: bookwyrm/templates/book/sync_modal.html:23
-#: bookwyrm/templates/groups/delete_group_modal.html:17
-#: bookwyrm/templates/lists/add_item_modal.html:42
-#: bookwyrm/templates/lists/delete_list_modal.html:18
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:23
+#: bookwyrm/templates/groups/delete_group_modal.html:15
+#: bookwyrm/templates/lists/add_item_modal.html:36
+#: bookwyrm/templates/lists/delete_list_modal.html:16
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
-#: bookwyrm/templates/snippets/report_modal.html:53
+#: bookwyrm/templates/snippets/report_modal.html:52
msgid "Cancel"
msgstr ""
@@ -771,9 +771,9 @@ msgstr ""
msgid "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr ""
-#: bookwyrm/templates/author/sync_modal.html:22
+#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:108
-#: bookwyrm/templates/book/sync_modal.html:22
+#: bookwyrm/templates/book/sync_modal.html:24
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
@@ -874,8 +874,8 @@ msgid "Add to list"
msgstr ""
#: bookwyrm/templates/book/book.html:370
-#: bookwyrm/templates/book/cover_add_modal.html:31
-#: bookwyrm/templates/lists/add_item_modal.html:37
+#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
@@ -1182,7 +1182,7 @@ msgid "Actions"
msgstr ""
#: bookwyrm/templates/book/file_links/edit_links.html:53
-#: bookwyrm/templates/book/file_links/verification_modal.html:25
+#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr ""
@@ -1216,7 +1216,7 @@ msgstr ""
msgid "This link is taking you to:
%(link_url)s
.
Is that where you'd like to go?"
msgstr ""
-#: bookwyrm/templates/book/file_links/verification_modal.html:20
+#: bookwyrm/templates/book/file_links/verification_modal.html:26
#: bookwyrm/templates/setup/config.html:139
msgid "Continue"
msgstr ""
@@ -1292,7 +1292,7 @@ msgstr ""
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:73
#: bookwyrm/templates/settings/dashboard/dashboard.html:116
-#: bookwyrm/templates/snippets/report_modal.html:52
+#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr ""
@@ -1806,7 +1806,8 @@ msgid "No users found for \"%(query)s\""
msgstr ""
#: bookwyrm/templates/groups/create_form.html:5
-msgid "Create Group"
+#: bookwyrm/templates/user/groups.html:17
+msgid "Create group"
msgstr ""
#: bookwyrm/templates/groups/created_text.html:4
@@ -1824,9 +1825,9 @@ msgstr ""
msgid "This action cannot be un-done"
msgstr ""
-#: bookwyrm/templates/groups/delete_group_modal.html:15
-#: bookwyrm/templates/lists/delete_list_modal.html:15
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:21
+#: bookwyrm/templates/groups/delete_group_modal.html:17
+#: bookwyrm/templates/lists/delete_list_modal.html:19
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:29
#: bookwyrm/templates/settings/announcements/announcement.html:23
#: bookwyrm/templates/settings/announcements/announcements.html:56
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
@@ -2298,7 +2299,7 @@ msgstr ""
msgid "Suggest \"%(title)s\" for this list"
msgstr ""
-#: bookwyrm/templates/lists/add_item_modal.html:39
+#: bookwyrm/templates/lists/add_item_modal.html:41
#: bookwyrm/templates/lists/list.html:257
msgid "Suggest"
msgstr ""
@@ -2468,7 +2469,7 @@ msgid "List position"
msgstr ""
#: bookwyrm/templates/lists/list.html:152
-#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
+#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23
msgid "Set"
msgstr ""
@@ -3923,7 +3924,7 @@ msgid "Copy the theme file into the bookwyrm/static/css/themes
dire
msgstr ""
#: bookwyrm/templates/settings/themes.html:32
-msgid "Run ./bw-dev compilescss
."
+msgid "Run ./bw-dev collectstatic
."
msgstr ""
#: bookwyrm/templates/settings/themes.html:35
@@ -4200,7 +4201,8 @@ msgid "Need help?"
msgstr ""
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-msgid "Create Shelf"
+#: bookwyrm/templates/shelf/shelf.html:72
+msgid "Create shelf"
msgstr ""
#: bookwyrm/templates/shelf/edit_shelf_form.html:5
@@ -4216,10 +4218,6 @@ msgstr ""
msgid "All books"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:72
-msgid "Create shelf"
-msgstr ""
-
#: bookwyrm/templates/shelf/shelf.html:96
#, python-format
msgid "%(formatted_count)s book"
@@ -4343,24 +4341,24 @@ msgstr ""
msgid "Content"
msgstr ""
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10
-msgid "Content warning:"
-msgstr ""
-
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
-msgid "Spoilers ahead!"
-msgstr ""
-
-#: bookwyrm/templates/snippets/create_status/content_warning_toggle.html:13
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:9
msgid "Include spoiler alert"
msgstr ""
-#: bookwyrm/templates/snippets/create_status/layout.html:47
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
+msgid "Spoilers/content warnings:"
+msgstr ""
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:27
+msgid "Spoilers ahead!"
+msgstr ""
+
+#: bookwyrm/templates/snippets/create_status/layout.html:45
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr ""
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:18
msgid "Post"
msgstr ""
@@ -4851,10 +4849,6 @@ msgstr ""
msgid "Groups: %(username)s"
msgstr ""
-#: bookwyrm/templates/user/groups.html:17
-msgid "Create group"
-msgstr ""
-
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr ""
diff --git a/locale/es_ES/LC_MESSAGES/django.mo b/locale/es_ES/LC_MESSAGES/django.mo
index cdb48a306eb2e333416e2cd803bb8ce01c4274c3..43db15d9d564c104654b5a2f27f668fb4ecbd918 100644
GIT binary patch
delta 22
dcmZqgV{Pwa-5`93-9o|0(8|zkv(%xtEdW=?2ps?b
delta 22
dcmZqgV{Pwa-5`93-AKXE(#qI!v(%xtEdW>D2qORh
diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po
index 51f969045..98d4e124f 100644
--- a/locale/es_ES/LC_MESSAGES/django.po
+++ b/locale/es_ES/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-02 19:39\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Spanish\n"
"Language: es\n"
@@ -261,73 +261,73 @@ msgstr "Citas"
msgid "Everything else"
msgstr "Todo lo demás"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "Línea de tiempo principal"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Inicio"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Línea temporal de libros"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Libros"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English (Inglés)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch (Alemán)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (Gallego)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italiano"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français (Francés)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norsk (Noruego)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugués brasileño)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Svenska (Sueco)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chino simplificado)"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chino tradicional)"
@@ -356,54 +356,54 @@ msgstr "¡Algo salió mal! Disculpa."
msgid "About"
msgstr "Acerca de"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "¡Bienvenido a %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s es parte de BookWyrm, una red de comunidades independientes y autogestionadas para lectores. Aunque puedes interactuar sin problemas con los usuarios de cualquier parte de la red BookWyrm, esta comunidad es única."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s es el libro más querido de %(site_name)s, con una valoración promedio de %(rating)s sobre 5."
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "Los usuarios de %(site_name)s quieren leer %(title)s más que cualquier otro libro."
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "Las valoraciones de %(title)s están más divididas que las de cualquier otro libro en %(site_name)s."
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "Haz un registro de tu lectura, habla sobre libros, escribe reseñas y descubre qué leer a continuación. BookWyrm es un software de escala humana, siempre sin anuncios, anticorporativo y orientado a la comunidad, diseñado para ser pequeño y personal. Si tienes solicitudes de características, informes de errores o grandes sueños, contacta y hazte oír."
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Conoce a tus administradores"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "Los moderadores y administradores de %(site_name)s mantienen el sitio en funcionamiento, hacen cumplir el código de conducta y responden cuando los usuarios informan de spam y mal comportamiento."
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Moderador"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Administrador"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po
index 31ebd43cd..6c5d17c4d 100644
--- a/locale/fr_FR/LC_MESSAGES/django.po
+++ b/locale/fr_FR/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-02 12:24\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: French\n"
"Language: fr\n"
@@ -261,73 +261,73 @@ msgstr "Citations"
msgid "Everything else"
msgstr "Tout le reste"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "Mon fil d’actualité"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Accueil"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Actualité de mes livres"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Livres"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (Galicien)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italiano (italien)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituanien)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norsk (norvégien)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugais brésilien)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugais européen)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Svenska (Suédois)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简化字"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "Infos supplémentaires :"
@@ -356,54 +356,54 @@ msgstr "Une erreur s’est produite ; désolé !"
msgid "About"
msgstr "À propos"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Bienvenue sur %(site_name)s !"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s fait partie de BookWyrm, un réseau de communautés indépendantes et autogérées, à destination des lecteurs. Bien que vous puissiez interagir apparemment avec les comptes n'importe où dans le réseau BookWyrm, cette communauté est unique."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s est le livre le plus aimé de %(site_name)s, avec une note moyenne de %(rating)s sur 5."
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "Sur %(site_name)s, c’est %(title)s que tout le monde veut lire plus que n’importe quel autre livre."
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "%(title)s divise les critiques plus que n’importe quel autre livre sur %(site_name)s."
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "Gardez trace de vos lectures, parlez de livres, écrivez des commentaires et découvrez quoi lire ensuite. BookWyrm est un logiciel à échelle humaine, sans publicité, anti-capitaliste et axé sur la communauté, conçu pour rester petit et personnel. Si vous avez des demandes de fonctionnalités, des rapports de bogue ou des rêves grandioses, rejoignez-nous et faites-vous entendre."
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Rencontrez vos admins"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "L’administration et la modération de %(site_name)s maintiennent le site opérationnel, font respecter le code de conduite, et répondent lorsque les utilisateurs signalent le spam et les mauvais comportements."
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Modérateur/modératrice"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Admin"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/gl_ES/LC_MESSAGES/django.mo b/locale/gl_ES/LC_MESSAGES/django.mo
index dbe430ba55e58d9a4febfef0b56a7a2c87061b09..691d4246e087603ac0f44e63c0f842b22202e1a0 100644
GIT binary patch
delta 22
ecmaE{i}l4W)(zR0*)0@|46O{!HWyv~)(HT0#0nPx
delta 22
ecmaE{i}l4W)(zR0*^Lwo%&m+~HWyv~)(HT0pb8ZL
diff --git a/locale/gl_ES/LC_MESSAGES/django.po b/locale/gl_ES/LC_MESSAGES/django.po
index b76edace6..1f45a6890 100644
--- a/locale/gl_ES/LC_MESSAGES/django.po
+++ b/locale/gl_ES/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-02 07:34\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Galician\n"
"Language: gl\n"
@@ -261,73 +261,73 @@ msgstr "Citas"
msgid "Everything else"
msgstr "As outras cousas"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "Cronoloxía de Inicio"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Inicio"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Cronoloxía de libros"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Libros"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English (Inglés)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Alemán (Alemaña)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español (España)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (Galician)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italiano (Italian)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Francés (Francia)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lithuanian)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Noruegués (Norwegian)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugués brasileiro)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Sueco (Swedish)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chinés simplificado)"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinés tradicional)"
@@ -356,54 +356,54 @@ msgstr "Algo fallou! Lamentámolo."
msgid "About"
msgstr "Acerca de"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Sexas ben vida a %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s é parte de BookWyrm, unha rede independente, auto-xestionada por comunidades de persoas lectoras. Aínda que podes interactuar con outras usuarias da rede BookWyrm, esta comunidade é única."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s é o libro máis querido de %(site_name)s, cunha valoración media de %(rating)s sobre 5."
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "%(title)s é o libro que máis queren ler as usuarias de %(site_name)s."
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "%(title)s é o libro con valoracións máis diverxentes en %(site_name)s."
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "Rexistra as túas lecturas, conversa acerca dos libros, escribe recensións e descubre próximas lecturas. Sempre sen publicidade, anti-corporacións e orientado á comunidade, BookWyrm é software a escala humana, deseñado para ser pequeno e persoal. Se queres propoñer novas ferramentas, informar de fallos, ou colaborar, contacta con nós e deixa oír a túa voz."
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Contacta coa administración"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "A moderación e administración de %(site_name)s coidan e xestionan o sitio web, fan cumprir co código de conduta e responden ás denuncias das usuarias sobre spam e mal comportamento."
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Moderación"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Admin"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/it_IT/LC_MESSAGES/django.mo b/locale/it_IT/LC_MESSAGES/django.mo
index cddc0a5404396ed218fbdc22f037e2c5d7c0a1d9..2be0c3ac01a7057cabd8b69e3f99520ca5e585ef 100644
GIT binary patch
delta 22
ecmZoW%G!36bwl%Ib_)d~Ln}kG&0UxO^Z@{Am5o
diff --git a/locale/it_IT/LC_MESSAGES/django.po b/locale/it_IT/LC_MESSAGES/django.po
index 143539d9e..245387351 100644
--- a/locale/it_IT/LC_MESSAGES/django.po
+++ b/locale/it_IT/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-01 21:14\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Italian\n"
"Language: it\n"
@@ -261,73 +261,73 @@ msgstr "Citazioni"
msgid "Everything else"
msgstr "Tutto il resto"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "La tua timeline"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Home"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Timeline dei libri"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Libri"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English (Inglese)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch (Tedesco)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español (Spagnolo)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (Galiziano)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français (Francese)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norvegese)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portoghese Brasiliano)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portoghese europeo)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Svenska (Svedese)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Cinese Semplificato)"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Cinese Tradizionale)"
@@ -356,54 +356,54 @@ msgstr "Qualcosa è andato storto! Ci dispiace."
msgid "About"
msgstr "Informazioni su"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Benvenuto su %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s fa parte di BookWyrm, una rete di comunità indipendenti e autogestite per i lettori. Mentre puoi interagire apparentemente con gli utenti ovunque nella rete di BookWyrm, questa comunità è unica."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s è il libro più amato di %(site_name)s, con un punteggio medio di %(rating)s su 5."
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "Più %(site_name)s utenti vogliono leggere %(title)s rispetto a qualsiasi altro libro."
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "%(title)s ha le valutazioni più divisive di ogni libro su %(site_name)s."
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "Traccia la tue letture, parla di libri, scrivi recensioni, e scopri cosa leggere dopo. BookWyrm, sempre libero, anti-corporate, orientato alla comunità, è un software a misura d'uomo, progettato per rimanere piccolo e personale. Se hai richieste di funzionalità, segnalazioni di bug o grandi sogni, contatta e fai sentire la tua voce."
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Incontra gli amministratori"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "I moderatori e gli amministratori di %(site_name)s mantengono il sito attivo e funzionante, applicano il codice di condotta, e rispondono quando gli utenti segnalano spam o comportamenti non adeguati."
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Moderatori"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Admin"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/lt_LT/LC_MESSAGES/django.mo b/locale/lt_LT/LC_MESSAGES/django.mo
index d05ea5af184fd779c03aaa8e5ecc5f100443d7eb..b4885e93b693c8909b1476f861f3aaecba0a2b0a 100644
GIT binary patch
delta 19
bcmbO>opsuD)(sj5Su7Nc3^(f>%<2LFNj3*j
delta 19
bcmbO>opsuD)(sj5Sqv473^wZ=%<2LFNbv_r
diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po
index ca506d583..b272ecf09 100644
--- a/locale/lt_LT/LC_MESSAGES/django.po
+++ b/locale/lt_LT/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-01 20:15\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:15\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Lithuanian\n"
"Language: lt\n"
@@ -261,73 +261,73 @@ msgstr "Citatos"
msgid "Everything else"
msgstr "Visa kita"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "Pagrindinė siena"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Pagrindinis"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Knygų siena"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Knygos"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English (Anglų)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch (Vokiečių)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español (Ispanų)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (galisų)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italų (Italian)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français (Prancūzų)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norvegų (Norwegian)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português brasileiro (Brazilijos portugalų)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Europos portugalų)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Svenska (Švedų)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Supaprastinta kinų)"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Tradicinė kinų)"
@@ -356,54 +356,54 @@ msgstr "Kažkas nepavyko. Atsiprašome."
msgid "About"
msgstr "Apie"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Sveiki atvykę į %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s yra BookWyrmdalis, tinklo nepriklausomų skaitytojų bendruomenių. Jūs galite bendrauti su nariais iš šio BookWyrm tinklo, tačiau ši bendruomenė yra unikali."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s yra %(site_name)s's mėgstamiausia knyga, kurios vidutinis įvertinimas yra %(rating)s iš 5."
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "Daugiau %(site_name)s narių nori perskaityti %(title)s negu bet kurią kitą knygą."
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "%(title)s labiausiai kontroversiškai reitinguota %(site_name)s."
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "Sekite savo skaitymus, kalbėkite apie knygas, rašykite atsiliepimus ir atraskite, ką dar perskaityti. „BookWyrm“ – tai programinė įranga, kurioje nėra reklamų, biurokratijos. Tai bendruomenei orientuota, nedidelė ir asmeninė įranga, kurią lengva plėsti. Jei norite papildomų funkcijų, įgyvendinti savo svajones ar tiesiog pranešti apie klaidą, susisiekite ir jus išgirsime."
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Šio serverio administratoriai"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "Svetainės %(site_name)s moderatoriai ir administratoriai nuolat atnaujina puslapį, laikosi elgsenos susitarimo ir atsako, kai naudotojai praneša apie brukalą ir blogą elgesį."
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Moderatorius"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Administravimas"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/no_NO/LC_MESSAGES/django.mo b/locale/no_NO/LC_MESSAGES/django.mo
index 97e81d11d44590e10e50b3cefb248244ad231eb4..dbfe5ea07ba28095af217223c694380ae67f9888 100644
GIT binary patch
delta 22
ecmezWp5_00mJJ#Q*)0@|46O{!HtQd}PzC^c*9po1
delta 22
ecmezWp5_00mJJ#Q*$owp46F=IH|rm~PzC^cbP2%#
diff --git a/locale/no_NO/LC_MESSAGES/django.po b/locale/no_NO/LC_MESSAGES/django.po
index 473c4a71e..a7626b284 100644
--- a/locale/no_NO/LC_MESSAGES/django.po
+++ b/locale/no_NO/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-01 20:15\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Norwegian\n"
"Language: no\n"
@@ -261,73 +261,73 @@ msgstr "Sitater"
msgid "Everything else"
msgstr "Andre ting"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "Lokal tidslinje"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Hjem"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Boktidslinja"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Bøker"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English (Engelsk)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch (Tysk)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español (Spansk)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (Gallisk)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italiano (Italiensk)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français (Fransk)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisk)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norsk)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português - Brasil (Brasiliansk portugisisk)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Europeisk Portugisisk)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Svenska (Svensk)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Forenklet kinesisk)"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Tradisjonelt kinesisk)"
@@ -356,54 +356,54 @@ msgstr "Beklager, noe gikk galt! Leit, det der."
msgid "About"
msgstr "Om"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Velkommen til %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s er en del av BookWyrm, et nettverk av selvstendige, selvstyrte samfunn for lesere. Du kan kommunisere sømløst med brukere hvor som helst i BookWyrm nettverket, men hvert samfunn er unikt."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s er %(site_name)s sin favorittbok, med en gjennomsnittlig vurdering på %(rating)s av 5."
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "Flere av %(site_name)s sine medlemmer ønsker å lese %(title)s enn noen annen bok."
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "%(title)s er den boka på %(site_name)s med de mest polariserte vurderingene."
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "Journalfør lesingen din, snakk om bøker, skriv anmeldelser, og oppdag din neste bok. BookWyrm er reklamefri, ukommers og fellesskapsorientert, programvare for mennesker, designet for å forbli liten og nær. Hvis du har ønsker, feilrapporter eller store vyer, ta kontakt og bli hørt."
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Møt administratorene"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "%(site_name)s sine moderatorer og administratorer holder nettsida oppe og tilgjengelig, håndhever adferdskoden, og svarer på brukernes rapporterer om spam og dårlig atferd."
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Moderator"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Admin"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo
index ef4929f88c44dedad938ff601db128dccc37a28d..064c6caebac3129eca39164512621959f106f161 100644
GIT binary patch
delta 22
ecmX@LpY_y!)(y><*)0@|46O{!Hg{ci=m7w77zttk
delta 22
ecmX@LpY_y!)(y><*$owpjIE3eH+Nlj=m7w6zX@3Y
diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po
index c2432bbba..60b192c6a 100644
--- a/locale/pt_BR/LC_MESSAGES/django.po
+++ b/locale/pt_BR/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-01 23:21\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt\n"
@@ -261,73 +261,73 @@ msgstr "Citações"
msgid "Everything else"
msgstr "Todo o resto"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "Linha do tempo"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Página inicial"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Linha do tempo dos livros"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Livros"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English (Inglês)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch (Alemão)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español (Espanhol)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (Galego)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français (Francês)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norueguês)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Português do Brasil)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Português Europeu)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Svenska (Sueco)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chinês simplificado)"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinês tradicional)"
@@ -356,54 +356,54 @@ msgstr "Algo deu errado! Foi mal."
msgid "About"
msgstr "Sobre"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Bem-vindol(a) a %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s é parte da BookWyrm, uma rede independente e autogestionada para leitores. Apesar de você poder interagir diretamente com usuários de toda a rede BookWyrm, esta comunidade é única."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s é o livro favorito da instância %(site_name)s, com uma avaliação média de %(rating)s em 5."
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "O livro mais desejado de toda a instância %(site_name)s é %(title)s."
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "%(title)s tem a avaliação mais polêmica de toda a instância %(site_name)s."
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "Registre o andamento de suas leituras, fale sobre livros, escreva resenhas e ache o que ler em seguida. Sempre sem propagandas, anticorporativa e voltada à comunidade, a BookWyrm é um software em escala humana desenvolvido para permanecer pequeno e pessoal. Se você tem sugestões de funções, avisos sobre bugs ou grandes sonhos para o projeto, fale conosco e faça sua voz ser ouvida."
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Conheça a administração"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "Moderadores/as e administradores/as de %(site_name)s mantêm o site funcionando, aplicam o código de conduta e respondem quando usuários denunciam spam e mau comportamento."
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Moderador/a"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Admin"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/pt_PT/LC_MESSAGES/django.mo b/locale/pt_PT/LC_MESSAGES/django.mo
index 9c144cf8a16437303931924bed48443e9f8fb759..85e167660be76978d3eae5b1408af98292516f36 100644
GIT binary patch
delta 22
ecmX@RljZDAmJRM}*ew){46O{!Hv6rqF8}~)+X%M+
delta 22
ecmX@RljZDAmJRM}*bNno46F=IH~X!rF8}~)cnGcl
diff --git a/locale/pt_PT/LC_MESSAGES/django.po b/locale/pt_PT/LC_MESSAGES/django.po
index ff508e117..32acf05c3 100644
--- a/locale/pt_PT/LC_MESSAGES/django.po
+++ b/locale/pt_PT/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-01 20:15\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Portuguese\n"
"Language: pt\n"
@@ -261,73 +261,73 @@ msgstr "Citações"
msgid "Everything else"
msgstr "Tudo o resto"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "Cronograma Inicial"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Início"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Cronograma de Livros"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Livros"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "Inglês"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch (Alemão)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español (Espanhol)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (Galician)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français (Francês)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (lituano)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norueguês)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Português brasileiro)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português (Português Europeu)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr ""
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chinês simplificado)"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinês tradicional)"
@@ -356,54 +356,54 @@ msgstr "Ocorreu um erro! Pedimos desculpa por isto."
msgid "About"
msgstr "Sobre"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Bem-vindo(a) ao %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s faz parte do BookWyrm, uma rede de comunidades independentes, focada nos leitores. Enquanto podes interagir continuamente com utilizadores por todo o lado na Rede Boomwyrm, esta comunidade é única."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr ""
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr ""
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr ""
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr ""
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Conheça os nossos administradores"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr ""
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Moderador"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Admin"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/sv_SE/LC_MESSAGES/django.mo b/locale/sv_SE/LC_MESSAGES/django.mo
index 4f1348791d606f2cc21d5ef40c9a0d0916f359d7..eb44d9bf9529fbb561ab36fe4271c235c2e19ff6 100644
GIT binary patch
delta 21
dcmeyrj`jaK)(za}*en!`46O_|3!cmC1OR8N2%`W1
delta 21
dcmeyrj`jaK)(za}*h~}*Osq^c3!cmC1OR832%`W1
diff --git a/locale/sv_SE/LC_MESSAGES/django.po b/locale/sv_SE/LC_MESSAGES/django.po
index f98510e33..303495c60 100644
--- a/locale/sv_SE/LC_MESSAGES/django.po
+++ b/locale/sv_SE/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-04 04:45\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:15\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Swedish\n"
"Language: sv\n"
@@ -261,73 +261,73 @@ msgstr "Citationer"
msgid "Everything else"
msgstr "Allt annat"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "Tidslinje för Hem"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "Hem"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "Tidslinjer för böcker"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Böcker"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "Engelska"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Tyska (Tysk)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Spanska (Spansk)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego (Gallisk)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italienska (Italiensk)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Franska (Fransk)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Litauiska (Litauisk)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norska (Norska)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português d Brasil (Brasiliansk Portugisiska)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Europeisk Portugisiska)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Svenska (Svenska)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Förenklad Kinesiska)"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Traditionell Kinesiska)"
@@ -356,54 +356,54 @@ msgstr "Något gick fel! Förlåt för det."
msgid "About"
msgstr "Om"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Välkommen till %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s är en del av BookWyrm, ett nätverk av oberoende, självstyrda gemenskaper för läsare. Medan du kan interagera sömlöst med användare var som helst i BookWyrm-nätverketså är den här gemenskapen unik."
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s är %(site_name)s's mest omtyckta bok med ett genomsnittligt betyg på %(rating)s utav 5."
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "Flera %(site_name)s användare vill läsa %(title)s än någon annan bok."
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "%(title)s har de mest splittrade betygen av alla böcker på %(site_name)s."
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "Följ din läsning, prata om böcker, skriv recensioner och upptäck vad som ska läsas härnäst. BookWyrm är alltid annonsfri, företagsfientlig och gemenskapsorienterad, och är en mänsklig programvara som är utformad för att förbli liten och personlig. Om du har förfrågningar om funktioner, felrapporter eller storslagna drömmar, ta kontakt och gör dig själv hörd."
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "Träffa dina administratörer"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "%(site_name)s's moderatorer och administratörer håller hemsidan uppe och fungerande, upprätthåller uppförandekoden och svarar när användarna rapporterar skräppost och dåligt uppförande."
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "Moderator"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "Administratör"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po
index ec1edda73..4acf1dce3 100644
--- a/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/locale/zh_Hans/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-04 15:46\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Chinese Simplified\n"
"Language: zh\n"
@@ -261,73 +261,73 @@ msgstr "引用"
msgid "Everything else"
msgstr "所有其它内容"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "主页时间线"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "主页"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr "书目时间线"
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "书目"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English(英语)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch(德语)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español(西班牙语)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr "Galego(加利西亚语)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr "Italiano(意大利语)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français(法语)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių(立陶宛语)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr "Norsk(挪威语)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil(巴西葡萄牙语)"
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu(欧洲葡萄牙语)"
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr "Svenska(瑞典语)"
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文(繁体中文)"
@@ -356,54 +356,54 @@ msgstr "某些东西出错了!对不起啦。"
msgid "About"
msgstr "关于"
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "欢迎来到 %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr "%(site_name)s 是 BookWyrm 的一部分,这是一个为读者建立的独立、自我导向的社区网络。 虽然您可以在 BookWyrm 网络中与任何地方的用户无缝互动,但这个社区是独一无二的。"
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr "%(title)s 是 %(site_name)s 最受欢迎的书,平均得分为 %(rating)s(满分五分)。"
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr "%(site_name)s 上的最用户想读的书籍是 %(title)s。"
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr "在 %(site_name)s 上,对 %(title)s 这本书的评分争议较大。"
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr "记录您的阅读、谈论书籍、撰写评论、发现下一本书。 BookWyrm 永远是无广告、反公司化和面向社区的为人设计的软件,其目的是保持小规模和个人性。 如果您有特性请求、错误报告或大梦想, 联系我们,为自己发声。"
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr "遇见您的管理员"
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr "%(site_name)s 的仲裁员和管理员负责维持站点运行, 执行行为守则,并在用户报告垃圾邮件和不良行为时做出回应。"
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr "仲裁员"
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "管理员"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po
index 4222d2635..a410c4fed 100644
--- a/locale/zh_Hant/LC_MESSAGES/django.po
+++ b/locale/zh_Hant/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-01 19:48+0000\n"
-"PO-Revision-Date: 2022-03-01 20:15\n"
+"POT-Creation-Date: 2022-03-08 19:55+0000\n"
+"PO-Revision-Date: 2022-03-08 21:16\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Chinese Traditional\n"
"Language: zh\n"
@@ -261,73 +261,73 @@ msgstr ""
msgid "Everything else"
msgstr ""
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home Timeline"
msgstr "主頁時間線"
-#: bookwyrm/settings.py:211
+#: bookwyrm/settings.py:207
msgid "Home"
msgstr "主頁"
-#: bookwyrm/settings.py:212
+#: bookwyrm/settings.py:208
msgid "Books Timeline"
msgstr ""
-#: bookwyrm/settings.py:212 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "書目"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:280
msgid "English"
msgstr "English(英語)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:281
msgid "Deutsch (German)"
msgstr "Deutsch(德語)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:282
msgid "Español (Spanish)"
msgstr "Español(西班牙語)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:283
msgid "Galego (Galician)"
msgstr ""
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:284
msgid "Italiano (Italian)"
msgstr ""
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:285
msgid "Français (French)"
msgstr "Français(法語)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:286
msgid "Lietuvių (Lithuanian)"
msgstr ""
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:287
msgid "Norsk (Norwegian)"
msgstr ""
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:288
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr ""
-#: bookwyrm/settings.py:293
+#: bookwyrm/settings.py:289
msgid "Português Europeu (European Portuguese)"
msgstr ""
-#: bookwyrm/settings.py:294
+#: bookwyrm/settings.py:290
msgid "Svenska (Swedish)"
msgstr ""
-#: bookwyrm/settings.py:295
+#: bookwyrm/settings.py:291
msgid "简体中文 (Simplified Chinese)"
msgstr "簡體中文"
-#: bookwyrm/settings.py:296
+#: bookwyrm/settings.py:292
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文"
@@ -356,54 +356,54 @@ msgstr "某些東西出錯了!抱歉。"
msgid "About"
msgstr ""
-#: bookwyrm/templates/about/about.html:19
+#: bookwyrm/templates/about/about.html:20
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "歡迎來到 %(site_name)s!"
-#: bookwyrm/templates/about/about.html:23
+#: bookwyrm/templates/about/about.html:24
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
msgstr ""
-#: bookwyrm/templates/about/about.html:40
+#: bookwyrm/templates/about/about.html:42
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr ""
-#: bookwyrm/templates/about/about.html:59
+#: bookwyrm/templates/about/about.html:61
#, python-format
msgid "More %(site_name)s users want to read %(title)s than any other book."
msgstr ""
-#: bookwyrm/templates/about/about.html:78
+#: bookwyrm/templates/about/about.html:80
#, python-format
msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
msgstr ""
-#: bookwyrm/templates/about/about.html:89
+#: bookwyrm/templates/about/about.html:91
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
msgstr ""
-#: bookwyrm/templates/about/about.html:96
+#: bookwyrm/templates/about/about.html:98
msgid "Meet your admins"
msgstr ""
-#: bookwyrm/templates/about/about.html:99
+#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
msgstr ""
-#: bookwyrm/templates/about/about.html:113
+#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
msgstr ""
-#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
msgid "Admin"
msgstr "管理員"
-#: bookwyrm/templates/about/about.html:131
+#: bookwyrm/templates/about/about.html:133
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
From 739b394ccc63522f4aca72953bbc01826eaa3ee3 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Sun, 13 Mar 2022 12:31:21 -0700
Subject: [PATCH 37/59] Catch error when trying to update book
---
bookwyrm/views/books/books.py | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py
index ad7ee9436..3556a0dc1 100644
--- a/bookwyrm/views/books/books.py
+++ b/bookwyrm/views/books/books.py
@@ -12,7 +12,7 @@ from django.views.decorators.http import require_POST
from bookwyrm import forms, models
from bookwyrm.activitypub import ActivitypubResponse
-from bookwyrm.connectors import connector_manager
+from bookwyrm.connectors import connector_manager, ConnectorException
from bookwyrm.connectors.abstract_connector import get_image
from bookwyrm.settings import PAGE_LENGTH
from bookwyrm.views.helpers import is_api_request
@@ -191,6 +191,10 @@ def update_book_from_remote(request, book_id, connector_identifier):
)
book = get_object_or_404(models.Book.objects.select_subclasses(), id=book_id)
- connector.update_book_from_remote(book)
+ try:
+ connector.update_book_from_remote(book)
+ except ConnectorException:
+ # the remote source isn't available or doesn't know this book
+ pass
return redirect("book", book.id)
From c7efa2340505ae22f5f0d225eedb3716e2545eb9 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Sun, 13 Mar 2022 12:38:29 -0700
Subject: [PATCH 38/59] Display error message for remote failure
---
bookwyrm/templates/book/book.html | 9 +++++++++
bookwyrm/views/books/books.py | 5 +++--
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html
index 0e2fd5d39..fa098281e 100644
--- a/bookwyrm/templates/book/book.html
+++ b/bookwyrm/templates/book/book.html
@@ -12,6 +12,15 @@
{% endblock %}
{% block content %}
+{% if update_error %}
+
+
+
+ {% trans "Unable to connect to remote source." %}
+
+
+{% endif %}
+
{% with user_authenticated=request.user.is_authenticated can_edit_book=perms.bookwyrm.edit_book %}
diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py
index 3556a0dc1..a010c300f 100644
--- a/bookwyrm/views/books/books.py
+++ b/bookwyrm/views/books/books.py
@@ -22,7 +22,7 @@ from bookwyrm.views.helpers import is_api_request
class Book(View):
"""a book! this is the stuff"""
- def get(self, request, book_id, user_statuses=False):
+ def get(self, request, book_id, user_statuses=False, update_error=False):
"""info about a book"""
if is_api_request(request):
book = get_object_or_404(
@@ -80,6 +80,7 @@ class Book(View):
else None,
"rating": reviews.aggregate(Avg("rating"))["rating__avg"],
"lists": lists,
+ "update_error": update_error,
}
if request.user.is_authenticated:
@@ -195,6 +196,6 @@ def update_book_from_remote(request, book_id, connector_identifier):
connector.update_book_from_remote(book)
except ConnectorException:
# the remote source isn't available or doesn't know this book
- pass
+ return Book().get(request, book_id, update_error=True)
return redirect("book", book.id)
From 3885ae789b7c75da35f83e1a68242b015d135b12 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Sun, 13 Mar 2022 13:11:24 -0700
Subject: [PATCH 39/59] Manually add theme path rather than options
---
bookwyrm/forms.py | 7 ++++++-
bookwyrm/templates/settings/themes.html | 22 ++--------------------
bookwyrm/views/admin/themes.py | 5 -----
3 files changed, 8 insertions(+), 26 deletions(-)
diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py
index f152ed4ea..7cfbe6283 100644
--- a/bookwyrm/forms.py
+++ b/bookwyrm/forms.py
@@ -468,7 +468,12 @@ class ThemeForm(CustomForm):
fields = ["name", "path"]
widgets = {
"name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
- "path": forms.Select(attrs={"aria-describedby": "desc_path"}),
+ "path": forms.TextInput(
+ attrs={
+ "aria-describedby": "desc_path",
+ "placeholder": "css/themes/theme-name.scss",
+ }
+ ),
}
diff --git a/bookwyrm/templates/settings/themes.html b/bookwyrm/templates/settings/themes.html
index 44d0cecec..3d4d83dec 100644
--- a/bookwyrm/templates/settings/themes.html
+++ b/bookwyrm/templates/settings/themes.html
@@ -56,12 +56,7 @@
class="box"
enctype="multipart/form-data"
>
- {% if not choices %}
-
- {% trans "No available theme files detected" %}
-
- {% endif %}
-
-{% include 'settings/users/user_admin_filters.html' %}
+{% include 'settings/reports/report_filters.html' %}
{% if not reports %}
diff --git a/bookwyrm/templates/settings/users/email_filter.html b/bookwyrm/templates/settings/users/email_filter.html
new file mode 100644
index 000000000..5d49d615e
--- /dev/null
+++ b/bookwyrm/templates/settings/users/email_filter.html
@@ -0,0 +1,16 @@
+{% extends 'snippets/filters_panel/filter_field.html' %}
+{% load i18n %}
+
+{% block filter %}
+
+
+
+
+{% endblock %}
+
diff --git a/bookwyrm/templates/settings/users/user_admin_filters.html b/bookwyrm/templates/settings/users/user_admin_filters.html
index 48a3b7c8a..c5ab2dabe 100644
--- a/bookwyrm/templates/settings/users/user_admin_filters.html
+++ b/bookwyrm/templates/settings/users/user_admin_filters.html
@@ -2,6 +2,11 @@
{% block filter_fields %}
{% include 'settings/users/username_filter.html' %}
-{% include 'directory/community_filter.html' %}
+
+{% if status != "local" %}
{% include 'settings/users/server_filter.html' %}
+{% else %}
+{% include 'settings/users/email_filter.html' %}
+{% endif %}
+
{% endblock %}
From bfb8fc800a0d10277cfdb5dfe017a8f022b2d109 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Mon, 14 Mar 2022 10:59:24 -0700
Subject: [PATCH 46/59] Moves duplicate field script into its own file
---
bookwyrm/static/js/bookwyrm.js | 24 --------------
bookwyrm/static/js/forms.js | 32 +++++++++++++++++++
.../templates/book/edit/edit_book_form.html | 5 +++
3 files changed, 37 insertions(+), 24 deletions(-)
create mode 100644 bookwyrm/static/js/forms.js
diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js
index 100daa039..95271795d 100644
--- a/bookwyrm/static/js/bookwyrm.js
+++ b/bookwyrm/static/js/bookwyrm.js
@@ -38,10 +38,6 @@ let BookWyrm = new (class {
.querySelectorAll("[data-modal-open]")
.forEach((node) => node.addEventListener("click", this.handleModalButton.bind(this)));
- document
- .querySelectorAll("[data-duplicate]")
- .forEach((node) => node.addEventListener("click", this.duplicateInput.bind(this)));
-
document
.querySelectorAll("details.dropdown")
.forEach((node) =>
@@ -495,26 +491,6 @@ let BookWyrm = new (class {
window.open(url, windowName, "left=100,top=100,width=430,height=600");
}
- duplicateInput(event) {
- const trigger = event.currentTarget;
- const input_id = trigger.dataset.duplicate;
- const orig = document.getElementById(input_id);
- const parent = orig.parentNode;
- const new_count = parent.querySelectorAll("input").length + 1;
-
- let input = orig.cloneNode();
-
- input.id += "-" + new_count;
- input.value = "";
-
- let label = parent.querySelector("label").cloneNode();
-
- label.setAttribute("for", input.id);
-
- parent.appendChild(label);
- parent.appendChild(input);
- }
-
/**
* Set up a "click-to-copy" component from a textarea element
* with `data-copytext`, `data-copytext-label`, `data-copytext-success`
diff --git a/bookwyrm/static/js/forms.js b/bookwyrm/static/js/forms.js
new file mode 100644
index 000000000..7d946d147
--- /dev/null
+++ b/bookwyrm/static/js/forms.js
@@ -0,0 +1,32 @@
+(function () {
+ "use strict";
+
+ /**
+ * Duplicate an input field
+ *
+ * @param {event} the click even on the associated button
+ */
+ function duplicateInput(event) {
+ const trigger = event.currentTarget;
+ const input_id = trigger.dataset.duplicate;
+ const orig = document.getElementById(input_id);
+ const parent = orig.parentNode;
+ const new_count = parent.querySelectorAll("input").length + 1;
+
+ let input = orig.cloneNode();
+
+ input.id += "-" + new_count;
+ input.value = "";
+
+ let label = parent.querySelector("label").cloneNode();
+
+ label.setAttribute("for", input.id);
+
+ parent.appendChild(label);
+ parent.appendChild(input);
+ }
+
+ document
+ .querySelectorAll("[data-duplicate]")
+ .forEach((node) => node.addEventListener("click", duplicateInput));
+})();
diff --git a/bookwyrm/templates/book/edit/edit_book_form.html b/bookwyrm/templates/book/edit/edit_book_form.html
index d95aa725e..38a7fe35d 100644
--- a/bookwyrm/templates/book/edit/edit_book_form.html
+++ b/bookwyrm/templates/book/edit/edit_book_form.html
@@ -1,4 +1,5 @@
{% load i18n %}
+{% load static %}
{% if form.non_field_errors %}
@@ -302,3 +303,7 @@
+
+{% block scripts %}
+
+{% endblock %}
From 7169f7ba2030eef10023f3518b0a5e45a52b7219 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Mon, 14 Mar 2022 11:43:58 -0700
Subject: [PATCH 47/59] Creates forms directory
---
bookwyrm/forms/__init__.py | 3 +++
bookwyrm/{ => forms}/forms.py | 0
2 files changed, 3 insertions(+)
create mode 100644 bookwyrm/forms/__init__.py
rename bookwyrm/{ => forms}/forms.py (100%)
diff --git a/bookwyrm/forms/__init__.py b/bookwyrm/forms/__init__.py
new file mode 100644
index 000000000..dac2007b8
--- /dev/null
+++ b/bookwyrm/forms/__init__.py
@@ -0,0 +1,3 @@
+""" make forms available to the app """
+# site admin
+from .forms import *
diff --git a/bookwyrm/forms.py b/bookwyrm/forms/forms.py
similarity index 100%
rename from bookwyrm/forms.py
rename to bookwyrm/forms/forms.py
From d3f723a07dd95ddf96c5b96d7fb23fea6abd54c2 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Mon, 14 Mar 2022 11:46:08 -0700
Subject: [PATCH 48/59] Splits forms into separate files
---
bookwyrm/forms/__init__.py | 9 +
bookwyrm/forms/admin.py | 129 +++++++++
bookwyrm/forms/author.py | 47 +++
bookwyrm/forms/books.py | 81 ++++++
bookwyrm/forms/custom_form.py | 26 ++
bookwyrm/forms/edit_user.py | 68 +++++
bookwyrm/forms/forms.py | 529 +---------------------------------
bookwyrm/forms/groups.py | 16 +
bookwyrm/forms/landing.py | 45 +++
bookwyrm/forms/links.py | 48 +++
bookwyrm/forms/lists.py | 37 +++
bookwyrm/forms/status.py | 82 ++++++
12 files changed, 590 insertions(+), 527 deletions(-)
create mode 100644 bookwyrm/forms/admin.py
create mode 100644 bookwyrm/forms/author.py
create mode 100644 bookwyrm/forms/books.py
create mode 100644 bookwyrm/forms/custom_form.py
create mode 100644 bookwyrm/forms/edit_user.py
create mode 100644 bookwyrm/forms/groups.py
create mode 100644 bookwyrm/forms/landing.py
create mode 100644 bookwyrm/forms/links.py
create mode 100644 bookwyrm/forms/lists.py
create mode 100644 bookwyrm/forms/status.py
diff --git a/bookwyrm/forms/__init__.py b/bookwyrm/forms/__init__.py
index dac2007b8..a6f704339 100644
--- a/bookwyrm/forms/__init__.py
+++ b/bookwyrm/forms/__init__.py
@@ -1,3 +1,12 @@
""" make forms available to the app """
# site admin
+from .admin import *
+from .author import *
+from .books import *
from .forms import *
+from .groups import *
+from .landing import *
+from .links import *
+from .lists import *
+from .status import *
+from .user import *
diff --git a/bookwyrm/forms/admin.py b/bookwyrm/forms/admin.py
new file mode 100644
index 000000000..6b2984b3b
--- /dev/null
+++ b/bookwyrm/forms/admin.py
@@ -0,0 +1,129 @@
+""" using django model forms """
+import datetime
+
+from django import forms
+from django.forms import widgets
+from django.utils import timezone
+from django.utils.translation import gettext_lazy as _
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class ExpiryWidget(widgets.Select):
+ def value_from_datadict(self, data, files, name):
+ """human-readable exiration time buckets"""
+ selected_string = super().value_from_datadict(data, files, name)
+
+ if selected_string == "day":
+ interval = datetime.timedelta(days=1)
+ elif selected_string == "week":
+ interval = datetime.timedelta(days=7)
+ elif selected_string == "month":
+ interval = datetime.timedelta(days=31) # Close enough?
+ elif selected_string == "forever":
+ return None
+ else:
+ return selected_string # This will raise
+
+ return timezone.now() + interval
+
+
+class CreateInviteForm(CustomForm):
+ class Meta:
+ model = models.SiteInvite
+ exclude = ["code", "user", "times_used", "invitees"]
+ widgets = {
+ "expiry": ExpiryWidget(
+ choices=[
+ ("day", _("One Day")),
+ ("week", _("One Week")),
+ ("month", _("One Month")),
+ ("forever", _("Does Not Expire")),
+ ]
+ ),
+ "use_limit": widgets.Select(
+ choices=[(i, _(f"{i} uses")) for i in [1, 5, 10, 25, 50, 100]]
+ + [(None, _("Unlimited"))]
+ ),
+ }
+
+
+class SiteForm(CustomForm):
+ class Meta:
+ model = models.SiteSettings
+ exclude = ["admin_code", "install_mode"]
+ widgets = {
+ "instance_short_description": forms.TextInput(
+ attrs={"aria-describedby": "desc_instance_short_description"}
+ ),
+ "require_confirm_email": forms.CheckboxInput(
+ attrs={"aria-describedby": "desc_require_confirm_email"}
+ ),
+ "invite_request_text": forms.Textarea(
+ attrs={"aria-describedby": "desc_invite_request_text"}
+ ),
+ }
+
+
+class ThemeForm(CustomForm):
+ class Meta:
+ model = models.Theme
+ fields = ["name", "path"]
+ widgets = {
+ "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
+ "path": forms.TextInput(
+ attrs={
+ "aria-describedby": "desc_path",
+ "placeholder": "css/themes/theme-name.scss",
+ }
+ ),
+ }
+
+
+class AnnouncementForm(CustomForm):
+ class Meta:
+ model = models.Announcement
+ exclude = ["remote_id"]
+ widgets = {
+ "preview": forms.TextInput(attrs={"aria-describedby": "desc_preview"}),
+ "content": forms.Textarea(attrs={"aria-describedby": "desc_content"}),
+ "event_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_event_date"}
+ ),
+ "start_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_start_date"}
+ ),
+ "end_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_end_date"}
+ ),
+ "active": forms.CheckboxInput(attrs={"aria-describedby": "desc_active"}),
+ }
+
+
+class EmailBlocklistForm(CustomForm):
+ class Meta:
+ model = models.EmailBlocklist
+ fields = ["domain"]
+ widgets = {
+ "avatar": forms.TextInput(attrs={"aria-describedby": "desc_domain"}),
+ }
+
+
+class IPBlocklistForm(CustomForm):
+ class Meta:
+ model = models.IPBlocklist
+ fields = ["address"]
+
+
+class ServerForm(CustomForm):
+ class Meta:
+ model = models.FederatedServer
+ exclude = ["remote_id"]
+
+
+class AutoModRuleForm(CustomForm):
+ class Meta:
+ model = models.AutoMod
+ fields = ["string_match", "flag_users", "flag_statuses", "created_by"]
diff --git a/bookwyrm/forms/author.py b/bookwyrm/forms/author.py
new file mode 100644
index 000000000..ca59426de
--- /dev/null
+++ b/bookwyrm/forms/author.py
@@ -0,0 +1,47 @@
+""" using django model forms """
+from django import forms
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class AuthorForm(CustomForm):
+ class Meta:
+ model = models.Author
+ fields = [
+ "last_edited_by",
+ "name",
+ "aliases",
+ "bio",
+ "wikipedia_link",
+ "born",
+ "died",
+ "openlibrary_key",
+ "inventaire_id",
+ "librarything_key",
+ "goodreads_key",
+ "isni",
+ ]
+ widgets = {
+ "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
+ "aliases": forms.TextInput(attrs={"aria-describedby": "desc_aliases"}),
+ "bio": forms.Textarea(attrs={"aria-describedby": "desc_bio"}),
+ "wikipedia_link": forms.TextInput(
+ attrs={"aria-describedby": "desc_wikipedia_link"}
+ ),
+ "born": forms.SelectDateWidget(attrs={"aria-describedby": "desc_born"}),
+ "died": forms.SelectDateWidget(attrs={"aria-describedby": "desc_died"}),
+ "oepnlibrary_key": forms.TextInput(
+ attrs={"aria-describedby": "desc_oepnlibrary_key"}
+ ),
+ "inventaire_id": forms.TextInput(
+ attrs={"aria-describedby": "desc_inventaire_id"}
+ ),
+ "librarything_key": forms.TextInput(
+ attrs={"aria-describedby": "desc_librarything_key"}
+ ),
+ "goodreads_key": forms.TextInput(
+ attrs={"aria-describedby": "desc_goodreads_key"}
+ ),
+ }
diff --git a/bookwyrm/forms/books.py b/bookwyrm/forms/books.py
new file mode 100644
index 000000000..64b85d0b2
--- /dev/null
+++ b/bookwyrm/forms/books.py
@@ -0,0 +1,81 @@
+""" using django model forms """
+from django import forms
+
+from bookwyrm import models
+from bookwyrm.models.fields import ClearableFileInputWithWarning
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class CoverForm(CustomForm):
+ class Meta:
+ model = models.Book
+ fields = ["cover"]
+ help_texts = {f: None for f in fields}
+
+
+class EditionForm(CustomForm):
+ class Meta:
+ model = models.Edition
+ exclude = [
+ "remote_id",
+ "origin_id",
+ "created_date",
+ "updated_date",
+ "edition_rank",
+ "authors",
+ "parent_work",
+ "shelves",
+ "connector",
+ "search_vector",
+ "links",
+ "file_links",
+ ]
+ widgets = {
+ "title": forms.TextInput(attrs={"aria-describedby": "desc_title"}),
+ "subtitle": forms.TextInput(attrs={"aria-describedby": "desc_subtitle"}),
+ "description": forms.Textarea(
+ attrs={"aria-describedby": "desc_description"}
+ ),
+ "series": forms.TextInput(attrs={"aria-describedby": "desc_series"}),
+ "series_number": forms.TextInput(
+ attrs={"aria-describedby": "desc_series_number"}
+ ),
+ "languages": forms.TextInput(
+ attrs={"aria-describedby": "desc_languages_help desc_languages"}
+ ),
+ "subjects": forms.TextInput(
+ attrs={"aria-describedby": "desc_subjects_help desc_subjects"}
+ ),
+ "publishers": forms.TextInput(
+ attrs={"aria-describedby": "desc_publishers_help desc_publishers"}
+ ),
+ "first_published_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_first_published_date"}
+ ),
+ "published_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_published_date"}
+ ),
+ "cover": ClearableFileInputWithWarning(
+ attrs={"aria-describedby": "desc_cover"}
+ ),
+ "physical_format": forms.Select(
+ attrs={"aria-describedby": "desc_physical_format"}
+ ),
+ "physical_format_detail": forms.TextInput(
+ attrs={"aria-describedby": "desc_physical_format_detail"}
+ ),
+ "pages": forms.NumberInput(attrs={"aria-describedby": "desc_pages"}),
+ "isbn_13": forms.TextInput(attrs={"aria-describedby": "desc_isbn_13"}),
+ "isbn_10": forms.TextInput(attrs={"aria-describedby": "desc_isbn_10"}),
+ "openlibrary_key": forms.TextInput(
+ attrs={"aria-describedby": "desc_openlibrary_key"}
+ ),
+ "inventaire_id": forms.TextInput(
+ attrs={"aria-describedby": "desc_inventaire_id"}
+ ),
+ "oclc_number": forms.TextInput(
+ attrs={"aria-describedby": "desc_oclc_number"}
+ ),
+ "ASIN": forms.TextInput(attrs={"aria-describedby": "desc_ASIN"}),
+ }
diff --git a/bookwyrm/forms/custom_form.py b/bookwyrm/forms/custom_form.py
new file mode 100644
index 000000000..74a3417a2
--- /dev/null
+++ b/bookwyrm/forms/custom_form.py
@@ -0,0 +1,26 @@
+""" Overrides django's default form class """
+from collections import defaultdict
+from django.forms import ModelForm
+from django.forms.widgets import Textarea
+
+
+class CustomForm(ModelForm):
+ """add css classes to the forms"""
+
+ def __init__(self, *args, **kwargs):
+ css_classes = defaultdict(lambda: "")
+ css_classes["text"] = "input"
+ css_classes["password"] = "input"
+ css_classes["email"] = "input"
+ css_classes["number"] = "input"
+ css_classes["checkbox"] = "checkbox"
+ css_classes["textarea"] = "textarea"
+ # pylint: disable=super-with-arguments
+ super(CustomForm, self).__init__(*args, **kwargs)
+ for visible in self.visible_fields():
+ if hasattr(visible.field.widget, "input_type"):
+ input_type = visible.field.widget.input_type
+ if isinstance(visible.field.widget, Textarea):
+ input_type = "textarea"
+ visible.field.widget.attrs["rows"] = 5
+ visible.field.widget.attrs["class"] = css_classes[input_type]
diff --git a/bookwyrm/forms/edit_user.py b/bookwyrm/forms/edit_user.py
new file mode 100644
index 000000000..d609f15dc
--- /dev/null
+++ b/bookwyrm/forms/edit_user.py
@@ -0,0 +1,68 @@
+""" using django model forms """
+from django import forms
+
+from bookwyrm import models
+from bookwyrm.models.fields import ClearableFileInputWithWarning
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class EditUserForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = [
+ "avatar",
+ "name",
+ "email",
+ "summary",
+ "show_goal",
+ "show_suggested_users",
+ "manually_approves_followers",
+ "default_post_privacy",
+ "discoverable",
+ "hide_follows",
+ "preferred_timezone",
+ "preferred_language",
+ "theme",
+ ]
+ help_texts = {f: None for f in fields}
+ widgets = {
+ "avatar": ClearableFileInputWithWarning(
+ attrs={"aria-describedby": "desc_avatar"}
+ ),
+ "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
+ "summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
+ "email": forms.EmailInput(attrs={"aria-describedby": "desc_email"}),
+ "discoverable": forms.CheckboxInput(
+ attrs={"aria-describedby": "desc_discoverable"}
+ ),
+ }
+
+
+class LimitedEditUserForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = [
+ "avatar",
+ "name",
+ "summary",
+ "manually_approves_followers",
+ "discoverable",
+ ]
+ help_texts = {f: None for f in fields}
+ widgets = {
+ "avatar": ClearableFileInputWithWarning(
+ attrs={"aria-describedby": "desc_avatar"}
+ ),
+ "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
+ "summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
+ "discoverable": forms.CheckboxInput(
+ attrs={"aria-describedby": "desc_discoverable"}
+ ),
+ }
+
+
+class DeleteUserForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = ["password"]
diff --git a/bookwyrm/forms/forms.py b/bookwyrm/forms/forms.py
index ff35a9486..8af8fb812 100644
--- a/bookwyrm/forms/forms.py
+++ b/bookwyrm/forms/forms.py
@@ -1,212 +1,14 @@
""" using django model forms """
-import datetime
-from collections import defaultdict
-from urllib.parse import urlparse
-
from django import forms
-from django.forms import ModelForm, PasswordInput, widgets, ChoiceField
-from django.forms.widgets import Textarea
-from django.utils import timezone
+from django.forms import widgets
from django.utils.translation import gettext_lazy as _
from bookwyrm import models
-from bookwyrm.models.fields import ClearableFileInputWithWarning
from bookwyrm.models.user import FeedFilterChoices
-
-
-class CustomForm(ModelForm):
- """add css classes to the forms"""
-
- def __init__(self, *args, **kwargs):
- css_classes = defaultdict(lambda: "")
- css_classes["text"] = "input"
- css_classes["password"] = "input"
- css_classes["email"] = "input"
- css_classes["number"] = "input"
- css_classes["checkbox"] = "checkbox"
- css_classes["textarea"] = "textarea"
- # pylint: disable=super-with-arguments
- super(CustomForm, self).__init__(*args, **kwargs)
- for visible in self.visible_fields():
- if hasattr(visible.field.widget, "input_type"):
- input_type = visible.field.widget.input_type
- if isinstance(visible.field.widget, Textarea):
- input_type = "textarea"
- visible.field.widget.attrs["rows"] = 5
- visible.field.widget.attrs["class"] = css_classes[input_type]
+from .custom_form import CustomForm
# pylint: disable=missing-class-docstring
-class LoginForm(CustomForm):
- class Meta:
- model = models.User
- fields = ["localname", "password"]
- help_texts = {f: None for f in fields}
- widgets = {
- "password": PasswordInput(),
- }
-
-
-class RegisterForm(CustomForm):
- class Meta:
- model = models.User
- fields = ["localname", "email", "password"]
- help_texts = {f: None for f in fields}
- widgets = {"password": PasswordInput()}
-
- def clean(self):
- """Check if the username is taken"""
- cleaned_data = super().clean()
- localname = cleaned_data.get("localname").strip()
- if models.User.objects.filter(localname=localname).first():
- self.add_error("localname", _("User with this username already exists"))
-
-
-class RatingForm(CustomForm):
- class Meta:
- model = models.ReviewRating
- fields = ["user", "book", "rating", "privacy"]
-
-
-class ReviewForm(CustomForm):
- class Meta:
- model = models.Review
- fields = [
- "user",
- "book",
- "name",
- "content",
- "rating",
- "content_warning",
- "sensitive",
- "privacy",
- ]
-
-
-class CommentForm(CustomForm):
- class Meta:
- model = models.Comment
- fields = [
- "user",
- "book",
- "content",
- "content_warning",
- "sensitive",
- "privacy",
- "progress",
- "progress_mode",
- "reading_status",
- ]
-
-
-class QuotationForm(CustomForm):
- class Meta:
- model = models.Quotation
- fields = [
- "user",
- "book",
- "quote",
- "content",
- "content_warning",
- "sensitive",
- "privacy",
- "position",
- "position_mode",
- ]
-
-
-class ReplyForm(CustomForm):
- class Meta:
- model = models.Status
- fields = [
- "user",
- "content",
- "content_warning",
- "sensitive",
- "reply_parent",
- "privacy",
- ]
-
-
-class StatusForm(CustomForm):
- class Meta:
- model = models.Status
- fields = ["user", "content", "content_warning", "sensitive", "privacy"]
-
-
-class DirectForm(CustomForm):
- class Meta:
- model = models.Status
- fields = ["user", "content", "content_warning", "sensitive", "privacy"]
-
-
-class EditUserForm(CustomForm):
- class Meta:
- model = models.User
- fields = [
- "avatar",
- "name",
- "email",
- "summary",
- "show_goal",
- "show_suggested_users",
- "manually_approves_followers",
- "default_post_privacy",
- "discoverable",
- "hide_follows",
- "preferred_timezone",
- "preferred_language",
- "theme",
- ]
- help_texts = {f: None for f in fields}
- widgets = {
- "avatar": ClearableFileInputWithWarning(
- attrs={"aria-describedby": "desc_avatar"}
- ),
- "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
- "summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
- "email": forms.EmailInput(attrs={"aria-describedby": "desc_email"}),
- "discoverable": forms.CheckboxInput(
- attrs={"aria-describedby": "desc_discoverable"}
- ),
- }
-
-
-class LimitedEditUserForm(CustomForm):
- class Meta:
- model = models.User
- fields = [
- "avatar",
- "name",
- "summary",
- "manually_approves_followers",
- "discoverable",
- ]
- help_texts = {f: None for f in fields}
- widgets = {
- "avatar": ClearableFileInputWithWarning(
- attrs={"aria-describedby": "desc_avatar"}
- ),
- "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
- "summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
- "discoverable": forms.CheckboxInput(
- attrs={"aria-describedby": "desc_discoverable"}
- ),
- }
-
-
-class DeleteUserForm(CustomForm):
- class Meta:
- model = models.User
- fields = ["password"]
-
-
-class UserGroupForm(CustomForm):
- class Meta:
- model = models.User
- fields = ["groups"]
-
-
class FeedStatusTypesForm(CustomForm):
class Meta:
model = models.User
@@ -219,217 +21,10 @@ class FeedStatusTypesForm(CustomForm):
}
-class CoverForm(CustomForm):
- class Meta:
- model = models.Book
- fields = ["cover"]
- help_texts = {f: None for f in fields}
-
-
-class LinkDomainForm(CustomForm):
- class Meta:
- model = models.LinkDomain
- fields = ["name"]
-
-
-class FileLinkForm(CustomForm):
- class Meta:
- model = models.FileLink
- fields = ["url", "filetype", "availability", "book", "added_by"]
-
- def clean(self):
- """make sure the domain isn't blocked or pending"""
- cleaned_data = super().clean()
- url = cleaned_data.get("url")
- filetype = cleaned_data.get("filetype")
- book = cleaned_data.get("book")
- domain = urlparse(url).netloc
- if models.LinkDomain.objects.filter(domain=domain).exists():
- status = models.LinkDomain.objects.get(domain=domain).status
- if status == "blocked":
- # pylint: disable=line-too-long
- self.add_error(
- "url",
- _(
- "This domain is blocked. Please contact your administrator if you think this is an error."
- ),
- )
- elif models.FileLink.objects.filter(
- url=url, book=book, filetype=filetype
- ).exists():
- # pylint: disable=line-too-long
- self.add_error(
- "url",
- _(
- "This link with file type has already been added for this book. If it is not visible, the domain is still pending."
- ),
- )
-
-
-class EditionForm(CustomForm):
- class Meta:
- model = models.Edition
- exclude = [
- "remote_id",
- "origin_id",
- "created_date",
- "updated_date",
- "edition_rank",
- "authors",
- "parent_work",
- "shelves",
- "connector",
- "search_vector",
- "links",
- "file_links",
- ]
- widgets = {
- "title": forms.TextInput(attrs={"aria-describedby": "desc_title"}),
- "subtitle": forms.TextInput(attrs={"aria-describedby": "desc_subtitle"}),
- "description": forms.Textarea(
- attrs={"aria-describedby": "desc_description"}
- ),
- "series": forms.TextInput(attrs={"aria-describedby": "desc_series"}),
- "series_number": forms.TextInput(
- attrs={"aria-describedby": "desc_series_number"}
- ),
- "languages": forms.TextInput(
- attrs={"aria-describedby": "desc_languages_help desc_languages"}
- ),
- "subjects": forms.TextInput(
- attrs={"aria-describedby": "desc_subjects_help desc_subjects"}
- ),
- "publishers": forms.TextInput(
- attrs={"aria-describedby": "desc_publishers_help desc_publishers"}
- ),
- "first_published_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_first_published_date"}
- ),
- "published_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_published_date"}
- ),
- "cover": ClearableFileInputWithWarning(
- attrs={"aria-describedby": "desc_cover"}
- ),
- "physical_format": forms.Select(
- attrs={"aria-describedby": "desc_physical_format"}
- ),
- "physical_format_detail": forms.TextInput(
- attrs={"aria-describedby": "desc_physical_format_detail"}
- ),
- "pages": forms.NumberInput(attrs={"aria-describedby": "desc_pages"}),
- "isbn_13": forms.TextInput(attrs={"aria-describedby": "desc_isbn_13"}),
- "isbn_10": forms.TextInput(attrs={"aria-describedby": "desc_isbn_10"}),
- "openlibrary_key": forms.TextInput(
- attrs={"aria-describedby": "desc_openlibrary_key"}
- ),
- "inventaire_id": forms.TextInput(
- attrs={"aria-describedby": "desc_inventaire_id"}
- ),
- "oclc_number": forms.TextInput(
- attrs={"aria-describedby": "desc_oclc_number"}
- ),
- "ASIN": forms.TextInput(attrs={"aria-describedby": "desc_ASIN"}),
- }
-
-
-class AuthorForm(CustomForm):
- class Meta:
- model = models.Author
- fields = [
- "last_edited_by",
- "name",
- "aliases",
- "bio",
- "wikipedia_link",
- "born",
- "died",
- "openlibrary_key",
- "inventaire_id",
- "librarything_key",
- "goodreads_key",
- "isni",
- ]
- widgets = {
- "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
- "aliases": forms.TextInput(attrs={"aria-describedby": "desc_aliases"}),
- "bio": forms.Textarea(attrs={"aria-describedby": "desc_bio"}),
- "wikipedia_link": forms.TextInput(
- attrs={"aria-describedby": "desc_wikipedia_link"}
- ),
- "born": forms.SelectDateWidget(attrs={"aria-describedby": "desc_born"}),
- "died": forms.SelectDateWidget(attrs={"aria-describedby": "desc_died"}),
- "oepnlibrary_key": forms.TextInput(
- attrs={"aria-describedby": "desc_oepnlibrary_key"}
- ),
- "inventaire_id": forms.TextInput(
- attrs={"aria-describedby": "desc_inventaire_id"}
- ),
- "librarything_key": forms.TextInput(
- attrs={"aria-describedby": "desc_librarything_key"}
- ),
- "goodreads_key": forms.TextInput(
- attrs={"aria-describedby": "desc_goodreads_key"}
- ),
- }
-
-
class ImportForm(forms.Form):
csv_file = forms.FileField()
-class ExpiryWidget(widgets.Select):
- def value_from_datadict(self, data, files, name):
- """human-readable exiration time buckets"""
- selected_string = super().value_from_datadict(data, files, name)
-
- if selected_string == "day":
- interval = datetime.timedelta(days=1)
- elif selected_string == "week":
- interval = datetime.timedelta(days=7)
- elif selected_string == "month":
- interval = datetime.timedelta(days=31) # Close enough?
- elif selected_string == "forever":
- return None
- else:
- return selected_string # This will raise
-
- return timezone.now() + interval
-
-
-class InviteRequestForm(CustomForm):
- def clean(self):
- """make sure the email isn't in use by a registered user"""
- cleaned_data = super().clean()
- email = cleaned_data.get("email")
- if email and models.User.objects.filter(email=email).exists():
- self.add_error("email", _("A user with this email already exists."))
-
- class Meta:
- model = models.InviteRequest
- fields = ["email"]
-
-
-class CreateInviteForm(CustomForm):
- class Meta:
- model = models.SiteInvite
- exclude = ["code", "user", "times_used", "invitees"]
- widgets = {
- "expiry": ExpiryWidget(
- choices=[
- ("day", _("One Day")),
- ("week", _("One Week")),
- ("month", _("One Month")),
- ("forever", _("Does Not Expire")),
- ]
- ),
- "use_limit": widgets.Select(
- choices=[(i, _(f"{i} uses")) for i in [1, 5, 10, 25, 50, 100]]
- + [(None, _("Unlimited"))]
- ),
- }
-
-
class ShelfForm(CustomForm):
class Meta:
model = models.Shelf
@@ -442,126 +37,12 @@ class GoalForm(CustomForm):
fields = ["user", "year", "goal", "privacy"]
-class SiteForm(CustomForm):
- class Meta:
- model = models.SiteSettings
- exclude = ["admin_code", "install_mode"]
- widgets = {
- "instance_short_description": forms.TextInput(
- attrs={"aria-describedby": "desc_instance_short_description"}
- ),
- "require_confirm_email": forms.CheckboxInput(
- attrs={"aria-describedby": "desc_require_confirm_email"}
- ),
- "invite_request_text": forms.Textarea(
- attrs={"aria-describedby": "desc_invite_request_text"}
- ),
- }
-
-
-class SiteThemeForm(CustomForm):
- class Meta:
- model = models.SiteSettings
- fields = ["default_theme"]
-
-
-class ThemeForm(CustomForm):
- class Meta:
- model = models.Theme
- fields = ["name", "path"]
- widgets = {
- "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
- "path": forms.TextInput(
- attrs={
- "aria-describedby": "desc_path",
- "placeholder": "css/themes/theme-name.scss",
- }
- ),
- }
-
-
-class AnnouncementForm(CustomForm):
- class Meta:
- model = models.Announcement
- exclude = ["remote_id"]
- widgets = {
- "preview": forms.TextInput(attrs={"aria-describedby": "desc_preview"}),
- "content": forms.Textarea(attrs={"aria-describedby": "desc_content"}),
- "event_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_event_date"}
- ),
- "start_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_start_date"}
- ),
- "end_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_end_date"}
- ),
- "active": forms.CheckboxInput(attrs={"aria-describedby": "desc_active"}),
- }
-
-
-class ListForm(CustomForm):
- class Meta:
- model = models.List
- fields = ["user", "name", "description", "curation", "privacy", "group"]
-
-
-class ListItemForm(CustomForm):
- class Meta:
- model = models.ListItem
- fields = ["user", "book", "book_list", "notes"]
-
-
-class GroupForm(CustomForm):
- class Meta:
- model = models.Group
- fields = ["user", "privacy", "name", "description"]
-
-
class ReportForm(CustomForm):
class Meta:
model = models.Report
fields = ["user", "reporter", "status", "links", "note"]
-class EmailBlocklistForm(CustomForm):
- class Meta:
- model = models.EmailBlocklist
- fields = ["domain"]
- widgets = {
- "avatar": forms.TextInput(attrs={"aria-describedby": "desc_domain"}),
- }
-
-
-class IPBlocklistForm(CustomForm):
- class Meta:
- model = models.IPBlocklist
- fields = ["address"]
-
-
-class ServerForm(CustomForm):
- class Meta:
- model = models.FederatedServer
- exclude = ["remote_id"]
-
-
-class SortListForm(forms.Form):
- sort_by = ChoiceField(
- choices=(
- ("order", _("List Order")),
- ("title", _("Book Title")),
- ("rating", _("Rating")),
- ),
- label=_("Sort By"),
- )
- direction = ChoiceField(
- choices=(
- ("ascending", _("Ascending")),
- ("descending", _("Descending")),
- ),
- )
-
-
class ReadThroughForm(CustomForm):
def clean(self):
"""make sure the email isn't in use by a registered user"""
@@ -576,9 +57,3 @@ class ReadThroughForm(CustomForm):
class Meta:
model = models.ReadThrough
fields = ["user", "book", "start_date", "finish_date"]
-
-
-class AutoModRuleForm(CustomForm):
- class Meta:
- model = models.AutoMod
- fields = ["string_match", "flag_users", "flag_statuses", "created_by"]
diff --git a/bookwyrm/forms/groups.py b/bookwyrm/forms/groups.py
new file mode 100644
index 000000000..15b27c0ae
--- /dev/null
+++ b/bookwyrm/forms/groups.py
@@ -0,0 +1,16 @@
+""" using django model forms """
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class UserGroupForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = ["groups"]
+
+
+class GroupForm(CustomForm):
+ class Meta:
+ model = models.Group
+ fields = ["user", "privacy", "name", "description"]
diff --git a/bookwyrm/forms/landing.py b/bookwyrm/forms/landing.py
new file mode 100644
index 000000000..61b92ee83
--- /dev/null
+++ b/bookwyrm/forms/landing.py
@@ -0,0 +1,45 @@
+""" Forms for the landing pages """
+from django.forms import PasswordInput
+from django.utils.translation import gettext_lazy as _
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class LoginForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = ["localname", "password"]
+ help_texts = {f: None for f in fields}
+ widgets = {
+ "password": PasswordInput(),
+ }
+
+
+class RegisterForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = ["localname", "email", "password"]
+ help_texts = {f: None for f in fields}
+ widgets = {"password": PasswordInput()}
+
+ def clean(self):
+ """Check if the username is taken"""
+ cleaned_data = super().clean()
+ localname = cleaned_data.get("localname").strip()
+ if models.User.objects.filter(localname=localname).first():
+ self.add_error("localname", _("User with this username already exists"))
+
+
+class InviteRequestForm(CustomForm):
+ def clean(self):
+ """make sure the email isn't in use by a registered user"""
+ cleaned_data = super().clean()
+ email = cleaned_data.get("email")
+ if email and models.User.objects.filter(email=email).exists():
+ self.add_error("email", _("A user with this email already exists."))
+
+ class Meta:
+ model = models.InviteRequest
+ fields = ["email"]
diff --git a/bookwyrm/forms/links.py b/bookwyrm/forms/links.py
new file mode 100644
index 000000000..de229bc2d
--- /dev/null
+++ b/bookwyrm/forms/links.py
@@ -0,0 +1,48 @@
+""" using django model forms """
+from urllib.parse import urlparse
+
+from django.utils.translation import gettext_lazy as _
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class LinkDomainForm(CustomForm):
+ class Meta:
+ model = models.LinkDomain
+ fields = ["name"]
+
+
+class FileLinkForm(CustomForm):
+ class Meta:
+ model = models.FileLink
+ fields = ["url", "filetype", "availability", "book", "added_by"]
+
+ def clean(self):
+ """make sure the domain isn't blocked or pending"""
+ cleaned_data = super().clean()
+ url = cleaned_data.get("url")
+ filetype = cleaned_data.get("filetype")
+ book = cleaned_data.get("book")
+ domain = urlparse(url).netloc
+ if models.LinkDomain.objects.filter(domain=domain).exists():
+ status = models.LinkDomain.objects.get(domain=domain).status
+ if status == "blocked":
+ # pylint: disable=line-too-long
+ self.add_error(
+ "url",
+ _(
+ "This domain is blocked. Please contact your administrator if you think this is an error."
+ ),
+ )
+ elif models.FileLink.objects.filter(
+ url=url, book=book, filetype=filetype
+ ).exists():
+ # pylint: disable=line-too-long
+ self.add_error(
+ "url",
+ _(
+ "This link with file type has already been added for this book. If it is not visible, the domain is still pending."
+ ),
+ )
diff --git a/bookwyrm/forms/lists.py b/bookwyrm/forms/lists.py
new file mode 100644
index 000000000..647db3bfe
--- /dev/null
+++ b/bookwyrm/forms/lists.py
@@ -0,0 +1,37 @@
+""" using django model forms """
+from django import forms
+from django.forms import ChoiceField
+from django.utils.translation import gettext_lazy as _
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class ListForm(CustomForm):
+ class Meta:
+ model = models.List
+ fields = ["user", "name", "description", "curation", "privacy", "group"]
+
+
+class ListItemForm(CustomForm):
+ class Meta:
+ model = models.ListItem
+ fields = ["user", "book", "book_list", "notes"]
+
+
+class SortListForm(forms.Form):
+ sort_by = ChoiceField(
+ choices=(
+ ("order", _("List Order")),
+ ("title", _("Book Title")),
+ ("rating", _("Rating")),
+ ),
+ label=_("Sort By"),
+ )
+ direction = ChoiceField(
+ choices=(
+ ("ascending", _("Ascending")),
+ ("descending", _("Descending")),
+ ),
+ )
diff --git a/bookwyrm/forms/status.py b/bookwyrm/forms/status.py
new file mode 100644
index 000000000..0800166bf
--- /dev/null
+++ b/bookwyrm/forms/status.py
@@ -0,0 +1,82 @@
+""" using django model forms """
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class RatingForm(CustomForm):
+ class Meta:
+ model = models.ReviewRating
+ fields = ["user", "book", "rating", "privacy"]
+
+
+class ReviewForm(CustomForm):
+ class Meta:
+ model = models.Review
+ fields = [
+ "user",
+ "book",
+ "name",
+ "content",
+ "rating",
+ "content_warning",
+ "sensitive",
+ "privacy",
+ ]
+
+
+class CommentForm(CustomForm):
+ class Meta:
+ model = models.Comment
+ fields = [
+ "user",
+ "book",
+ "content",
+ "content_warning",
+ "sensitive",
+ "privacy",
+ "progress",
+ "progress_mode",
+ "reading_status",
+ ]
+
+
+class QuotationForm(CustomForm):
+ class Meta:
+ model = models.Quotation
+ fields = [
+ "user",
+ "book",
+ "quote",
+ "content",
+ "content_warning",
+ "sensitive",
+ "privacy",
+ "position",
+ "position_mode",
+ ]
+
+
+class ReplyForm(CustomForm):
+ class Meta:
+ model = models.Status
+ fields = [
+ "user",
+ "content",
+ "content_warning",
+ "sensitive",
+ "reply_parent",
+ "privacy",
+ ]
+
+
+class StatusForm(CustomForm):
+ class Meta:
+ model = models.Status
+ fields = ["user", "content", "content_warning", "sensitive", "privacy"]
+
+
+class DirectForm(CustomForm):
+ class Meta:
+ model = models.Status
+ fields = ["user", "content", "content_warning", "sensitive", "privacy"]
From 19202e2cd77fddb0cd267e911d713e3562ba4617 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Mon, 14 Mar 2022 12:12:51 -0700
Subject: [PATCH 49/59] Fixes name of user forms file
---
bookwyrm/forms/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bookwyrm/forms/__init__.py b/bookwyrm/forms/__init__.py
index a6f704339..075752936 100644
--- a/bookwyrm/forms/__init__.py
+++ b/bookwyrm/forms/__init__.py
@@ -3,10 +3,10 @@
from .admin import *
from .author import *
from .books import *
+from .edit_user import *
from .forms import *
from .groups import *
from .landing import *
from .links import *
from .lists import *
from .status import *
-from .user import *
From 486f70c7fbd9147ca1ed4a58cee162676b7a5404 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Mon, 14 Mar 2022 12:31:29 -0700
Subject: [PATCH 50/59] Adds scanner translation strings
---
locale/de_DE/LC_MESSAGES/django.po | 122 +++++-----
locale/en_US/LC_MESSAGES/django.po | 348 +++++++++++++++------------
locale/es_ES/LC_MESSAGES/django.mo | Bin 83719 -> 83594 bytes
locale/es_ES/LC_MESSAGES/django.po | 130 +++++-----
locale/fr_FR/LC_MESSAGES/django.po | 128 +++++-----
locale/gl_ES/LC_MESSAGES/django.mo | Bin 89448 -> 89154 bytes
locale/gl_ES/LC_MESSAGES/django.po | 126 +++++-----
locale/it_IT/LC_MESSAGES/django.mo | Bin 90758 -> 90522 bytes
locale/it_IT/LC_MESSAGES/django.po | 126 +++++-----
locale/lt_LT/LC_MESSAGES/django.mo | Bin 84886 -> 84689 bytes
locale/lt_LT/LC_MESSAGES/django.po | 122 +++++-----
locale/no_NO/LC_MESSAGES/django.mo | Bin 79871 -> 79689 bytes
locale/no_NO/LC_MESSAGES/django.po | 122 +++++-----
locale/pt_BR/LC_MESSAGES/django.mo | Bin 90058 -> 89997 bytes
locale/pt_BR/LC_MESSAGES/django.po | 124 +++++-----
locale/pt_PT/LC_MESSAGES/django.mo | Bin 72909 -> 72742 bytes
locale/pt_PT/LC_MESSAGES/django.po | 124 +++++-----
locale/sv_SE/LC_MESSAGES/django.mo | Bin 87935 -> 87729 bytes
locale/sv_SE/LC_MESSAGES/django.po | 122 +++++-----
locale/zh_Hans/LC_MESSAGES/django.po | 126 +++++-----
locale/zh_Hant/LC_MESSAGES/django.po | 122 +++++-----
21 files changed, 909 insertions(+), 933 deletions(-)
diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po
index f7ed0969d..31e44a7b9 100644
--- a/locale/de_DE/LC_MESSAGES/django.po
+++ b/locale/de_DE/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-08 19:55+0000\n"
-"PO-Revision-Date: 2022-03-08 21:16\n"
+"POT-Creation-Date: 2022-03-13 18:56+0000\n"
+"PO-Revision-Date: 2022-03-13 19:52\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: German\n"
"Language: de\n"
@@ -220,7 +220,7 @@ msgid "Followers"
msgstr "Follower*innen"
#: bookwyrm/models/fields.py:208
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:8
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:6
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
#: bookwyrm/templates/snippets/privacy_select.html:20
@@ -261,73 +261,73 @@ msgstr "Zitate"
msgid "Everything else"
msgstr "Alles andere"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home Timeline"
msgstr "Start-Zeitleiste"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home"
msgstr "Startseite"
-#: bookwyrm/settings.py:208
+#: bookwyrm/settings.py:209
msgid "Books Timeline"
msgstr "Bücher-Zeitleiste"
-#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:209 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Bücher"
-#: bookwyrm/settings.py:280
+#: bookwyrm/settings.py:281
msgid "English"
msgstr "English (Englisch)"
-#: bookwyrm/settings.py:281
+#: bookwyrm/settings.py:282
msgid "Deutsch (German)"
msgstr "Deutsch"
-#: bookwyrm/settings.py:282
+#: bookwyrm/settings.py:283
msgid "Español (Spanish)"
msgstr "Español (Spanisch)"
-#: bookwyrm/settings.py:283
+#: bookwyrm/settings.py:284
msgid "Galego (Galician)"
msgstr "Galego (Galizisch)"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:285
msgid "Italiano (Italian)"
msgstr "Italiano (Italienisch)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:286
msgid "Français (French)"
msgstr "Français (Französisch)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:287
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisch)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:288
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norwegisch)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:289
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (brasilianisches Portugiesisch)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:290
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugiesisch)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:291
msgid "Svenska (Swedish)"
msgstr "Svenska (Schwedisch)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:292
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (vereinfachtes Chinesisch)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:293
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinesisch, traditionell)"
@@ -727,14 +727,14 @@ msgstr "ISNI:"
#: bookwyrm/templates/author/edit_author.html:115
#: bookwyrm/templates/book/book.html:193
#: bookwyrm/templates/book/edit/edit_book.html:121
-#: bookwyrm/templates/book/file_links/add_link_modal.html:58
+#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
-#: bookwyrm/templates/groups/form.html:30
+#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
#: bookwyrm/templates/lists/form.html:130
#: bookwyrm/templates/preferences/edit_user.html:136
-#: bookwyrm/templates/readthrough/readthrough_modal.html:72
+#: bookwyrm/templates/readthrough/readthrough_modal.html:74
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
@@ -748,20 +748,20 @@ msgstr "Speichern"
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/book.html:194
-#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/file_links/add_link_modal.html:59
-#: bookwyrm/templates/book/file_links/verification_modal.html:21
+#: bookwyrm/templates/book/file_links/verification_modal.html:25
#: bookwyrm/templates/book/sync_modal.html:23
-#: bookwyrm/templates/groups/delete_group_modal.html:17
-#: bookwyrm/templates/lists/add_item_modal.html:42
-#: bookwyrm/templates/lists/delete_list_modal.html:18
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:23
+#: bookwyrm/templates/groups/delete_group_modal.html:15
+#: bookwyrm/templates/lists/add_item_modal.html:36
+#: bookwyrm/templates/lists/delete_list_modal.html:16
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
-#: bookwyrm/templates/snippets/report_modal.html:53
+#: bookwyrm/templates/snippets/report_modal.html:52
msgid "Cancel"
msgstr "Abbrechen"
@@ -770,9 +770,9 @@ msgstr "Abbrechen"
msgid "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr "Das Laden von Daten wird eine Verbindung zu %(source_name)s aufbauen und überprüfen, ob Autor*in-Informationen vorliegen, die hier noch nicht bekannt sind. Bestehende Informationen werden nicht überschrieben."
-#: bookwyrm/templates/author/sync_modal.html:22
+#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:108
-#: bookwyrm/templates/book/sync_modal.html:22
+#: bookwyrm/templates/book/sync_modal.html:24
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
@@ -873,8 +873,8 @@ msgid "Add to list"
msgstr "Zur Liste hinzufügen"
#: bookwyrm/templates/book/book.html:370
-#: bookwyrm/templates/book/cover_add_modal.html:31
-#: bookwyrm/templates/lists/add_item_modal.html:37
+#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
@@ -1182,7 +1182,7 @@ msgid "Actions"
msgstr "Aktionen"
#: bookwyrm/templates/book/file_links/edit_links.html:53
-#: bookwyrm/templates/book/file_links/verification_modal.html:25
+#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Spam melden"
@@ -1216,7 +1216,7 @@ msgstr "BookWyrm verlassen"
msgid "This link is taking you to: %(link_url)s
.
Is that where you'd like to go?"
msgstr "Dieser Link führt zu: %(link_url)s
.
Möchtest du dorthin wechseln?"
-#: bookwyrm/templates/book/file_links/verification_modal.html:20
+#: bookwyrm/templates/book/file_links/verification_modal.html:26
#: bookwyrm/templates/setup/config.html:139
msgid "Continue"
msgstr "Weiter"
@@ -1292,7 +1292,7 @@ msgstr "Bestätigungscode:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:73
#: bookwyrm/templates/settings/dashboard/dashboard.html:116
-#: bookwyrm/templates/snippets/report_modal.html:52
+#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Absenden"
@@ -1806,7 +1806,8 @@ msgid "No users found for \"%(query)s\""
msgstr "Keine Benutzer*innen für „%(query)s“ gefunden"
#: bookwyrm/templates/groups/create_form.html:5
-msgid "Create Group"
+#: bookwyrm/templates/user/groups.html:17
+msgid "Create group"
msgstr "Gruppe erstellen"
#: bookwyrm/templates/groups/created_text.html:4
@@ -1824,9 +1825,9 @@ msgstr "Diese Gruppe löschen?"
msgid "This action cannot be un-done"
msgstr "Diese Aktion kann nicht rückgängig gemacht werden"
-#: bookwyrm/templates/groups/delete_group_modal.html:15
-#: bookwyrm/templates/lists/delete_list_modal.html:15
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:21
+#: bookwyrm/templates/groups/delete_group_modal.html:17
+#: bookwyrm/templates/lists/delete_list_modal.html:19
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:29
#: bookwyrm/templates/settings/announcements/announcement.html:23
#: bookwyrm/templates/settings/announcements/announcements.html:56
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
@@ -2298,7 +2299,7 @@ msgstr "\"%(title)s\" zu dieser Liste hinzufügen"
msgid "Suggest \"%(title)s\" for this list"
msgstr "\"%(title)s\" für diese Liste vorschlagen"
-#: bookwyrm/templates/lists/add_item_modal.html:39
+#: bookwyrm/templates/lists/add_item_modal.html:41
#: bookwyrm/templates/lists/list.html:257
msgid "Suggest"
msgstr "Vorschlagen"
@@ -2468,7 +2469,7 @@ msgid "List position"
msgstr "Listenposition"
#: bookwyrm/templates/lists/list.html:152
-#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
+#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23
msgid "Set"
msgstr "Übernehmen"
@@ -3923,7 +3924,7 @@ msgid "Copy the theme file into the bookwyrm/static/css/themes
dire
msgstr ""
#: bookwyrm/templates/settings/themes.html:32
-msgid "Run ./bw-dev compilescss
."
+msgid "Run ./bw-dev collectstatic
."
msgstr ""
#: bookwyrm/templates/settings/themes.html:35
@@ -4200,7 +4201,8 @@ msgid "Need help?"
msgstr ""
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-msgid "Create Shelf"
+#: bookwyrm/templates/shelf/shelf.html:72
+msgid "Create shelf"
msgstr "Regal erstellen"
#: bookwyrm/templates/shelf/edit_shelf_form.html:5
@@ -4216,10 +4218,6 @@ msgstr "Benutzer*inprofil"
msgid "All books"
msgstr "Alle Bücher"
-#: bookwyrm/templates/shelf/shelf.html:72
-msgid "Create shelf"
-msgstr "Regal erstellen"
-
#: bookwyrm/templates/shelf/shelf.html:96
#, python-format
msgid "%(formatted_count)s book"
@@ -4343,24 +4341,24 @@ msgstr "Antworten"
msgid "Content"
msgstr "Inhalt"
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10
-msgid "Content warning:"
-msgstr "Inhaltswarnung:"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
-msgid "Spoilers ahead!"
-msgstr "Spoileralarm!"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_toggle.html:13
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:9
msgid "Include spoiler alert"
msgstr "Spoileralarm aktivieren"
-#: bookwyrm/templates/snippets/create_status/layout.html:47
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
+msgid "Spoilers/content warnings:"
+msgstr ""
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:27
+msgid "Spoilers ahead!"
+msgstr "Spoileralarm!"
+
+#: bookwyrm/templates/snippets/create_status/layout.html:45
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Kommentar:"
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:18
msgid "Post"
msgstr "Veröffentlichen"
@@ -4851,10 +4849,6 @@ msgstr "Deine Gruppen"
msgid "Groups: %(username)s"
msgstr "Gruppen: %(username)s"
-#: bookwyrm/templates/user/groups.html:17
-msgid "Create group"
-msgstr "Gruppe erstellen"
-
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Benutzer*inprofil"
diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po
index 76cfb32bd..c5d3ad3fa 100644
--- a/locale/en_US/LC_MESSAGES/django.po
+++ b/locale/en_US/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-13 18:56+0000\n"
+"POT-Creation-Date: 2022-03-14 19:30+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: English \n"
@@ -18,77 +18,77 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: bookwyrm/forms.py:62
-msgid "User with this username already exists"
-msgstr ""
-
-#: bookwyrm/forms.py:254
-msgid "This domain is blocked. Please contact your administrator if you think this is an error."
-msgstr ""
-
-#: bookwyrm/forms.py:264
-msgid "This link with file type has already been added for this book. If it is not visible, the domain is still pending."
-msgstr ""
-
-#: bookwyrm/forms.py:403
-msgid "A user with this email already exists."
-msgstr ""
-
-#: bookwyrm/forms.py:417
+#: bookwyrm/forms/admin.py:40
msgid "One Day"
msgstr ""
-#: bookwyrm/forms.py:418
+#: bookwyrm/forms/admin.py:41
msgid "One Week"
msgstr ""
-#: bookwyrm/forms.py:419
+#: bookwyrm/forms/admin.py:42
msgid "One Month"
msgstr ""
-#: bookwyrm/forms.py:420
+#: bookwyrm/forms/admin.py:43
msgid "Does Not Expire"
msgstr ""
-#: bookwyrm/forms.py:424
+#: bookwyrm/forms/admin.py:47
#, python-brace-format
msgid "{i} uses"
msgstr ""
-#: bookwyrm/forms.py:425
+#: bookwyrm/forms/admin.py:48
msgid "Unlimited"
msgstr ""
-#: bookwyrm/forms.py:543
+#: bookwyrm/forms/forms.py:54
+msgid "Reading finish date cannot be before start date."
+msgstr ""
+
+#: bookwyrm/forms/landing.py:32
+msgid "User with this username already exists"
+msgstr ""
+
+#: bookwyrm/forms/landing.py:41
+msgid "A user with this email already exists."
+msgstr ""
+
+#: bookwyrm/forms/links.py:36
+msgid "This domain is blocked. Please contact your administrator if you think this is an error."
+msgstr ""
+
+#: bookwyrm/forms/links.py:46
+msgid "This link with file type has already been added for this book. If it is not visible, the domain is still pending."
+msgstr ""
+
+#: bookwyrm/forms/lists.py:26
msgid "List Order"
msgstr ""
-#: bookwyrm/forms.py:544
+#: bookwyrm/forms/lists.py:27
msgid "Book Title"
msgstr ""
-#: bookwyrm/forms.py:545 bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr ""
-#: bookwyrm/forms.py:547 bookwyrm/templates/lists/list.html:185
+#: bookwyrm/forms/lists.py:30 bookwyrm/templates/lists/list.html:185
msgid "Sort By"
msgstr ""
-#: bookwyrm/forms.py:551
+#: bookwyrm/forms/lists.py:34
msgid "Ascending"
msgstr ""
-#: bookwyrm/forms.py:552
+#: bookwyrm/forms/lists.py:35
msgid "Descending"
msgstr ""
-#: bookwyrm/forms.py:565
-msgid "Reading finish date cannot be before start date."
-msgstr ""
-
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr ""
@@ -188,7 +188,7 @@ msgstr ""
msgid "%(value)s is not a valid username"
msgstr ""
-#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171
+#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr ""
@@ -246,7 +246,7 @@ msgstr ""
msgid "Approved"
msgstr ""
-#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:272
+#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:281
msgid "Reviews"
msgstr ""
@@ -400,7 +400,7 @@ msgstr ""
msgid "Moderator"
msgstr ""
-#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:140
msgid "Admin"
msgstr ""
@@ -431,7 +431,7 @@ msgid "Software version:"
msgstr ""
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:34 bookwyrm/templates/layout.html:230
+#: bookwyrm/templates/embed-layout.html:34 bookwyrm/templates/layout.html:238
#, python-format
msgid "About %(site_name)s"
msgstr ""
@@ -534,7 +534,7 @@ msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:245
-#: bookwyrm/templates/book/book.html:47
+#: bookwyrm/templates/book/book.html:56
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -619,18 +619,18 @@ msgstr ""
#: bookwyrm/templates/author/author.html:83
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:122
+#: bookwyrm/templates/book/book.html:131
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr ""
#: bookwyrm/templates/author/author.html:87
-#: bookwyrm/templates/book/book.html:126
+#: bookwyrm/templates/book/book.html:135
msgid "View on OpenLibrary"
msgstr ""
#: bookwyrm/templates/author/author.html:102
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:149
msgid "View on Inventaire"
msgstr ""
@@ -667,7 +667,7 @@ msgid "Last edited by:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:33
-#: bookwyrm/templates/book/edit/edit_book_form.html:16
+#: bookwyrm/templates/book/edit/edit_book_form.html:17
msgid "Metadata"
msgstr ""
@@ -679,8 +679,9 @@ msgid "Name:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:44
-#: bookwyrm/templates/book/edit/edit_book_form.html:75
-#: bookwyrm/templates/book/edit/edit_book_form.html:94
+#: bookwyrm/templates/book/edit/edit_book_form.html:76
+#: bookwyrm/templates/book/edit/edit_book_form.html:88
+#: bookwyrm/templates/book/edit/edit_book_form.html:107
msgid "Separate multiple values with commas."
msgstr ""
@@ -709,7 +710,7 @@ msgid "Openlibrary key:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:84
-#: bookwyrm/templates/book/edit/edit_book_form.html:265
+#: bookwyrm/templates/book/edit/edit_book_form.html:278
msgid "Inventaire ID:"
msgstr ""
@@ -726,7 +727,7 @@ msgid "ISNI:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:115
-#: bookwyrm/templates/book/book.html:193
+#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
@@ -748,7 +749,7 @@ msgstr ""
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
-#: bookwyrm/templates/book/book.html:194
+#: bookwyrm/templates/book/book.html:203
#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
@@ -760,6 +761,7 @@ msgstr ""
#: bookwyrm/templates/lists/delete_list_modal.html:16
#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
+#: bookwyrm/templates/search/barcode_modal.html:45
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
#: bookwyrm/templates/snippets/report_modal.html:52
@@ -780,87 +782,91 @@ msgstr ""
msgid "Confirm"
msgstr ""
-#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
+#: bookwyrm/templates/book/book.html:19
+msgid "Unable to connect to remote source."
+msgstr ""
+
+#: bookwyrm/templates/book/book.html:64 bookwyrm/templates/book/book.html:65
msgid "Edit Book"
msgstr ""
-#: bookwyrm/templates/book/book.html:79 bookwyrm/templates/book/book.html:82
+#: bookwyrm/templates/book/book.html:88 bookwyrm/templates/book/book.html:91
msgid "Click to add cover"
msgstr ""
-#: bookwyrm/templates/book/book.html:88
+#: bookwyrm/templates/book/book.html:97
msgid "Failed to load cover"
msgstr ""
-#: bookwyrm/templates/book/book.html:99
+#: bookwyrm/templates/book/book.html:108
msgid "Click to enlarge"
msgstr ""
-#: bookwyrm/templates/book/book.html:170
+#: bookwyrm/templates/book/book.html:179
#, python-format
msgid "(%(review_count)s review)"
msgid_plural "(%(review_count)s reviews)"
msgstr[0] ""
msgstr[1] ""
-#: bookwyrm/templates/book/book.html:182
+#: bookwyrm/templates/book/book.html:191
msgid "Add Description"
msgstr ""
-#: bookwyrm/templates/book/book.html:189
-#: bookwyrm/templates/book/edit/edit_book_form.html:39
+#: bookwyrm/templates/book/book.html:198
+#: bookwyrm/templates/book/edit/edit_book_form.html:40
#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17
msgid "Description:"
msgstr ""
-#: bookwyrm/templates/book/book.html:203
+#: bookwyrm/templates/book/book.html:212
#, python-format
msgid "%(count)s editions"
msgstr ""
-#: bookwyrm/templates/book/book.html:211
+#: bookwyrm/templates/book/book.html:220
msgid "You have shelved this edition in:"
msgstr ""
-#: bookwyrm/templates/book/book.html:226
+#: bookwyrm/templates/book/book.html:235
#, python-format
msgid "A different edition of this book is on your %(shelf_name)s shelf."
msgstr ""
-#: bookwyrm/templates/book/book.html:237
+#: bookwyrm/templates/book/book.html:246
msgid "Your reading activity"
msgstr ""
-#: bookwyrm/templates/book/book.html:243
+#: bookwyrm/templates/book/book.html:252
msgid "Add read dates"
msgstr ""
-#: bookwyrm/templates/book/book.html:251
+#: bookwyrm/templates/book/book.html:260
msgid "You don't have any reading activity for this book."
msgstr ""
-#: bookwyrm/templates/book/book.html:277
+#: bookwyrm/templates/book/book.html:286
msgid "Your reviews"
msgstr ""
-#: bookwyrm/templates/book/book.html:283
+#: bookwyrm/templates/book/book.html:292
msgid "Your comments"
msgstr ""
-#: bookwyrm/templates/book/book.html:289
+#: bookwyrm/templates/book/book.html:298
msgid "Your quotes"
msgstr ""
-#: bookwyrm/templates/book/book.html:325
+#: bookwyrm/templates/book/book.html:334
msgid "Subjects"
msgstr ""
-#: bookwyrm/templates/book/book.html:337
+#: bookwyrm/templates/book/book.html:346
msgid "Places"
msgstr ""
-#: bookwyrm/templates/book/book.html:348
-#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:75
+#: bookwyrm/templates/book/book.html:357
+#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:83
#: bookwyrm/templates/lists/curate.html:8 bookwyrm/templates/lists/list.html:12
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
@@ -869,11 +875,11 @@ msgstr ""
msgid "Lists"
msgstr ""
-#: bookwyrm/templates/book/book.html:360
+#: bookwyrm/templates/book/book.html:369
msgid "Add to list"
msgstr ""
-#: bookwyrm/templates/book/book.html:370
+#: bookwyrm/templates/book/book.html:379
#: bookwyrm/templates/book/cover_add_modal.html:32
#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
@@ -887,12 +893,12 @@ msgid "ISBN:"
msgstr ""
#: bookwyrm/templates/book/book_identifiers.html:15
-#: bookwyrm/templates/book/edit/edit_book_form.html:274
+#: bookwyrm/templates/book/edit/edit_book_form.html:287
msgid "OCLC Number:"
msgstr ""
#: bookwyrm/templates/book/book_identifiers.html:22
-#: bookwyrm/templates/book/edit/edit_book_form.html:283
+#: bookwyrm/templates/book/edit/edit_book_form.html:296
msgid "ASIN:"
msgstr ""
@@ -901,12 +907,12 @@ msgid "Add cover"
msgstr ""
#: bookwyrm/templates/book/cover_add_modal.html:17
-#: bookwyrm/templates/book/edit/edit_book_form.html:173
+#: bookwyrm/templates/book/edit/edit_book_form.html:186
msgid "Upload cover:"
msgstr ""
#: bookwyrm/templates/book/cover_add_modal.html:23
-#: bookwyrm/templates/book/edit/edit_book_form.html:179
+#: bookwyrm/templates/book/edit/edit_book_form.html:192
msgid "Load cover from url:"
msgstr ""
@@ -976,110 +982,114 @@ msgstr ""
msgid "Back"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:21
+#: bookwyrm/templates/book/edit/edit_book_form.html:22
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:30
+#: bookwyrm/templates/book/edit/edit_book_form.html:31
msgid "Subtitle:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:50
+#: bookwyrm/templates/book/edit/edit_book_form.html:51
msgid "Series:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:60
+#: bookwyrm/templates/book/edit/edit_book_form.html:61
msgid "Series number:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:71
+#: bookwyrm/templates/book/edit/edit_book_form.html:72
msgid "Languages:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:85
+#: bookwyrm/templates/book/edit/edit_book_form.html:84
+msgid "Subjects:"
+msgstr ""
+
+#: bookwyrm/templates/book/edit/edit_book_form.html:98
msgid "Publication"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:90
+#: bookwyrm/templates/book/edit/edit_book_form.html:103
msgid "Publisher:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:102
+#: bookwyrm/templates/book/edit/edit_book_form.html:115
msgid "First published date:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:111
+#: bookwyrm/templates/book/edit/edit_book_form.html:124
msgid "Published date:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:122
+#: bookwyrm/templates/book/edit/edit_book_form.html:135
msgid "Authors"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:131
+#: bookwyrm/templates/book/edit/edit_book_form.html:144
#, python-format
msgid "Remove %(name)s"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:134
+#: bookwyrm/templates/book/edit/edit_book_form.html:147
#, python-format
msgid "Author page for %(name)s"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:142
+#: bookwyrm/templates/book/edit/edit_book_form.html:155
msgid "Add Authors:"
msgstr ""
-#: 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:158
+#: bookwyrm/templates/book/edit/edit_book_form.html:161
msgid "Add Author"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:146
-#: bookwyrm/templates/book/edit/edit_book_form.html:149
+#: bookwyrm/templates/book/edit/edit_book_form.html:159
+#: bookwyrm/templates/book/edit/edit_book_form.html:162
msgid "Jane Doe"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:152
+#: bookwyrm/templates/book/edit/edit_book_form.html:165
msgid "Add Another Author"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:160
+#: bookwyrm/templates/book/edit/edit_book_form.html:173
#: bookwyrm/templates/shelf/shelf.html:146
msgid "Cover"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:192
+#: bookwyrm/templates/book/edit/edit_book_form.html:205
msgid "Physical Properties"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:199
+#: bookwyrm/templates/book/edit/edit_book_form.html:212
#: bookwyrm/templates/book/editions/format_filter.html:6
msgid "Format:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:211
+#: bookwyrm/templates/book/edit/edit_book_form.html:224
msgid "Format details:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:222
+#: bookwyrm/templates/book/edit/edit_book_form.html:235
msgid "Pages:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:233
+#: bookwyrm/templates/book/edit/edit_book_form.html:246
msgid "Book Identifiers"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:238
+#: bookwyrm/templates/book/edit/edit_book_form.html:251
msgid "ISBN 13:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:247
+#: bookwyrm/templates/book/edit/edit_book_form.html:260
msgid "ISBN 10:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:256
+#: bookwyrm/templates/book/edit/edit_book_form.html:269
msgid "Openlibrary ID:"
msgstr ""
@@ -1168,7 +1178,7 @@ msgstr ""
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
#: bookwyrm/templates/settings/invites/status_filter.html:5
-#: bookwyrm/templates/settings/users/user_admin.html:34
+#: bookwyrm/templates/settings/users/user_admin.html:52
#: bookwyrm/templates/settings/users/user_info.html:20
msgid "Status"
msgstr ""
@@ -1177,7 +1187,7 @@ msgstr ""
#: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:118
+#: bookwyrm/templates/settings/themes.html:100
msgid "Actions"
msgstr ""
@@ -1321,16 +1331,18 @@ msgid "Community"
msgstr ""
#: bookwyrm/templates/directory/community_filter.html:8
+#: bookwyrm/templates/settings/users/user_admin.html:25
msgid "Local users"
msgstr ""
#: bookwyrm/templates/directory/community_filter.html:12
+#: bookwyrm/templates/settings/users/user_admin.html:29
msgid "Federated community"
msgstr ""
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
-#: bookwyrm/templates/layout.html:101
+#: bookwyrm/templates/layout.html:109
msgid "Directory"
msgstr ""
@@ -1450,7 +1462,7 @@ msgstr ""
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
-#: bookwyrm/templates/layout.html:78
+#: bookwyrm/templates/layout.html:86
msgid "Discover"
msgstr ""
@@ -1573,7 +1585,7 @@ msgstr ""
msgid "%(site_name)s home page"
msgstr ""
-#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
+#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:242
msgid "Contact site admin"
msgstr ""
@@ -1587,7 +1599,7 @@ msgid "Direct Messages with %(username)s"
msgstr ""
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/layout.html:111
+#: bookwyrm/templates/layout.html:119
msgid "Direct Messages"
msgstr ""
@@ -1624,7 +1636,7 @@ msgid "Updates"
msgstr ""
#: bookwyrm/templates/feed/suggested_books.html:6
-#: bookwyrm/templates/layout.html:106
+#: bookwyrm/templates/layout.html:114
msgid "Your Books"
msgstr ""
@@ -2176,7 +2188,7 @@ msgid "Login"
msgstr ""
#: bookwyrm/templates/landing/login.html:7
-#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
+#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:187
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr ""
@@ -2185,7 +2197,7 @@ msgstr ""
msgid "Success! Email address confirmed."
msgstr ""
-#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
+#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@@ -2193,12 +2205,12 @@ msgstr ""
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
-#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
+#: bookwyrm/templates/layout.html:182 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:45
msgid "Password:"
msgstr ""
-#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
+#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:184
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr ""
@@ -2230,19 +2242,23 @@ msgstr ""
msgid "Search for a book, user, or list"
msgstr ""
-#: bookwyrm/templates/layout.html:64
-msgid "Main navigation menu"
+#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
+msgid "Scan Barcode"
msgstr ""
#: bookwyrm/templates/layout.html:72
+msgid "Main navigation menu"
+msgstr ""
+
+#: bookwyrm/templates/layout.html:80
msgid "Feed"
msgstr ""
-#: bookwyrm/templates/layout.html:116 bookwyrm/templates/setup/config.html:52
+#: bookwyrm/templates/layout.html:124 bookwyrm/templates/setup/config.html:52
msgid "Settings"
msgstr ""
-#: bookwyrm/templates/layout.html:125
+#: bookwyrm/templates/layout.html:133
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@@ -2250,42 +2266,42 @@ msgstr ""
msgid "Invites"
msgstr ""
-#: bookwyrm/templates/layout.html:139
+#: bookwyrm/templates/layout.html:147
msgid "Log out"
msgstr ""
-#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
+#: bookwyrm/templates/layout.html:155 bookwyrm/templates/layout.html:156
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr ""
-#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
+#: bookwyrm/templates/layout.html:183 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr ""
-#: bookwyrm/templates/layout.html:187
+#: bookwyrm/templates/layout.html:195
msgid "Join"
msgstr ""
-#: bookwyrm/templates/layout.html:221
+#: bookwyrm/templates/layout.html:229
msgid "Successfully posted status"
msgstr ""
-#: bookwyrm/templates/layout.html:222
+#: bookwyrm/templates/layout.html:230
msgid "Error posting status"
msgstr ""
-#: bookwyrm/templates/layout.html:238
+#: bookwyrm/templates/layout.html:246
msgid "Documentation"
msgstr ""
-#: bookwyrm/templates/layout.html:245
+#: bookwyrm/templates/layout.html:253
#, python-format
msgid "Support %(site_name)s on %(support_title)s"
msgstr ""
-#: bookwyrm/templates/layout.html:249
+#: bookwyrm/templates/layout.html:257
msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
msgstr ""
@@ -3013,6 +3029,44 @@ msgstr ""
msgid "Report"
msgstr ""
+#: bookwyrm/templates/search/barcode_modal.html:5
+msgid ""
+"\n"
+" Scan Barcode\n"
+" "
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:23
+msgid "Requesting camera..."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:24
+msgid "Grant access to the camera to scan a book's barcode."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:29
+msgid "Could not access camera"
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:33
+msgctxt "barcode scanner"
+msgid "Scanning..."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:34
+msgid "Align your book's barcode with the camera."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:38
+msgctxt "barcode scanner"
+msgid "ISBN scanned"
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:39
+msgctxt "followed by ISBN"
+msgid "Searching for book:"
+msgstr ""
+
#: bookwyrm/templates/search/book.html:44
msgid "Results from"
msgstr ""
@@ -3046,8 +3100,9 @@ msgstr ""
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27
#: bookwyrm/templates/settings/federation/instance_list.html:44
#: bookwyrm/templates/settings/layout.html:36
-#: bookwyrm/templates/settings/users/user_admin.html:3
-#: bookwyrm/templates/settings/users/user_admin.html:10
+#: bookwyrm/templates/settings/users/user.html:13
+#: bookwyrm/templates/settings/users/user_admin.html:5
+#: bookwyrm/templates/settings/users/user_admin.html:12
msgid "Users"
msgstr ""
@@ -3514,6 +3569,7 @@ msgid "Date accepted"
msgstr ""
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:42
+#: bookwyrm/templates/settings/users/email_filter.html:5
msgid "Email"
msgstr ""
@@ -3932,7 +3988,7 @@ msgid "Add the file name using the form below to make it available in the applic
msgstr ""
#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:101
+#: bookwyrm/templates/settings/themes.html:83
msgid "Add theme"
msgstr ""
@@ -3940,28 +3996,24 @@ msgstr ""
msgid "Unable to save theme"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:61
-msgid "No available theme files detected"
-msgstr ""
-
-#: bookwyrm/templates/settings/themes.html:69
-#: bookwyrm/templates/settings/themes.html:112
+#: bookwyrm/templates/settings/themes.html:64
+#: bookwyrm/templates/settings/themes.html:94
msgid "Theme name"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:79
+#: bookwyrm/templates/settings/themes.html:74
msgid "Theme filename"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:107
+#: bookwyrm/templates/settings/themes.html:89
msgid "Available Themes"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:115
+#: bookwyrm/templates/settings/themes.html:97
msgid "File"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:130
+#: bookwyrm/templates/settings/themes.html:112
msgid "Remove theme"
msgstr ""
@@ -3979,43 +4031,39 @@ msgstr ""
msgid "Your password:"
msgstr ""
-#: bookwyrm/templates/settings/users/user.html:7
-msgid "Back to users"
-msgstr ""
-
-#: bookwyrm/templates/settings/users/user_admin.html:7
+#: bookwyrm/templates/settings/users/user_admin.html:9
#, python-format
msgid "Users: %(instance_name)s"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:22
+#: bookwyrm/templates/settings/users/user_admin.html:40
#: bookwyrm/templates/settings/users/username_filter.html:5
msgid "Username"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:26
+#: bookwyrm/templates/settings/users/user_admin.html:44
msgid "Date Added"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:30
+#: bookwyrm/templates/settings/users/user_admin.html:48
msgid "Last Active"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:38
+#: bookwyrm/templates/settings/users/user_admin.html:57
msgid "Remote instance"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:47
+#: bookwyrm/templates/settings/users/user_admin.html:67
#: bookwyrm/templates/settings/users/user_info.html:24
msgid "Active"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:47
+#: bookwyrm/templates/settings/users/user_admin.html:67
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Inactive"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:52
+#: bookwyrm/templates/settings/users/user_admin.html:73
#: bookwyrm/templates/settings/users/user_info.html:120
msgid "Not set"
msgstr ""
diff --git a/locale/es_ES/LC_MESSAGES/django.mo b/locale/es_ES/LC_MESSAGES/django.mo
index 43db15d9d564c104654b5a2f27f668fb4ecbd918..ff4ad1d4996bb4a39f8a210854b7bfa648db2dfc 100644
GIT binary patch
delta 21021
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
delta 21094
zcmeC`Wo_?ct-mM4GL?aWf#D`I1A`0$1H%(J1_pIj28K1ZAW;Sek01sH0|o{L&maZ{
zEd~aLsvrgiQ3eKvr9lh~vJ4CiyMq`Qyg~Yd7#N%w7#LK885nFB7#K2w85r~!7#NlY
zGcbfPFfd#RW?+bCU|`S=VPH7Kz`)QQ!ocu~fuWwkFO-2nnt_4AGK_)2h=GA2Gz?-<
zM;HTx7y|>t<}d~ZB?bnDQ(+7Y#taM$Z^IZE92giF6vG)90vH$=lENVl+#JrpAP@3D
zI0FMe0|Ns~1OtOO0|SFd1OtNt0|SFj1OtN)0|SFERD2eQW~^sm*c8FQAOf-=l7V3h
z0|UeTNQlNMQ4k-liDF;~0m(-(FsLywFvv$k#NDDH`ck4H4y=r3U{GXWV3-rlz#zxK
zz_2eG5>j`g85krP7#Kc7`Mfa<3^5E049YPK4E*&B3=9o13=Ad=3=9)u7#O%17#NO%
zBp4VNF2pb}s4_4xJcwan;A3E5V2g!>lxQpiLly%AgJCQKLo>+2SOx}V1_lO&I7kS(
z#4#}BGcYieL+R&n3=DY;3=HA%3=F{x3=GHO85j~67#O4y7#QkP7#J9;6BrnxKo%u1
zFhnviFjyx-TsSom5{I7>85oj5L7v3GkjTKm(3-@+pv%C(@H~luL6CugK{T0xp_GAv
zK|Ps)L5G2XVQwU+@~-wRDnF0!cY&k&^r|pr%O{IasDio
zfx(o4f#Gi|1A`_51A}oI1A{*U14C>YgugZo5*63e7#LU?7#RLRX_j;b24MyU2Cj4l
z1~vu;2Dx+w1`bf7OlM%=Wnf^?OJ`tUXJBBkfy%q2*Fyxnp#s6_5FbTBHRM1wR6z}D
zN@rkT2KgWz5;gtl3=BdH3=CV-AyIcCoq>Uefq~&NRQ-c=1_n+B28NgEkVN@89TJty
z84z)ydMHCC17d($2E?U?84!c)GZ+{I7#J9QpmZ!$eO?B{po$Cz26YAohV~2w25trh
zhV>Z`5A4o>`21`J1A`$01H-ipNQiJ`Ld@gOgm}DOArlgW8krCa^)ev_TW3NH@XCbv
zI5-pH;&3RPm$0|P@xCd9%WnUKWzDie|mWV0Y4Wt;_xTDL54ny6=}
z$zotI10|X)hy$)^&pd%Mz;RLAqc~J3}3=9lAq3ZYLLPF>|RQ+?P{8y+0e&sSSu!8bG
zTOP#cJb4fcB=aB^DCR-pQa=ykAjdq21p#@GI1J5$I4~^_;_$*e1_mnz28NbANH*RN
z)hC(Hz%YSunq80cFJiNnNVNYOi|7?SEw7egFi
zUIGci@Dhka<4Pa~r>lEH?15JLbJ=kK4REd4hfONP<`jiAr89(rJt2UJoo{`2j&0YP=%}&5D6hD
zEeoYJptNxX#36PSAeS>RctgdbD)a9fPVrQvr#(I~9g%e4SUj%^;*r%=kf=RdRS!v>SE|6Z5yP7*h)a2^AqL4*LxM`R
z8WP85)ewz7)ewgTS2Hk#GcYiuS2HlEFfcIeuZD!olWIsv{H%tgdd?b%dZikO!^~S2cAGJ
zdJA>H{~Ach3D-greZ5>Q#6lgYfORb-Dm-f;2Kv`R9FSDY0B)Y=)j~pGVJ*a`D{3JQ
z-&+f56(6sKIN&K%{1sIH7pOQx9mHbRI(md$Ms)rOr
zdi9Vf@v4V7BnsL_Os;2OIL5%hkPTID)BusUYk;VCZ-7Kicmv2_28P@Qh)?SqAR*if
z6`uoDx2}PKK>(Ehk3bb(ZGZ&jV<`O=s_}aR#HVbH5Q}&l!9m9$+XzWaMvaj6zf~io
zEg07biMqB%hy!OfLPB;?Bg8?=q4d^928Mc2$Ko(l;U%aAw;Lf2dEE#}EMFTTA;i!G
z@flAO#36D`3=DptW_1%J8`d^Kd^)!YqJB*iBnoykK|&>WEs(UbvIUae*0(S)
zSTis%9BzSx*#8!Y$3$8oT{gMadIp9K3=9m8tqct77#J8nwL%P7*amUX@-~PCo7*5!
zaHtL9@{?_lKHh^iNEG~UgXm*#hv?&NhwvraAr{NGLqg7^9TFmL?T{8!czrv>r~U2F
z`o0}v;AyCa%k7Xd{b@TSaWZs3ifWk-NZeX>Kn!&1fHbRvq2irT@kvnr;toiNt?7V-
z!1fME8mT`BWnAfixb%4k14AYQ1H&IEKdlpDVRa|Op);WL(oTp$n>ryr-O~vP@4bJ=>{9j5Cf(2yCD`gbwhH=l5U6tPIQAhEcFZwx4I!d;p%}%
zh(Kwz9!OkT^g!wcmmbK#L~0KtDkk(m9J&Uo{&Ww-oVz{HknDj(<)0o%2(k1+(hyfK
zB!mQe85np#`Cq;l;zONYhz8SMh(Wecara(GH#(pfl16s-LJWM>3kli}y^u=gYcC{Q
z^7TPzxjsnR(CdSkYu^VML2>Vc^tP+}7#Qk7-Qzud5SJb8gIIh9N?(I&e9#AR@ryo4
zV*J(z32MQ9NStf-Lqg6L%J=Vwn3voS8TrWShd8jMpMgOG)Ya=}V9*8)MD#P%gS*F{
z`XN5~(+^2xj1wR<-vmgdBRv5Uq<#}1K1rSc39)P_zhnX=?bJ+w_`G`pqhWI053|TNCObK7KO+;^J=;AaVY80wfV}PK4C!G7}+j?l=)*LF`0GcFLUyQC|V&
zw@idYP5(rQc~d7s96Dzr#Dhzr;;SY?JhHKVBE;o8Cqhc96HtXLlOQ3$ISDelB{m5X
z1@2Js&`A(|Ns}NBDx3r{un{WXISCT<)1dk`OoBLQAC!L-%CEl+HQ*Lh;1!hraS|lR
z87D)0C^i|wSDFm*q4{Kpfwq$&QRFfiQUH}th7Qq8hGgsOP<`(vL$WXP6o`3>Q@|dp
zXV9Gj@k!hih!1k7K!U7v3M8@BO@SCVa|)yqIXndtWjCil#(*AAfg~=jsStyer$Wrr
zhthUaA^G2TD#ZN!sSxwar-DMbo`IoZD#S;5zg(bUK7@HXYp?lT|-$krK|>LVqU{cNEA+-3C;hrXF`0wbSA`y$7Vu&
zd}$^m`#qltaXHT{h=E44AU?I41@XDZEQrIxXF)K17~JK9DaQ^
z#9@!2=6!_f`#BpD=bUpO<_OGzl%NXrb0DeMVh+Rs@pB+PNrx&dm;-T015|wC9Ed@)
z=0F^}5GuZU4kVRtnFGls*XBTS&l{+@>~kTN7yn#{1Fhyl^w)dLg}5kaE+h>k&4oB1
ze=ek{RRPs-X)YwFA3)W;p9=|@KXV}=!Z#11Pjw!|BE5N#av^da#QdIl3=Ec_!RmPo
z3>QHIk`R79!;1Nk{QYP?q`v1_00|na1rYI|1(38+vw(rY3siYP=@$ziwW0AsNWqe{
zkbxlrG@8B;qW|VX28K-x3=AI^LekQbMUX_ea}i{)`^+Lx)YmgGs4r$
z<$D%G63flS5REcRAaQKC1d^(4mO!GwX$d6CJfY%&OCV_=dc0Tx-&zKV`^QjqAD1yO)Ptr`=Okz32A2?fq~)f
zYKRL<)<8m}X$>UKd)7byK*D)}}F)%RHpIQfL#cHmHy?{0@!$hHF#bfG&K7@Qdx7#8e+IOqwKZ?qE<
zb!9stiE_tINU!iMg1H*059Pk-PH7b4<64&}?AsPeDLQ1;jXCVe2Jqxkm-C0Oejq@DDV7+sYvOn+~
zB>Uw;>E3e?hpjya4zYTM1Lq*wLFPQfXFBI0`8xSLL}A`}Ncqrs9+JP;orgGJ?|BA>
zE(QjM+vgb=dKnlP(k?(8@Z|!ebu4)ilC6C&GBD&YFfbgr2$>bvy#z_rb1#7wB-Ar7
ze7ppSo50JE7SFEBV3#q7T!Ez0f-8`Q#@Q>7?D^*kNFxJ7@>S3P0t3V0s}P5NzRJK*
z1DdA4261rnH3kNIP=R%gfuWp%f#Jh72Jkd}#&t+G?zzsu02+T{xPBd?Aod2t!mBqR
zwVTmRNI%{ACM0fKZbE!?_$I`sX15@TGWr%I+x6ap)D@F&fs0m#xwjy>V&g4H>fd<_
zV(y_^kX&^67PS3;3##A|RN^&M;ip@WT9NrS#30ez5DR3XeD&Lq+@OCO5(3e;A>~2d
zZHPrRP=4=iNYu@~4N1(aZbNd<{@V=o;FS$mZ$r|+6Da-VHl$C-atGo7**g%v{vAjn
z^|%AEC<)3hxC4pvt~(HO_T7P4bnXtMBz=4bQo???1Mz^`U5L2`ccJya(_M&xzIP$@
zcl2F|K}~ldK{e?vB#39;h4^efl-_U`(q=q(7ZL*Z?n1ipAMZk1ySn!vboxC=+%LQb
zX`&sy2Z`D{_4gpzL-szT2)4Zs3F^H2kT@&553#WRKE&k{?lXW!VHsxKhm;Sp4aLAQl{X1hMeUBS@6ofr@{71PQT!k03r~eGG|f&Bu@+w|@+=FYqxq
zis~6+A46PP^cdpP>cehR4*
zenaJDpFtd^_6)Kp#p)TPWz+Qx5~R1EK|J#686?DhKZAsTnKm!P0vV2FANktlfyaY)@uNSt-Pgjh5iO7DCL@xk?%
zkX&>BCB(sRq3VA^`P{D{`o&*CLPqlyBxEdJLDYM`VyFkNS_y?JOne0i`r=oR60i9c
z#3zSdK?Wo~zJgRn@vk8cYB&1(J`F~%7
z=6@I%7>EfLX?+9ndEXm|1Li>K)o&niz3UCc
zq6<*{Pv1Zs{`CzcSBSlZM3q%Nlo9wAQk`bJg;XLF-$H_j?;XSLFR_2~zQMH*0X>kkkEJ)rz>sJfI75Qi2))ptY1=Y4=!xaI>SL{32EnLa{%
zF8UGDK(PnY^$ZM2A0aMn{Rk;QW`2aYaNkFW!%lsK1o?Ha1_p+gA0ctf^9f>+(kDoW
z*nNVe8TU^R2SQh9ugw&k%FVK0`cE2bG`j84`61KSRg=_kV`O
z{fWzCc>N1z#W`c=8J*b-()pDS%kN
zLd;iy(pFy~=7xM_s0S~fi~9;OsPHQ!^|pV7_+S!L;i9jQAYStoQYmfy3JLm4P<`*9
z@+{vV*^c)cM73idPvX~LKSpy&^LmcSv9il%LN+*AZq>0S$5PcQjAt6&={~Z$Kv!Dw0
zeuor9XTC#xa1l!1f*SM~O27OL>D#^k4vAyyACRDT{sGaK0i_FnKzv;F1LCnMP-AP)Zp
zu`uHoBn>n{`7?h(LTd9bNYtJ91rC9Fh9|!uasU4pB$0{!hNJ;aC~fi^;xPN)5TE+}
z25V#p`wa=X!rzeWHRU&?=d`~wMk@jsBbmjl!F3=9T;ATD$I
z12HK455&ThKM)Ix|3D0?{sYNwEq@^Gf$4uB)$qCs5k5tP4)31ZGc
zCPwhu^5aa5;FXk5m>9t;qW>~6)`PQ?I5Q)733eDWBY2TXHZvo5{q8)d_)=y@2GEk~
zUCfN&^?f&)AqIY7W(2SC7G#0&HCY(J-EKD)M)1614+}(o8kE0|g%RA|*a77qVX23>
z=o|~gMbB9vd`4DAh6>OUX;wz?YWK;kj0~WVTFJ@?UPyeNl@Yx1`7SHO!1t_-;Dt=T
zSs~^yvoV4THd!`^!wuLV4)SM%gjggS#Gc-IHb(F&_hnFpd)XMl%j)m2F@jev{9U)WFUNUTDazQNK&jm>vH@P5b;RP2YYTrS`>lwa6HL!3)6bf-ef>MziqEM5Y
z5xgqifSVD#hSQpx5xidbG*q662cn*nhY`H|UXTak5Mv%lnsVlWL`4J-BY3Pin}-p+
zf1reik-?Xto`GR24jkMOy?I!JA1=2|!#bCI|@uSwTp?HWY*eZMh&M
z1bPG^KAsB|-zo_4$SFZcBD^99iK<6XK9dl{Ap$}Whf508Lo8Aef*7bR1mW8VK@yR(
z5F{vrg&;1@5rQP93L%I^-B1Ik3NeCbx8?~!g8YUMBzFi4L(+(&FeJp1gc-rvw^A6A
z*yq&?Lkfho!VsT66o$C)t1!fZf5MF5-7y>@kVK>+0!eKCA`l;BiZFtQ>q|r+7Ht!O
zc;vbWBxGJdX$Db7@JOqKD8zghC|&O>3JIz(QHX&lqL3iY7lp)Cizp=3_lPnw%mIyN
zi!y@O`CE%Y49bSmC1Q{`uN7kiZ`EiLgXq5`264zOsJc&L5C{Gi1BY}y1CKaFKv*2&
z5EXGqVlxtlSR5@535i^BNQqVs6`v-~2%c_V0p&jxhdBH@l+Pmp3353JNR*jMKpf;D
z0VyW}BtYiZGcXiMfL+4S0#(>80g3B*5{%&C_*D`Riv=YiMW=xzByGe>LgFx25@Jz}
zBqYu!OENNmR>dEbgqZV765;_iDM%CxNI@K+BE`tS3(Eg)QjqKxBE<+^R-Y&ZF?gmF
zq#Rfw#R%R7b6AQIyrt@`6vSW|X-Lp&NJB!&L(6AJw)RfIf%=z%0Z&y
z8Pvefa*W_fV*$ky0Dnf#sUkQ?LRg@t0e1H-ocjaGvMWwsh5lXWk%3{p8pJ#=
z4T!o#4My;Oz-$dh&`zp)hC><k
zJ~z~a$Omge%KT)ge6uFRyqTJi0&b}$B&s%Of;?8wz;Hqn;^OC;kZSg~CL|3QX+aFM
z*McM#e=SCacc9%aP;p;vMutkzrZjDc{_ENh2ffyYq!C6Ph=+uAAWbzH9f-Iylpm_Y
z2-*Kv1C{8}fuw7x{$OJtP5#q
zWavUXFhLiRE9UD$9J*7Nk)a;6E$+N7B#7=p4R{GP_?IrkXFPfk2Px=5)EVnRg3?|O
zVvv^}#HR^*kb)&s50Y5hpz7D?K|*qe9whCYfQnzxW2}d?cJ&~M4&G-1
zaX_3Y#G;9&kf=Fs3JJlRrjTs>)|3%E4=8B{F}JDS4C3>%W{`Hk6ElcUCCni~tOTWX
zp|piLBSRSj1B0_UBX~RQE~vPa1tg?Yp|q(5#2i-(NNV@DU9kSudN}~uA&Vj1UhUW
zb;D#EPXJCl2hxlNHJ;cS|?HR#)I
zhB!k~X|gjU1P(#@pPV6466gZ4IKljpPSk$S`p;=^Zdj0}vB?cfYAKua7z`@Nxj1x5yj
zPmBxT9&;mTH9Z3ZXm2-z03!p#WJU%Cb4CV+i;N5mJ0>5r6|R5H$iVQHiGkrc
z69dCXM#ye(kYOho85mYDGcep?Vqmzy$iVQ3k%2)BYAtA&ffFMGLl~3~8iAS&+IIue
z2*tmd7#OOU7#KD)GBD^sUAYu02ih3U2HLm_8os;3z`!t(fq_91YFI4DJB$nr^-xWq
zdG!BGkiFGu%nS_MKueXOYP}~OjJ>5N9xGFhWLiKw?jz@>x(hkl1^uSUAX4j0_B{ObiU{ObiSw
zK%3?xnIK!be=>pRwHRy}85p)RGcYV>f{Z(Y3;85oQhA*(_Xpk_Q^f-Ffm$_ySnt!KCd
zG7O}efq`Kyl)V8;S3os^TJ}Xu3=Fpz85mYGGcYtTLRNa*g6cD2W?+bAVqmalVgMHt
zOPL{K;UMX+3=9lP%#e}bA507kcA&h;$iQ$FD{Br!2C9Ajc&IKTv1@zKHzS(F#S
z$iQI71Q})q>0^jwgbeBSGchofFf%ZG02OVZGbb1r80JsD=phAyacLCOOdAtTxC
z%nS^Hj0_AZP&v?Au$NG_4I=}?az+M*K8SfBpMkV8Fsx)^U@&50U?^i|U}%K;oexwR
zFf%alFflOngDiv^Vg!{3=~Q84V5nhcV6bFlU^valz)%ZSGo6`%VJ(ymQs>Idz#xmn
zk7iC#~nHd<;pazIC
zGB5;z@(L)DnIXgL`pgUrE1?eaWM*J^!N|a{1GFt4l*$+w7(AF57|t^=Fa$F*F!X?q
z>0o4F_yZ~_K(6a!W?(oA)qEThGz_yqWg_Un5vZjgb@7Z04Bk+6pu<9>m>C#OF*7i{
zWMp7SV1%sQTFAt}AjinSu%3~Dp&P0eG&~Q|Z^q2Pun=Sy)Xe$~P|G+$u4iOm2xnwq
zh-GGAc+3DkX6Xj7#SGOF)=V$GBGf;Le&&7
zGcY`1VqjPd>Y;*aRYnGe1xySKVoc!KT82cBUSwY5QOOMz09hQ3Jm=Fx+5d
zVA#dXz_5#nfuWCyf#D+5k&{4%K{4o@m%UJPSeO|Yw4iE0H5J2gW(I~1M#!|97Bd4w
z8&onI$sr(flo=TqW`IfosCYZ5T4QElI1W{RpOJw4)&&U^uh9cG5i=ez<{S)het
zObiSxObiS>j0_AvLE9^t85piHGBEftGcYV+U|=w1hAdQ5ftoXsnSr4hRAYd07bv$e
zGccS184POdfaq>ezGY-!=wW7HI0ss{%>-H1xSxT6!3pX(4n_us6O0TDiC$3wW7$IxvKnLuIfEt*fvr!l!8+X?*GceRa
zExZfLbD-t`BLjGm?rdfTh8YYD3_F+^7`{Qx1f7w?3qEs%fq|iyiGkq+XkR4M5%WP7
zLJg~6W?-1d$iUFX$iT1}R248XFzjVuV90|Sqy#E=K@|W414ALG000&23=9lipi~0N
zTg(g${}~w=JSHo83fCWmde0q7gDeD%ysm-rzc4W{2s1G-yaY)wFfc5H+Omj|fguyh
z2A!@0I{aiRBLf3FsGI`jZm8ULP#T81T#b=|;S>`C!)&No;P3_wUV`}hK;B_yV9;iU
ztU0rQIsmk}0VEGPIs`;dVq#$EfEvgJrAwh|LGu2f`W;jD)32C6!k85jhZ
z85kxoGcX)uW&ro#L6(7V1|tK*br1uJ7lCRAMh1qXP@7Ie>CX%d45iEr3^Sp8kn*j}
z;1yky+r4?~eW0G01$F;TCI$vkW(M%tH%=gbfC_U^Va>$A5Cb)%fRTY=H&p$1s8~Lf
z-VQbIGBX2%22>1WC+Og(uS^UK+>8ti&p`qV;B__i3{w~(>*1^!85nXv{RXI}+l&kh
zE{u?6%0ECoLa2oxy+TY34DnEP=Rr*uP(=X?XCI*H}p!O7~
zkcNuQhSKGX3=Gy#{SQGIjDdmS4JbP^F)(mI9i;{GBr^lUD<%epv!Lxvpk%89H9(k=
zfng6L0|O{2O@V5d!N>p}UrmRqv4mOx3Wap2nl+3J41b~WpmVggLd8L9)-y9O%z?_;
zgVt*^F)&OAB{xt#4eH0-f+{}D$iOfigc%qZ&Oj|OXJ%m70F?(F+ygp@?L1Vjk{Pnx
z0b~j2j2sXR!tTrr48K7c4XW=tlm-ofg5-Uf85kykY9vr?0~%~DWn^GD3w2=^sHw}y
zz%Z4Gf#J;L#sJ~THhvuS!psZ|KcOl>`wl_I^n#Kkh{3?XkPPZnGD6mmsDj$!P_>}t
z+eern$3B3RCNnWG%mwv)7#SG&nHU&sp-y9BW?%>cwLh2`82*5o4WLd3)C_rMhI$5H
zD94qFf#EBZ-2$bLf?8AzkORuzGBPj}FflM>Gcz!JVPIfrV}>l-1I@7Kg9;H)dlgjb
zfr?d70~&N18#4p=5H*kk*D*0L?1!2Q;%{PNVAup|3~dG-KE}+zFbmW#XM`;Ii(qD8
z_{G4$kOeBgK?l__Gcd$KBWEwDH;QD?dnN`32T<>ZiGkq_6J-7QQcwdL)WL+RdjztP
zfq`KUGXn!RNF5^sLpuWlgF`)Nkbr@KVJb5NLk_653=KBW5isXKj)3yFfl39aVJjIJ
z7`{UdJPc~^fP4*Fj{q8=VPasI0P0kNnt`AVZ=gf(K=}kzheGwJFhSOy@PdYjb}=w8
z`~dBwg<4e2%)lTH^=Tofat58U2Wp2v#Xu7T!AuMccNiHM(ij;So=$EI5a-MV_0Sj@
z7z`&b3=p<00S!DbGB7xUy3~ve3^AY)B}N8@0A>aTKTw4O8odB@pP^=g_BPC6W?)zV
z>cCF^7$BU>%E-WQ88qeub+Rfm1H*j=28QdP@MBj_
z8RMbqK*AYJ3=AQY4+hE`ZUGH2F*7jyg@&Rx)E(u_3=A7VN*Nd!4nTD}Gcqt-*(?|&
zqrj7zSE5j!Sd^EUmu@v#qo{z@y(qu5VDf|_CD!1K)SR@\n"
"Language-Team: Spanish\n"
"Language: es\n"
@@ -220,7 +220,7 @@ msgid "Followers"
msgstr "Seguidores"
#: bookwyrm/models/fields.py:208
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:8
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:6
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
#: bookwyrm/templates/snippets/privacy_select.html:20
@@ -261,73 +261,73 @@ msgstr "Citas"
msgid "Everything else"
msgstr "Todo lo demás"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home Timeline"
msgstr "Línea de tiempo principal"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home"
msgstr "Inicio"
-#: bookwyrm/settings.py:208
+#: bookwyrm/settings.py:209
msgid "Books Timeline"
msgstr "Línea temporal de libros"
-#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:209 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Libros"
-#: bookwyrm/settings.py:280
+#: bookwyrm/settings.py:281
msgid "English"
msgstr "English (Inglés)"
-#: bookwyrm/settings.py:281
+#: bookwyrm/settings.py:282
msgid "Deutsch (German)"
msgstr "Deutsch (Alemán)"
-#: bookwyrm/settings.py:282
+#: bookwyrm/settings.py:283
msgid "Español (Spanish)"
msgstr "Español"
-#: bookwyrm/settings.py:283
+#: bookwyrm/settings.py:284
msgid "Galego (Galician)"
msgstr "Galego (Gallego)"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:285
msgid "Italiano (Italian)"
msgstr "Italiano"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:286
msgid "Français (French)"
msgstr "Français (Francés)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:287
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:288
msgid "Norsk (Norwegian)"
msgstr "Norsk (Noruego)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:289
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugués brasileño)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:290
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:291
msgid "Svenska (Swedish)"
msgstr "Svenska (Sueco)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:292
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chino simplificado)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:293
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chino tradicional)"
@@ -598,11 +598,11 @@ msgstr "Alias:"
#: bookwyrm/templates/author/author.html:48
msgid "Born:"
-msgstr "Nacido:"
+msgstr "Fecha de nacimiento:"
#: bookwyrm/templates/author/author.html:55
msgid "Died:"
-msgstr "Muerto:"
+msgstr "Fecha de defunción:"
#: bookwyrm/templates/author/author.html:65
msgid "External links"
@@ -727,14 +727,14 @@ msgstr "ISNI:"
#: bookwyrm/templates/author/edit_author.html:115
#: bookwyrm/templates/book/book.html:193
#: bookwyrm/templates/book/edit/edit_book.html:121
-#: bookwyrm/templates/book/file_links/add_link_modal.html:58
+#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
-#: bookwyrm/templates/groups/form.html:30
+#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
#: bookwyrm/templates/lists/form.html:130
#: bookwyrm/templates/preferences/edit_user.html:136
-#: bookwyrm/templates/readthrough/readthrough_modal.html:72
+#: bookwyrm/templates/readthrough/readthrough_modal.html:74
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
@@ -748,20 +748,20 @@ msgstr "Guardar"
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/book.html:194
-#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/file_links/add_link_modal.html:59
-#: bookwyrm/templates/book/file_links/verification_modal.html:21
+#: bookwyrm/templates/book/file_links/verification_modal.html:25
#: bookwyrm/templates/book/sync_modal.html:23
-#: bookwyrm/templates/groups/delete_group_modal.html:17
-#: bookwyrm/templates/lists/add_item_modal.html:42
-#: bookwyrm/templates/lists/delete_list_modal.html:18
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:23
+#: bookwyrm/templates/groups/delete_group_modal.html:15
+#: bookwyrm/templates/lists/add_item_modal.html:36
+#: bookwyrm/templates/lists/delete_list_modal.html:16
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
-#: bookwyrm/templates/snippets/report_modal.html:53
+#: bookwyrm/templates/snippets/report_modal.html:52
msgid "Cancel"
msgstr "Cancelar"
@@ -770,9 +770,9 @@ msgstr "Cancelar"
msgid "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr "La carga de datos se conectará a %(source_name)s y comprobará si hay metadatos sobre este autor que no están presentes aquí. Los metadatos existentes no serán sobrescritos."
-#: bookwyrm/templates/author/sync_modal.html:22
+#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:108
-#: bookwyrm/templates/book/sync_modal.html:22
+#: bookwyrm/templates/book/sync_modal.html:24
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
@@ -873,8 +873,8 @@ msgid "Add to list"
msgstr "Agregar a lista"
#: bookwyrm/templates/book/book.html:370
-#: bookwyrm/templates/book/cover_add_modal.html:31
-#: bookwyrm/templates/lists/add_item_modal.html:37
+#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
@@ -1182,7 +1182,7 @@ msgid "Actions"
msgstr "Acciones"
#: bookwyrm/templates/book/file_links/edit_links.html:53
-#: bookwyrm/templates/book/file_links/verification_modal.html:25
+#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Denunciar spam"
@@ -1216,7 +1216,7 @@ msgstr "Saliendo de BookWyrm"
msgid "This link is taking you to: %(link_url)s
.
Is that where you'd like to go?"
msgstr "Este enlace te lleva a: %(link_url)s
.
¿Es ahí adonde quieres ir?"
-#: bookwyrm/templates/book/file_links/verification_modal.html:20
+#: bookwyrm/templates/book/file_links/verification_modal.html:26
#: bookwyrm/templates/setup/config.html:139
msgid "Continue"
msgstr "Continuar"
@@ -1292,7 +1292,7 @@ msgstr "Código de confirmación:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:73
#: bookwyrm/templates/settings/dashboard/dashboard.html:116
-#: bookwyrm/templates/snippets/report_modal.html:52
+#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Enviar"
@@ -1326,7 +1326,7 @@ msgstr "Usuarios locales"
#: bookwyrm/templates/directory/community_filter.html:12
msgid "Federated community"
-msgstr "Comunidad federalizada"
+msgstr "Comunidad federada"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
@@ -1806,7 +1806,8 @@ msgid "No users found for \"%(query)s\""
msgstr "No se encontró ningún usuario correspondiente a \"%(query)s\""
#: bookwyrm/templates/groups/create_form.html:5
-msgid "Create Group"
+#: bookwyrm/templates/user/groups.html:17
+msgid "Create group"
msgstr "Crear grupo"
#: bookwyrm/templates/groups/created_text.html:4
@@ -1824,9 +1825,9 @@ msgstr "¿Eliminar este grupo?"
msgid "This action cannot be un-done"
msgstr "Esta acción no se puede deshacer"
-#: bookwyrm/templates/groups/delete_group_modal.html:15
-#: bookwyrm/templates/lists/delete_list_modal.html:15
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:21
+#: bookwyrm/templates/groups/delete_group_modal.html:17
+#: bookwyrm/templates/lists/delete_list_modal.html:19
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:29
#: bookwyrm/templates/settings/announcements/announcement.html:23
#: bookwyrm/templates/settings/announcements/announcements.html:56
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
@@ -2298,7 +2299,7 @@ msgstr "Añadir «%(title)s» a esta lista"
msgid "Suggest \"%(title)s\" for this list"
msgstr "Sugerir «%(title)s» para esta lista"
-#: bookwyrm/templates/lists/add_item_modal.html:39
+#: bookwyrm/templates/lists/add_item_modal.html:41
#: bookwyrm/templates/lists/list.html:257
msgid "Suggest"
msgstr "Sugerir"
@@ -2468,7 +2469,7 @@ msgid "List position"
msgstr "Posición"
#: bookwyrm/templates/lists/list.html:152
-#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
+#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23
msgid "Set"
msgstr "Establecido"
@@ -3923,7 +3924,7 @@ msgid "Copy the theme file into the bookwyrm/static/css/themes
dire
msgstr ""
#: bookwyrm/templates/settings/themes.html:32
-msgid "Run ./bw-dev compilescss
."
+msgid "Run ./bw-dev collectstatic
."
msgstr ""
#: bookwyrm/templates/settings/themes.html:35
@@ -4200,8 +4201,9 @@ msgid "Need help?"
msgstr ""
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-msgid "Create Shelf"
-msgstr "Crear Estantería"
+#: bookwyrm/templates/shelf/shelf.html:72
+msgid "Create shelf"
+msgstr "Crear estantería"
#: bookwyrm/templates/shelf/edit_shelf_form.html:5
msgid "Edit Shelf"
@@ -4216,10 +4218,6 @@ msgstr "Perfil de usuario"
msgid "All books"
msgstr "Todos los libros"
-#: bookwyrm/templates/shelf/shelf.html:72
-msgid "Create shelf"
-msgstr "Crear estantería"
-
#: bookwyrm/templates/shelf/shelf.html:96
#, python-format
msgid "%(formatted_count)s book"
@@ -4343,24 +4341,24 @@ msgstr "Responder"
msgid "Content"
msgstr "Contenido"
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10
-msgid "Content warning:"
-msgstr "Advertencia de contenido:"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
-msgid "Spoilers ahead!"
-msgstr "¡Advertencia, ya vienen spoilers!"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_toggle.html:13
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:9
msgid "Include spoiler alert"
msgstr "Incluir alerta de spoiler"
-#: bookwyrm/templates/snippets/create_status/layout.html:47
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
+msgid "Spoilers/content warnings:"
+msgstr ""
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:27
+msgid "Spoilers ahead!"
+msgstr "¡Advertencia, ya vienen spoilers!"
+
+#: bookwyrm/templates/snippets/create_status/layout.html:45
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Comentario:"
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:18
msgid "Post"
msgstr "Compartir"
@@ -4851,10 +4849,6 @@ msgstr "Tus grupos"
msgid "Groups: %(username)s"
msgstr "Grupos: %(username)s"
-#: bookwyrm/templates/user/groups.html:17
-msgid "Create group"
-msgstr "Crear grupo"
-
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Perfil de usuario"
diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po
index 6c5d17c4d..4e3d049b6 100644
--- a/locale/fr_FR/LC_MESSAGES/django.po
+++ b/locale/fr_FR/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-08 19:55+0000\n"
-"PO-Revision-Date: 2022-03-08 21:16\n"
+"POT-Creation-Date: 2022-03-13 18:56+0000\n"
+"PO-Revision-Date: 2022-03-14 16:32\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: French\n"
"Language: fr\n"
@@ -220,7 +220,7 @@ msgid "Followers"
msgstr "Abonné(e)s"
#: bookwyrm/models/fields.py:208
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:8
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:6
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
#: bookwyrm/templates/snippets/privacy_select.html:20
@@ -261,73 +261,73 @@ msgstr "Citations"
msgid "Everything else"
msgstr "Tout le reste"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home Timeline"
msgstr "Mon fil d’actualité"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home"
msgstr "Accueil"
-#: bookwyrm/settings.py:208
+#: bookwyrm/settings.py:209
msgid "Books Timeline"
msgstr "Actualité de mes livres"
-#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:209 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Livres"
-#: bookwyrm/settings.py:280
+#: bookwyrm/settings.py:281
msgid "English"
msgstr "English"
-#: bookwyrm/settings.py:281
+#: bookwyrm/settings.py:282
msgid "Deutsch (German)"
msgstr "Deutsch"
-#: bookwyrm/settings.py:282
+#: bookwyrm/settings.py:283
msgid "Español (Spanish)"
msgstr "Español"
-#: bookwyrm/settings.py:283
+#: bookwyrm/settings.py:284
msgid "Galego (Galician)"
msgstr "Galego (Galicien)"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:285
msgid "Italiano (Italian)"
msgstr "Italiano (italien)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:286
msgid "Français (French)"
msgstr "Français"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:287
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituanien)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:288
msgid "Norsk (Norwegian)"
msgstr "Norsk (norvégien)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:289
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugais brésilien)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:290
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugais européen)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:291
msgid "Svenska (Swedish)"
msgstr "Svenska (Suédois)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:292
msgid "简体中文 (Simplified Chinese)"
msgstr "简化字"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:293
msgid "繁體中文 (Traditional Chinese)"
msgstr "Infos supplémentaires :"
@@ -727,14 +727,14 @@ msgstr "ISNI :"
#: bookwyrm/templates/author/edit_author.html:115
#: bookwyrm/templates/book/book.html:193
#: bookwyrm/templates/book/edit/edit_book.html:121
-#: bookwyrm/templates/book/file_links/add_link_modal.html:58
+#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
-#: bookwyrm/templates/groups/form.html:30
+#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
#: bookwyrm/templates/lists/form.html:130
#: bookwyrm/templates/preferences/edit_user.html:136
-#: bookwyrm/templates/readthrough/readthrough_modal.html:72
+#: bookwyrm/templates/readthrough/readthrough_modal.html:74
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
@@ -748,20 +748,20 @@ msgstr "Enregistrer"
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/book.html:194
-#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/file_links/add_link_modal.html:59
-#: bookwyrm/templates/book/file_links/verification_modal.html:21
+#: bookwyrm/templates/book/file_links/verification_modal.html:25
#: bookwyrm/templates/book/sync_modal.html:23
-#: bookwyrm/templates/groups/delete_group_modal.html:17
-#: bookwyrm/templates/lists/add_item_modal.html:42
-#: bookwyrm/templates/lists/delete_list_modal.html:18
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:23
+#: bookwyrm/templates/groups/delete_group_modal.html:15
+#: bookwyrm/templates/lists/add_item_modal.html:36
+#: bookwyrm/templates/lists/delete_list_modal.html:16
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
-#: bookwyrm/templates/snippets/report_modal.html:53
+#: bookwyrm/templates/snippets/report_modal.html:52
msgid "Cancel"
msgstr "Annuler"
@@ -770,9 +770,9 @@ msgstr "Annuler"
msgid "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr "Le chargement des données se connectera à %(source_name)s et vérifiera les métadonnées de cet auteur ou autrice qui ne sont pas présentes ici. Les métadonnées existantes ne seront pas écrasées."
-#: bookwyrm/templates/author/sync_modal.html:22
+#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:108
-#: bookwyrm/templates/book/sync_modal.html:22
+#: bookwyrm/templates/book/sync_modal.html:24
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
@@ -873,8 +873,8 @@ msgid "Add to list"
msgstr "Ajouter à la liste"
#: bookwyrm/templates/book/book.html:370
-#: bookwyrm/templates/book/cover_add_modal.html:31
-#: bookwyrm/templates/lists/add_item_modal.html:37
+#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
@@ -1182,7 +1182,7 @@ msgid "Actions"
msgstr "Actions"
#: bookwyrm/templates/book/file_links/edit_links.html:53
-#: bookwyrm/templates/book/file_links/verification_modal.html:25
+#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Signaler un spam"
@@ -1216,7 +1216,7 @@ msgstr "Vous quittez BookWyrm"
msgid "This link is taking you to: %(link_url)s
.
Is that where you'd like to go?"
msgstr "Ce lien vous amène à %(link_url)s
.
Est-ce là que vous souhaitez aller ?"
-#: bookwyrm/templates/book/file_links/verification_modal.html:20
+#: bookwyrm/templates/book/file_links/verification_modal.html:26
#: bookwyrm/templates/setup/config.html:139
msgid "Continue"
msgstr "Continuer"
@@ -1292,7 +1292,7 @@ msgstr "Code de confirmation :"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:73
#: bookwyrm/templates/settings/dashboard/dashboard.html:116
-#: bookwyrm/templates/snippets/report_modal.html:52
+#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Valider"
@@ -1806,8 +1806,9 @@ msgid "No users found for \"%(query)s\""
msgstr "Aucun compte trouvé pour « %(query)s »"
#: bookwyrm/templates/groups/create_form.html:5
-msgid "Create Group"
-msgstr "Créer un Groupe"
+#: bookwyrm/templates/user/groups.html:17
+msgid "Create group"
+msgstr "Créer un groupe"
#: bookwyrm/templates/groups/created_text.html:4
#, python-format
@@ -1824,9 +1825,9 @@ msgstr "Supprimer ce groupe ?"
msgid "This action cannot be un-done"
msgstr "Cette action ne peut pas être annulée"
-#: bookwyrm/templates/groups/delete_group_modal.html:15
-#: bookwyrm/templates/lists/delete_list_modal.html:15
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:21
+#: bookwyrm/templates/groups/delete_group_modal.html:17
+#: bookwyrm/templates/lists/delete_list_modal.html:19
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:29
#: bookwyrm/templates/settings/announcements/announcement.html:23
#: bookwyrm/templates/settings/announcements/announcements.html:56
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
@@ -2298,7 +2299,7 @@ msgstr "Ajouter « %(title)s » à cette liste"
msgid "Suggest \"%(title)s\" for this list"
msgstr "Suggérer « %(title)s » pour cette liste"
-#: bookwyrm/templates/lists/add_item_modal.html:39
+#: bookwyrm/templates/lists/add_item_modal.html:41
#: bookwyrm/templates/lists/list.html:257
msgid "Suggest"
msgstr "Suggérer"
@@ -2468,7 +2469,7 @@ msgid "List position"
msgstr "Position"
#: bookwyrm/templates/lists/list.html:152
-#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
+#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23
msgid "Set"
msgstr "Appliquer"
@@ -3923,8 +3924,8 @@ msgid "Copy the theme file into the bookwyrm/static/css/themes
dire
msgstr "Copiez le fichier de thème dans le répertoire bookwyrm/static/css/themes
de votre serveur depuis la ligne de commande."
#: bookwyrm/templates/settings/themes.html:32
-msgid "Run ./bw-dev compilescss
."
-msgstr "Exécutez ./bw-dev compilescss
."
+msgid "Run ./bw-dev collectstatic
."
+msgstr "Exécutez ./bw-dev collectstatic
."
#: bookwyrm/templates/settings/themes.html:35
msgid "Add the file name using the form below to make it available in the application interface."
@@ -4200,7 +4201,8 @@ msgid "Need help?"
msgstr "Besoin d’aide ?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-msgid "Create Shelf"
+#: bookwyrm/templates/shelf/shelf.html:72
+msgid "Create shelf"
msgstr "Créer une étagère"
#: bookwyrm/templates/shelf/edit_shelf_form.html:5
@@ -4216,10 +4218,6 @@ msgstr "Profil utilisateur·rice"
msgid "All books"
msgstr "Tous les livres"
-#: bookwyrm/templates/shelf/shelf.html:72
-msgid "Create shelf"
-msgstr "Créer une étagère"
-
#: bookwyrm/templates/shelf/shelf.html:96
#, python-format
msgid "%(formatted_count)s book"
@@ -4343,24 +4341,24 @@ msgstr "Répondre"
msgid "Content"
msgstr "Contenu"
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10
-msgid "Content warning:"
-msgstr "Avertissement sur le contenu :"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
-msgid "Spoilers ahead!"
-msgstr "Attention spoilers !"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_toggle.html:13
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:9
msgid "Include spoiler alert"
msgstr "Afficher une alerte spoiler"
-#: bookwyrm/templates/snippets/create_status/layout.html:47
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
+msgid "Spoilers/content warnings:"
+msgstr "Avertissements de contenu/spoilers :"
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:27
+msgid "Spoilers ahead!"
+msgstr "Attention spoilers !"
+
+#: bookwyrm/templates/snippets/create_status/layout.html:45
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Commentaire :"
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:18
msgid "Post"
msgstr "Publier"
@@ -4497,7 +4495,7 @@ msgstr "Critique de « %(book_title)s » : %(review_title)s"
#: bookwyrm/templates/snippets/goal_form.html:4
#, python-format
msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year."
-msgstr "Définissez un nombre de livre à lire comme objectif pour %(year)s, et suivezvotre progression au fil de l’année."
+msgstr "Définissez un nombre de livres à lire comme objectif pour %(year)s, et suivez votre progression au fil de l’année."
#: bookwyrm/templates/snippets/goal_form.html:16
msgid "Reading goal:"
@@ -4851,10 +4849,6 @@ msgstr "Vos Groupes"
msgid "Groups: %(username)s"
msgstr "Groupes : %(username)s"
-#: bookwyrm/templates/user/groups.html:17
-msgid "Create group"
-msgstr "Créer un groupe"
-
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Profil"
diff --git a/locale/gl_ES/LC_MESSAGES/django.mo b/locale/gl_ES/LC_MESSAGES/django.mo
index 691d4246e087603ac0f44e63c0f842b22202e1a0..8958c625aa2159fb6d31240e3ad57c6309aa0a96 100644
GIT binary patch
delta 22785
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