Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions core/languages/de/core.php
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,10 @@
'core.datatable.paginate_next' => 'Weiter',
'core.datatable.paginate_prev' => 'Zurück',
'core.nav.modules_manage' => 'Verwalten',

// Media picker field (Tiger_View_Helper_MediaField) — shared by the Identity, CMS and SEO screens.
'core.media.field.choose' => 'Medium auswählen',
'core.media.field.clear' => 'Entfernen',
'core.media.field.preview_alt' => 'Vorschau des ausgewählten Mediums',
'core.media.field.file' => 'Ausgewählte Datei',
];
6 changes: 6 additions & 0 deletions core/languages/en/core.php
Original file line number Diff line number Diff line change
Expand Up @@ -191,4 +191,10 @@
'core.datatable.paginate_next' => 'Next',
'core.datatable.paginate_prev' => 'Previous',
'core.nav.modules_manage' => 'Manage',

// Media picker field (Tiger_View_Helper_MediaField) — shared by the Identity, CMS and SEO screens.
'core.media.field.choose' => 'Choose media',
'core.media.field.clear' => 'Clear',
'core.media.field.preview_alt' => 'Selected media preview',
'core.media.field.file' => 'Selected file',
];
6 changes: 6 additions & 0 deletions core/languages/es/core.php
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,10 @@
'core.datatable.paginate_next' => 'Siguiente',
'core.datatable.paginate_prev' => 'Anterior',
'core.nav.modules_manage' => 'Gestionar',

// Media picker field (Tiger_View_Helper_MediaField) — shared by the Identity, CMS and SEO screens.
'core.media.field.choose' => 'Elegir medio',
'core.media.field.clear' => 'Quitar',
'core.media.field.preview_alt' => 'Vista previa del medio seleccionado',
'core.media.field.file' => 'Archivo seleccionado',
];
6 changes: 6 additions & 0 deletions core/languages/fr/core.php
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,10 @@
'core.datatable.paginate_next' => 'Suivant',
'core.datatable.paginate_prev' => 'Précédent',
'core.nav.modules_manage' => 'Gérer',

// Media picker field (Tiger_View_Helper_MediaField) — shared by the Identity, CMS and SEO screens.
'core.media.field.choose' => 'Choisir un média',
'core.media.field.clear' => 'Retirer',
'core.media.field.preview_alt' => 'Aperçu du média sélectionné',
'core.media.field.file' => 'Fichier sélectionné',
];
6 changes: 6 additions & 0 deletions core/languages/hi/core.php
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,10 @@
'core.datatable.paginate_next' => 'अगला',
'core.datatable.paginate_prev' => 'पिछला',
'core.nav.modules_manage' => 'प्रबंधित करें',

// Media picker field (Tiger_View_Helper_MediaField) — shared by the Identity, CMS and SEO screens.
'core.media.field.choose' => 'मीडिया चुनें',
'core.media.field.clear' => 'हटाएँ',
'core.media.field.preview_alt' => 'चयनित मीडिया का प्रीव्यू',
'core.media.field.file' => 'चयनित फ़ाइल',
];
6 changes: 6 additions & 0 deletions core/languages/pt/core.php
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,10 @@
'core.datatable.paginate_next' => 'Próximo',
'core.datatable.paginate_prev' => 'Anterior',
'core.nav.modules_manage' => 'Gerenciar',

// Media picker field (Tiger_View_Helper_MediaField) — shared by the Identity, CMS and SEO screens.
'core.media.field.choose' => 'Escolher mídia',
'core.media.field.clear' => 'Remover',
'core.media.field.preview_alt' => 'Pré-visualização da mídia selecionada',
'core.media.field.file' => 'Arquivo selecionado',
];
45 changes: 41 additions & 4 deletions library/Tiger/View/Helper/MediaField.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ public function mediaField($name, $value = '', array $options = [])
$esc = function ($s) { return htmlspecialchars((string) $s, ENT_QUOTES); };
$kind = (string) ($options['kind'] ?? '');
$multiple = !empty($options['multiple']) ? '1' : '0';
$label = (string) ($options['label'] ?? 'Choose media');
// A caller-supplied label is already localized by the view; only the default needs a key.
$label = (string) ($options['label'] ?? $this->_t('core.media.field.choose', 'Choose media'));
$id = (string) ($options['id'] ?? $name);
$value = (string) $value;
$hasVal = trim($value) !== '';
Expand All @@ -41,9 +42,14 @@ public function mediaField($name, $value = '', array $options = [])
$row = $model->findById($value);
if ($row) {
$m = $row->toArray();
// The preview conveys WHICH media is selected, so it carries real alt text rather
// than being marked decorative; the non-image tile gets the same treatment.
$altText = $this->_t('core.media.field.preview_alt', 'Selected media preview');
$fileText = $this->_t('core.media.field.file', 'Selected file');
$preview = ($m['kind'] === 'image')
? '<img src="' . $esc($model->thumbUrl($m)) . '" alt="" style="width:56px;height:56px;object-fit:cover;border-radius:6px;">'
: '<span class="d-inline-flex align-items-center justify-content-center bg-body-secondary rounded" style="width:56px;height:56px;"><i class="fa-solid fa-file"></i></span>';
? '<img src="' . $esc($model->thumbUrl($m)) . '" alt="' . $esc($altText) . '" style="width:56px;height:56px;object-fit:cover;border-radius:6px;">'
: '<span class="d-inline-flex align-items-center justify-content-center bg-body-secondary rounded" style="width:56px;height:56px;" title="' . $esc($fileText) . '">'
. '<i class="fa-solid fa-file" aria-hidden="true"></i><span class="visually-hidden">' . $esc($fileText) . '</span></span>';
}
}

Expand All @@ -52,7 +58,38 @@ public function mediaField($name, $value = '', array $options = [])
. '<input type="hidden" name="' . $esc($name) . '" id="' . $esc($id) . '" value="' . $esc($value) . '">'
. '<button type="button" class="btn btn-sm btn-outline-primary" data-media-choose data-kind="' . $esc($kind) . '" data-multiple="' . $multiple . '">'
. '<i class="fa-solid fa-photo-film me-1"></i>' . $esc($label) . '</button>'
. '<button type="button" class="btn btn-sm btn-outline-secondary" data-media-clear' . ($hasVal ? '' : ' hidden') . '>Clear</button>'
. '<button type="button" class="btn btn-sm btn-outline-secondary" data-media-clear' . ($hasVal ? '' : ' hidden') . '>'
. $esc($this->_t('core.media.field.clear', 'Clear')) . '</button>'
. '</div>';
}

/**
* Translate a key, falling back to the English literal.
*
* A view helper has no `$this->t()`, so this routes through the registered `t` helper when a
* view is attached (inheriting its source-locale fallback), then the registry translator, then
* the literal. Fail-soft by design: this helper is also instantiated bare (no view, no
* translator) in tests, and a raw key rendered into a button would be worse than English.
*
* @param string $key the translation key
* @param string $fallback the English literal to use when nothing resolves
* @return string the translated text, or the fallback
*/
protected function _t($key, $fallback)
{
try {
if ($this->view instanceof Zend_View_Interface && method_exists($this->view, 't')) {
$out = (string) $this->view->t($key);
if ($out !== '' && $out !== $key) { return $out; }
}
if (Zend_Registry::isRegistered('Zend_Translate')) {
$tr = Zend_Registry::get('Zend_Translate');
$out = (string) $tr->translate($key);
if ($out !== '' && $out !== $key) { return $out; }
}
} catch (Throwable $e) {
// fail-open — a head/label lookup must never break a render
}
return $fallback;
}
}
Loading