Sanitize translations instead of using _html

Using the `_html` suffix in an i18n key is the same as using `html_safe`
on it, which means that translation could potentially be used for XSS
attacks.
This commit is contained in:
Javi Martín
2019-10-06 00:03:50 +02:00
parent b66859945e
commit 6b1864fbcd
62 changed files with 185 additions and 172 deletions

View File

@@ -64,7 +64,7 @@ module GlobalizeHelper
end
def selected_languages_description(resource)
t("shared.translations.languages_in_use_html", count: active_languages_count(resource))
sanitize(t("shared.translations.languages_in_use", count: active_languages_count(resource)))
end
def select_language_error(resource)

View File

@@ -1,16 +1,16 @@
<% if params[:filter].present? && params[:advanced_filters].present? %>
<p class="inline-block"><%= t("#{i18n_namespace}.filters.two_filters_html",
<p class="inline-block"><%= sanitize(t("#{i18n_namespace}.filters.two_filters",
filter: t("#{i18n_namespace}.filters.#{params[:filter]}"),
advanced_filters: budget_investments_advanced_filters(params[:advanced_filters])) %></p>
advanced_filters: budget_investments_advanced_filters(params[:advanced_filters]))) %></p>
<% elsif params[:filter].present? %>
<p class="inline-block"><%= t("#{i18n_namespace}.filters.one_filter_html",
filter: t("#{i18n_namespace}.filters.#{params[:filter]}")) %></p>
<p class="inline-block"><%= sanitize(t("#{i18n_namespace}.filters.one_filter",
filter: t("#{i18n_namespace}.filters.#{params[:filter]}"))) %></p>
<% elsif params[:advanced_filters].present? %>
<p class="inline-block"><%= t("#{i18n_namespace}.filters.one_filter_html",
filter: budget_investments_advanced_filters(params[:advanced_filters])) %></p>
<p class="inline-block"><%= sanitize(t("#{i18n_namespace}.filters.one_filter",
filter: budget_investments_advanced_filters(params[:advanced_filters]))) %></p>
<% end %>

View File

@@ -36,9 +36,9 @@
<div class="markdown-editor clear">
<div class="small-12 medium-8 column fullscreen-container">
<div class="markdown-editor-header truncate">
<%= t("admin.legislation.draft_versions.form.title_html",
<%= sanitize(t("admin.legislation.draft_versions.form.title",
draft_version_title: @draft_version.title,
process_title: @process.title) %>
process_title: @process.title)) %>
</div>
<div class="markdown-editor-buttons">

View File

@@ -1,9 +1,9 @@
<%= back_link_to %>
<h2><%= t("admin.newsletters.new.title") %></h2>
<p>
<%= t("admin.newsletters.new.header_footer_help_text_html",
<%= sanitize(t("admin.newsletters.new.header_footer_help_text",
link: link_to(t("admin.newsletters.new.image_link"),
admin_site_customization_images_path)) %>
admin_site_customization_images_path))) %>
</p>
<%= render "form" %>

View File

@@ -67,7 +67,7 @@
<% if hidden > 0 %>
<div class="callout warning">
<%= t("admin.organizations.index.hidden_count_html", count: hidden) %>
<%= sanitize(t("admin.organizations.index.hidden_count", count: hidden)) %>
</div>
<% end %>

View File

@@ -32,7 +32,7 @@
<div class="small-12 medium-6 column">
<%= f.text_field :slug, size: 80, maxlength: 80,
hint: t("admin.site_customization.pages.new.slug_help_html") %>
hint: sanitize(t("admin.site_customization.pages.new.slug_help")) %>
</div>
</div>

View File

@@ -6,8 +6,7 @@
<div class="small-12 medium-8 column small-centered text-center">
<h2>
<%= t("budgets.ballots.show.voted_html",
count: @ballot.investments.count) %>
<%= sanitize(t("budgets.ballots.show.voted", count: @ballot.investments.count)) %>
</h2>
<p class="confirmed">
<%= t("budgets.ballots.show.voted_info") %>

View File

