Skip to content

Commit

Permalink
pkp/pkp-lib#7272 Simultaneously Displaying Multilingual Metadata on t…
Browse files Browse the repository at this point in the history
…he Article Landing Page
  • Loading branch information
jyhein committed Nov 22, 2023
1 parent 65b914a commit 70669a7
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 29 deletions.
45 changes: 43 additions & 2 deletions pages/article/ArticleHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,8 @@ public function initialize($request, $args = [])
$this->galley = $galley;
break;

// In some cases, a URL to a galley may use the ID when it should use
// the urlPath. Redirect to the galley's correct URL.
// In some cases, a URL to a galley may use the ID when it should use
// the urlPath. Redirect to the galley's correct URL.
} elseif (ctype_digit($galleyId) && $galley->getId() == $galleyId) {
$request->redirect(null, $request->getRequestedPage(), $request->getRequestedOp(), [$submission->getBestId(), $galley->getBestGalleyId()]);
}
Expand Down Expand Up @@ -357,6 +357,8 @@ public function view($args, $request)
$templateMgr->assign('purchaseArticleEnabled', true);
}

$templateMgr->assign('pubLocaleData', $this->getPublicationLocaleData($publication, $context->getPrimaryLocale(), $article->getData('locale'), $templateMgr->getTemplateVars('activeTheme')->getOption('showMetadata') ?: []));

if (!Hook::call('ArticleHandler::view', [&$request, &$issue, &$article, $publication])) {
$templateMgr->display('frontend/pages/article.tpl');
event(new UsageEvent(Application::ASSOC_TYPE_SUBMISSION, $context, $article, null, null, $this->issue));
Expand Down Expand Up @@ -616,4 +618,43 @@ public function userCanViewGalley($request, $articleId, $galleyId = null)
}
return true;
}

/**
* For article details, format display data.
*/
protected function getPublicationLocaleData(\APP\publication\Publication $publication, string $contextPrimaryLocale, string $submissionLocale, array $metadataOpts): array
{
$titles = $publication->getTitles('html');
$subtitles = $publication->getSubtitles('html');
$primaryLocale = isset($titles[$contextPrimaryLocale]) ? $contextPrimaryLocale : $submissionLocale;
$uiLocale = $contextPrimaryLocale;
$getOtherTitles = fn (array $tt, string $opt): array => in_array($opt, $metadataOpts) ? array_filter($tt, fn (string $locale) => $locale !== $primaryLocale, ARRAY_FILTER_USE_KEY) : [];
$getMdata = fn (string $opt): array => empty(count($mdata = array_filter($publication->getData($opt) ?? []))) || in_array($opt, $metadataOpts)
? $mdata
: (isset($mdata[$primaryLocale]) ? [$primaryLocale => $mdata[$primaryLocale]] : [$fk = array_key_first($mdata) => $mdata[$fk]]);
$getText = fn (array $item, string $opt): array => [
'text' => $item,
'headingLang' => collect($item)->map(fn ($_, string $locale): string => in_array($opt, $metadataOpts) ? $locale : $uiLocale)->toArray()
];

$pubLocaleData = [
'title' => $getText($getOtherTitles($titles, 'title'), 'title'),
'subtitle' => $getText($getOtherTitles($subtitles, 'title'), 'title'),
'keywords' => $getText($getMdata('keywords'), 'keywords'),
'abstract' => $getText($getMdata('abstract'), 'abstract'),
];
$pubLocaleData['languages'] = collect($pubLocaleData)
->map(fn (array $item): array => array_keys($item['text']))
->flatten()
->sort()
->prepend($primaryLocale)
->unique()
->values()
->toArray();
$pubLocaleData['primaryTitle'] = $titles[$primaryLocale];
$pubLocaleData['primarySubtitle'] = $subtitles[$primaryLocale] ?? null;
$pubLocaleData['primaryLocale'] = $primaryLocale;

return $pubLocaleData;
}
}
20 changes: 20 additions & 0 deletions plugins/themes/default/DefaultThemePlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,26 @@ public function init()
'default' => 'none',
]);

$this->addOption('showMetadata', 'FieldOptions', [
'label' => __('plugins.themes.default.option.metadata.label'),
'description' => __('plugins.themes.default.option.metadata.description'),
'options' => [
[
'value' => 'title',
'label' => __('article.title'),
],
[
'value' => 'keywords',
'label' => __('article.subject'),
],
[
'value' => 'abstract',
'label' => __('article.abstract'),
],
],
'default' => [],
]);


// Load primary stylesheet
$this->addStyle('stylesheet', 'styles/index.less');
Expand Down
12 changes: 12 additions & 0 deletions plugins/themes/default/locale/en/locale.po
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,15 @@ msgstr "Next slide"

msgid "plugins.themes.default.prevSlide"
msgstr "Previous slide"

msgid "plugins.themes.default.option.metadata.label"
msgstr "Show article metadata on the article landing page"

msgid "plugins.themes.default.option.metadata.description"
msgstr "Select the article metadata to show in other languages."

msgid "plugins.themes.default.submissionMetadataInLanguage"
msgstr "Article Metadata in English"

msgid "plugins.themes.default.titleSubtitleSeparator"
msgstr " — "
14 changes: 13 additions & 1 deletion plugins/themes/default/styles/objects/article_details.less
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
margin-bottom: 0;
}

> h2 + p {
> h2 + p, h3 + p {
margin-top: 0;
}
}
Expand All @@ -52,6 +52,10 @@

