diff --git a/.env b/.env index f3dbbc7a1a..fd804fbc09 100644 --- a/.env +++ b/.env @@ -120,7 +120,7 @@ PHRASEANET_DOCKER_REGISTRY=local # Docker images tag. # @run -PHRASEANET_DOCKER_TAG=4.1.5 +PHRASEANET_DOCKER_TAG=4.1.6-rc1 # Application port. # @run diff --git a/CHANGELOG.md b/CHANGELOG.md index c9f96324fe..bd057baf0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,48 @@ # CHANGELOG +## 4.1.6-rc1 + +### Update instructions + + - Migration patch: no patch to play, just run upgrade for bump version + - Elasticsearch action : none + +### Version summary : + + - Big improvement of generated PDF, + - Password protection + - Download link + - Prod - Publications editing, user experience improvements + +### New Features + +``` +PHRAS-3642 API - Return databox subdefs on new endpoint /api/v3/databoxes/\{databox\_id\}/subdefs/ and /api/v3/databoxes/subdefs/ +PHRAS-3636 docker - docker-compose - Add container for execute primary datastore \(mysql\) backup +``` + +### Improvement + +``` +PHRAS-3633 Prod - Printed PDF Improvement - add a Title , Password, download link to the PDF +PHRAS-3595 Prod - New publication - features and UX improvement +PHRAS-3631 Prod : Notifications : Add a fonction to mark all notification as read +PHRAS-3229 Thesaurus GUI improvement - import - refresh candidat terms +``` + + +### Bug fix + +``` +PHRAS-3637 API - Upload Url | Prod GUI - Let's Encrypt ssl certificate verification fail. use the correct guzzle version +PHRAS-3635 user list : general toggles change selection +PHRAS-3626 Prod - detailed view - Print, Export windows appear behind the detailed view \(z-index\) +PHRAS-3620 Admin - subviews : a bad path can lead to creating file at the roots of the Phraseanet sources. +PHRAS-3619 After record removal, we have an HTTP status 200 on the /records route of the API on the deleted record +PHRAS-3285 Thesaurus - candidat panel - The Stock is not available +PHRAS-3628 API - create record - 500 error if No file + ``` + ## 4.1.5 ### Version summary : diff --git a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php index 9f1cae2919..1632fe1571 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php @@ -2813,7 +2813,7 @@ class V1Controller extends Controller { $ret = [ "meta_fields" => $this->listUserAuthorizedMetadataFields($this->getAuthenticatedUser()), - "aggregable_fields" => $this->buildUserFieldList(ElasticsearchOptions::getAggregableTechnicalFields(), ['choices']), + "aggregable_fields" => $this->buildUserFieldList(ElasticsearchOptions::getAggregableTechnicalFields($this->app['translator']), ['choices']), "technical_fields" => $this->buildUserFieldList(media_subdef::getTechnicalFieldsList()), ]; diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3Controller.php new file mode 100644 index 0000000000..fe865f41c2 --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3Controller.php @@ -0,0 +1,76 @@ +attributes->get('databox_id'))) { + $ret = [ + 'databoxes' => $this->listSubdefsStructure([$this->findDataboxById($request->attributes->get('databox_id'))]) + ]; + } else { + $acl = $this->getAclForUser($this->getAuthenticatedUser()); + + // ensure can see databox structure + $ret = [ + 'databoxes' => $this->listSubdefsStructure($acl->get_granted_sbas([\ACL::BAS_MODIFY_STRUCT])) + ]; + } + + return Result::create($request, $ret)->createResponse(); + } + + /** + * List the subdef structure of databoxes + * @param array $databoxes + * @return array + * @throws \Exception + */ + private function listSubdefsStructure(array $databoxes) + { + $ret = []; + + /** @var \databox $databox */ + foreach ($databoxes as $databox) { + $databoxId = $databox->get_sbas_id(); + $subdefStructure = $databox->get_subdef_structure(); + $subdefs = []; + foreach ($subdefStructure as $subGroup) { + /** @var \databox_subdef $sub */ + foreach ($subGroup->getIterator() as $sub) { + $opt = []; + $data = [ + 'name' => $sub->get_name(), + 'databox_id' => $databoxId, + 'class' => $sub->get_class(), + 'preset' => $sub->get_preset(), + 'downloadable' => $sub->isDownloadable(), + 'devices' => $sub->getDevices(), + 'labels' => [ + 'fr' => $sub->get_label('fr'), + 'en' => $sub->get_label('en'), + 'de' => $sub->get_label('de'), + 'nl' => $sub->get_label('nl'), + ], + ]; + $options = $sub->getOptions(); + foreach ($options as $option) { + $opt[$option->getName()] = $option->getValue(); + } + $data['options'] = $opt; + $subdefs[$subGroup->getName()][$sub->get_name()] = $data; + } + } + $ret[$databoxId]['databox_id'] = $databoxId; + $ret[$databoxId]['subdefs'] = $subdefs; + } + + return $ret; + } +} diff --git a/lib/Alchemy/Phrasea/Controller/Prod/QueryController.php b/lib/Alchemy/Phrasea/Controller/Prod/QueryController.php index 4ca7c3bf0f..d055206d18 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/QueryController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/QueryController.php @@ -76,7 +76,8 @@ class QueryController extends Controller $this->app['elasticsearch.client'], $query_context_factory, $this->app['elasticsearch.facets_response.factory'], - $this->app['elasticsearch.options'] + $this->app['elasticsearch.options'], + $this->app['translator'] ); $autocomplete = $engine->autocomplete($word, $options); @@ -351,7 +352,7 @@ class QueryController extends Controller // add technical fields $fieldsInfosByName = []; - foreach(ElasticsearchOptions::getAggregableTechnicalFields() as $k => $f) { + foreach(ElasticsearchOptions::getAggregableTechnicalFields($this->app['translator']) as $k => $f) { $fieldsInfosByName[$k] = $f; $fieldsInfosByName[$k]['trans_label'] = $this->app->trans( /** @ignore */ $f['label']); $fieldsInfosByName[$k]['labels'] = []; diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php b/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php index 011000495d..e7797eaf92 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php @@ -4,6 +4,7 @@ namespace Alchemy\Phrasea\ControllerProvider\Api; use Alchemy\Phrasea\Application as PhraseaApplication; use Alchemy\Phrasea\Controller\Api\V1Controller; +use Alchemy\Phrasea\Controller\Api\V3\V3Controller; use Alchemy\Phrasea\Controller\Api\V3\V3RecordController; use Alchemy\Phrasea\Controller\Api\V3\V3ResultHelpers; use Alchemy\Phrasea\Controller\Api\V3\V3SearchController; @@ -53,6 +54,9 @@ class V3 extends Api implements ControllerProviderInterface, ServiceProviderInte $app['controller.api.v3.stories'] = $app->share(function (PhraseaApplication $app) { return (new V3StoriesController($app)); }); + $app['controller.api.v3'] = $app->share(function (PhraseaApplication $app) { + return (new V3Controller($app)); + }); } public function boot(Application $app) @@ -150,6 +154,16 @@ class V3 extends Api implements ControllerProviderInterface, ServiceProviderInte $controllers->post('/subdefs_service/', 'controller.api.v3.subdefs_service:indexAction_POST'); } + /** + * @uses V3Controller::getDataboxSubdefsAction() + */ + $controllers->get('/databoxes/{databox_id}/subdefs/', 'controller.api.v3:getDataboxSubdefsAction') + ->before('controller.api.v1:ensureAccessToDatabox') + ->before('controller.api.v1:ensureCanSeeDataboxStructure') + ->assert('databox_id', '\d+'); + + $controllers->get('/databoxes/subdefs/', 'controller.api.v3:getDataboxSubdefsAction'); + return $controllers; } diff --git a/lib/Alchemy/Phrasea/Core/Provider/SearchEngineServiceProvider.php b/lib/Alchemy/Phrasea/Core/Provider/SearchEngineServiceProvider.php index bab1a62f28..71159f028e 100644 --- a/lib/Alchemy/Phrasea/Core/Provider/SearchEngineServiceProvider.php +++ b/lib/Alchemy/Phrasea/Core/Provider/SearchEngineServiceProvider.php @@ -96,7 +96,8 @@ class SearchEngineServiceProvider implements ServiceProviderInterface $app['elasticsearch.client'], $app['query_context.factory'], $app['elasticsearch.facets_response.factory'], - $app['elasticsearch.options'] + $app['elasticsearch.options'], + $app['translator'] ); }); diff --git a/lib/Alchemy/Phrasea/Core/Version.php b/lib/Alchemy/Phrasea/Core/Version.php index abfcc87945..62554030cb 100644 --- a/lib/Alchemy/Phrasea/Core/Version.php +++ b/lib/Alchemy/Phrasea/Core/Version.php @@ -16,7 +16,7 @@ class Version /** * @var string */ - private $number = '4.1.5'; + private $number = '4.1.6-rc1'; /** * @var string diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php index 43dc650c27..5eab435c70 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php @@ -33,6 +33,7 @@ use Closure; use databox_field; use Doctrine\Common\Collections\ArrayCollection; use Elasticsearch\Client; +use Symfony\Component\Translation\TranslatorInterface; class ElasticSearchEngine implements SearchEngineInterface { @@ -59,6 +60,8 @@ class ElasticSearchEngine implements SearchEngineInterface */ private $context_factory; + private $translator; + /** * @param Application $app * @param GlobalStructure $structure @@ -66,8 +69,9 @@ class ElasticSearchEngine implements SearchEngineInterface * @param QueryContextFactory $context_factory * @param Closure $facetsResponseFactory * @param ElasticsearchOptions $options + * @param TranslatorInterface $translator */ - public function __construct(Application $app, GlobalStructure $structure, Client $client, QueryContextFactory $context_factory, Closure $facetsResponseFactory, ElasticsearchOptions $options) + public function __construct(Application $app, GlobalStructure $structure, Client $client, QueryContextFactory $context_factory, Closure $facetsResponseFactory, ElasticsearchOptions $options, TranslatorInterface $translator) { $this->app = $app; $this->structure = $structure; @@ -75,6 +79,7 @@ class ElasticSearchEngine implements SearchEngineInterface $this->context_factory = $context_factory; $this->facetsResponseFactory = $facetsResponseFactory; $this->options = $options; + $this->translator = $translator; $this->indexName = $options->getIndexName(); } @@ -780,7 +785,7 @@ class ElasticSearchEngine implements SearchEngineInterface { $aggs = []; // technical aggregates (enable + optional limit) - foreach (ElasticsearchOptions::getAggregableTechnicalFields() as $k => $f) { + foreach (ElasticsearchOptions::getAggregableTechnicalFields($this->translator) as $k => $f) { $size = $this->options->getAggregableFieldLimit($k); if ($size !== databox_field::FACET_DISABLED) { if ($size === databox_field::FACET_NO_LIMIT) { @@ -793,6 +798,13 @@ class ElasticSearchEngine implements SearchEngineInterface ] ]; $aggs[$k] = $agg; + if($options->getIncludeUnsetFieldFacet() === true) { + $aggs[$k . '#empty'] = [ + 'missing' => [ + 'field' => $f['esfield'], + ] + ]; + } } } // fields aggregates diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticsearchOptions.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticsearchOptions.php index 4f7de4c7af..5c7989afb3 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticsearchOptions.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticsearchOptions.php @@ -11,6 +11,7 @@ namespace Alchemy\Phrasea\SearchEngine\Elastic; use databox_field; use igorw; +use Symfony\Component\Translation\TranslatorInterface; class ElasticsearchOptions @@ -312,47 +313,47 @@ class ElasticsearchOptions $this->_customValues = igorw\assoc_in($this->_customValues, $keys, $value); } - public static function getAggregableTechnicalFields() + public static function getAggregableTechnicalFields(TranslatorInterface $translator) { return [ '_base' => [ 'type' => 'string', - 'label' => 'prod::facet:base_label', + 'label' => $translator->trans('prod::facet:base_label'), 'field' => "database", 'esfield' => 'databox_name', - 'query' => 'database:%s', + 'query' => 'database=%s', ], '_collection' => [ 'type' => 'string', - 'label' => 'prod::facet:collection_label', + 'label' => $translator->trans('prod::facet:collection_label'), 'field' => "collection", 'esfield' => 'collection_name', - 'query' => 'collection:%s', + 'query' => 'collection=%s', ], '_doctype' => [ 'type' => 'string', - 'label' => 'prod::facet:doctype_label', + 'label' => $translator->trans('prod::facet:doctype_label'), 'field' => "type", 'esfield' => 'type', - 'query' => 'type:%s', + 'query' => 'type=%s', ], '_camera_model' => [ 'type' => 'string', - 'label' => 'Camera Model', + 'label' => $translator->trans('prod::facet:CameraModel_label'), 'field' => "meta.CameraModel", 'esfield' => 'metadata_tags.CameraModel', - 'query' => 'meta.CameraModel:%s', + 'query' => 'meta.CameraModel=%s', ], '_iso' => [ 'type' => 'number', - 'label' => 'ISO', + 'label' => $translator->trans('prod::facet:ISO_label'), 'field' => "meta.ISO", 'esfield' => 'metadata_tags.ISO', 'query' => 'meta.ISO=%s', ], '_aperture' => [ 'type' => 'number', - 'label' => 'Aperture', + 'label' => $translator->trans('prod::facet:Aperture_label'), 'field' => "meta.Aperture", 'esfield' => 'metadata_tags.Aperture', 'query' => 'meta.Aperture=%s', @@ -362,7 +363,7 @@ class ElasticsearchOptions ], '_shutterspeed' => [ 'type' => 'number', - 'label' => 'Shutter speed', + 'label' => $translator->trans('prod::facet:ShutterSpeed_label'), 'field' => "meta.ShutterSpeed", 'esfield' => 'metadata_tags.ShutterSpeed', 'query' => 'meta.ShutterSpeed=%s', @@ -375,66 +376,89 @@ class ElasticsearchOptions ], '_flashfired' => [ 'type' => 'boolean', - 'label' => 'FlashFired', + 'label' => $translator->trans('prod::facet:FlashFired_label'), 'field' => "meta.FlashFired", 'esfield' => 'metadata_tags.FlashFired', 'query' => 'meta.FlashFired=%s', 'choices' => [ "aggregated (2 values: fired = 0 or 1)" => -1, ], - 'output_formatter' => function($value) { - static $map = ["false"=>"No flash", "true"=>"Flash", '0'=>"No flash", '1'=>"Flash"]; + 'output_formatter' => function($value) use($translator) { + $map = [ + "false" => $translator->trans("facet.flashfired:no"), + "true" => $translator->trans("facet.flashfired:yes"), + '0' => $translator->trans("facet.flashfired:no"), + '1' => $translator->trans("facet.flashfired:yes") + ]; return array_key_exists($value, $map) ? $map[$value] : $value; }, ], '_framerate' => [ 'type' => 'number', - 'label' => 'FrameRate', + 'label' => $translator->trans('prod::facet:FrameRate_label'), 'field' => "meta.FrameRate", 'esfield' => 'metadata_tags.FrameRate', 'query' => 'meta.FrameRate=%s', ], '_audiosamplerate' => [ 'type' => 'number', - 'label' => 'Audio Samplerate', + 'label' => $translator->trans('prod::facet:AudioSamplerate_label'), 'field' => "meta.AudioSamplerate", 'esfield' => 'metadata_tags.AudioSamplerate', 'query' => 'meta.AudioSamplerate=%s', ], '_videocodec' => [ 'type' => 'string', - 'label' => 'Video codec', + 'label' => $translator->trans('prod::facet:VideoCodec_label'), 'field' => "meta.VideoCodec", 'esfield' => 'metadata_tags.VideoCodec', - 'query' => 'meta.VideoCodec:%s', + 'query' => 'meta.VideoCodec=%s', ], '_audiocodec' => [ 'type' => 'string', - 'label' => 'Audio codec', + 'label' => $translator->trans('prod::facet:AudioCodec_label'), 'field' => "meta.AudioCodec", 'esfield' => 'metadata_tags.AudioCodec', - 'query' => 'meta.AudioCodec:%s', + 'query' => 'meta.AudioCodec=%s', ], '_orientation' => [ 'type' => 'string', - 'label' => 'Orientation', + 'label' => $translator->trans('prod::facet.Orientation_label'), 'field' => "meta.Orientation", 'esfield' => 'metadata_tags.Orientation', 'query' => 'meta.Orientation=%s', ], + '_thumbnail_orientation' => [ + 'type' => 'string', + 'label' => $translator->trans('prod::facet.ThumbnailOrientation_label'), + 'field' => "meta.ThumbnailOrientation", + 'esfield' => 'metadata_tags.ThumbnailOrientation', + 'query' => 'meta.ThumbnailOrientation=%s', + 'choices' => [ + "aggregated (4 values: '', 'S', 'L', 'P')" => -1, + ], + 'output_formatter' => function($value) use($translator) { + $map = [ + "L" => $translator->trans("facet.ThumbnailOrientation:Landscape"), + "P" => $translator->trans("facet.ThumbnailOrientation:Portrait"), + 'S' => $translator->trans("facet.ThumbnailOrientation:Square") + ]; + return array_key_exists($value, $map) ? $map[$value] : $value; + }, + ], '_colorspace' => [ 'type' => 'string', - 'label' => 'Colorspace', + 'label' => $translator->trans('prod::facet:Colorspace_label'), 'field' => "meta.ColorSpace", 'esfield' => 'metadata_tags.ColorSpace', - 'query' => 'meta.ColorSpace:%s', + 'query' => 'meta.ColorSpace=%s', ], '_mimetype' => [ 'type' => 'string', - 'label' => 'MimeType', + 'label' => $translator->trans('prod::facet:MimeType_label'), 'field' => "meta.MimeType", 'esfield' => 'metadata_tags.MimeType', - 'query' => 'meta.MimeType:%s', + 'query' => 'meta.MimeType=%s', ], ]; } diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticsearchSettingsFormType.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticsearchSettingsFormType.php index 0b7a3ce9e6..3115055a34 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticsearchSettingsFormType.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticsearchSettingsFormType.php @@ -137,7 +137,7 @@ class ElasticsearchSettingsFormType extends AbstractType } // add or replace hardcoded tech fields - foreach(ElasticsearchOptions::getAggregableTechnicalFields() as $k => $f) { + foreach(ElasticsearchOptions::getAggregableTechnicalFields($this->translator) as $k => $f) { $choices = array_key_exists('choices', $f) ? $f['choices'] : null; // a tech-field can publish it's own choices $help = null; $label = '#' . $k; diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Indexer/Record/Hydrator/SubDefinitionHydrator.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Indexer/Record/Hydrator/SubDefinitionHydrator.php index a7da16e834..32a06e3781 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Indexer/Record/Hydrator/SubDefinitionHydrator.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Indexer/Record/Hydrator/SubDefinitionHydrator.php @@ -18,7 +18,18 @@ use media_Permalink_Adapter; class SubDefinitionHydrator implements HydratorInterface { - /** @var Application */ + const ORIENTATION_SQUARE = 'S'; + const ORIENTATION_LANDSCAPE = 'L'; + const ORIENTATION_PORTRAIT = 'P'; + const ORIENTATION_UNKNOW = ''; + +// const ORIENTATION_SQUARE = 1; +// const ORIENTATION_LANDSCAPE = 2; +// const ORIENTATION_PORTRAIT = 3; +// const ORIENTATION_UNKNOW = 0; + + + /** @var Application */ private $app; /** @var databox */ @@ -38,45 +49,50 @@ class SubDefinitionHydrator implements HydratorInterface { if ($this->populatePermalinks) { $this->hydrateRecordsWithPermalinks($records); - } else { + } + else { $this->hydrateRecordsWithoutPermalinks($records); } } private function hydrateRecordsWithPermalinks(&$records) { - foreach(array_keys($records) as $rid) { + foreach (array_keys($records) as $rid) { + + $record = &$records[$rid]; + try { $subdefs = $this->databox->getRecordRepository()->find($rid)->get_subdefs(); $pls = array_map( /** media_Permalink_Adapter|null $plink */ - function($plink) { - return $plink ? ((string) $plink->get_url()) : null; + function ($plink) { + return $plink ? ((string)$plink->get_url()) : null; }, media_Permalink_Adapter::getMany($this->app, $subdefs, false) // false: don't create missing plinks ); - foreach($subdefs as $subdef) { + foreach ($subdefs as $subdef) { $name = $subdef->get_name(); - if(substr(($path = $subdef->get_path()), -1) !== '/') { + if (substr(($path = $subdef->get_path()), -1) !== '/') { $path .= '/'; } - $records[$rid]['subdefs'][$name] = array( - 'path' => $path . $subdef->get_file(), - 'width' => $subdef->get_width(), - 'height' => $subdef->get_height(), - 'size' => $subdef->get_size(), - 'mime' => $subdef->get_mime(), + $record['subdefs'][$name] = [ + 'path' => $path . $subdef->get_file(), + 'width' => $subdef->get_width(), + 'height' => $subdef->get_height(), + 'size' => $subdef->get_size(), + 'mime' => $subdef->get_mime(), 'permalink' => array_key_exists($name, $pls) ? $pls[$name] : null - ); - + ]; + if ($name == "thumbnail") { + $this->setOrientation($record, $subdef->get_width(), $subdef->get_height()); + } } } catch (\Exception $e) { // cant get record ? ignore } - } } @@ -96,22 +112,42 @@ class SubDefinitionHydrator implements HydratorInterface ORDER BY s.record_id SQL; $statement = $this->databox->get_connection()->executeQuery($sql, - array(array_keys($records)), - array(Connection::PARAM_INT_ARRAY) + [array_keys($records)], + [Connection::PARAM_INT_ARRAY] ); $current_rid = null; $record = null; while ($subdef = $statement->fetch()) { + $rid = $subdef['record_id']; + $record = &$records[$rid]; $name = $subdef['name']; - $records[$subdef['record_id']]['subdefs'][$name] = array( - 'path' => $subdef['path'], - 'width' => $subdef['width'], - 'height' => $subdef['height'], - 'size' => $subdef['size'], - 'mime' => $subdef['mime'], + $record['subdefs'][$name] = [ + 'path' => $subdef['path'], + 'width' => $subdef['width'], + 'height' => $subdef['height'], + 'size' => $subdef['size'], + 'mime' => $subdef['mime'], 'permalink' => null - ); + ]; + if ($name == "thumbnail") { + $this->setOrientation($record, $subdef['width'], $subdef['height']); + } } } + + private function setOrientation(&$record, $w, $h) + { + $o = self::ORIENTATION_UNKNOW; + if ($w !== '' && $h !== '' && !is_null($w) && !is_null($h)) { + $w = (int)$w; + $h = (int)$h; + $o = $w == $h ? self::ORIENTATION_SQUARE : ($w > $h ? self::ORIENTATION_LANDSCAPE : self::ORIENTATION_PORTRAIT); + } + if(!array_key_exists('metadata_tags', $record)) { + $record['metadata_tags'] = []; + } + $record['metadata_tags']['ThumbnailOrientation'] = $o; + } } + diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/MetadataTagToFieldMappingConverter.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/MetadataTagToFieldMappingConverter.php index 07d186b4e3..ceb7a0a6d9 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/MetadataTagToFieldMappingConverter.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/MetadataTagToFieldMappingConverter.php @@ -18,6 +18,25 @@ class MetadataTagToFieldMappingConverter { public function convertTag(Tag $tag) + { + if ($tag->getType() === FieldMapping::TYPE_STRING) { + + $fieldMapping = new StringFieldMapping($tag->getName()); + $fieldMapping->addChild((new StringFieldMapping('raw'))->enableRawIndexing()); + if ($tag->isAnalyzable()) { + $fieldMapping->enableAnalysis(); + } + else { + $fieldMapping->disableAnalysis(); + } + + return $fieldMapping; + } + + return new FieldMapping($tag->getName(), $tag->getType()); + } + + public function dead_convertTag(Tag $tag) { if ($tag->getType() === FieldMapping::TYPE_STRING) { $fieldMapping = new StringFieldMapping($tag->getName()); diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php index 4849ff4693..6f7d0b4655 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php @@ -24,7 +24,7 @@ class FacetsResponse return; } - $atf = ElasticsearchOptions::getAggregableTechnicalFields(); + $atf = ElasticsearchOptions::getAggregableTechnicalFields($this->translator); // sort facets respecting the order defined in options foreach($options->getAggregableFields() as $name=>$foptions) { @@ -35,9 +35,11 @@ class FacetsResponse $tf = null; $valueFormatter = function($v){ return $v; }; // default equality formatter + $label = $name; if(array_key_exists($name, $atf)) { $tf = $atf[$name]; + $label = $tf['label']; if(array_key_exists('output_formatter', $tf)) { $valueFormatter = $tf['output_formatter']; } @@ -56,7 +58,8 @@ class FacetsResponse if($response['aggregations'][$name . '#empty']['doc_count'] > 0) { // don't add a facet for 0 results $aggregation['buckets'][] = [ 'key' => '_unset_', - 'value' => $this->translator->trans('prod:workzone:facetstab:unset_field_facet_label_(%fieldname%)', ['%fieldname%' =>$name]), // special homemade prop to display a human value instead of the key + 'value' => $this->translator->trans('prod:workzone:facetstab:unset_field_facet_label_(%fieldname%)', ['%fieldname%' =>$label]), // special homemade prop to display a human value instead of the key + // 'value' => 'unset '.$name, // special homemade prop to display a human value instead of the key 'doc_count' => $response['aggregations'][$name . '#empty']['doc_count'] ]; } @@ -70,8 +73,15 @@ class FacetsResponse $key = array_key_exists('key_as_string', $bucket) ? $bucket['key_as_string'] : $bucket['key']; if($tf) { // the field is one of the hardcoded tech fields + if($key == '_unset_' && array_key_exists('value', $bucket)) { + // don't use the valueformatter since 'value' if already translated + $v = $bucket['value']; + } + else { + $v = $valueFormatter($key); + } $value = [ - 'value' => $valueFormatter($key), + 'value' => $v, 'raw_value' => $key, 'count' => $bucket['doc_count'], 'query' => sprintf($tf['query'], $this->escaper->escapeWord($key)) diff --git a/lib/classes/media/subdef.php b/lib/classes/media/subdef.php index 8893523fe0..544f838504 100644 --- a/lib/classes/media/subdef.php +++ b/lib/classes/media/subdef.php @@ -109,6 +109,7 @@ class media_subdef extends media_abstract implements cache_cacheableInterface const TC_DATA_COLORSPACE = 'ColorSpace'; const TC_DATA_CHANNELS = 'Channels'; const TC_DATA_ORIENTATION = 'Orientation'; + const TC_DATA_THUMBNAILORIENTATION = 'ThumbnailOrientation'; const TC_DATA_COLORDEPTH = 'ColorDepth'; const TC_DATA_DURATION = 'Duration'; const TC_DATA_AUDIOCODEC = 'AudioCodec'; @@ -864,6 +865,7 @@ class media_subdef extends media_abstract implements cache_cacheableInterface self::TC_DATA_VIDEOCODEC => ['method' => 'getVideoCodec', 'type' => 'string', 'analyzable' => false], self::TC_DATA_AUDIOCODEC => ['method' => 'getAudioCodec', 'type' => 'string', 'analyzable' => false], self::TC_DATA_ORIENTATION => ['method' => 'getOrientation', 'type' => 'integer', 'analyzable' => false], + self::TC_DATA_THUMBNAILORIENTATION => ['type' => 'string', 'analyzable' => false], self::TC_DATA_LONGITUDE => ['method' => 'getLongitude', 'type' => 'float', 'analyzable' => false], self::TC_DATA_LONGITUDE_REF => ['method' => 'getLongitudeRef'], self::TC_DATA_LATITUDE => ['method' => 'getLatitude', 'type' => 'float', 'analyzable' => false], diff --git a/resources/locales/messages.de.xlf b/resources/locales/messages.de.xlf index 868442ed3d..32395ef631 100644 --- a/resources/locales/messages.de.xlf +++ b/resources/locales/messages.de.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -198,7 +198,7 @@ %number% documents<br/>selectionnes ausgewählt]]> - Controller/Prod/QueryController.php + Controller/Prod/QueryController.php %quantity% Stories attached to the WorkZone @@ -279,7 +279,7 @@ %total% reponses %total% Ergebnisse - Controller/Prod/QueryController.php + Controller/Prod/QueryController.php %user% a envoye son rapport de validation de %title% @@ -1080,7 +1080,6 @@ Aperture Blende - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -1291,21 +1290,11 @@ Media/Subdef/Video.php Media/Subdef/Audio.php - - Audio Samplerate - Audio Samplerate - SearchEngine/Elastic/ElasticsearchOptions.php - Audio channel Audiokanal Media/Subdef/Audio.php - - Audio codec - Audio-Codec - SearchEngine/Elastic/ElasticsearchOptions.php - AudioSamplerate Audio Samplerate @@ -1577,7 +1566,6 @@ Camera Model Kameramodell - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -1863,11 +1851,6 @@ Farbraum web/common/technical_datas.html.twig - - Colorspace - Colorspace - SearchEngine/Elastic/ElasticsearchOptions.php - Commande Bestellung @@ -3352,11 +3335,6 @@ web/common/technical_datas.html.twig web/prod/index.html.twig - - FlashFired - FlashFired - SearchEngine/Elastic/ElasticsearchOptions.php - Flatten layers Flatten Layers @@ -3418,11 +3396,6 @@ Bildfrequenz Media/Subdef/Video.php - - FrameRate - Framerate - SearchEngine/Elastic/ElasticsearchOptions.php - Frequence d'echantillonage Abtastfrequenz @@ -3668,11 +3641,6 @@ IP web/account/sessions.html.twig - - ISO - ISO - SearchEngine/Elastic/ElasticsearchOptions.php - ISO sensibility ISO Empfindlichkeit @@ -4375,11 +4343,6 @@ Mime Typ web/common/technical_datas.html.twig - - MimeType - MimeType - SearchEngine/Elastic/ElasticsearchOptions.php - Minimum number of letters before truncation Mindestzeichenzahl vor der Kürzung @@ -4911,11 +4874,6 @@ Einfach Controller/Root/LoginController.php - - Orientation - Ausrichtung - SearchEngine/Elastic/ElasticsearchOptions.php - Original name ursprünglicher Name @@ -6234,7 +6192,6 @@ Shutter speed Verschlusszeit - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -7458,11 +7415,6 @@ Video Codec Media/Subdef/Video.php - - Video codec - Video-Codec - SearchEngine/Elastic/ElasticsearchOptions.php - Videos Videos @@ -9726,7 +9678,7 @@ ascendant aufsteigend - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php audio @@ -10330,12 +10282,12 @@ date dajout hinzugefügtes Datum - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php date de modification Änderungsdatum - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php decembre @@ -10350,7 +10302,7 @@ descendant absteigend - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php developers:: Events name @@ -10730,6 +10682,33 @@ Untertitelung (vtt) Felder senden prod/WorkZone/ExposeFieldList.html.twig + + facet.ThumbnailOrientation:Landscape + Landschaft + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.ThumbnailOrientation:Portrait + Porträt + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.ThumbnailOrientation:Square + Quadrat + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.flashfired:no + Blitz nicht benutzt + SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.flashfired:yes + Blitz benutzt + SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php + failed to send mail Email Senden ist fehlgeschlagen @@ -11619,7 +11598,7 @@ pertinence Relevanz - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php php.ini path @@ -12594,20 +12573,85 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben web/lightbox/validate.html.twig web/prod/index.html.twig + + prod::facet.Orientation_label + Exif Ausrichtung + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet.ThumbnailOrientation_label + Ausrichtung + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:Aperture_label + Blendeöffnung + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:AudioCodec_label + Audio Codec + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:AudioSamplerate_label + Audio Sample Rate + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:CameraModel_label + Kamera Modell + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:Colorspace_label + Farbraum + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:FlashFired_label + Blitzlicht + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:FrameRate_label + Video Frame Rate + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:ISO_label + ISO + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:MimeType_label + Mime Type + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:ShutterSpeed_label + Belichtungszeit + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:VideoCodec_label + Video Codec + SearchEngine/Elastic/ElasticsearchOptions.php + prod::facet:base_label Datenbanken - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::facet:collection_label Kollektionen - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::facet:doctype_label Dokumenttyp - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::feedback:feedback_set_title @@ -13374,7 +13418,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben prod:workzone:facetstab:unset_field_facet_label_(%fieldname%) Wert nicht gesetzt für %fieldname% - Elastic/Search/FacetsResponse.php + Elastic/Search/FacetsResponse.php public diff --git a/resources/locales/messages.en.xlf b/resources/locales/messages.en.xlf index 551c3cc264..e37def3754 100644 --- a/resources/locales/messages.en.xlf +++ b/resources/locales/messages.en.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -198,7 +198,7 @@ %number% documents<br/>selectionnes selected]]> - Controller/Prod/QueryController.php + Controller/Prod/QueryController.php %quantity% Stories attached to the WorkZone @@ -279,7 +279,7 @@ %total% reponses %total% responses - Controller/Prod/QueryController.php + Controller/Prod/QueryController.php %user% a envoye son rapport de validation de %title% @@ -1081,7 +1081,6 @@ Aperture Aperture - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -1292,21 +1291,11 @@ Media/Subdef/Video.php Media/Subdef/Audio.php - - Audio Samplerate - Audio Samplerate - SearchEngine/Elastic/ElasticsearchOptions.php - Audio channel Audio channel Media/Subdef/Audio.php - - Audio codec - Audio codec - SearchEngine/Elastic/ElasticsearchOptions.php - AudioSamplerate Audio sample rate @@ -1578,7 +1567,6 @@ Camera Model Camera model - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -1865,11 +1853,6 @@ Color space web/common/technical_datas.html.twig - - Colorspace - Colorspace - SearchEngine/Elastic/ElasticsearchOptions.php - Commande Order @@ -3355,11 +3338,6 @@ web/common/technical_datas.html.twig web/prod/index.html.twig - - FlashFired - FlashFired - SearchEngine/Elastic/ElasticsearchOptions.php - Flatten layers Flatten layers @@ -3421,11 +3399,6 @@ Frame rate Media/Subdef/Video.php - - FrameRate - FrameRate - SearchEngine/Elastic/ElasticsearchOptions.php - Frequence d'echantillonage Sampling frequency @@ -3671,11 +3644,6 @@ IP address web/account/sessions.html.twig - - ISO - ISO - SearchEngine/Elastic/ElasticsearchOptions.php - ISO sensibility ISO sensibility @@ -4378,11 +4346,6 @@ Mime type web/common/technical_datas.html.twig - - MimeType - MimeType - SearchEngine/Elastic/ElasticsearchOptions.php - Minimum number of letters before truncation Minimum number of characters before truncation @@ -4914,11 +4877,6 @@ Ordinary Controller/Root/LoginController.php - - Orientation - Orientation - SearchEngine/Elastic/ElasticsearchOptions.php - Original name Original name @@ -6237,7 +6195,6 @@ Shutter speed Shutter speed - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -7461,11 +7418,6 @@ Video codec Media/Subdef/Video.php - - Video codec - Video codec - SearchEngine/Elastic/ElasticsearchOptions.php - Videos Videos @@ -9729,7 +9681,7 @@ ascendant ascending - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php audio @@ -10333,12 +10285,12 @@ date dajout Add date - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php date de modification Modification date - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php decembre @@ -10353,7 +10305,7 @@ descendant descending - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php developers:: Events name @@ -10733,6 +10685,33 @@ Send video text track files prod/WorkZone/ExposeFieldList.html.twig + + facet.ThumbnailOrientation:Landscape + Landscape + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.ThumbnailOrientation:Portrait + Portrait + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.ThumbnailOrientation:Square + Square + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.flashfired:no + Flash Not fired + SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.flashfired:yes + Flash Fired + SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php + failed to send mail failed to send mail @@ -11237,7 +11216,7 @@ notification:: mark all notification as read - Mark all notifications as "Read" + Mark all notifications as "Read" web/prod/notifications_dialog.html.twig @@ -11622,7 +11601,7 @@ pertinence Relevance - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php php.ini path @@ -12156,7 +12135,7 @@ print:: add and remember password to protect the pdf - Define a password to protect the PDF (optional) + Define a password to protect the PDF (optional) prod/actions/printer_default.html.twig @@ -12268,7 +12247,7 @@ print:: some options - Additional settings + Additional settings prod/actions/printer_default.html.twig @@ -12293,7 +12272,7 @@ print:: warning! Only available media for chosen subdef is downloadable - Leave the duration empty for a permanent validity + Leave the duration empty for a permanent validity prod/actions/printer_default.html.twig @@ -12599,20 +12578,85 @@ Warning: The current values will be overwritten by these new values web/lightbox/validate.html.twig web/prod/index.html.twig + + prod::facet.Orientation_label + Exif Orientation + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet.ThumbnailOrientation_label + Orientation + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:Aperture_label + Aperture + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:AudioCodec_label + Audio Codec + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:AudioSamplerate_label + Audio Samplerate + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:CameraModel_label + Camera Model + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:Colorspace_label + Colorspace + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:FlashFired_label + Flash + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:FrameRate_label + Video frame rate + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:ISO_label + ISO + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:MimeType_label + Mime Type + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:ShutterSpeed_label + Shutter Speed + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:VideoCodec_label + Video Codec + SearchEngine/Elastic/ElasticsearchOptions.php + prod::facet:base_label Base - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::facet:collection_label Collection - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::facet:doctype_label Document type - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::feedback:feedback_set_title @@ -13382,7 +13426,7 @@ It is possible to place several search areas prod:workzone:facetstab:unset_field_facet_label_(%fieldname%) Unset value for %fieldname% - Elastic/Search/FacetsResponse.php + Elastic/Search/FacetsResponse.php public @@ -13442,7 +13486,7 @@ It is possible to place several search areas publication:: %count% users to notify - %count% users will be notified + %count% users will be notified Controller/Prod/FeedController.php diff --git a/resources/locales/messages.fr.xlf b/resources/locales/messages.fr.xlf index e548a236ea..90d3c06a96 100644 --- a/resources/locales/messages.fr.xlf +++ b/resources/locales/messages.fr.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -198,7 +198,7 @@ %number% documents<br/>selectionnes sélectionnés]]> - Controller/Prod/QueryController.php + Controller/Prod/QueryController.php %quantity% Stories attached to the WorkZone @@ -279,7 +279,7 @@ %total% reponses %total% réponses - Controller/Prod/QueryController.php + Controller/Prod/QueryController.php %user% a envoye son rapport de validation de %title% @@ -1080,7 +1080,6 @@ Aperture Ouverture - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -1291,21 +1290,11 @@ Media/Subdef/Video.php Media/Subdef/Audio.php - - Audio Samplerate - Fréquence d'échantillonnage - SearchEngine/Elastic/ElasticsearchOptions.php - Audio channel Canal audio Media/Subdef/Audio.php - - Audio codec - Encodeur Audio - SearchEngine/Elastic/ElasticsearchOptions.php - AudioSamplerate Taux d’échantillonnage audio @@ -1577,7 +1566,6 @@ Camera Model Type d'appareil numérique - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -1863,11 +1851,6 @@ Espace colorimétrique web/common/technical_datas.html.twig - - Colorspace - Espace colorimétrique - SearchEngine/Elastic/ElasticsearchOptions.php - Commande Commande @@ -3352,11 +3335,6 @@ web/common/technical_datas.html.twig web/prod/index.html.twig - - FlashFired - Avec Flash - SearchEngine/Elastic/ElasticsearchOptions.php - Flatten layers Aplatir les calques @@ -3418,11 +3396,6 @@ Nombre d'images par seconde Media/Subdef/Video.php - - FrameRate - Cadence - SearchEngine/Elastic/ElasticsearchOptions.php - Frequence d'echantillonage Fréquence d'échantillonnage @@ -3668,11 +3641,6 @@ Adresse IP web/account/sessions.html.twig - - ISO - ISO - SearchEngine/Elastic/ElasticsearchOptions.php - ISO sensibility Sensibilité ISO @@ -4375,11 +4343,6 @@ Type Mime web/common/technical_datas.html.twig - - MimeType - MimeType - SearchEngine/Elastic/ElasticsearchOptions.php - Minimum number of letters before truncation Nombre minimal de caractères avant la troncature @@ -4911,11 +4874,6 @@ Normale Controller/Root/LoginController.php - - Orientation - Orientation - SearchEngine/Elastic/ElasticsearchOptions.php - Original name Le nom de fichier original @@ -6236,7 +6194,6 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Shutter speed Vitesse d'obturateur - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -7460,11 +7417,6 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Codec Vidéos Media/Subdef/Video.php - - Video codec - Codec vidéo - SearchEngine/Elastic/ElasticsearchOptions.php - Videos Vidéos @@ -9729,7 +9681,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le ascendant Ascendant - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php audio @@ -10333,12 +10285,12 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le date dajout Date d'ajout - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php date de modification date de modification - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php decembre @@ -10353,7 +10305,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le descendant Descendant - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php developers:: Events name @@ -10733,6 +10685,33 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le Envoyer les fichiers de sous titrage prod/WorkZone/ExposeFieldList.html.twig + + facet.ThumbnailOrientation:Landscape + Paysage + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.ThumbnailOrientation:Portrait + Portrait + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.ThumbnailOrientation:Square + Carré + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.flashfired:no + Flash non déclenché + SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.flashfired:yes + Flash déclenché + SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php + failed to send mail Echec de l'envoi d'e-mail @@ -11622,7 +11601,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le pertinence Pertinence - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php php.ini path @@ -12599,20 +12578,85 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles web/lightbox/validate.html.twig web/prod/index.html.twig + + prod::facet.Orientation_label + Orientation exif + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet.ThumbnailOrientation_label + Orientation + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:Aperture_label + Ouverture + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:AudioCodec_label + Codec audio + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:AudioSamplerate_label + Fréquence d'échantillonnage + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:CameraModel_label + Appareil Photographique + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:Colorspace_label + Espace colorimétrique + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:FlashFired_label + Flash + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:FrameRate_label + Cadence + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:ISO_label + ISO + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:MimeType_label + Type Mime + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:ShutterSpeed_label + Vitesse d'obturateur + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:VideoCodec_label + Codec Video + SearchEngine/Elastic/ElasticsearchOptions.php + prod::facet:base_label Bases - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::facet:collection_label Collections - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::facet:doctype_label Types de documents - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::feedback:feedback_set_title @@ -13385,7 +13429,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles prod:workzone:facetstab:unset_field_facet_label_(%fieldname%) Valeur non définie pour %fieldname% - Elastic/Search/FacetsResponse.php + Elastic/Search/FacetsResponse.php public diff --git a/resources/locales/messages.nl.xlf b/resources/locales/messages.nl.xlf index 177b414e37..96bbc23ced 100644 --- a/resources/locales/messages.nl.xlf +++ b/resources/locales/messages.nl.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -198,7 +198,7 @@ selectionnes]]> selectionnes]]> - Controller/Prod/QueryController.php + Controller/Prod/QueryController.php %quantity% Stories attached to the WorkZone @@ -279,7 +279,7 @@ %total% reponses %total% reponses - Controller/Prod/QueryController.php + Controller/Prod/QueryController.php %user% a envoye son rapport de validation de %title% @@ -1082,7 +1082,6 @@ Aperture Diafragma - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -1293,21 +1292,11 @@ Media/Subdef/Video.php Media/Subdef/Audio.php - - Audio Samplerate - Audio Samplerate - SearchEngine/Elastic/ElasticsearchOptions.php - Audio channel Audio channel Media/Subdef/Audio.php - - Audio codec - Audio codec - SearchEngine/Elastic/ElasticsearchOptions.php - AudioSamplerate AudioSamplerate @@ -1579,7 +1568,6 @@ Camera Model Cameramodel - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -1867,11 +1855,6 @@ Kleurruimte web/common/technical_datas.html.twig - - Colorspace - Colorspace - SearchEngine/Elastic/ElasticsearchOptions.php - Commande Bestelling @@ -3364,11 +3347,6 @@ web/common/technical_datas.html.twig web/prod/index.html.twig - - FlashFired - FlashFired - SearchEngine/Elastic/ElasticsearchOptions.php - Flatten layers Flatten layers @@ -3430,11 +3408,6 @@ Beelden per Seconden Media/Subdef/Video.php - - FrameRate - FrameRate - SearchEngine/Elastic/ElasticsearchOptions.php - Frequence d'echantillonage Samplefrequentie @@ -3680,11 +3653,6 @@ IP web/account/sessions.html.twig - - ISO - ISO - SearchEngine/Elastic/ElasticsearchOptions.php - ISO sensibility ISO waarde @@ -4387,11 +4355,6 @@ Mime type web/common/technical_datas.html.twig - - MimeType - MimeType - SearchEngine/Elastic/ElasticsearchOptions.php - Minimum number of letters before truncation Minimum aantal tekens alvorens te ledigen @@ -4923,11 +4886,6 @@ Gewoon Controller/Root/LoginController.php - - Orientation - Orientation - SearchEngine/Elastic/ElasticsearchOptions.php - Original name Originele naam @@ -6246,7 +6204,6 @@ Shutter speed Sluitersnelheid - SearchEngine/Elastic/ElasticsearchOptions.php web/common/technical_datas.html.twig @@ -7470,11 +7427,6 @@ Video Codec Media/Subdef/Video.php - - Video codec - Video codec - SearchEngine/Elastic/ElasticsearchOptions.php - Videos Video's @@ -9738,7 +9690,7 @@ ascendant aflopend - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php audio @@ -10342,12 +10294,12 @@ date dajout Datum toegevoegd - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php date de modification date de modification - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php decembre @@ -10362,7 +10314,7 @@ descendant oplopend - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php developers:: Events name @@ -10742,6 +10694,33 @@ expose::setting send vtt field prod/WorkZone/ExposeFieldList.html.twig + + facet.ThumbnailOrientation:Landscape + facet.ThumbnailOrientation:Landscape + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.ThumbnailOrientation:Portrait + facet.ThumbnailOrientation:Portrait + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.ThumbnailOrientation:Square + facet.ThumbnailOrientation:Square + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.flashfired:no + facet.flashfired:no + SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php + + + facet.flashfired:yes + facet.flashfired:yes + SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php + failed to send mail email versturen niet gelukt @@ -11631,7 +11610,7 @@ pertinence relevantie - SearchEngine/Elastic/ElasticSearchEngine.php + SearchEngine/Elastic/ElasticSearchEngine.php php.ini path @@ -12605,20 +12584,85 @@ web/lightbox/validate.html.twig web/prod/index.html.twig + + prod::facet.Orientation_label + prod::facet.Orientation_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet.ThumbnailOrientation_label + prod::facet.ThumbnailOrientation_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:Aperture_label + prod::facet:Aperture_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:AudioCodec_label + prod::facet:AudioCodec_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:AudioSamplerate_label + prod::facet:AudioSamplerate_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:CameraModel_label + prod::facet:CameraModel_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:Colorspace_label + prod::facet:Colorspace_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:FlashFired_label + prod::facet:FlashFired_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:FrameRate_label + prod::facet:FrameRate_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:ISO_label + prod::facet:ISO_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:MimeType_label + prod::facet:MimeType_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:ShutterSpeed_label + prod::facet:ShutterSpeed_label + SearchEngine/Elastic/ElasticsearchOptions.php + + + prod::facet:VideoCodec_label + prod::facet:VideoCodec_label + SearchEngine/Elastic/ElasticsearchOptions.php + prod::facet:base_label prod::facet:base_label - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::facet:collection_label prod::facet:collection_label - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::facet:doctype_label prod::facet:doctype_label - SearchEngine/Elastic/ElasticsearchOptions.php + SearchEngine/Elastic/ElasticsearchOptions.php prod::feedback:feedback_set_title @@ -13385,7 +13429,7 @@ prod:workzone:facetstab:unset_field_facet_label_(%fieldname%) prod:workzone:facetstab:unset_field_facet_label_(%fieldname%) - Elastic/Search/FacetsResponse.php + Elastic/Search/FacetsResponse.php public diff --git a/resources/locales/validators.de.xlf b/resources/locales/validators.de.xlf index 7c569b9065..d9ebbe66de 100644 --- a/resources/locales/validators.de.xlf +++ b/resources/locales/validators.de.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/resources/locales/validators.en.xlf b/resources/locales/validators.en.xlf index 54a2ef63be..8d2a1872be 100644 --- a/resources/locales/validators.en.xlf +++ b/resources/locales/validators.en.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/resources/locales/validators.fr.xlf b/resources/locales/validators.fr.xlf index ed3f030055..7419646cf1 100644 --- a/resources/locales/validators.fr.xlf +++ b/resources/locales/validators.fr.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/resources/locales/validators.nl.xlf b/resources/locales/validators.nl.xlf index 05fbe6ddc6..0bb6b94264 100644 --- a/resources/locales/validators.nl.xlf +++ b/resources/locales/validators.nl.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.