@@ -36,8 +36,8 @@
</h2>
<div class="small-12 medium-9">
<div class="callout warning margin-top">
<%= t("budgets.investments.header.different_heading_assigned_html",
heading_link: heading_link(@assigned_heading, @budget)) %>
<%= sanitize(t("budgets.investments.header.different_heading_assigned",
heading_link: heading_link(@assigned_heading, @budget))) %>
<br>
<small>
<%= sanitize(t("budgets.investments.header.change_ballot",

View File

@@ -19,7 +19,7 @@
<%= render_image(investment.image, :large, true) if investment.image.present? %>
<p id="investment_code">
<%= t("budgets.investments.show.code_html", code: investment.id) %>
<%= sanitize(t("budgets.investments.show.code", code: investment.id)) %>
</p>
<%= auto_link_already_sanitized_html investment.description %>
@@ -32,13 +32,13 @@
<% if investment.location.present? %>
<p>
<%= t("budgets.investments.show.location_html", location: investment.location) %>
<%= sanitize(t("budgets.investments.show.location", location: investment.location)) %>
</p>
<% end %>
<% if investment.organization_name.present? %>
<p>
<%= t("budgets.investments.show.organization_name_html", name: investment.organization_name) %>
<%= sanitize(t("budgets.investments.show.organization_name", name: investment.organization_name)) %>
</p>
<% end %>

View File

@@ -75,7 +75,7 @@
<% if investment.unfeasible? && investment.valuation_finished? %>
<div class="callout warning">
<%= t("budgets.investments.show.project_unfeasible_html") %>
<%= sanitize(t("budgets.investments.show.project_unfeasible")) %>
</div>
<% elsif investment.winner? && @budget.finished? %>
<div class="callout success">
@@ -83,11 +83,11 @@
</div>
<% elsif investment.selected? %>
<div class="callout success">
<%= t("budgets.investments.show.project_selected_html") %>
<%= sanitize(t("budgets.investments.show.project_selected")) %>
</div>
<% elsif @budget.balloting_or_later? %>
<div class="callout warning">
<%= t("budgets.investments.show.project_not_selected_html") %>
<%= sanitize(t("budgets.investments.show.project_not_selected")) %>
</div>
<% else %>
<br>

View File

@@ -40,16 +40,16 @@
<% if @ballot.investments.by_heading(@heading.id).count > 0 %>
<p>
<em>
<%= t("budgets.investments.index.sidebar.voted_html",
<%= sanitize(t("budgets.investments.index.sidebar.voted",
count: @ballot.investments.by_heading(@heading.id).count,
amount_spent: @ballot.formatted_amount_spent(@heading)) %>
amount_spent: @ballot.formatted_amount_spent(@heading))) %>
</em>
</p>
<% elsif @assigned_heading.present? %>
<p>
<%= t("budgets.investments.index.sidebar.different_heading_assigned_html",
<%= sanitize(t("budgets.investments.index.sidebar.different_heading_assigned",
heading_link: heading_link(@assigned_heading, @budget)
) %>
)) %>
<br>
<small>
<%= sanitize(t("budgets.investments.index.sidebar.change_ballot",

View File

@@ -28,9 +28,9 @@
<h2><%= t("shared.search_results") %></h2>
<p>
<%= page_entries_info @investments %>
<%= t("budgets.investments.index.search_results_html",
<%= sanitize(t("budgets.investments.index.search_results",
count: @investments.size,
search_term: params[:search]) %>
search_term: params[:search])) %>
</p>
</div>
</div>

View File

@@ -34,7 +34,7 @@
<thead>
<tr>
<th scope="col" rowspan="2"><%= t("stats.budgets.heading") %></th>
<th scope="col" rowspan="2"><%= t("stats.budgets.investments_sent_html") %></th>
<th scope="col" rowspan="2"><%= sanitize(t("stats.budgets.investments_sent")) %></th>
<% stats.all_phases.each do |phase| %>
<th scope="col" colspan="3">

View File

@@ -8,7 +8,7 @@
<%= image_tag "quote_before_white.png", style: "max-width: 40px; vertical-align: top;" %>
<h1 style="color: #fff; font-size: 60px; line-height: 90px; display: inline;"><%= @proposal.title %></h1>
<%= image_tag "quote_after_white.png", style: "max-width: 40px; vertical-align: top;" %>
<h2 style="color: #fff; font-size: 40px; line-height: 60px"><%= t("dashboard.mailer.forward.subtitle_html") %></h2>
<h2 style="color: #fff; font-size: 40px; line-height: 60px"><%= sanitize(t("dashboard.mailer.forward.subtitle")) %></h2>
</td>
</tr>
</tbody>

View File

@@ -5,7 +5,7 @@
<%= image_tag "quote_before_white.png" %>
<h1 class="inline"><%= proposal.title %></h1>
<%= image_tag "quote_after_white.png" %>
<h2><%= t("dashboard.mailer.forward.subtitle_html") %></h2>
<h2><%= sanitize(t("dashboard.mailer.forward.subtitle")) %></h2>
</div>
<div class="margin-bottom">

View File

@@ -10,7 +10,7 @@
<%= t("dashboard.poster.index.poster_subtitle") %>
</h1>
<p class="intro">
<%= t("dashboard.poster.index.intro_text_html", org: Setting["org_name"]) %>
<%= sanitize(t("dashboard.poster.index.intro_text", org: Setting["org_name"])) %>
</p>
<p class="text-center">
@@ -29,7 +29,7 @@
<h3><%= proposal.title %></h3>
<%= image_tag "quote_after_blue.png" %>
<p class="poster-footer">
<%= t("dashboard.poster.index.footer_html", link: proposal_url(proposal)) %>
<%= sanitize(t("dashboard.poster.index.footer", link: proposal_url(proposal))) %>
</p>
</div>
</div>

View File

@@ -16,7 +16,7 @@
</strong>
</h1>
<p class="intro">
<%= t("dashboard.poster.index.intro_text_html", org: Setting["org_name"]) %>
<%= sanitize(t("dashboard.poster.index.intro_text", org: Setting["org_name"])) %>
</p>
<p class="text-center proposal-code">
<strong><%= t("dashboard.poster.index.proposal_code", code: proposal.code) %></strong>
@@ -34,7 +34,7 @@
<h3><strong><%= proposal.title %></strong></h3>
<%= wicked_pdf_image_tag "quote_after_blue.png" %>
<p class="poster-footer">
<%= t("dashboard.poster.index.footer_html", link: proposal_url(proposal)) %>
<%= sanitize(t("dashboard.poster.index.footer", link: proposal_url(proposal))) %>
</p>
</div>
</div>

View File

@@ -18,7 +18,9 @@
<p>
<%= page_entries_info @debates %>
<% if !@advanced_search_terms %>
<%= t("debates.index.search_results_html", count: @debates.size, search_term: @search_terms) %>
<%= sanitize(
t("debates.index.search_results", count: @debates.size, search_term: @search_terms)
) %>
<% end %>
</p>
<% elsif @tag_filter %>

View File

@@ -1,7 +1,7 @@
<% provide :title do %><%= t("devise_views.confirmations.show.title") %><% end %>
<h1 class="text-center"><%= t("devise_views.confirmations.show.title") %></h1>
<p><%= t("devise_views.confirmations.show.instructions_html", email: resource.email) %></p>
<p><%= sanitize(t("devise_views.confirmations.show.instructions", email: resource.email)) %></p>
<%= form_for(resource,
as: resource_name,

View File

@@ -18,6 +18,6 @@
} %>
<div id="max-documents-notice" class="max-documents-notice callout primary text-center <%= "hide" unless max_documents_allowed?(documentable) %>">
<%= t "documents.max_documents_allowed_reached_html" %>
<%= sanitize(t("documents.max_documents_allowed_reached")) %>
</div>
</div>

View File

@@ -9,9 +9,9 @@
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.budget_investment_unfeasible.new_html",
<%= sanitize(t("mailers.budget_investment_unfeasible.new",
url: link_to(t("mailers.budget_investment_unfeasible.new_href"),
new_budget_investment_url(@investment.budget), style: "color: #2895F1; text-decoration: underline;")) %>
new_budget_investment_url(@investment.budget), style: "color: #2895F1; text-decoration: underline;"))) %>
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">

View File

@@ -9,7 +9,8 @@
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.comment.new_comment_by_html", commenter: @comment.author.name) %> <%= link_to @commentable.title, commentable_url(@commentable), style: "color: #2895F1; text-decoration:none;" %>
<%= sanitize(t("mailers.comment.new_comment_by", commenter: @comment.author.name)) %>
<%= link_to @commentable.title, commentable_url(@commentable), style: "color: #2895F1; text-decoration:none;" %>
</p>
<p style="border-left: 2px solid #DEE0E3;font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-style: italic;font-weight: normal;line-height: 24px;margin-left: 20px;padding: 10px;">

View File

@@ -1,8 +1,8 @@
<td style="padding-bottom: 20px; padding-left: 10px;">
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif; font-size: 20px;">
<%= t("mailers.direct_message_for_sender.title_html",
receiver: @direct_message.receiver.name) %>
<%= sanitize(t("mailers.direct_message_for_sender.title",
receiver: @direct_message.receiver.name)) %>
</p>
<h2 style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif; font-size: 18px;">

View File

@@ -4,16 +4,16 @@
</h1>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.email_verification.instructions_html",
<%= sanitize(t("mailers.email_verification.instructions",
verification_link: link_to(
t("mailers.email_verification.click_here_to_verify"),
email_url(email_verification_token: @token))) %>
email_url(email_verification_token: @token)))) %>
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.email_verification.instructions_2_html",
<%= sanitize(t("mailers.email_verification.instructions_2",
document_type: humanize_document_type(@document_type),
document_number: @document_number) %>
document_number: @document_number)) %>
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.email_verification.thanks") %>

View File

@@ -9,7 +9,11 @@
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.evaluation_comment.new_comment_by_html", commenter: @email.comment.author.name, investment: valuation_comments_link(@email.commentable)) %>
<%= sanitize(t(
"mailers.evaluation_comment.new_comment_by",
commenter: @email.comment.author.name,
investment: valuation_comments_link(@email.commentable)
)) %>
</p>
<%= t("mailers.evaluation_comment.commenter_info", commenter: @email.comment.author.name, time: l(@email.comment.created_at)) %>

View File

@@ -9,7 +9,8 @@
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.reply.new_reply_by_html", commenter: @email.reply.author.name) %> <%= link_to @email.commentable.title, comment_url(@email.reply.id), style: "color: #2895F1; text-decoration:none;" %>
<%= sanitize(t("mailers.reply.new_reply_by", commenter: @email.reply.author.name)) %>
<%= link_to @email.commentable.title, comment_url(@email.reply.id), style: "color: #2895F1; text-decoration:none;" %>
</p>
<div style="border-left: 2px solid #DEE0E3;font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-style: italic;font-weight: normal;line-height: 24px;margin-left: 20px;padding: 10px;">

View File

@@ -10,7 +10,9 @@
<% if @search_terms %>
<h3>
<%= page_entries_info @proposals %>
<%= t("proposals.index.search_results_html", count: @proposals.size, search_term: @search_terms) %>
<%= sanitize(
t("proposals.index.search_results", count: @proposals.size, search_term: @search_terms)
) %>
</h3>
<% end %>

View File

