5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-16 15:41:42 +00:00

Merge branch 'rails' into search-engine

This commit is contained in:
f 2021-05-06 18:11:55 -03:00
commit f9dca42f95
8 changed files with 84 additions and 134 deletions

View file

@ -1 +0,0 @@
system

View file

@ -81,7 +81,7 @@ RUN echo 'http://dl-cdn.alpinelinux.org/alpine/edge/testing' >> /etc/apk/reposit
RUN apk add --no-cache libxslt libxml2 tzdata ruby ruby-bundler ruby-json ruby-bigdecimal ruby-rake ruby-irb RUN apk add --no-cache libxslt libxml2 tzdata ruby ruby-bundler ruby-json ruby-bigdecimal ruby-rake ruby-irb
RUN apk add --no-cache postgresql-libs libssh2 file rsync git jpegoptim vips RUN apk add --no-cache postgresql-libs libssh2 file rsync git jpegoptim vips
RUN apk add --no-cache ffmpeg imagemagick pandoc tectonic oxipng jemalloc RUN apk add --no-cache ffmpeg imagemagick pandoc tectonic oxipng jemalloc
RUN apk add --no-cache git-lfs RUN apk add --no-cache git-lfs openssh-client patch
# Chequear que la versión de ruby sea la correcta # Chequear que la versión de ruby sea la correcta
RUN test "2.7.3" = `ruby -e 'puts RUBY_VERSION'` RUN test "2.7.3" = `ruby -e 'puts RUBY_VERSION'`

View file

@ -1,3 +1,4 @@
.SHELL := /bin/bash
# Incluir las variables de entorno # Incluir las variables de entorno
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
root_dir := $(patsubst %/,%,$(dir $(mkfile_path))) root_dir := $(patsubst %/,%,$(dir $(mkfile_path)))
@ -21,7 +22,7 @@ test/%_test.rb: always
$(hain) 'cd /Sutty/sutty; bundle exec rake test TEST="$@" RAILS_ENV=test' $(hain) 'cd /Sutty/sutty; bundle exec rake test TEST="$@" RAILS_ENV=test'
test: always test: always
$(hain) 'cd /Sutty/sutty; bundle exec rake test' $(hain) 'cd /Sutty/sutty; RAILS_ENV=test bundle exec rake test'
serve: /etc/hosts serve: /etc/hosts
$(hain) 'cd /Sutty/sutty; bundle exec rails s -b "ssl://0.0.0.0:3000?key=../sutty.local/domain/$(SUTTY).key&cert=../sutty.local/domain/$(SUTTY).crt"' $(hain) 'cd /Sutty/sutty; bundle exec rails s -b "ssl://0.0.0.0:3000?key=../sutty.local/domain/$(SUTTY).key&cert=../sutty.local/domain/$(SUTTY).crt"'
@ -53,10 +54,12 @@ save:
date +%F | xargs git tag -f date +%F | xargs git tag -f
@echo -e "\a" @echo -e "\a"
# Crear el directorio donde se almacenan las gemas binarias # proyectos.
../gems/: ../gems/:
mkdir -p $@ mkdir -p $@
# Crear el directorio donde se almacenan las gemas binarias
# TODO: Mover a un proyecto propio, porque lo utilizamos en todos los
gem_dir := $(shell readlink -f ../gems) gem_dir := $(shell readlink -f ../gems)
gem_cache_dir := $(gem_dir)/cache gem_cache_dir := $(gem_dir)/cache
gem_binary_dir := $(gem_dir)/$(alpine_version) gem_binary_dir := $(gem_dir)/$(alpine_version)
@ -92,18 +95,12 @@ dirs := $(patsubst %,root/%,data sites deploy public)
$(dirs): $(dirs):
mkdir -p $@ mkdir -p $@
app/assets/fonts/forkawesome-webfont.woff2: fa.txt
which glyphhanger || npm i -g glyphhanger
grep -v "^#" fa.txt | sed "s/^/U+/" | cut -d " " -f 1 | tr "\n" "," | xargs -rI {} glyphhanger --subset=node_modules/fork-awesome/fonts/forkawesome-webfont.ttf --formats=woff2 --whitelist="{}"
mv node_modules/fork-awesome/fonts/forkawesome-webfont-subset.woff2 $@
fa: app/assets/fonts/forkawesome-webfont.woff2 ## Fork Awesome
ota: assets ota: assets
sudo chgrp -R 82 public/ sudo chgrp -R 82 public/
rsync -av --delete-after public/ athshe:/srv/sutty/srv/http/data/_public/ rsync -avi --delete-after public/ athshe:/srv/sutty/srv/http/data/_public/
# Hotfixes # Hotfixes
commit ?= origin/rails
ota-rb: ota-rb:
umask 022; git format-patch $(commit) umask 022; git format-patch $(commit)
scp ./0*.patch root@athshe.sutty.nl:/tmp/ scp ./0*.patch root@athshe.sutty.nl:/tmp/

