diff --git a/src/Template/Element/sentences/sentence_and_translations.ctp b/src/Template/Element/sentences/sentence_and_translations.ctp index b8dd036e6e..28c04d7663 100644 --- a/src/Template/Element/sentences/sentence_and_translations.ctp +++ b/src/Template/Element/sentences/sentence_and_translations.ctp @@ -201,7 +201,7 @@ $sentenceUrl = $this->Url->build([ {{vm.sentence.expandLabel}} - + diff --git a/src/View/Helper/LanguagesHelper.php b/src/View/Helper/LanguagesHelper.php index d9af6b04c0..e4863d2f19 100644 --- a/src/View/Helper/LanguagesHelper.php +++ b/src/View/Helper/LanguagesHelper.php @@ -70,7 +70,7 @@ public function preferredLanguageFilter() { } } - private function separatePreferredLanguages($languages) + private function prioritizePreferredLanguages($languages, $oldDesign) { $filter = $this->preferredLanguageFilter(); if (!$filter) { @@ -85,18 +85,28 @@ private function separatePreferredLanguages($languages) } $this->localizedAsort($preferred); - if (CurrentUser::isMember()) { - $filterName = __('Profile languages'); + if ($oldDesign) { + if (CurrentUser::isMember()) { + $filterName = __('Profile languages'); + } else { + $filterName = __('Last used languages'); + } + return array( + $filterName => $preferred, + __('Other languages') => $languages, + ); } else { - $filterName = __('Last used languages'); + $preferred = array_map( + function($langName) { + return ['name' => $langName, 'prio' => true]; + }, + $preferred + ); + return $preferred + $languages; } - return array( - $filterName => $preferred, - __('Other languages') => $languages, - ); } - public function onlyLanguagesArray($split = true) + public function onlyLanguagesArray($split = true, $oldDesign = false) { if (!$this->__languages_alone) { $this->__languages_alone = array_map( @@ -106,11 +116,8 @@ public function onlyLanguagesArray($split = true) $this->localizedAsort($this->__languages_alone); } - $languages = $this->__languages_alone; - if ($split) { - $languages = $this->separatePreferredLanguages($languages); - } - return $languages; + return $split ? $this->prioritizePreferredLanguages($this->__languages_alone, $oldDesign) + : $this->__languages_alone; } /** @@ -150,7 +157,7 @@ public function profileLanguagesArray($withAutoDetection = false, $with = []) public function languagesArrayAlone() { $languages = $this->onlyLanguagesArray(); - $options = ['und' => $this->langAsAlone(__('All languages'))]; + $options = ['und' => ['name' => $this->langAsAlone(__('All languages')), 'prio' => true]]; return $options + $languages; } @@ -180,7 +187,7 @@ public function unknownLanguagesArray($split = true) */ public function otherLanguagesArray() { - $languages = $this->onlyLanguagesArray(); + $languages = $this->onlyLanguagesArray(true, true); $options = ['' => __('other language')]; return $options + $languages; @@ -198,11 +205,11 @@ public function languagesArrayShowTranslationsIn($withAllLanguages = true) $languages = $this->onlyLanguagesArray(); $options = [ /* @translators: option used in language selection dropdown for "Show translations in" in advanced search form */ - 'none' => __('None'), + 'none' => ['name' => __('None'), 'prio' => true], ]; if ($withAllLanguages) { /* @translators: option used in language selection dropdown for "Show translations in" in advanced search form */ - $options['und'] = __x('show-translations-in', 'All languages'); + $options['und'] = ['name' => __x('show-translations-in', 'All languages'), 'prio' => true]; } return $options + $languages; @@ -219,7 +226,7 @@ public function getSearchableLanguagesArray($anyOption = null) { $languages = $this->onlyLanguagesArray(); if (!is_null($anyOption)) { - $languages = array('und' => $anyOption) + $languages; + $languages = ['und' => ['name' => $anyOption, 'prio' => true]] + $languages; } return $languages; } diff --git a/src/View/Helper/SentencesHelper.php b/src/View/Helper/SentencesHelper.php index 450c89c818..d9fe0c0c7f 100644 --- a/src/View/Helper/SentencesHelper.php +++ b/src/View/Helper/SentencesHelper.php @@ -148,97 +148,88 @@ public function displaySentencesGroup(
1; + $typeMap = [0 => 'directTranslation', 1 => 'indirectTranslation']; + $hidden = 0; + + if (!$langBased) { + if ($totalTranslations <= 6 || !$collapsibleTranslationsEnabled) { + $toGo = $totalTranslations; + } else { + $toGo = 5; + } } - //Split 'allTranslations' array into two, visible & hidden sets of sentences - $visibleTranslations = array_slice($allTranslations, 0, $initiallyDisplayedTranslations); - $hiddenTranslations = array_slice($allTranslations, $initiallyDisplayedTranslations); - - $sentenceCount = 0; - - //visible list of translations - foreach ($visibleTranslations as $translation) { - - if ($sentenceCount < $totalDirectTranslations) - $type = 'directTranslation'; - else - $type = 'indirectTranslation'; - - $this->displayGenericSentence( - $translation, - $type, - $withAudio, - $id, - false, - $langFilter - ); - - $sentenceCount++; + foreach($allTranslations as $type => $translations) { + foreach($translations as $translation) { + if ($langBased) { + $initiallyHidden = !in_array($translation->lang, $userLangs); + } else { + $initiallyHidden = !!$toGo; + if ($toGo > 0) + $toGo--; + } + + if ($initiallyHidden) { + echo $this->Html->tag('div', null, ['class' => 'more']); + $showButton = true; + $hidden++; + } + $this->displayGenericSentence( + $translation, + $typeMap[$type], + $withAudio, + $id, + false, + $langFilter + ); + if ($initiallyHidden) { + echo $this->Html->tag('/div'); + } + } } - if($showButton){ + if ($showButton) { + $downArrowIcon = ' ▼ '; + if ($hidden == $totalTranslations) { + $buttonLabel = __n( + '{downArrowIcon} Show all translations (1)', + '{downArrowIcon} Show all translations ({number})', + $hidden + ); + } else { + $buttonLabel = __n( + '{downArrowIcon} Show all translations (+1)', + '{downArrowIcon} Show all translations (+{number})', + $hidden + ); + } echo $this->Html->tag('div', - ' ▼ ' . format(__n( - 'Show 1 more translation', - 'Show {number} more translations', - $displayed, - true - ), array('number' => $displayed)), + format( + $buttonLabel, + ['number' => $hidden, 'downArrowIcon' => $downArrowIcon] + ), array('class' => 'showLink') ); - } - - //expanded list of translations - echo $this->Html->tag('div', null, array('class' => 'more')); - - foreach ($hiddenTranslations as $translation) { - - if ($sentenceCount < $totalDirectTranslations) - $type = 'directTranslation'; - else - $type = 'indirectTranslation'; - - $this->displayGenericSentence( - $translation, - $type, - $withAudio, - $id, - false, - $langFilter - ); - - $sentenceCount++; - } - - echo $this->Html->tag('div', - ' ▲ ' . __('Fewer translations'), + $upArrowIcon = ' ▲ '; + echo $this->Html->tag('div', + format( + __('{upArrowIcon} Show fewer translations'), + compact('upArrowIcon') + ), array('class' => 'hideLink') ); + } ?> -
getNumberOfExtraTranslations($sentence); + $extraTranslationsCount = $this->getNumberOfExtraTranslations($sentence, $allHidden); if ($extraTranslationsCount > 0) { - return format(__n( - 'Show 1 more translation', - 'Show {number} more translations', - $extraTranslationsCount - ), ['number' => $this->Number->format($extraTranslationsCount)]); + if ($allHidden) { + $buttonLabel = __n( + 'Show all translations (1)', + 'Show all translations ({number})', + $extraTranslationsCount + ); + } else { + $buttonLabel = __n( + 'Show all translations (+1)', + 'Show all translations (+{number})', + $extraTranslationsCount + ); + } + + return format( + $buttonLabel, + ['number' => $this->Number->format($extraTranslationsCount)] + ); } else { return null; } } - private function getNumberOfExtraTranslations($sentence) + private function getNumberOfExtraTranslations($sentence, &$allHidden) { - $translations = $sentence->translations; - $total = count($translations[0]) + count($translations[1]); - return $total - SentencesTable::MAX_TRANSLATIONS_DISPLAYED; + $allHidden = false; + $userLangs = CurrentUser::getProfileLanguages(); + if (is_array($userLangs) && count($userLangs) > 1) { + $total = $count = 0; + foreach ($sentence->translations as $translations) { + foreach ($translations as $translation) { + $count += !in_array($translation->lang, $userLangs); + $total++; + } + } + $allHidden = $count == $total; + return $count; + } else { + $translations = $sentence->translations; + $total = count($translations[0]) + count($translations[1]); + return $total - SentencesTable::MAX_TRANSLATIONS_DISPLAYED; + } } } ?> diff --git a/webroot/js/directives/language-dropdown.dir.js b/webroot/js/directives/language-dropdown.dir.js index e2ddea4da4..c9f7e4df67 100644 --- a/webroot/js/directives/language-dropdown.dir.js +++ b/webroot/js/directives/language-dropdown.dir.js @@ -64,25 +64,17 @@ ///////////////////////////////////////////////////////////////////////// function $onInit() { - var data = $scope.languagesJson; - var isPriority; - - Object.keys(data).forEach(function (key1) { - if (typeof data[key1] === 'object'){ - var items = data[key1]; - isPriority = !isPriority && key1 !== '0'; - Object.keys(items).forEach(function (key2) { - languages.push({code: key2, name: items[key2], isPriority: isPriority}); - }); - vm.hasSuggestions = true; - } else { - var code = key1; - var lang = {code: code, name: data[code]}; - if (code == 'und' || code == 'none') { - lang.isPriority = true; - } - languages.push(lang); - } + var langs = $scope.languagesJson; + + Object.keys(langs).forEach(function (code) { + var isPriority = langs[code].prio || false; + var name = langs[code].name || langs[code]; + languages.push({ + code: code, + name: name, + isPriority: isPriority + }); + vm.hasSuggestions = vm.hasSuggestions || isPriority; }); if ($scope.initialSelection) { diff --git a/webroot/js/directives/sentence-and-translations.dir.js b/webroot/js/directives/sentence-and-translations.dir.js index a1b6453eb8..058dc08b6e 100644 --- a/webroot/js/directives/sentence-and-translations.dir.js +++ b/webroot/js/directives/sentence-and-translations.dir.js @@ -262,12 +262,20 @@ } function showFewerTranslations() { - vm.directTranslations = allDirectTranslations.filter(function(item, index) { - return index <= MAX_TRANSLATIONS - 1; - }); - vm.indirectTranslations = allIndirectTranslations.filter(function(item, index) { - return index + allDirectTranslations.length <= MAX_TRANSLATIONS - 1; - }); + if (Object.keys(vm.userLanguages).length > 1) { + function onlyUserLanguages(sentence) { + return sentence.lang in vm.userLanguages; + } + vm.directTranslations = allDirectTranslations.filter(onlyUserLanguages); + vm.indirectTranslations = allIndirectTranslations.filter(onlyUserLanguages); + } else { + vm.directTranslations = allDirectTranslations.filter(function(item, index) { + return index <= MAX_TRANSLATIONS - 1; + }); + vm.indirectTranslations = allIndirectTranslations.filter(function(item, index) { + return index + allDirectTranslations.length <= MAX_TRANSLATIONS - 1; + }); + } } function toggleMenu() { diff --git a/webroot/js/sentences.collapse.js b/webroot/js/sentences.collapse.js index 8a6fc3ebfa..64f298763b 100644 --- a/webroot/js/sentences.collapse.js +++ b/webroot/js/sentences.collapse.js @@ -18,15 +18,16 @@ $(document).ready(function(){ $(document).watch("addrule", function() { $(document).on("click", "div.showLink", function(){ $(".more").hide(); + $("div.hideLink").hide(); $("div.showLink").show(); - $(this).parents(".translations").find(".more").show(); $(this).hide(); - $("div.hideLink").show(); + $(this).parents(".translations").find(".more").show(); + $(this).next().show(); }); $(document).on("click", "div.hideLink", function(){ - $(this).parents(".more").hide(); + $(this).parents(".translations").find(".more").hide(); $(this).hide(); $("div.showLink").show(); }); }); -}); \ No newline at end of file +});