@@ -4,6 +4,6 @@
<h2><%= t("management.user_invites.create.title") %></h2>
<div class="callout success">
<%= t("management.user_invites.create.success_html", count: @emails.count) %>
<%= sanitize(t("management.user_invites.create.success", count: @emails.count)) %>
</div>
</div>

View File

@@ -1,7 +1,7 @@
<% if @user.email.blank? %>
<p><%= t("management.users.autogenerated_password_html", password: @user.password) %></p>
<p><%= sanitize(t("management.users.autogenerated_password", password: @user.password)) %></p>
<% else %>
<p><%= t("management.users.create_user_success_html", email: @user.email) %></p>
<p><%= sanitize(t("management.users.create_user_success", email: @user.email)) %></p>
<% end %>
<%= render "management/user_permissions",

View File

@@ -1,7 +1,7 @@
<h2><%= t("devise_views.organizations.registrations.success.title") %></h2>
<p><%= t("devise_views.organizations.registrations.success.thank_you_html") %></p>
<p><%= t("devise_views.organizations.registrations.success.instructions_1_html") %></p>
<p><%= t("devise_views.organizations.registrations.success.instructions_2_html") %></p>
<p><%= sanitize(t("devise_views.organizations.registrations.success.thank_you")) %></p>
<p><%= sanitize(t("devise_views.organizations.registrations.success.instructions_1")) %></p>
<p><%= sanitize(t("devise_views.organizations.registrations.success.instructions_2")) %></p>
<p><%= t("devise_views.organizations.registrations.success.instructions_3") %></p>
<p>
<%= link_to t("devise_views.organizations.registrations.success.back_to_index"),

View File

@@ -7,8 +7,8 @@
</div>
<% elsif current_user.unverified? %>
<div class="callout warning">
<%= t("polls.show.cant_answer_verify_html",
verify_link: link_to(t("polls.show.verify_link"), verification_path)) %>
<%= sanitize(t("polls.show.cant_answer_verify",
verify_link: link_to(t("polls.show.verify_link"), verification_path))) %>
</div>
<% elsif @poll.expired? %>
<div class="callout alert">

View File

@@ -4,7 +4,7 @@
<h2><%= t("proposals.created.title") %></h2>
<p><%= t("proposals.created.motivation") %></p>
<p><%= t("proposals.created.motivation_2_html") %></p>
<p><%= sanitize(t("proposals.created.motivation_2")) %></p>
<% if can?(:dashboard, @proposal) %>
<%= link_to t("proposals.created.dashboard"),

View File

@@ -24,7 +24,9 @@
<p>
<%= page_entries_info @proposals %>
<% if !@advanced_search_terms %>
<%= t("proposals.index.search_results_html", count: @proposals.size, search_term: @search_terms) %>
<%= sanitize(
t("proposals.index.search_results", count: @proposals.size, search_term: @search_terms)
) %>
<% end %>
<p>
<% elsif @tag_filter %>

View File

@@ -1,7 +1,7 @@
<div class="row globalize-languages column padding-top <%= highlight_translation_html_class %>"
data-zero-languages-description="<%= t("shared.translations.languages_in_use_html", count: 0) %>"
data-one-languages-description="<%= t("shared.translations.languages_in_use_html", count: 1) %>"
data-other-languages-description="<%= t("shared.translations.languages_in_use_html", count: 2) %>">
data-zero-languages-description="<%= sanitize(t("shared.translations.languages_in_use", count: 0)) %>"
data-one-languages-description="<%= sanitize(t("shared.translations.languages_in_use", count: 1)) %>"
data-other-languages-description="<%= sanitize(t("shared.translations.languages_in_use", count: 2)) %>">
<div class="small-6 large-3 column">
<span class="small">
<strong class="js-languages-description"><%= selected_languages_description(resource) %></strong>

View File

@@ -10,7 +10,7 @@
<% if local_assigns[:message].present? %>
<%= message %>
<% else %>
<%= t("form.not_saved_html", resource: t("form.#{resource.class.to_s.underscore}")) %>
<%= sanitize(t("form.not_saved", resource: t("form.#{resource.class.to_s.underscore}"))) %>
<% end %>
</strong>
</div>

View File

@@ -1,6 +1,6 @@
<h2><%= t("devise_views.users.registrations.success.title") %></h2>
<p><%= t("devise_views.users.registrations.success.thank_you_html") %></p>
<p><%= t("devise_views.users.registrations.success.instructions_1_html") %></p>
<p><%= sanitize(t("devise_views.users.registrations.success.thank_you")) %></p>
<p><%= sanitize(t("devise_views.users.registrations.success.instructions_1")) %></p>
<p><%= t("devise_views.users.registrations.success.instructions_2") %></p>
<p>
<%= link_to t("devise_views.users.registrations.success.back_to_index"),

View File

@@ -13,7 +13,9 @@
<%= investment.unfeasibility_explanation.presence || "-" %>
</p>
<p>
<strong><%= t("valuation.budget_investments.edit.price_html", currency: budget.currency_symbol) %>:</strong>
<strong>
<%= sanitize(t("valuation.budget_investments.edit.price", currency: budget.currency_symbol)) %>:
</strong>
<%= investment.price.presence || "-" %>
</p>
<p>

View File

@@ -41,7 +41,7 @@
<div class="row">
<div class="small-12 medium-6 column">
<%= f.number_field :price,
label: t("valuation.budget_investments.edit.price_html", currency: budget.currency_symbol),
label: t("valuation.budget_investments.edit.price", currency: budget.currency_symbol),
max: 1000000000000000 %>
</div>

View File

@@ -7,7 +7,7 @@
<h1><%= t("verification.letter.edit.title") %></h1>
<div data-alert class="callout success">
<%= t("verification.letter.create.flash.success_html") %>
<%= sanitize(t("verification.letter.create.flash.success")) %>
</div>
<%= link_to t("verification.letter.edit.see_all"), proposals_path, class: "button warning" %>

View File

@@ -54,7 +54,7 @@
<div class="dropdown-pane" id="info-document-number" data-dropdown
data-hover="true" data-hover-pane="true">
<%= t("verification.residence.new.document_number_help_text_html") %>
<%= sanitize(t("verification.residence.new.document_number_help_text")) %>
</div>
<%= f.text_field :document_number, label: false %>

View File

@@ -27,7 +27,7 @@
<div class="small-12 medium-6">
<%= f.label :phone, t("verification.sms.new.phone"), class: "inline-block" %>
<span class="inline-block"><%= t("verification.sms.new.phone_format_html") %></span>
<span class="inline-block"><%= sanitize(t("verification.sms.new.phone_format")) %></span>
<p class="help-text" id="phone-text-help"><%= t("verification.sms.new.phone_note") %></p>
<%= f.text_field :phone, label: false,
placeholder: t("verification.sms.new.phone_placeholder"),

View File

