feature #16031 [Translation][Form] Do not translate form labels and placeholders when 'translation_domain' is false (Restless-ET)
This PR was squashed before being merged into the 2.8 branch (closes #16031).
Discussion
----------
[Translation][Form] Do not translate form labels and placeholders when 'translation_domain' is false
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | -
| License | MIT
| Doc PR | -
Seems like this behaviour was already partially added (as stated [here](https://github.com/symfony/symfony/pull/16016#issuecomment-144464875)) to solve the problem of expanded choice widgets.
Commits
-------
0e0b904
[Translation][Form] Do not translate form labels and placeholders when 'translation_domain' is false
This commit is contained in:
commit
09e896c306
@ -57,7 +57,7 @@
|
||||
{%- endif -%}
|
||||
<select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
|
||||
{%- if placeholder is not none -%}
|
||||
<option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ placeholder != '' ? placeholder|trans({}, translation_domain) }}</option>
|
||||
<option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ placeholder != '' ? (translation_domain is same as(false) ? placeholder : placeholder|trans({}, translation_domain)) }}</option>
|
||||
{%- endif -%}
|
||||
{%- if preferred_choices|length > 0 -%}
|
||||
{% set options = preferred_choices %}
|
||||
@ -192,7 +192,7 @@
|
||||
{% set label = name|humanize %}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
<button type="{{ type|default('button') }}" {{ block('button_attributes') }}>{{ label|trans({}, translation_domain) }}</button>
|
||||
<button type="{{ type|default('button') }}" {{ block('button_attributes') }}>{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}</button>
|
||||
{%- endblock button_widget -%}
|
||||
|
||||
{%- block submit_widget -%}
|
||||
@ -324,7 +324,7 @@
|
||||
{%- for attrname, attrvalue in attr -%}
|
||||
{{- " " -}}
|
||||
{%- if attrname in ['placeholder', 'title'] -%}
|
||||
{{- attrname }}="{{ attrvalue|trans({}, translation_domain) }}"
|
||||
{{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
|
||||
{%- elseif attrvalue is same as(true) -%}
|
||||
{{- attrname }}="{{ attrname }}"
|
||||
{%- elseif attrvalue is not same as(false) -%}
|
||||
@ -338,7 +338,7 @@
|
||||
{%- for attrname, attrvalue in attr -%}
|
||||
{{- " " -}}
|
||||
{%- if attrname in ['placeholder', 'title'] -%}
|
||||
{{- attrname }}="{{ attrvalue|trans({}, translation_domain) }}"
|
||||
{{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
|
||||
{%- elseif attrvalue is same as(true) -%}
|
||||
{{- attrname }}="{{ attrname }}"
|
||||
{%- elseif attrvalue is not same as(false) -%}
|
||||
@ -352,7 +352,7 @@
|
||||
{%- for attrname, attrvalue in attr -%}
|
||||
{{- " " -}}
|
||||
{%- if attrname in ['placeholder', 'title'] -%}
|
||||
{{- attrname }}="{{ attrvalue|trans({}, translation_domain) }}"
|
||||
{{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
|
||||
{%- elseif attrvalue is same as(true) -%}
|
||||
{{- attrname }}="{{ attrname }}"
|
||||
{%- elseif attrvalue is not same as(false) -%}
|
||||
@ -365,7 +365,7 @@
|
||||
{%- for attrname, attrvalue in attr -%}
|
||||
{{- " " -}}
|
||||
{%- if attrname in ['placeholder', 'title'] -%}
|
||||
{{- attrname }}="{{ attrvalue|trans({}, translation_domain) }}"
|
||||
{{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
|
||||
{%- elseif attrvalue is same as(true) -%}
|
||||
{{- attrname }}="{{ attrname }}"
|
||||
{%- elseif attrvalue is not same as(false) -%}
|
||||
|
@ -150,7 +150,7 @@
|
||||
{%- endif -%}
|
||||
<select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple" data-customforms="disabled"{% endif %}>
|
||||
{% if placeholder is not none -%}
|
||||
<option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ placeholder|trans({}, translation_domain) }}</option>
|
||||
<option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ translation_domain is same as(false) ? placeholder : placeholder|trans({}, translation_domain) }}</option>
|
||||
{%- endif %}
|
||||
{%- if preferred_choices|length > 0 -%}
|
||||
{% set options = preferred_choices %}
|
||||
@ -253,7 +253,7 @@
|
||||
{% endif %}
|
||||
<label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
|
||||
{{ widget|raw }}
|
||||
{{ label|trans({}, translation_domain) }}
|
||||
{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}
|
||||
</label>
|
||||
{%- endblock checkbox_radio_label %}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
id="<?php echo $view->escape($id) ?>" name="<?php echo $view->escape($full_name) ?>" <?php if ($disabled): ?>disabled="disabled" <?php endif ?>
|
||||
<?php foreach ($attr as $k => $v): ?>
|
||||
<?php if (in_array($v, array('placeholder', 'title'), true)): ?>
|
||||
<?php printf('%s="%s" ', $view->escape($k), $view->escape($view['translator']->trans($v, array(), $translation_domain))) ?>
|
||||
<?php printf('%s="%s" ', $view->escape($k), $view->escape(false !== $translation_domain ? $view['translator']->trans($v, array(), $translation_domain) : $v)) ?>
|
||||
<?php elseif ($v === true): ?>
|
||||
<?php printf('%s="%s" ', $view->escape($k), $view->escape($k)) ?>
|
||||
<?php elseif ($v !== false): ?>
|
||||
|
@ -1,4 +1,4 @@
|
||||
<?php if (!$label) { $label = isset($label_format)
|
||||
? strtr($label_format, array('%name%' => $name, '%id%' => $id))
|
||||
: $view['form']->humanize($name); } ?>
|
||||
<button type="<?php echo isset($type) ? $view->escape($type) : 'button' ?>" <?php echo $view['form']->block($form, 'button_attributes') ?>><?php echo $view->escape($view['translator']->trans($label, array(), $translation_domain)) ?></button>
|
||||
<button type="<?php echo isset($type) ? $view->escape($type) : 'button' ?>" <?php echo $view['form']->block($form, 'button_attributes') ?>><?php echo $view->escape(false !== $translation_domain ? $view['translator']->trans($label, array(), $translation_domain) : $label) ?></button>
|
||||
|
@ -7,7 +7,7 @@
|
||||
)) ?>
|
||||
<?php if ($multiple): ?> multiple="multiple"<?php endif ?>
|
||||
>
|
||||
<?php if (null !== $placeholder): ?><option value=""<?php if ($required and empty($value) && '0' !== $value): ?> selected="selected"<?php endif?>><?php echo '' != $placeholder ? $view->escape($view['translator']->trans($placeholder, array(), $translation_domain)) : '' ?></option><?php endif; ?>
|
||||
<?php if (null !== $placeholder): ?><option value=""<?php if ($required and empty($value) && '0' !== $value): ?> selected="selected"<?php endif?>><?php echo '' != $placeholder ? $view->escape(false !== $translation_domain ? $view['translator']->trans($placeholder, array(), $translation_domain) : $placeholder) : '' ?></option><?php endif; ?>
|
||||
<?php if (count($preferred_choices) > 0): ?>
|
||||
<?php echo $view['form']->block($form, 'choice_widget_options', array('choices' => $preferred_choices)) ?>
|
||||
<?php if (count($choices) > 0 && null !== $separator): ?>
|
||||
|
@ -2,7 +2,7 @@ id="<?php echo $view->escape($id) ?>" name="<?php echo $view->escape($full_name)
|
||||
<?php if ($required): ?> required="required"<?php endif ?>
|
||||
<?php foreach ($attr as $k => $v): ?>
|
||||
<?php if (in_array($k, array('placeholder', 'title'), true)): ?>
|
||||
<?php printf(' %s="%s"', $view->escape($k), $view->escape($view['translator']->trans($v, array(), $translation_domain))) ?>
|
||||
<?php printf(' %s="%s"', $view->escape($k), $view->escape(false !== $translation_domain ? $view['translator']->trans($v, array(), $translation_domain) : $v)) ?>
|
||||
<?php elseif ($v === true): ?>
|
||||
<?php printf(' %s="%s"', $view->escape($k), $view->escape($k)) ?>
|
||||
<?php elseif ($v !== false): ?>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?php if (!empty($id)): ?>id="<?php echo $view->escape($id) ?>" <?php endif ?>
|
||||
<?php foreach ($attr as $k => $v): ?>
|
||||
<?php if (in_array($v, array('placeholder', 'title'), true)): ?>
|
||||
<?php printf('%s="%s" ', $view->escape($k), $view->escape($view['translator']->trans($v, array(), $translation_domain))) ?>
|
||||
<?php printf('%s="%s" ', $view->escape($k), $view->escape(false !== $translation_domain ? $view['translator']->trans($v, array(), $translation_domain) : $v)) ?>
|
||||
<?php elseif ($v === true): ?>
|
||||
<?php printf('%s="%s" ', $view->escape($k), $view->escape($k)) ?>
|
||||
<?php elseif ($v !== false): ?>
|
||||
|
@ -254,6 +254,32 @@ abstract class AbstractBootstrap3LayoutTest extends AbstractLayoutTest
|
||||
);
|
||||
}
|
||||
|
||||
public function testSingleChoiceWithPlaceholderWithoutTranslation()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&a', array(
|
||||
'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
|
||||
'multiple' => false,
|
||||
'expanded' => false,
|
||||
'required' => false,
|
||||
'translation_domain' => false,
|
||||
'placeholder' => 'Placeholder&Not&Translated',
|
||||
));
|
||||
|
||||
$this->assertWidgetMatchesXpath($form->createView(), array('attr' => array('class' => 'my&class')),
|
||||
'/select
|
||||
[@name="name"]
|
||||
[@class="my&class form-control"]
|
||||
[not(@required)]
|
||||
[
|
||||
./option[@value=""][not(@selected)][not(@disabled)][.="Placeholder&Not&Translated"]
|
||||
/following-sibling::option[@value="&a"][@selected="selected"][.="Choice&A"]
|
||||
/following-sibling::option[@value="&b"][not(@selected)][.="Choice&B"]
|
||||
]
|
||||
[count(./option)=3]
|
||||
'
|
||||
);
|
||||
}
|
||||
|
||||
public function testSingleChoiceAttributes()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&a', array(
|
||||
@ -771,6 +797,52 @@ abstract class AbstractBootstrap3LayoutTest extends AbstractLayoutTest
|
||||
);
|
||||
}
|
||||
|
||||
public function testSingleChoiceExpandedWithPlaceholderWithoutTranslation()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&a', array(
|
||||
'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
|
||||
'multiple' => false,
|
||||
'expanded' => true,
|
||||
'translation_domain' => false,
|
||||
'placeholder' => 'Placeholder&Not&Translated',
|
||||
));
|
||||
|
||||
$this->assertWidgetMatchesXpath($form->createView(), array(),
|
||||
'/div
|
||||
[
|
||||
./div
|
||||
[@class="radio"]
|
||||
[
|
||||
./label
|
||||
[.=" Placeholder&Not&Translated"]
|
||||
[
|
||||
./input[@type="radio"][@name="name"][@id="name_placeholder"][not(@checked)]
|
||||
]
|
||||
]
|
||||
/following-sibling::div
|
||||
[@class="radio"]
|
||||
[
|
||||
./label
|
||||
[.=" Choice&A"]
|
||||
[
|
||||
./input[@type="radio"][@name="name"][@id="name_0"][@checked]
|
||||
]
|
||||
]
|
||||
/following-sibling::div
|
||||
[@class="radio"]
|
||||
[
|
||||
./label
|
||||
[.=" Choice&B"]
|
||||
[
|
||||
./input[@type="radio"][@name="name"][@id="name_1"][not(@checked)]
|
||||
]
|
||||
]
|
||||
/following-sibling::input[@type="hidden"][@id="name__token"][@class="form-control"]
|
||||
]
|
||||
'
|
||||
);
|
||||
}
|
||||
|
||||
public function testSingleChoiceExpandedWithBooleanValue()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', true, array(
|
||||
@ -2023,6 +2095,17 @@ abstract class AbstractBootstrap3LayoutTest extends AbstractLayoutTest
|
||||
);
|
||||
}
|
||||
|
||||
public function testButtonlabelWithoutTranslation()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ButtonType', null, array(
|
||||
'translation_domain' => false,
|
||||
));
|
||||
|
||||
$this->assertWidgetMatchesXpath($form->createView(), array('attr' => array('class' => 'my&class')),
|
||||
'/button[@type="button"][@name="name"][.="Name"][@class="my&class btn"]'
|
||||
);
|
||||
}
|
||||
|
||||
public function testSubmit()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\SubmitType');
|
||||
|
@ -381,6 +381,25 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
);
|
||||
}
|
||||
|
||||
public function testLabelWithoutTranslationOnButton()
|
||||
{
|
||||
$form = $this->factory->createNamedBuilder('myform', 'Symfony\Component\Form\Extension\Core\Type\FormType', null, array(
|
||||
'translation_domain' => false,
|
||||
))
|
||||
->add('mybutton', 'Symfony\Component\Form\Extension\Core\Type\ButtonType')
|
||||
->getForm();
|
||||
$view = $form->get('mybutton')->createView();
|
||||
$html = $this->renderWidget($view);
|
||||
|
||||
$this->assertMatchesXpath($html,
|
||||
'/button
|
||||
[@type="button"]
|
||||
[@name="myform[mybutton]"]
|
||||
[.="Mybutton"]
|
||||
'
|
||||
);
|
||||
}
|
||||
|
||||
public function testLabelFormatOnButton()
|
||||
{
|
||||
$form = $this->factory->createNamedBuilder('myform')
|
||||
@ -549,6 +568,31 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
);
|
||||
}
|
||||
|
||||
public function testSingleChoiceWithPlaceholderWithoutTranslation()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&a', array(
|
||||
'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
|
||||
'multiple' => false,
|
||||
'expanded' => false,
|
||||
'required' => false,
|
||||
'translation_domain' => false,
|
||||
'placeholder' => 'Placeholder&Not&Translated',
|
||||
));
|
||||
|
||||
$this->assertWidgetMatchesXpath($form->createView(), array(),
|
||||
'/select
|
||||
[@name="name"]
|
||||
[not(@required)]
|
||||
[
|
||||
./option[@value=""][not(@selected)][not(@disabled)][.="Placeholder&Not&Translated"]
|
||||
/following-sibling::option[@value="&a"][@selected="selected"][.="Choice&A"]
|
||||
/following-sibling::option[@value="&b"][not(@selected)][.="Choice&B"]
|
||||
]
|
||||
[count(./option)=3]
|
||||
'
|
||||
);
|
||||
}
|
||||
|
||||
public function testSingleChoiceAttributes()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&a', array(
|
||||
@ -998,6 +1042,32 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
);
|
||||
}
|
||||
|
||||
public function testSingleChoiceExpandedWithPlaceholderWithoutTranslation()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&a', array(
|
||||
'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
|
||||
'multiple' => false,
|
||||
'expanded' => true,
|
||||
'translation_domain' => false,
|
||||
'placeholder' => 'Placeholder&Not&Translated',
|
||||
));
|
||||
|
||||
$this->assertWidgetMatchesXpath($form->createView(), array(),
|
||||
'/div
|
||||
[
|
||||
./input[@type="radio"][@name="name"][@id="name_placeholder"][not(@checked)]
|
||||
/following-sibling::label[@for="name_placeholder"][.="Placeholder&Not&Translated"]
|
||||
/following-sibling::input[@type="radio"][@name="name"][@id="name_0"][@checked]
|
||||
/following-sibling::label[@for="name_0"][.="Choice&A"]
|
||||
/following-sibling::input[@type="radio"][@name="name"][@id="name_1"][not(@checked)]
|
||||
/following-sibling::label[@for="name_1"][.="Choice&B"]
|
||||
/following-sibling::input[@type="hidden"][@id="name__token"]
|
||||
]
|
||||
[count(./input)=4]
|
||||
'
|
||||
);
|
||||
}
|
||||
|
||||
public function testSingleChoiceExpandedWithBooleanValue()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', true, array(
|
||||
@ -2141,6 +2211,17 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
$this->assertSame('', $this->renderLabel($form->createView()));
|
||||
}
|
||||
|
||||
public function testButtonlabelWithoutTranslation()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ButtonType', null, array(
|
||||
'translation_domain' => false,
|
||||
));
|
||||
|
||||
$this->assertWidgetMatchesXpath($form->createView(), array(),
|
||||
'/button[@type="button"][@name="name"][.="Name"]'
|
||||
);
|
||||
}
|
||||
|
||||
public function testSubmit()
|
||||
{
|
||||
$form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\SubmitType');
|
||||
@ -2349,4 +2430,20 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
$this->assertMatchesXpath($html, '/form//input[@title="[trans]Foo[/trans]"]');
|
||||
$this->assertMatchesXpath($html, '/form//input[@placeholder="[trans]Bar[/trans]"]');
|
||||
}
|
||||
|
||||
public function testAttributesNotTranslatedWhenTranslationDomainIsFalse()
|
||||
{
|
||||
$view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType', null, array(
|
||||
'translation_domain' => false,
|
||||
))
|
||||
->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', array('attr' => array('title' => 'Foo')))
|
||||
->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', array('attr' => array('placeholder' => 'Bar')))
|
||||
->getForm()
|
||||
->createView();
|
||||
|
||||
$html = $this->renderForm($view);
|
||||
|
||||
$this->assertMatchesXpath($html, '/form//input[@title="Foo"]');
|
||||
$this->assertMatchesXpath($html, '/form//input[@placeholder="Bar"]');
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user