View file

@ -20,9 +20,9 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
# Queremos que los artículos nuevos siempre cacheen, si usamos el UUID # Queremos que los artículos nuevos siempre cacheen, si usamos el UUID
# siempre vamos a obtener un item nuevo. # siempre vamos a obtener un item nuevo.
def cache_key def cache_key
return layout.value + '/' + name.to_s if post.new? return "#{layout.value}/#{name}" if post.new?
@cache_key ||= 'post/' + post.uuid.value + '/' + name.to_s @cache_key ||= "post/#{post.uuid.value}/#{name}"
end end
def cache_version def cache_version
@ -30,7 +30,7 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
end end
def cache_key_with_version def cache_key_with_version
cache_key + '-' + cache_version "#{cache_key}-#{cache_version}"
end end
# XXX: Deberíamos sanitizar durante la asignación? # XXX: Deberíamos sanitizar durante la asignación?

View file

@ -112,7 +112,7 @@ class Post
end end
def cache_version def cache_version
updated_at.utc.to_s(:usec) (updated_at || modified_at).utc.to_s(:usec)
end end
# Agregar el timestamp para saber si cambió, siguiendo el módulo # Agregar el timestamp para saber si cambió, siguiendo el módulo
@ -129,6 +129,8 @@ class Post
# Fecha de última modificación del archivo # Fecha de última modificación del archivo
def updated_at def updated_at
return if new?
File.mtime(path.absolute) File.mtime(path.absolute)
end end

View file

@ -99,7 +99,7 @@ class Site < ApplicationRecord
# @param slash Boolean Agregar / al final o no # @param slash Boolean Agregar / al final o no
# @return String La URL con o sin / al final # @return String La URL con o sin / al final
def url(slash: true) def url(slash: true)
'https://' + hostname + (slash ? '/' : '') "https://#{hostname}#{slash ? '/' : ''}"
end end
# Obtiene los dominios alternativos # Obtiene los dominios alternativos
@ -107,7 +107,7 @@ class Site < ApplicationRecord
# @return Array # @return Array
def alternative_hostnames def alternative_hostnames
deploys.where(type: 'DeployAlternativeDomain').map(&:hostname).map do |h| deploys.where(type: 'DeployAlternativeDomain').map(&:hostname).map do |h|
h.end_with?('.') ? h[0..-2] : h + '.' + Site.domain h.end_with?('.') ? h[0..-2] : "#{h}.#{Site.domain}"
end end
end end
@ -116,7 +116,7 @@ class Site < ApplicationRecord
# @return Array # @return Array
def alternative_urls(slash: true) def alternative_urls(slash: true)
alternative_hostnames.map do |h| alternative_hostnames.map do |h|
'https://' + h + (slash ? '/' : '') "https://#{h}#{slash ? '/' : ''}"
end end
end end
@ -277,7 +277,9 @@ class Site < ApplicationRecord
# NoMethodError # NoMethodError
@layouts_struct ||= Struct.new(*layout_keys, keyword_init: true) @layouts_struct ||= Struct.new(*layout_keys, keyword_init: true)
@layouts ||= @layouts_struct.new(**data['layouts'].map do |name, metadata| @layouts ||= @layouts_struct.new(**data['layouts'].map do |name, metadata|
[name.to_sym, Layout.new(site: self, name: name.to_sym, meta: metadata.delete('meta')&.with_indifferent_access, metadata: metadata.with_indifferent_access)] [name.to_sym,
Layout.new(site: self, name: name.to_sym, meta: metadata.delete('meta')&.with_indifferent_access,
metadata: metadata.with_indifferent_access)]
end.to_h) end.to_h)
end end
@ -406,7 +408,7 @@ class Site < ApplicationRecord
end end
def self.default def self.default
find_by(name: Site.domain + '.') find_by(name: "#{Site.domain}.")
end end
def reset def reset