@@ -198,8 +198,8 @@ en:
min_total_supports: Minimum supports
max_total_supports: Maximum supports
winners: Winners
one_filter_html: "Current applied filters: <b><em>%{filter}</em></b>"
two_filters_html: "Current applied filters: <b><em>%{filter}, %{advanced_filters}</em></b>"
one_filter: "Current applied filters: <b><em>%{filter}</em></b>"
two_filters: "Current applied filters: <b><em>%{filter}, %{advanced_filters}</em></b>"
buttons:
filter: Filter
download_current_selection: "Download current selection"
@@ -555,7 +555,7 @@ en:
form:
error: Error
form:
title_html: 'Editing <span class="strong">%{draft_version_title}</span> from the process <span class="strong">%{process_title}</span>'
title: 'Editing <span class="strong">%{draft_version_title}</span> from the process <span class="strong">%{process_title}</span>'
launch_text_editor: Launch text editor
close_text_editor: Close text editor
use_markdown: Use Markdown to format the text
@@ -767,7 +767,7 @@ en:
empty_newsletters: There are no newsletters to show
new:
title: New newsletter
header_footer_help_text_html: "The heading and footer are the same for all emails, you can modify them on <code>app/views/layouts/mailer_header</code> and <code>app/views/layouts/mailer_footer</code>.<br>You can replace header image on %{link}."
header_footer_help_text: "The heading and footer are the same for all emails, you can modify them on <code>app/views/layouts/mailer_header</code> and <code>app/views/layouts/mailer_footer</code>.<br>You can replace header image on %{link}."
image_link: "custom images"
edit:
title: Edit newsletter
@@ -1187,7 +1187,7 @@ en:
pending: Pending
rejected: Rejected
verified: Verified
hidden_count_html:
hidden_count:
one: There is also <strong>one organisation</strong> with no users or with a hidden user.
other: There are <strong>%{count} organisations</strong> with no users or with a hidden user.
name: Name
@@ -1542,7 +1542,7 @@ en:
see_page: See page
new:
title: Create new custom page
slug_help_html: "Text to identify this page on URL, for example <code>https://consulproject.org/page-slug</code>"
slug_help: "Text to identify this page on URL, for example <code>https://consulproject.org/page-slug</code>"
page:
created_at: Created at
status: Status

View File

@@ -7,7 +7,7 @@ en:
remaining: "You still have <span>%{amount}</span> to invest."
no_balloted_group_yet: "You have not voted on this group yet, go vote!"
remove: Remove vote
voted_html:
voted:
one: "You have voted <span>one</span> investment."
other: "You have voted <span>%{count}</span> investments."
voted_info: "Your ballot is confirmed!"
@@ -79,17 +79,17 @@ en:
button: Search
placeholder: Search investment projects...
title: Search
search_results_html:
search_results:
one: " containing the term <strong>'%{search_term}'</strong>"
other: " containing the term <strong>'%{search_term}'</strong>"
sidebar:
my_ballot: My ballot
voted_html:
voted:
one: "<strong>You voted one proposal with a cost of %{amount_spent}</strong>"
other: "<strong>You voted %{count} proposals with a cost of %{amount_spent}</strong>"
voted_info: You can %{link} at any time until the close of this phase. No need to spend all the money available.
voted_info_link: change your vote
different_heading_assigned_html: "You have active votes in another heading: %{heading_link}"
different_heading_assigned: "You have active votes in another heading: %{heading_link}"
change_ballot: "If your change your mind you can remove your votes in %{check_ballot} and start again."
check_ballot_link: "check and confirm my ballot"
zero: You have not voted any investment project in this group.
@@ -109,9 +109,9 @@ en:
author_deleted: User deleted
price_explanation: Price explanation
unfeasibility_explanation: Unfeasibility explanation
code_html: "Investment project code: <strong>%{code}</strong>"
location_html: "Location: <strong>%{location}</strong>"
organization_name_html: "Proposed on behalf of: <strong>%{name}</strong>"
code: "Investment project code: <strong>%{code}</strong>"
location: "Location: <strong>%{location}</strong>"
organization_name: "Proposed on behalf of: <strong>%{name}</strong>"
share: Share
title: Investment project
supports: Supports
@@ -120,10 +120,10 @@ en:
comments_tab: Comments
milestones_tab: Milestones
author: Author
project_unfeasible_html: "This investment project <strong>has been marked as not feasible</strong> and will not go to balloting phase."
project_selected_html: "This investment project <strong>has been selected</strong> for balloting phase."
project_unfeasible: "This investment project <strong>has been marked as not feasible</strong> and will not go to balloting phase."
project_selected: "This investment project <strong>has been selected</strong> for balloting phase."
project_winner: "Winning investment project"
project_not_selected_html: "This investment project <strong>has not been selected</strong> for balloting phase."
project_not_selected: "This investment project <strong>has not been selected</strong> for balloting phase."
see_price_explanation: See price explanation
wrong_price_format: Only integer numbers
investment:
@@ -141,7 +141,7 @@ en:
give_support: Support
header:
check_ballot: Check and confirm my ballot
different_heading_assigned_html: "You have active votes in another heading: %{heading_link}"
different_heading_assigned: "You have active votes in another heading: %{heading_link}"
change_ballot: "If your change your mind you can remove your votes in %{check_ballot} and start again."
check_ballot_link: "check and confirm my ballot"
price: "This heading has a budget of"

View File

@@ -6,7 +6,7 @@ en:
submit: Re-send instructions
title: Re-send confirmation instructions
show:
instructions_html: Confirming the account with email %{email}
instructions: Confirming the account with email %{email}
new_password_confirmation_label: Repeat access password
new_password_label: New access password
please_set_password: Please choose your new pasword (it will allow you to login with the email above)
@@ -50,10 +50,10 @@ en:
title: Register as an organisation or collective
success:
back_to_index: I understand; go back to main page
instructions_1_html: "<strong>We will contact you soon</strong> to verify that you do in fact represent this collective."
instructions_2_html: While your <strong>email is reviewed</strong>, we have sent you a <strong>link to confirm your account</strong>.
instructions_1: "<strong>We will contact you soon</strong> to verify that you do in fact represent this collective."
instructions_2: While your <strong>email is reviewed</strong>, we have sent you a <strong>link to confirm your account</strong>.
instructions_3: Once confirmed, you may begin to participate as an unverified collective.
thank_you_html: Thank you for registering your collective on the website. It is now <strong>pending verification</strong>.
thank_you: Thank you for registering your collective on the website. It is now <strong>pending verification</strong>.
title: Registration of organisation / collective
passwords:
edit:
@@ -123,7 +123,7 @@ en:
username_note: Name that appears next to your posts
success:
back_to_index: I understand; go back to main page
instructions_1_html: Please <b>check your email</b> - we have sent you a <b>link to confirm your account</b>.
instructions_1: Please <b>check your email</b> - we have sent you a <b>link to confirm your account</b>.
instructions_2: Once confirmed, you may begin participation.
thank_you_html: Thank you for registering for the website. You must now <b>confirm your email address</b>.
thank_you: Thank you for registering for the website. You must now <b>confirm your email address</b>.
title: Confirm your email address

View File

@@ -1,7 +1,7 @@
en:
documents:
title: Documents
max_documents_allowed_reached_html: You have reached the maximum number of documents allowed! <strong>You have to delete one before you can upload another.</strong>
max_documents_allowed_reached: You have reached the maximum number of documents allowed! <strong>You have to delete one before you can upload another.</strong>
additional: Additional documentation
form:
title: Documents

View File

