Extract component for remote translations button
So we're consistent with the rest of the code in the header, which renders components and not partials.
This commit is contained in:
@@ -514,26 +514,6 @@ body > header,
|
|||||||
border-bottom: 1px solid #fff;
|
border-bottom: 1px solid #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.remote-translations-button {
|
|
||||||
|
|
||||||
&.callout {
|
|
||||||
margin: 0;
|
|
||||||
padding: rem-calc(6);
|
|
||||||
|
|
||||||
[type="submit"] {
|
|
||||||
@include brand-color;
|
|
||||||
background: none;
|
|
||||||
border: 0;
|
|
||||||
cursor: pointer;
|
|
||||||
font-weight: bold;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.external-links {
|
.external-links {
|
||||||
padding: rem-calc(6) 0;
|
padding: rem-calc(6) 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
.remote-translations-button {
|
||||||
|
|
||||||
|
&.callout {
|
||||||
|
margin: 0;
|
||||||
|
padding: rem-calc(6);
|
||||||
|
|
||||||
|
[type="submit"] {
|
||||||
|
@include brand-color;
|
||||||
|
background: none;
|
||||||
|
border: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<div class="remote-translations-button callout primary text-center">
|
<div class="remote-translations-button callout primary text-center">
|
||||||
<% if display_remote_translation_button?(remote_translations) %>
|
<% if display_remote_translation_button? %>
|
||||||
<%= form_tag remote_translations_path do %>
|
<%= form_tag remote_translations_path do %>
|
||||||
<%= hidden_field_tag :remote_translations, remote_translations.to_json %>
|
<%= hidden_field_tag :remote_translations, remote_translations.to_json %>
|
||||||
<%= t("remote_translations.text") %>
|
<%= t("remote_translations.text") %>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
class Layout::RemoteTranslationsButtonComponent < ApplicationComponent
|
||||||
|
attr_reader :remote_translations
|
||||||
|
|
||||||
|
def initialize(remote_translations)
|
||||||
|
@remote_translations = remote_translations
|
||||||
|
end
|
||||||
|
|
||||||
|
def render?
|
||||||
|
remote_translations.present? &&
|
||||||
|
RemoteTranslations::Microsoft::AvailableLocales.include_locale?(I18n.locale)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def display_remote_translation_button?
|
||||||
|
remote_translations.none? do |remote_translation|
|
||||||
|
RemoteTranslation.remote_translation_enqueued?(remote_translation)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
module RemoteTranslationsHelper
|
|
||||||
def display_remote_translation_info?(remote_translations, locale)
|
|
||||||
remote_translations.present? && RemoteTranslations::Microsoft::AvailableLocales.include_locale?(locale)
|
|
||||||
end
|
|
||||||
|
|
||||||
def display_remote_translation_button?(remote_translations)
|
|
||||||
remote_translations.none? do |remote_translation|
|
|
||||||
RemoteTranslation.remote_translation_enqueued?(remote_translation)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
<header>
|
<header>
|
||||||
<% if display_remote_translation_info?(@remote_translations, I18n.locale) %>
|
<%= render Layout::RemoteTranslationsButtonComponent.new(@remote_translations) %>
|
||||||
<%= render "shared/remote_translations_button", remote_translations: @remote_translations %>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<div class="top-links">
|
<div class="top-links">
|
||||||
<%= render Layout::LocaleSwitcherComponent.new %>
|
<%= render Layout::LocaleSwitcherComponent.new %>
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
require "rails_helper"
|
||||||
|
|
||||||
|
describe Layout::RemoteTranslationsButtonComponent do
|
||||||
|
let(:translations) { [{}] }
|
||||||
|
let(:component) { Layout::RemoteTranslationsButtonComponent.new(translations) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(RemoteTranslations::Microsoft::AvailableLocales).to receive(:available_locales)
|
||||||
|
.and_return(%w[de en es fr pt zh-Hans])
|
||||||
|
end
|
||||||
|
|
||||||
|
context "locale with English as a fallback" do
|
||||||
|
before do
|
||||||
|
allow(I18n.fallbacks).to receive(:[]).and_return([:en])
|
||||||
|
Globalize.set_fallbacks_to_all_available_locales
|
||||||
|
end
|
||||||
|
|
||||||
|
it "displays the text in English" do
|
||||||
|
I18n.with_locale(:de) { render_inline component }
|
||||||
|
|
||||||
|
expect(page).to have_css ".remote-translations-button"
|
||||||
|
expect(page).to have_content "The content of this page is not available in your language"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "displays the text in English with a locale needing parsing" do
|
||||||
|
I18n.with_locale(:"zh-CN") { render_inline component }
|
||||||
|
|
||||||
|
expect(page).to have_css ".remote-translations-button"
|
||||||
|
expect(page).to have_content "The content of this page is not available in your language"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "locale with Spanish as a fallback" do
|
||||||
|
before do
|
||||||
|
allow(I18n.fallbacks).to receive(:[]).and_return([:es])
|
||||||
|
Globalize.set_fallbacks_to_all_available_locales
|
||||||
|
end
|
||||||
|
|
||||||
|
it "displays the text in Spanish" do
|
||||||
|
I18n.with_locale(:fr) { render_inline component }
|
||||||
|
|
||||||
|
expect(page).to have_css ".remote-translations-button"
|
||||||
|
expect(page).to have_content "El contenido de esta página no está disponible en tu idioma"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "displays the text in Spanish with a locale needing parsing" do
|
||||||
|
I18n.with_locale(:"pt-BR") { render_inline component }
|
||||||
|
|
||||||
|
expect(page).to have_css ".remote-translations-button"
|
||||||
|
expect(page).to have_content "El contenido de esta página no está disponible en tu idioma"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "is not rendered when the locale isn't included in microsoft translate client" do
|
||||||
|
I18n.with_locale(:nl) { render_inline component }
|
||||||
|
|
||||||
|
expect(page).not_to be_rendered
|
||||||
|
end
|
||||||
|
|
||||||
|
it "is not rendered when there aren't any remote translations" do
|
||||||
|
render_inline Layout::RemoteTranslationsButtonComponent.new([])
|
||||||
|
|
||||||
|
expect(page).not_to be_rendered
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
require "rails_helper"
|
|
||||||
|
|
||||||
describe "Remote Translations" do
|
|
||||||
before do
|
|
||||||
Setting["feature.remote_translations"] = true
|
|
||||||
create(:proposal)
|
|
||||||
available_locales_response = %w[de en es fr pt zh-Hans]
|
|
||||||
expect(RemoteTranslations::Microsoft::AvailableLocales).to receive(:available_locales).at_most(2).times.
|
|
||||||
and_return(available_locales_response)
|
|
||||||
allow(Rails.application.secrets).to receive(:microsoft_api_key).and_return("123")
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "Display remote translation button when locale is included in microsoft translate client" do
|
|
||||||
context "with locale that has :en fallback" do
|
|
||||||
before do
|
|
||||||
allow(I18n.fallbacks).to receive(:[]).and_return([:en])
|
|
||||||
Globalize.set_fallbacks_to_all_available_locales
|
|
||||||
end
|
|
||||||
|
|
||||||
scenario "should display text in English" do
|
|
||||||
visit root_path(locale: :de)
|
|
||||||
|
|
||||||
expect(page).to have_css ".remote-translations-button"
|
|
||||||
expect(page).to have_content "The content of this page is not available in your language"
|
|
||||||
end
|
|
||||||
|
|
||||||
scenario "should display text in English after parse key" do
|
|
||||||
visit root_path(locale: :"zh-CN")
|
|
||||||
|
|
||||||
expect(page).to have_css ".remote-translations-button"
|
|
||||||
expect(page).to have_content "The content of this page is not available in your language"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "with locale that has :es fallback" do
|
|
||||||
before do
|
|
||||||
allow(I18n.fallbacks).to receive(:[]).and_return([:es])
|
|
||||||
Globalize.set_fallbacks_to_all_available_locales
|
|
||||||
end
|
|
||||||
|
|
||||||
scenario "should display text in Spanish" do
|
|
||||||
visit root_path(locale: :fr)
|
|
||||||
|
|
||||||
expect(page).to have_css ".remote-translations-button"
|
|
||||||
expect(page).to have_content "El contenido de esta página no está disponible en tu idioma"
|
|
||||||
end
|
|
||||||
|
|
||||||
scenario "should display text in Spanish after parse key" do
|
|
||||||
visit root_path(locale: :"pt-BR")
|
|
||||||
|
|
||||||
expect(page).to have_css ".remote-translations-button"
|
|
||||||
expect(page).to have_content "El contenido de esta página no está disponible en tu idioma"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
scenario "Not display remote translation button when locale is not included in microsoft translate client" do
|
|
||||||
visit root_path(locale: :nl)
|
|
||||||
|
|
||||||
expect(page).not_to have_css ".remote-translations-button"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
Reference in New Issue
Block a user