View file

@ -100,7 +100,7 @@ Rails.application.configure do
.new(Syslog::Logger.new('sutty')) .new(Syslog::Logger.new('sutty'))
if ENV['RAILS_LOG_TO_STDOUT'].present? if ENV['RAILS_LOG_TO_STDOUT'].present?
logger = ActiveSupport::Logger.new(STDOUT) logger = ActiveSupport::Logger.new($stdout)
logger.formatter = config.log_formatter logger.formatter = config.log_formatter
config.logger = ActiveSupport::TaggedLogging.new(logger) config.logger = ActiveSupport::TaggedLogging.new(logger)
end end

View file

@ -39,22 +39,22 @@ en:
image: image:
not_an_image: 'Not an image' not_an_image: 'Not an image'
path_required: 'Missing image for upload' path_required: 'Missing image for upload'
no_file_for_description: "There's a description with no associated image" no_file_for_description: "Description with no associated image"
file: file:
path_required: "Missing file for upload" path_required: "Missing file for upload"
no_file_for_description: "There's a description with no associated file" no_file_for_description: "Description with no associated file"
event: event:
zone_missing: 'Timezone is incorrect' zone_missing: 'Inexistent timezone'
date_missing: 'Event date is required' date_missing: 'Event date is required'
date_non_parseable: 'Time is not in the correct format' date_non_parseable: 'Time is not in the correct format'
time_non_parseable: 'Date is not in the correct format' time_non_parseable: 'Date is not in the correct format'
end_in_the_past: "Event end can't happen before the start" end_in_the_past: "Event can't end before it starts"
belongs_to: belongs_to:
missing_post: "Couldn't find the related post" missing_post: "Couldn't find the related post"
has_many: has_many:
missing_posts: "Couldn't find some related posts" missing_posts: "Couldn't find some related posts"
date: date:
invalid_format: "It seems that your browser doesn't support dates and the date is on the incorrect format, please use yyyy-mm-dd, ie. 2021-01-31" invalid_format: "Incorrect date format, please use yyyy-mm-dd, ie. 2021-01-31"
exceptions: exceptions:
post: post:
site_missing: 'Needs an instance of Site' site_missing: 'Needs an instance of Site'
@ -67,10 +67,10 @@ en:
subject: "[Sutty] The site %{site} has been built" subject: "[Sutty] The site %{site} has been built"
hi: "Hi!" hi: "Hi!"
explanation: | explanation: |
This e-mail is to notify you that Sutty has built your site and This e-mail is to notify you that Sutty has built your site, which is
it's available at <https://%{fqdn}>. available at <https://%{fqdn}>.
You'll find details bellow. You'll find details below.
th: th:
type: Type type: Type
status: Status status: Status
@ -98,18 +98,18 @@ en:
title: Alternative domain name title: Alternative domain name
success: Success! success: Success!
error: Error error: Error
help: You can contact us by replying this e-mail help: You can contact us by replying to this e-mail
maintenance_mailer: maintenance_mailer:
notice: notice:
subject: 'Maintenance notice' subject: 'Maintenance notice'
hi: 'Hi!' hi: 'Hi!'
message: "We're getting in contact with you to let you know we'll be doing maintenance work in our servers." message: "We're getting in contact with you to let you know we'll be doing maintenance work on our servers."
reason: 'The reason is:' reason: 'The reason is:'
estimated_from: 'The maintenance period starts at %{from} (visit %{time_is} to convert into your time zone)' estimated_from: 'The maintenance period starts at %{from} (visit %{time_is} to convert into your time zone)'
estimated_to: 'Up to %{to} (approximately, visit %{time_is} to convert into your time zone)' estimated_to: 'Up to %{to} (approximately, visit %{time_is} to convert into your time zone)'
estimated_from_html: 'The maintenance period starts at %{from} <a referrerpolicy="no-referrer" href="%{time_is}" target="_blank" rel="nofollow">(convert into your time zone)</a>' estimated_from_html: 'The maintenance period starts at %{from} <a referrerpolicy="no-referrer" href="%{time_is}" target="_blank" rel="nofollow">(convert into your time zone)</a>'
estimated_to_html: 'Up to %{to} (approximately, <a referrerpolicy="no-referrer" href="%{time_is}" target="_blank" rel="nofollow">convert into your time zone</a>)' estimated_to_html: 'Up to %{to} (approximately, <a referrerpolicy="no-referrer" href="%{time_is}" target="_blank" rel="nofollow">convert into your time zone</a>)'
thanks: 'Thanks for your patience' thanks: 'Thank you for your patience'
were_back: were_back:
subject: 'Maintenance period ended' subject: 'Maintenance period ended'
hi: 'Hi!' hi: 'Hi!'
@ -144,15 +144,15 @@ en:
invitadx: invitadx:
attributes: attributes:
email: email:
taken: 'This e-mail address is already taken, please choose another' taken: 'This e-mail address is already taken, please choose a different one'
password_confirmation: password_confirmation:
confirmation: "The passwords don't match" confirmation: "The passwords don't match"
acepta_politicas_de_privacidad: acepta_politicas_de_privacidad:
no_acepta_politicas_de_privacidad: "Please read and accept the privacy policy" no_acepta_politicas_de_privacidad: "Please read and accept the privacy policy"
design_id: design_id:
layout_incompatible: layout_incompatible:
error: "Design can't be changed because there're posts with incompatible layouts" error: "Design can't be changed because there are posts with incompatible layouts"
help: "Your site has posts with layout only compatible to the current design. If you change it, the site won't work as you expect. If you're trying out designs, you can delete posts in the following incompatible layouts:: %{layouts}." help: "Your site has posts with layouts only compatible with the current design. If you change it, the site won't work as you expect. If you're trying out designs, you can delete posts in the following incompatible layouts:: %{layouts}."
errors: errors:
argument_error: 'Argument `%{argument}` must be an instance of %{class}' argument_error: 'Argument `%{argument}` must be an instance of %{class}'
unknown_locale: 'Unknown %{locale} locale' unknown_locale: 'Unknown %{locale} locale'
@ -182,7 +182,7 @@ en:
category: 'Category' category: 'Category'
i18n: i18n:
top: 'Back to top' top: 'Back to top'
index: "Here you can edit your site's texts that don't belong to a post, like its description, sections, buttons... If you change languages up there in the title to be the same, you can edit them. If they're different, you can translate from one into the other." index: "Here is where you edit the text on your site that doesn't belong to a post, such as its description, sections, buttons... If you change languages up there in the title to be the same, you can edit them. If they're different, you can translate from one into the other."
count: 'This is the amount of texts.' count: 'This is the amount of texts.'
toc: 'Jump to this section' toc: 'Jump to this section'
meta: 'Metadata' meta: 'Metadata'
@ -204,76 +204,26 @@ en:
recursos: 'Resources' recursos: 'Resources'
contacta: 'Contact us' contacta: 'Contact us'
agradecimientos: 'Acknowledgments' agradecimientos: 'Acknowledgments'
sesion: 'Sessions'
sesiones: 'Sessions'
anexo: 'Appendix'
simple: 'Simple'
sites: sites:
index: 'This is the list of sites you can edit.' index: 'This is the list of sites you can edit.'
edit_translations: "You can edit texts from your site other than
posts', and you can also translate them to other languages."
edit_posts: "When you enter here, you'll see a list of every
article and edit them. You can also create new ones."
enqueued: "The site is on queue to be generated. Once this enqueued: "The site is on queue to be generated. Once this
process finishes, you'll get an email telling you the status. If process finishes, you'll get an email telling you the status. If
everything went well, your site will be published :)" everything went well, your site will be published :)"
enqueue: "When you finish making changes to your site, you can enqueue: "When you finish making changes to your site, you can
publish them with this action. You'll receive an email when it publish them with this action. You'll receive an email when it
finishes." finishes."
build_log: "This is the log for what happened during site
generation. If there was an issue, you'll see it here."
invitade: "Invited users can only add and modify entries but can't publish until reviewed by a user"
invitations: invitations:
accept: 'Someone invited you to collaborate on their site. If you accept the invitation, you can access the site.' accept: "Someone invited you to collaborate on their site. If you accept the invitation, you can access the site's edit mode."
reject: "If you decline, you won't have access." reject: "If you decline, you won't have access."
close: 'Close help' close: 'Close help'
markdown:
intro: 'The text is formatted using a syntax called Markdown, a
simple format that can be easily written just by remembering some
rules, and that can be converted to a web page, or to PDF and ePub
files. You can use the buttons below for basic formatting. If
you need help, here you have a <a href="/markdown">markdown
cheatsheet</a>.'
back: 'Go back'
input: 'If we write...'
output: 'We get...'
bold: 'Bold'
italic: 'Emphasis'
heading: 'Title'
link:
text: 'A link'
url: 'https://example.org'
quote: 'A quote from a text we liked'
ul: 'Our TODO list'
ol: 'Steps for our machiavelic plans'
img:
text: 'Kéfir island'
url: 'https://kefir.red/images/isla.png'
ltr: 'Introduction'
rtl: 'مقدمة'
dir: "These are tricky. If you want to use an expression in a
language using another direction, like using an Arabic expression
on an English text, or viceversa, you have to inform both
direction and language so the markdown processor understands it
has to change it internally. Otherwise you may see out of order
words, specially in the PDF results."
distraction_free_html: 'You can have a distraction free writing session
by clicking the <span class="fa fa-expand"></span> button'
preview_html: 'Click the <span class="fa fa-search"></span> preview
button to see the results.'
autocomplete_html: "Some of these fields can be auto-completed. If
you know what to put on them, just start writing and the
auto-complete will suggest available options. If the option doesn't
exist, finish writing and press <kbd>Enter</kbd> to add a new one.
To empty the field, click the &times; button on your right."
deploys: deploys:
deploy_local: deploy_local:
title: 'Host at Sutty' title: 'Host at Sutty'
help: | help: |
The site will be available at <https://%{fqdn}/>. The site will be available at <https://%{fqdn}/>.
We're working out the details for allowing your own site We're working out the details to allow you to use your own site
domains, you can help us! domains, you can [help us](https://sutty.nl/en/index.html#contact)!
ejemplo: 'example' ejemplo: 'example'
deploy_private: deploy_private:
title: 'Generate private version' title: 'Generate private version'
@ -288,20 +238,20 @@ en:
When you enable this option, your site will also be available When you enable this option, your site will also be available
under <https://%{fqdn}/>. under <https://%{fqdn}/>.
The www prefix to web addresses has been a way of refering to The www prefix has been a way of referring to
computers that are available on the World Wide Web. But since computers that are available on the World Wide Web. Since
the Web has become the hegemonic way of accessing the Internet, the Web became the hegemonic mode of accessing the Internet,
it has become less used. Even so, people still uses them. it has lost popularity. All the same, some people still use them.
deploy_zip: deploy_zip:
title: 'Generate a ZIP file' title: 'Generate a ZIP file'
help: | help: |
ZIP files contain and compress all the files of your site. With ZIP files contain and compress all your site's files. With
this option you can download and also share your whole site this option you can download and also share your entire site
through the <https://%{fqdn}/%{file}> address, keep it as backup through the <https://%{fqdn}/%{file}> address, keep it as backup
or have an strategy of solidarity hosting, were many people or have a strategy of solidary hosting, where many people
shares a copy of your site. share a copy of your site.
It also helps with site archival for historical purposes :) It also helps with site archiving for historical purposes!
ejemplo: 'example' ejemplo: 'example'
deploy_hidden_service: deploy_hidden_service:
title: 'Host as Tor Hidden Service' title: 'Host as Tor Hidden Service'
@ -313,7 +263,7 @@ en:
anonymous**. Visitors can still access your site publicly at anonymous**. Visitors can still access your site publicly at
<%{public_url}>. <%{public_url}>.
[Know more](https://sutty.nl/en/hidden-sites-with-tor/) [Learn more](https://sutty.nl/en/hidden-sites-with-tor/)
help_2: | help_2: |
The hidden address for your site is: The hidden address for your site is:
@ -325,7 +275,7 @@ en:
index: index:
title: Statistics title: Statistics
help: | help: |
Statistics show information about how your site is generated and These statistics show information about how your site is generated and
how many resources it uses. how many resources it uses.
build: build:
average: 'Average building time' average: 'Average building time'
@ -345,12 +295,12 @@ en:
welcome: | welcome: |
# Welcome! # Welcome!
You have no sites yet. You can generate all the sites you want You don't have any sites yet. You can generate as many sites as you want
with the **Create site** button. with the **Create site** button.
To see your changes, use the **Publish changes** button on each To see your changes, use the **Publish changes** button that corresponds to the
site and wait a few seconds. You will also receive an e-mail site you've modified and wait a few seconds. You will receive an e-mail
notification. notification when the changes are loaded.
[Create my first site](/sites/new) [Create my first site](/sites/new)
repository: repository:
@ -374,11 +324,11 @@ en:
submit: 'Save changes' submit: 'Save changes'
form: form:
errors: errors:
title: There're errors and we couldn't save your changes :( title: There were errors and we couldn't save your changes :(
help: Please, look for the invalid fields to fix them help: Please, look for the invalid fields to fix them
help: help:
name: "Your site's name. It can only contain numbers and letters." name: "The name of your site. It can only include numbers and letters."
design: 'Select the design for your site. You can change it later. We add more designs from time to time.' design: 'Select the design for your site. You can change it later. We add more designs from time to time!'
licencia: 'Everything we publish has automatic copyright. This licencia: 'Everything we publish has automatic copyright. This
means nobody can use our works without explicit permission. By means nobody can use our works without explicit permission. By
using licenses, we stablish conditions by which we want to share using licenses, we stablish conditions by which we want to share
@ -386,14 +336,14 @@ en:
privacidad: | privacidad: |
The [privacy policy](https://sutty.nl/en/privacy-policy/) and The [privacy policy](https://sutty.nl/en/privacy-policy/) and
[code of conduct](https://sutty.nl/en/code-of-conduct/) inform [code of conduct](https://sutty.nl/en/code-of-conduct/) inform
your visitors about their privacy and expected conduct of the your visitors about their privacy and the conduct expected from members of the
site's community. We suggest you use the same documents Sutty site's community. We suggest you use the same documents Sutty
uses. You can modify them as articles after creating the uses. You can modify them as articles after creating the
site. site.
deploys: | deploys: |
Sutty allows you to host your site in different places at the Sutty allows you to host your site in different places at the
same time. This strategy makes your site available even when same time. This strategy makes your site available even if
some of them become unavailable. one of them goes down.
design: design:
title: 'Design' title: 'Design'
actions: 'Information about this design' actions: 'Information about this design'
@ -408,26 +358,26 @@ en:
title: 'Where do you want your site to be hosted?' title: 'Where do you want your site to be hosted?'
colaboracion_anonima: colaboracion_anonima:
title: 'Accept anonymous collaboration' title: 'Accept anonymous collaboration'
help: 'By allowing anonymous collaboration, you enable visitors to send articles without a Sutty account. Nothing is published without your consent, so make sure to check drafts regularly. This feature can expose you to attacks and violence, so we recommend you enable it with care.' help: 'By allowing anonymous collaboration, you enable visitors to send articles without a Sutty account. Nothing is published without your consent, so make sure to check drafts regularly. This feature can expose you to attacks and violence, so we recommend you enable it with careful consideration.'
acepta_invitades: acepta_invitades:
title: 'Accept collaboration' title: 'Accept collaboration'
help: 'By enabling this option, you can invite other people to collaborate on your site.' help: 'By enabling this option, you can invite other people to collaborate on your site.'
contact: contact:
title: 'Enable contact forms' title: 'Enable contact forms'
help: 'If your site has contact forms, you can enable them here. If your site is under spam or trolls attack, you can disable them temporarily.' help: 'If your site has contact forms, you can enable them here. If your site is under a spam or troll attack, you can disable them temporarily.'
tienda: tienda:
title: Store title: Store
first_time_html: 'The store is an optional service that allows you to commertialize through your Sutty web site. To configure it, <a href="https://sutty.nl/en/#contact">we invite you to contact us :)</a>.' first_time_html: 'The store is an optional service that allows you to commercialize through your Sutty web site. To configure it, <a href="https://sutty.nl/en/#contact">we invite you to contact us :)</a>.'
help: 'Puedes configurar tu tienda aquí.' help: 'You can configure your store here.'
fetch: fetch:
title: 'Upgrade the site' title: 'Upgrade the site'
help: help:
fetch: 'Any changes made to the site are saved into a _git_ repository. Git saves the differences between previous and current versions of files so we can explore them as the history of the project. Also, we can bring and send changes between repositories. In this case, every site managed with Sutty share a common root that we call [skeleton](https://0xacab.org/sutty/skel.sutty.nl). When we upgrade this skeleton, you can explore the changes here and accept them to make your site better.' fetch: 'Any changes made to the site are saved into a _git_ repository. Git saves the differences between previous and current versions of files so we can explore them as the history of the project. Additionally, we can bring and send changes between repositories. In this case, every site managed with Sutty shares a common root that we call [skeleton](https://0xacab.org/sutty/skel.sutty.nl). When we upgrade this skeleton, you can explore the changes here and accept them to improve your site.'
toc: 'Table of contents' toc: 'Table of contents'
merge: merge:
request: 'Upgrade my site with these changes' request: 'Upgrade my site with these changes'
success: 'Site upgrade has been completed. Your next build will run this upgrade :)' success: 'Site upgrade has been completed. Your next build will run this upgrade :)'
error: "There was an error when we were trying to upgrade your site. This could be due to conflicts that couldn't be solved automatically. We've sent a report of the issue to Sutty's admins so they already know about it. Sorry! :(" error: "There was an error when trying to upgrade your site. This could be due to conflicts that couldn't be solved automatically. A report of the issue has already been sent to our admins. Sorry for the inconvenience! :("
message: 'Skeleton upgrade' message: 'Skeleton upgrade'
footer: footer:
powered_by: 'is developed by' powered_by: 'is developed by'
@ -435,14 +385,14 @@ en:
index: 'Translations' index: 'Translations'
edit: 'Edit texts and translations' edit: 'Edit texts and translations'
edit_same: 'Edit texts in' edit_same: 'Edit texts in'
translate_into: '. Translate into' translate_into: '. Translate to'
save: 'Save' save: 'Save'
change: 'Change' change: 'Change'
translate: 'Translate' translate: 'Translate'
jump: 'Jump to section' jump: 'Jump to section'
translating: translating:
from: 'Translating from' from: 'Translating from'
to: 'into' to: 'to'
es: 'Castillian Spanish' es: 'Castillian Spanish'
en: 'English' en: 'English'
ar: 'Arabic' ar: 'Arabic'
@ -463,7 +413,7 @@ en:
label: Language label: Language
date: date:
label: Date label: Date
help: Date for this post. If you use a date in the future the post won't be published until you publish changes on that day. help: Date for this post. If you choose a future date, the post won't be published until you publish changes on that day.
required: required:
label: ' (required)' label: ' (required)'
feedback: 'This field cannot be empty!' feedback: 'This field cannot be empty!'
@ -505,8 +455,8 @@ en:
edit: 'Edit' edit: 'Edit'
preview: preview:
btn: 'Preliminary version' btn: 'Preliminary version'
alert: 'Not every article type has a preliminary version :)' alert: 'Not every article type has a preliminary version'
message: 'This is a preliminary version, use the Publish changes button back on the panel to publish the article on your site.' message: 'This is a preliminary version, use the Publish changes button back on the panel to publish the article onto your site.'
open: 'Tip: You can add new options by typing them and pressing Enter' open: 'Tip: You can add new options by typing them and pressing Enter'
private: '&#128274; The values of this field will remain private' private: '&#128274; The values of this field will remain private'
select: select:
@ -541,17 +491,17 @@ en:
demote: Removes privileges for this user demote: Removes privileges for this user
promote: Gives privileges to this guest promote: Gives privileges to this guest
invite: 'Invites %{invite_as} to this site' invite: 'Invites %{invite_as} to this site'
public_invite: Copy this address and share it with everyone you want to accept public collaborations. These guests can only create and modify their own posts and any change needs to be approved. public_invite: Copy this address and share it with everyone you want to collaborate on your site. These guests can only create and modify their own posts and any change needs to be approved.
title: Users and Guests title: Users and Guests
usuaries: Users usuaries: Users
invitades: Guests invitades: Guests
destroy: destroy:
text: 'Remove access' text: 'Remove access'
confirm: "Remove access to this site? The account itself is not deleted, but it won't be able to make changes to this site." confirm: "Remove access to this site? The account itself will not be deleted, but it won't be able to make changes to this site."
denied: 'The site needs at least one user!' denied: 'The site needs at least one user!'
demote: demote:
text: 'Convert to guest' text: 'Convert to guest'
confirm: 'Convert to guest? They can only edit their own posts and will need approval from other user to publish them.' confirm: 'Convert to guest? They can only edit their own posts and will need approval from another user to publish them.'
denied: 'The site needs at least one user!' denied: 'The site needs at least one user!'
promote: promote:
text: 'Convert to user' text: 'Convert to user'
@ -573,10 +523,10 @@ en:
lockbox: lockbox:
help: help:
title: Encrypted content title: Encrypted content
description: The field contents are encrypted before being stored and won't be available on the public website or its source code. You can save private information here and it will only be readable to this site's users through Sutty's panel. description: The field contents are encrypted before being stored and won't be available on the public website or its source code. You can save private information here and it will only be readable to this site's users through the Sutty panel.
decryption_error: There was an error trying to decrypt the content, Sutty's team has been notified! decryption_error: There was an error trying to decrypt the content. The Sutty team has been notified.
editor: editor:
alert: "Hi! This our new editor, supporting more formats. Editors are complex machines and we can only polish them with your help. If you have a few minutes, [we'll like to read about your experience](https://sutty.nl/en/#contact) :)" alert: "Hi! This our new editor, which supports more formats. Editors are complex machines and we can only polish them with your help. If you have a few minutes, [we would like to read about your experience](https://sutty.nl/en/#contact) :)"
bold: Bold bold: Bold
italic: Emphasis italic: Emphasis
deleted: Strikethrough deleted: Strikethrough
@ -603,10 +553,10 @@ en:
multimedia-select: Select file multimedia-select: Select file
multimedia-upload: Upload multimedia-upload: Upload
multimedia-remove: Remove media multimedia-remove: Remove media
description: Description for blind people and search engines description: Description for the visually impaired and search engines
url: Address url: Address
more: More heading levels more: More heading levels
word: "If you're pasting from an hegemonic word processor, please be patient with us, it's not always simple to recover the whole format :)" word: "If you're pasting from another word processor, please be patient with us, as it isn't always simple to recover the whole format"
email_address: email_address:
address_unknown: "the address is unknown" address_unknown: "the address is unknown"
domain_does_not_accept_email: "this domain is not configured to accept email" domain_does_not_accept_email: "this domain is not configured to accept email"
@ -622,8 +572,8 @@ en:
ip_address_no_localhost: "localhost IP addresses are not allowed" ip_address_no_localhost: "localhost IP addresses are not allowed"
ipv4_address_invalid: "the address is not a valid IPv4 address" ipv4_address_invalid: "the address is not a valid IPv4 address"
ipv6_address_invalid: "the address is not a valid IPv6 address" ipv6_address_invalid: "the address is not a valid IPv6 address"
local_size_long: "the account name is too long" local_size_long: "account name too long"
local_size_short: "the account name is too short" local_size_short: "account name too short"
local_invalid: "format is incorrect" local_invalid: "format is incorrect"
not_allowed: "is not welcome here" not_allowed: "that email provider is not welcome here"
server_not_available: "the remote email server is not available" server_not_available: "remote email server not available"