@@ -116,7 +116,7 @@ en:
button: Search
placeholder: Search debates...
title: Search
search_results_html:
search_results:
one: " containing the term <strong>'%{search_term}'</strong>"
other: " containing the term <strong>'%{search_term}'</strong>"
select_order: Order by
@@ -169,7 +169,7 @@ en:
direct_message: private message
error: error
errors: errors
not_saved_html: "prevented this %{resource} from being saved. <br>Please check the marked fields to know how to correct them:"
not_saved: "prevented this %{resource} from being saved. <br>Please check the marked fields to know how to correct them:"
policy: Privacy Policy
proposal: Proposal
proposal_notification: "Notification"
@@ -302,7 +302,7 @@ en:
created:
title: Congratulations! You have taken the first step.
motivation: "It is important to prepare the launch campaign for your proposal to be successful. The first few days are decisive."
motivation_2_html: "<strong>If you want recommendations to prepare the publishing leave your proposal as a draft and we will guide you.</strong>"
motivation_2: "<strong>If you want recommendations to prepare the publishing leave your proposal as a draft and we will guide you.</strong>"
publish: No, I want to publish the proposal
dashboard: Yes, I want help and I'll publish later
preview_title: This is how your proposal will look when you publish it
@@ -376,7 +376,7 @@ en:
button: Search
placeholder: Search proposals...
title: Search
search_results_html:
search_results:
one: " containing the term <strong>'%{search_term}'</strong>"
other: " containing the term <strong>'%{search_term}'</strong>"
select_order: Order by
@@ -570,12 +570,12 @@ en:
title: Poster preview
poster_title: "Do not keep looking,"
poster_subtitle: "back me up! ;)"
intro_text_html:
intro_text:
"<strong>I am participating in %{org}</strong> with my own citizen proposal and only if you also add you can I achieve the
necessary support to make the city we all want."
proposal_code: "Code of the proposal: %{code}"
support: Support my proposal
footer_html: "<strong>Visit %{link} and support this proposal.</strong> We need to be many. Decide your too. Thank you!"
footer: "<strong>Visit %{link} and support this proposal.</strong> We need to be many. Decide your too. Thank you!"
new:
title: Poster of your proposal
options:
@@ -593,7 +593,7 @@ en:
sent: The email has been sent
mailer:
forward:
subtitle_html: "If you support me, <br>we will achieve it."
subtitle: "If you support me, <br>we will achieve it."
support_button: Support this proposal
share_in: Share in
hi: "Hello!"
@@ -644,7 +644,7 @@ en:
back: Back to voting
cant_answer_not_logged_in: "You must %{signin} or %{signup} to participate."
comments_tab: Comments
cant_answer_verify_html: "You must %{verify_link} in order to answer."
cant_answer_verify: "You must %{verify_link} in order to answer."
verify_link: "verify your account"
cant_answer_expired: "This poll has finished."
cant_answer_wrong_geozone: "This question is not available on your geozone."
@@ -805,7 +805,7 @@ en:
select_language_prompt: Choose language
remove_language: Remove language
add_language: Add language
languages_in_use_html:
languages_in_use:
zero: "<span class='js-languages-count'>0</span> languages in use"
one: "<span class='js-languages-count'>1</span> language in use"
other: "<span class='js-languages-count'>%{count}</span> languages in use"

View File

@@ -4,21 +4,21 @@ en:
no_reply: "This message was sent from an email address that does not accept replies."
comment:
hi: Hi
new_comment_by_html: There is a new comment from <strong>%{commenter}</strong>
new_comment_by: There is a new comment from <strong>%{commenter}</strong>
subject: Someone has commented on your %{commentable}
title: New comment
config:
manage_email_subscriptions: To stop receiving these emails change your settings in
email_verification:
click_here_to_verify: this link
instructions_2_html: This email will verify your account with <b>%{document_type} %{document_number}</b>. If these don't belong to you, please don't click on the previous link and ignore this email.
instructions_html: To complete the verification of your user account you must click %{verification_link}.
instructions_2: This email will verify your account with <b>%{document_type} %{document_number}</b>. If these don't belong to you, please don't click on the previous link and ignore this email.
instructions: To complete the verification of your user account you must click %{verification_link}.
subject: Confirm your email
thanks: Thank you very much.
title: Confirm your account using the following link
reply:
hi: Hi
new_reply_by_html: There is a new response from <strong>%{commenter}</strong> to your comment on
new_reply_by: There is a new response from <strong>%{commenter}</strong> to your comment on
subject: Someone has responded to your comment
title: New response to your comment
proposal_notification_digest:
@@ -35,7 +35,7 @@ en:
unsubscribe_account: My account
direct_message_for_sender:
subject: "You have sent a new private message"
title_html: "You have sent a new private message to <strong>%{receiver}</strong> with the content:"
title: "You have sent a new private message to <strong>%{receiver}</strong> with the content:"
user_invite:
ignore: "If you have not requested this invitation don't worry, you can ignore this email."
text: "Thank you for applying to join %{org}! In seconds you can start to participate, just fill the form below:"
@@ -54,7 +54,7 @@ en:
share: "Share your project"
budget_investment_unfeasible:
hi: "Dear user,"
new_html: "For all these, we invite you to elaborate a <strong>new investment</strong> that adjusts to the conditions of this process. You can do it following this link: %{url}."
new: "For all these, we invite you to elaborate a <strong>new investment</strong> that adjusts to the conditions of this process. You can do it following this link: %{url}."
new_href: "new investment project"
sincerely: "Sincerely"
sorry: "Sorry for the inconvenience and we again thank you for your invaluable participation."
@@ -75,7 +75,7 @@ en:
subject: "New evaluation comment"
title: New evaluation comment for %{investment}
hi: Hi
new_comment_by_html: There is a new evaluation comment from <strong>%{commenter}</strong> to the budget investment %{investment}
new_comment_by: There is a new evaluation comment from <strong>%{commenter}</strong> to the budget investment %{investment}
commenter_info: "%{commenter}, %{time}:"
new_actions_notification_rake_created:
subject: "More news about your citizen proposal"

View File

@@ -112,8 +112,8 @@ en:
create_user: Create a new account
create_user_info: We will create an account with the following data
create_user_submit: Create user
create_user_success_html: We have sent an email to the email address <b>%{email}</b> in order to verify that it belongs to this user. It contains a link they have to click. Then they will have to set their access password before being able to log in to the website
autogenerated_password_html: "Autogenerated password is <b>%{password}</b>, you can change it in the 'My account' section of the web"
create_user_success: We have sent an email to the email address <b>%{email}</b> in order to verify that it belongs to this user. It contains a link they have to click. Then they will have to set their access password before being able to log in to the website
autogenerated_password: "Autogenerated password is <b>%{password}</b>, you can change it in the 'My account' section of the web"
email_optional_label: Email (optional)
erased_notice: User account deleted.
erased_by_manager: "Deleted by manager: %{manager}"
@@ -128,5 +128,5 @@ en:
submit: Send invitations
title: Send invitations
create:
success_html: <strong>%{count} invitations</strong> have been sent.
success: <strong>%{count} invitations</strong> have been sent.
title: Send invitations

View File

@@ -27,7 +27,7 @@ en:
by_heading: "Participants by phase and heading"
total: "Total"
heading: "Heading"
investments_sent_html: "Investment proposals sent"
investments_sent: "Investment proposals sent"
participants_support_phase: "Participants support phase"
participants_vote_phase: "Participants voting phase"
participants_every_phase: "Total participants"

View File

@@ -56,7 +56,7 @@ en:
preview: Investment preview
edit:
dossier: Dossier
price_html: "Price (%{currency})"
price: "Price (%{currency})"
price_first_year: "Cost during the first year (%{currency}) <small>(optional, data not public)</small>"
feasibility: Feasibility
valuation_finished_alert: "Are you sure you want to mark this report as completed? If you do it, it can no longer be modified."

View File

@@ -19,7 +19,7 @@ en:
unconfirmed_code: You have not yet entered the confirmation code
create:
flash:
success_html: Thank you for requesting your <b>maximum security code (only required for the final votes)</b>. In a few days we will send it to the address featuring in the data we have on file. Please remember that, if you prefer, you can collect your code from any of the Citizen Support Offices.
success: Thank you for requesting your <b>maximum security code (only required for the final votes)</b>. In a few days we will send it to the address featuring in the data we have on file. Please remember that, if you prefer, you can collect your code from any of the Citizen Support Offices.
edit:
see_all: See proposals
title: Letter requested
@@ -49,7 +49,7 @@ en:
accept_terms_text_title: I accept the terms and conditions of access of the Census
document_number: Document number
document_number_help_title: Help
document_number_help_text_html: "<strong>DNI</strong>: 12345678A<br> <strong>Passport</strong>: AAA000001<br> <strong>Residence card</strong>: X1234567P"
document_number_help_text: "<strong>DNI</strong>: 12345678A<br> <strong>Passport</strong>: AAA000001<br> <strong>Residence card</strong>: X1234567P"
document_type:
passport: Passport
residence_card: Residence card
@@ -73,7 +73,7 @@ en:
title: Security code confirmation
new:
phone: Enter your mobile phone number to receive the code
phone_format_html: "<strong><em>(Example: 612345678 or +34612345678)</em></strong>"
phone_format: "<strong><em>(Example: 612345678 or +34612345678)</em></strong>"
phone_note: We only use your phone to send you a code, never to contact you.
phone_placeholder: "Example: 612345678 or +34612345678"
submit_button: Send