.main_entry {

.metadata > h2 {
padding: 0 @triple;
}

.item {

.label {
Expand All @@ -66,6 +70,14 @@
display: inline;
font-size: @font-base;
}

&.page_locale_title {
margin-bottom: @triple;
}

&.abstract {
margin-bottom: @quadruple;
}
}

.sub_item {
Expand Down
85 changes: 59 additions & 26 deletions templates/frontend/objects/article_details.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
* @uses $licenseUrl string URL to license. Only assigned if license should be
* included with published submissions.
* @uses $ccLicenseBadge string An image and text with details about the license
* @uses $pubLocaleData array Array of formatted publication locale metadata: titles, abstracts, keywords,
*
* @hook Templates::Article::Main []
* @hook Templates::Article::Details::Reference []
Expand Down Expand Up @@ -91,13 +92,12 @@
</div>
{/if}

<h1 class="page_title">
{$publication->getLocalizedTitle(null, 'html')|strip_unsafe_html}
<h1 class="page_title" lang="{$pubLocaleData.primaryLocale|replace:"_":"-"}">
{$pubLocaleData.primaryTitle|strip_unsafe_html}
</h1>

{if $publication->getLocalizedData('subtitle')}
<h2 class="subtitle">
{$publication->getLocalizedSubTitle(null, 'html')|strip_unsafe_html}
{if $pubLocaleData.primarySubtitle}
<h2 class="subtitle" lang="{$pubLocaleData.primaryLocale|replace:"_":"-"}">
{$pubLocaleData.primarySubtitle|strip_unsafe_html}
</h2>
{/if}

Expand Down Expand Up @@ -160,29 +160,62 @@
</section>
{/if}

{*
* Show article keywords and abstract in ui, or submission, language by default.
* Show optional multilingual metadata: titles, keywords, abstracts.
*}
{foreach from=$pubLocaleData.languages item=lang}
<section class="metadata">
{assign "hLvl" "2"}
{* Multilingual metadata title *}
{if $lang !== $pubLocaleData.primaryLocale}
{assign "hLvl" "3"}
<h2 class="label" lang={$lang|replace:"_":"-"}>
{translate key="plugins.themes.default.submissionMetadataInLanguage" locale=$lang}
</h2>
{/if}

{* Keywords *}
{if !empty($publication->getLocalizedData('keywords'))}
<section class="item keywords">
<h2 class="label">
{capture assign=translatedKeywords}{translate key="article.subject"}{/capture}
{translate key="semicolon" label=$translatedKeywords}
</h2>
<span class="value">
{foreach name="keywords" from=$publication->getLocalizedData('keywords') item="keyword"}
{$keyword|escape}{if !$smarty.foreach.keywords.last}{translate key="common.commaListSeparator"}{/if}
{/foreach}
</span>
</section>
{/if}
{* Title in other language *}
{if isset($pubLocaleData.title.text[$lang])}
<section class="item page_locale_title">
<h{$hLvl} class="label" lang="{$pubLocaleData.title.headingLang[$lang]|replace:"_":"-"}">
{translate key="submission.title" locale=$pubLocaleData.title.headingLang[$lang]}
</h{$hLvl}>
<p lang="{$lang|replace:"_":"-"}">
{$pubLocaleData.title.text[$lang]|strip_tags}
{if isset($pubLocaleData.subtitle.text[$lang])}
{translate key="plugins.themes.default.titleSubtitleSeparator" locale=$pubLocaleData.title.headingLang[$lang]}{$pubLocaleData.subtitle.text[$lang]|strip_tags}
{/if}
</p>
</section>
{/if}

{* Abstract *}
{if $publication->getLocalizedData('abstract')}
<section class="item abstract">
<h2 class="label">{translate key="article.abstract"}</h2>
{$publication->getLocalizedData('abstract')|strip_unsafe_html}
{* Keywords *}
{if isset($pubLocaleData.keywords.text[$lang])}
<section class="item keywords">
<h{$hLvl} class="label" lang="{$pubLocaleData.keywords.headingLang[$lang]|replace:"_":"-"}">
{capture assign=translatedKeywords}{translate key="article.subject" locale=$pubLocaleData.keywords.headingLang[$lang]}{/capture}
{translate key="semicolon" label=$translatedKeywords locale=$pubLocaleData.keywords.headingLang[$lang]}
</h{$hLvl}>
<span class="value" lang="{$lang|replace:"_":"-"}">
{foreach from=$pubLocaleData.keywords.text[$lang] item="keyword"}
{$keyword|escape}{if !$keyword@last}{translate key="common.commaListSeparator" locale=$pubLocaleData.keywords.headingLang[$lang]}{/if}
{/foreach}
</span>
</section>
{/if}

{* Abstract *}
{if isset($pubLocaleData.abstract.text[$lang])}
<section class="item abstract">
<h{$hLvl} class="label" lang="{$pubLocaleData.abstract.headingLang[$lang]|replace:"_":"-"}">
{translate key="article.abstract" locale=$pubLocaleData.abstract.headingLang[$lang]}
</h{$hLvl}>
<p lang="{$lang|replace:"_":"-"}">{$pubLocaleData.abstract.text[$lang]|strip_tags}</p>
</section>
{/if}
</section>
{/if}
{/foreach}

{call_hook name="Templates::Article::Main"}

Expand Down

0 comments on commit 70669a7

Please sign in to comment.