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
+});