View File

@@ -198,8 +198,8 @@ es:
min_total_supports: Apoyos mínimos
max_total_supports: Apoyos máximos
winners: Ganadores
one_filter_html: "Filtros en uso: <b><em>%{filter}</em></b>"
two_filters_html: "Filtros en uso: <b><em>%{filter}, %{advanced_filters}</em></b>"
one_filter: "Filtros en uso: <b><em>%{filter}</em></b>"
two_filters: "Filtros en uso: <b><em>%{filter}, %{advanced_filters}</em></b>"
buttons:
filter: Filtrar
download_current_selection: "Descargar selección actual"
@@ -554,7 +554,7 @@ es:
form:
error: Error
form:
title_html: 'Editando <span class="strong">%{draft_version_title}</span> del proceso <span class="strong">%{process_title}</span>'
title: 'Editando <span class="strong">%{draft_version_title}</span> del proceso <span class="strong">%{process_title}</span>'
launch_text_editor: Lanzar editor de texto
close_text_editor: Cerrar editor de texto
use_markdown: Usa Markdown para formatear el texto
@@ -766,7 +766,7 @@ es:
empty_newsletters: No hay newsletters para mostrar
new:
title: Nueva newsletter
header_footer_help_text_html: "El encabezado y pie son los mismos en todos los emails, puedes modificarlos en <code>app/views/layouts/mailer_header</code> y <code>app/views/layouts/mailer_footer</code>.<br>Puedes reemplazar la imagen del encabezado en %{link}."
header_footer_help_text: "El encabezado y pie son los mismos en todos los emails, puedes modificarlos en <code>app/views/layouts/mailer_header</code> y <code>app/views/layouts/mailer_footer</code>.<br>Puedes reemplazar la imagen del encabezado en %{link}."
image_link: "personalizar imágenes"
edit:
title: Editar newsletter
@@ -1186,7 +1186,7 @@ es:
pending: Pendientes
rejected: Rechazadas
verified: Verificadas
hidden_count_html:
hidden_count:
one: Hay además <strong>una organización</strong> sin usuario o con el usuario bloqueado.
other: Hay <strong>%{count} organizaciones</strong> sin usuario o con el usuario bloqueado.
name: Nombre
@@ -1541,7 +1541,7 @@ es:
see_page: Ver página
new:
title: Página nueva
slug_help_html: "Texto que identifica esta página en la URL, por ejemplo <code>https://consulproject.org/slug-de-pagina</code>"
slug_help: "Texto que identifica esta página en la URL, por ejemplo <code>https://consulproject.org/slug-de-pagina</code>"
page:
created_at: Creada
status: Estado

View File

@@ -7,7 +7,7 @@ es:
remaining: "Te quedan <span>%{amount}</span> para invertir"
no_balloted_group_yet: "Todavía no has votado proyectos de este grupo, ¡vota!"
remove: Quitar voto
voted_html:
voted:
one: "Has votado <span>un</span> proyecto."
other: "Has votado <span>%{count}</span> proyectos."
voted_info: "¡Tus votos están confirmados!"
@@ -18,9 +18,9 @@ es:
not_verified: Los proyectos de gasto sólo pueden ser apoyados por usuarios verificados, %{verify_account}.
organization: Las organizaciones no pueden votar.
not_selected: No se pueden votar proyectos inviables.
not_enough_money_html: "Ya has asignado el presupuesto disponible.<br><small>Recuerda que puedes %{change_ballot} en cualquier momento</small>"
not_enough_money: "Ya has asignado el presupuesto disponible.<br><small>Recuerda que puedes %{change_ballot} en cualquier momento</small>"
no_ballots_allowed: El periodo de votación está cerrado.
different_heading_assigned_html: "Ya has votado proyectos de otra partida: %{heading_link}"
different_heading_assigned: "Ya has votado proyectos de otra partida: %{heading_link}"
change_ballot: cambiar tus votos
casted_offline: Ya has participado presencialmente
groups:
@@ -79,17 +79,17 @@ es:
button: Buscar
placeholder: Buscar proyectos de gasto...
title: Buscar
search_results_html:
search_results:
one: " que contiene <strong>'%{search_term}'</strong>"
other: " que contienen <strong>'%{search_term}'</strong>"
sidebar:
my_ballot: Mis votos
voted_html:
voted:
one: "<strong>Has votado un proyecto por un valor de %{amount_spent}</strong>"
other: "<strong>Has votado %{count} proyectos por un valor de %{amount_spent}</strong>"
voted_info: Puedes %{link} en cualquier momento hasta el cierre de esta fase. No hace falta que gastes todo el dinero disponible.
voted_info_link: cambiar tus votos
different_heading_assigned_html: "Ya apoyaste proyectos de otra sección del presupuesto: %{heading_link}"
different_heading_assigned: "Ya apoyaste proyectos de otra sección del presupuesto: %{heading_link}"
change_ballot: "Si cambias de opinión puedes borrar tus votos en %{check_ballot} y volver a empezar."
check_ballot_link: "revisar y confirmar mis votos"
zero: Todavía no has votado ningún proyecto de gasto en este ámbito del presupuesto.
@@ -109,9 +109,9 @@ es:
author_deleted: Usuario eliminado
price_explanation: Informe de coste
unfeasibility_explanation: Informe de inviabilidad
code_html: "Código proyecto de gasto: <strong>%{code}</strong>"
location_html: "Ubicación: <strong>%{location}</strong>"
organization_name_html: "Propuesto en nombre de: <strong>%{name}</strong>"
code: "Código proyecto de gasto: <strong>%{code}</strong>"
location: "Ubicación: <strong>%{location}</strong>"
organization_name: "Propuesto en nombre de: <strong>%{name}</strong>"
share: Compartir
title: Proyecto de gasto
supports: Apoyos
@@ -120,10 +120,10 @@ es:
comments_tab: Comentarios
milestones_tab: Seguimiento
author: Autor
project_unfeasible_html: "Este proyecto de gasto <strong>ha sido marcado como inviable</strong> y no pasará a la fase de votación."
project_selected_html: "Este proyecto de gasto <strong>ha sido seleccionado</strong> para la fase de votación."
project_unfeasible: "Este proyecto de gasto <strong>ha sido marcado como inviable</strong> y no pasará a la fase de votación."
project_selected: "Este proyecto de gasto <strong>ha sido seleccionado</strong> para la fase de votación."
project_winner: "Proyecto de gasto ganador"
project_not_selected_html: "Este proyecto de gasto <strong>no ha sido seleccionado</strong> para la fase de votación."
project_not_selected: "Este proyecto de gasto <strong>no ha sido seleccionado</strong> para la fase de votación."
see_price_explanation: Ver informe de coste
wrong_price_format: Solo puede incluir caracteres numéricos
investment:
@@ -141,7 +141,7 @@ es:
give_support: Apoyar
header:
check_ballot: Revisar y confirmar mis votos
different_heading_assigned_html: "Ya apoyaste proyectos de otra sección del presupuesto: %{heading_link}"
different_heading_assigned: "Ya apoyaste proyectos de otra sección del presupuesto: %{heading_link}"
change_ballot: "Si cambias de opinión puedes borrar tus votos en %{check_ballot} y volver a empezar."
check_ballot_link: "revisar y confirmar mis votos"
price: "Esta partida tiene un presupuesto de"

View File

@@ -6,7 +6,7 @@ es:
submit: Reenviar instrucciones
title: Reenviar instrucciones de confirmación
show:
instructions_html: Vamos a proceder a confirmar la cuenta con el email <b>%{email}</b>
instructions: Vamos a proceder a confirmar la cuenta con el email <b>%{email}</b>
new_password_confirmation_label: Repite la clave de nuevo
new_password_label: Nueva clave de acceso
please_set_password: Por favor introduce una nueva clave de acceso para su cuenta (te permitirá hacer login con el email de más arriba)
@@ -50,10 +50,10 @@ es:
title: Registrarse como organización / colectivo
success:
back_to_index: Entendido, volver a la página principal
instructions_1_html: "En breve <b>nos pondremos en contacto contigo</b> para verificar que realmente representas a este colectivo."
instructions_2_html: Mientras <b>revisa tu correo electrónico</b>, te hemos enviado un <b>enlace para confirmar tu cuenta</b>.
instructions_1: "En breve <b>nos pondremos en contacto contigo</b> para verificar que realmente representas a este colectivo."
instructions_2: Mientras <b>revisa tu correo electrónico</b>, te hemos enviado un <b>enlace para confirmar tu cuenta</b>.
instructions_3: Una vez confirmado, podrás empezar a participar como colectivo no verificado.
thank_you_html: Gracias por registrar tu colectivo en la web. Ahora está <b>pendiente de verificación</b>.
thank_you: Gracias por registrar tu colectivo en la web. Ahora está <b>pendiente de verificación</b>.
title: Registro de organización / colectivo
passwords:
edit:
@@ -123,7 +123,7 @@ es:
username_note: Nombre público que aparecerá en tus publicaciones
success:
back_to_index: Entendido, volver a la página principal
instructions_1_html: Por favor <b>revisa tu correo electrónico</b> - te hemos enviado un <b>enlace para confirmar tu cuenta</b>.
instructions_1: Por favor <b>revisa tu correo electrónico</b> - te hemos enviado un <b>enlace para confirmar tu cuenta</b>.
instructions_2: Una vez confirmado, podrás empezar a participar.
thank_you_html: Gracias por registrarte en la web. Ahora debes <b>confirmar tu correo</b>.
thank_you: Gracias por registrarte en la web. Ahora debes <b>confirmar tu correo</b>.
title: Revisa tu correo

View File

@@ -1,7 +1,7 @@
es:
documents:
title: Documentos
max_documents_allowed_reached_html: '¡Has alcanzado el número máximo de documentos permitidos! <strong>Tienes que eliminar uno antes de poder subir otro.</strong>'
max_documents_allowed_reached: '¡Has alcanzado el número máximo de documentos permitidos! <strong>Tienes que eliminar uno antes de poder subir otro.</strong>'
additional: Documentación adicional
form:
title: Documentos

View File

@@ -116,7 +116,7 @@ es:
button: Buscar
placeholder: Buscar debates...
title: Buscar
search_results_html:
search_results:
one: " que contiene <strong>'%{search_term}'</strong>"
other: " que contienen <strong>'%{search_term}'</strong>"
select_order: Ordenar por
@@ -169,7 +169,7 @@ es:
direct_message: el mensaje privado
error: error
errors: errores
not_saved_html: "impidieron guardar %{resource}. <br>Por favor revisa los campos marcados para saber cómo corregirlos:"
not_saved: "impidieron guardar %{resource}. <br>Por favor revisa los campos marcados para saber cómo corregirlos:"
policy: Política de privacidad
proposal: la propuesta
proposal_notification: "la notificación"
@@ -302,7 +302,7 @@ es:
created:
title: '¡Enhorabuena! Has dado el primer paso.'
motivation: "Es importante preparar la campaña de lanzamiento de tu propuesta para que tenga éxito. Los primeros días son decisivos."
motivation_2_html: "<strong>Si quieres recomendaciones para preparar la publicación deja tu propuesta como borrador y te guiaremos.</strong>"
motivation_2: "<strong>Si quieres recomendaciones para preparar la publicación deja tu propuesta como borrador y te guiaremos.</strong>"
publish: No, quiero publicar la propuesta ya
dashboard: Si, quiero ayuda y publicaré mas tarde
preview_title: Así es como quedará tu propuesta cuando la publiques
@@ -376,7 +376,7 @@ es:
button: Buscar
placeholder: Buscar propuestas...
title: Buscar
search_results_html:
search_results:
one: " que contiene <strong>'%{search_term}'</strong>"
other: " que contienen <strong>'%{search_term}'</strong>"
select_order: Ordenar por
@@ -570,10 +570,10 @@ es:
title: Previsualización del poster
poster_title: "No te quedes mirando,"
poster_subtitle: "¡apóyame! ;)"
intro_text_html: "<strong>Estoy participando en %{org}</strong> con mi propia propuesta ciudadana y sólo si tú también te sumas podré lograr el apoyo necesario para hacer la ciudad que todos queremos."
intro_text: "<strong>Estoy participando en %{org}</strong> con mi propia propuesta ciudadana y sólo si tú también te sumas podré lograr el apoyo necesario para hacer la ciudad que todos queremos."
proposal_code: "Código de la propuesta: %{code}"
support: Apoya mi propuesta
footer_html: "<strong>Entra en %{link} y apoya esta propuesta.</strong> Necesitamos ser muchos. Decide tu también. ¡Gracias!"
footer: "<strong>Entra en %{link} y apoya esta propuesta.</strong> Necesitamos ser muchos. Decide tu también. ¡Gracias!"
new:
title: Póster de tu propuesta
options:
@@ -591,7 +591,7 @@ es:
sent: El e-mail ha sido enviado
mailer:
forward:
subtitle_html: "Si me apoyas, <br>lo conseguiremos."
subtitle: "Si me apoyas, <br>lo conseguiremos."
support_button: Apoyar esta propuesta
share_in: Compartir en
hi: "¡Hola!"
@@ -642,7 +642,7 @@ es:
back: Volver a votaciones
cant_answer_not_logged_in: "Necesitas %{signin} o %{signup} para participar."
comments_tab: Comentarios
cant_answer_verify_html: "Por favor %{verify_link} para poder responder."
cant_answer_verify: "Por favor %{verify_link} para poder responder."
verify_link: "verifica tu cuenta"
cant_answer_expired: "Esta votación ha terminado."
cant_answer_wrong_geozone: "Esta votación no está disponible en tu zona."
@@ -802,7 +802,7 @@ es:
select_language_prompt: Seleccionar idioma
remove_language: Eliminar idioma
add_language: Añadir idioma
languages_in_use_html:
languages_in_use:
zero: "<span class='js-languages-count'>0</span> idiomas en uso"
one: "<span class='js-languages-count'>1</span> idioma en uso"
other: "<span class='js-languages-count'>%{count}</span> idiomas en uso"

View File

@@ -4,21 +4,21 @@ es:
no_reply: "Este mensaje se ha enviado desde una dirección de correo electrónico que no admite respuestas."
comment:
hi: Hola
new_comment_by_html: Hay un nuevo comentario de <strong>%{commenter}</strong> en
new_comment_by: Hay un nuevo comentario de <strong>%{commenter}</strong> en
subject: Alguien ha comentado en tu %{commentable}
title: Nuevo comentario
config:
manage_email_subscriptions: Puedes dejar de recibir estos emails cambiando tu configuración en
email_verification:
click_here_to_verify: en este enlace
instructions_2_html: Este email es para verificar tu cuenta con <b>%{document_type} %{document_number}</b>. Si esos no son tus datos, por favor no pulses el enlace anterior e ignora este email.
instructions_html: Para terminar de verificar tu cuenta de usuario pulsa %{verification_link}.
instructions_2: Este email es para verificar tu cuenta con <b>%{document_type} %{document_number}</b>. Si esos no son tus datos, por favor no pulses el enlace anterior e ignora este email.
instructions: Para terminar de verificar tu cuenta de usuario pulsa %{verification_link}.
subject: Verifica tu email
thanks: Muchas gracias.
title: Verifica tu cuenta con el siguiente enlace
reply:
hi: Hola
new_reply_by_html: Hay una nueva respuesta de <strong>%{commenter}</strong> a tu comentario en
new_reply_by: Hay una nueva respuesta de <strong>%{commenter}</strong> a tu comentario en
subject: Alguien ha respondido a tu comentario
title: Nueva respuesta a tu comentario
proposal_notification_digest:
@@ -35,7 +35,7 @@ es:
unsubscribe_account: Mi cuenta
direct_message_for_sender:
subject: "Has enviado un nuevo mensaje privado"
title_html: "Has enviado un nuevo mensaje privado a <strong>%{receiver}</strong> con el siguiente contenido:"
title: "Has enviado un nuevo mensaje privado a <strong>%{receiver}</strong> con el siguiente contenido:"
user_invite:
ignore: "Si no has solicitado esta invitación no te preocupes, puedes ignorar este correo."
text: "¡Gracias por solicitar unirte a %{org}! En unos segundos podrás empezar a participar, sólo tienes que rellenar el siguiente formulario:"
@@ -54,7 +54,7 @@ es:
share: "Comparte tu proyecto"
budget_investment_unfeasible:
hi: "Estimado/a usuario/a"
new_html: "Por todo ello, te invitamos a que elabores un <strong>nuevo proyecto de gasto</strong> que se ajuste a las condiciones de este proceso. Esto lo puedes hacer en este enlace: %{url}."
new: "Por todo ello, te invitamos a que elabores un <strong>nuevo proyecto de gasto</strong> que se ajuste a las condiciones de este proceso. Esto lo puedes hacer en este enlace: %{url}."
new_href: "nuevo proyecto de gasto"
sincerely: "Atentamente"
sorry: "Sentimos las molestias ocasionadas y volvemos a darte las gracias por tu inestimable participación."
@@ -75,7 +75,7 @@ es:
subject: "Nuevo comentario de evaluación"
title: Nuevo comentario de evaluación para %{investment}
hi: Hola
new_comment_by_html: Hay un nuevo comentario de evaluación de <strong>%{commenter}</strong> en el presupuesto participativo %{investment}
new_comment_by: Hay un nuevo comentario de evaluación de <strong>%{commenter}</strong> en el presupuesto participativo %{investment}
commenter_info: "%{commenter}, %{time}"
new_actions_notification_rake_created:
subject: "Más novedades de tu propuesta ciudadana"

View File

@@ -112,8 +112,8 @@ es:
create_user: Crear nueva cuenta de usuario
create_user_info: Procedemos a crear un usuario con la siguiente información
create_user_submit: Crear usuario
create_user_success_html: Hemos enviado un correo electrónico a <b>%{email}</b> para verificar que es suya. El correo enviado contiene un link que el usuario deberá pulsar. Entonces podrá seleccionar una clave de acceso, y entrar en la web de participación.
autogenerated_password_html: "Se ha asignado la contraseña <b>%{password}</b> a este usuario. Puede modificarla desde el apartado 'Mi cuenta' de la web."
create_user_success: Hemos enviado un correo electrónico a <b>%{email}</b> para verificar que es suya. El correo enviado contiene un link que el usuario deberá pulsar. Entonces podrá seleccionar una clave de acceso, y entrar en la web de participación.
autogenerated_password: "Se ha asignado la contraseña <b>%{password}</b> a este usuario. Puede modificarla desde el apartado 'Mi cuenta' de la web."
email_optional_label: Email (recomendado pero opcional)
erased_notice: Cuenta de usuario borrada.
erased_by_manager: "Borrada por el manager: %{manager}"
@@ -128,5 +128,5 @@ es:
submit: Enviar invitaciones
title: Enviar invitaciones
create:
success_html: Se han enviado <strong>%{count} invitaciones</strong>.
success: Se han enviado <strong>%{count} invitaciones</strong>.
title: Enviar invitaciones

View File

@@ -26,7 +26,7 @@ es:
by_heading: "Participantes por distritos y fase"
total: "Total"
heading: "Distrito"
investments_sent_html: "Propuestas<br>enviadas"
investments_sent: "Propuestas<br>enviadas"
participants_support_phase: "Participantes fase apoyos"
participants_vote_phase: "Participantes fase votación"
participants_every_phase: "Total de participantes"

View File

@@ -56,7 +56,7 @@ es:
preview: Vista previa de presupuesto
edit:
dossier: Informe
price_html: "Coste (%{currency}) <small>(dato público)</small>"
price: "Coste (%{currency}) <small>(dato público)</small>"
price_first_year: "Coste en el primer año (%{currency}) <small>(opcional, dato no público)</small>"
feasibility: Viabilidad
valuation_finished_alert: "¿Estás seguro/a de querer marcar este informe como completado? Una vez hecho, no se puede deshacer la acción."

View File

@@ -19,7 +19,7 @@ es:
unconfirmed_code: Todavía no has introducido el código de confirmación
create:
flash:
success_html: Antes de las votaciones recibirás una carta con las instrucciones para verificar tu cuenta.<br> Recuerda que puedes ahorrar el envío verificándote presencialmente en cualquiera de las Oficinas de Atención al Ciudadano.
success: Antes de las votaciones recibirás una carta con las instrucciones para verificar tu cuenta.<br> Recuerda que puedes ahorrar el envío verificándote presencialmente en cualquiera de las Oficinas de Atención al Ciudadano.
edit:
see_all: Ver propuestas
title: Carta solicitada
@@ -49,7 +49,7 @@ es:
accept_terms_text_title: Acepto los términos de acceso al Padrón
document_number: Número de documento
document_number_help_title: Ayuda
document_number_help_text_html: "<strong>DNI</strong>: 12345678A<br> <strong>Pasaporte</strong>: AAA000001<br> <strong>Tarjeta de residencia</strong>: X1234567P"
document_number_help_text: "<strong>DNI</strong>: 12345678A<br> <strong>Pasaporte</strong>: AAA000001<br> <strong>Tarjeta de residencia</strong>: X1234567P"
document_type:
passport: Pasaporte
residence_card: Tarjeta de residencia
@@ -73,7 +73,7 @@ es:
title: SMS de confirmación
new:
phone: Introduce tu teléfono móvil para recibir el código
phone_format_html: "<strong><em>(Ejemplo: 612345678 ó +34612345678)</em></strong>"
phone_format: "<strong><em>(Ejemplo: 612345678 ó +34612345678)</em></strong>"
phone_note: Sólo usaremos tu teléfono para enviarte un código, nunca te contactaremos.
phone_placeholder: "Ejemplo: 612345678 ó +34612345678"
submit_button: Enviar

View File

@@ -56,7 +56,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
scenario "Should display new follower notice after user clicks on follow button", :js do
user = create(:user)
login_as(user)
create_notice_message = t("shared.followable.#{followable_class_name}.create.notice_html")
create_notice_message = t("shared.followable.#{followable_class_name}.create.notice")
visit send(followable_path, arguments)
within "##{dom_id(followable)}" do
@@ -91,7 +91,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
scenario "Should display destroy follower notice after user clicks on unfollow button", :js do
user = create(:user, followables: [followable])
login_as(user)
destroy_notice_message = t("shared.followable.#{followable_class_name}.destroy.notice_html")
destroy_notice_message = t("shared.followable.#{followable_class_name}.destroy.notice")
visit send(followable_path, arguments)
within "##{dom_id(followable)}" do