diff --git a/local/config/vufind/facets.ini b/local/config/vufind/facets.ini
index 133d784c552bfeb77f4208e6b24049b17271c6a3..fa1d561991f2009e3415d5c5385fc723d8768a43 100644
--- a/local/config/vufind/facets.ini
+++ b/local/config/vufind/facets.ini
@@ -241,12 +241,109 @@ hide_facets = "genre_facet,era_facet,geographic_facet"
 
 ; Special terms (key), which can't / shouldn't be translated but marked as other language (value) for BARF reasons
 [LanguageTags]
-De Gruyter Journals / Social Sciences and Humanities = "en"
-Free = "en"
-JSTOR Music Archive = "en"
-Local = "en"
-Microform = "en"
-Open Access = "en"
-Online = "en"
-Proceeding = "en"
-Répertoire International des Sources Musicales = "fr"
+en[] = "American Museum of Natural History"
+en[] = "American Museum of Natural History Library"
+en[] = "Article"
+en[] = "Article, E-Article"
+en[] = "BASE - Bielefeld Academic Search Engine"
+en[] = "Biodiversity Heritage Library (BHL)"
+en[] = "Bioregional Assessment Program (isOwnedBy)"
+en[] = "Book, E-Book"
+en[] = "CEEOL Central and Eastern European Online Library"
+en[] = "Charles I King of England"
+en[] = "Charles I, King of England,"
+en[] = "Charles II, King of England,"
+en[] = "Dance in Video"
+en[] = "De Gruyter Journals / Social Sciences and Humanities"
+en[] = "Department of Education (isOwnedBy)"
+en[] = "DOAJ Directory of Open Access Journals"
+en[] = "Early English Books Online"
+en[] = "Early English Books Online EEBO"
+en[] = "EconStor (German National Library of Economics, ZBW)"
+en[] = "Eighteenth Century Collections Online / ECCO"
+en[] = "Elsevier Journals"
+en[] = "England and Wales Parliament"
+en[] = "England and Wales Sovereign (1625-1649 : Charles I)"
+en[] = "England and Wales. Parliament"
+en[] = "England and Wales. Sovereign (1625-1649 : Charles I)"
+en[] = "E-Article"
+en[] = "E-Proceedings"
+en[] = "Field Museum of Natural History Library"
+en[] = "Free"
+en[] = "Harvard University, Museum of Comparative Zoology, Ernst Mayr Library"
+en[] = "IEEE Xplore Library"
+en[] = "IMSLP (Petrucci Library)"
+en[] = "JSTOR Arts & Sciences I Archive"
+en[] = "JSTOR Arts & Sciences II Archive"
+en[] = "JSTOR Arts & Sciences III Archive"
+en[] = "JSTOR Arts & Sciences IV Archive"
+en[] = "JSTOR Arts & Sciences V Archive"
+en[] = "JSTOR Arts & Sciences VI Archive"
+en[] = "JSTOR Arts & Sciences VII Archive"
+en[] = "JSTOR Arts & Sciences VIII Archive"
+en[] = "JSTOR Arts & Sciences IX Archive"
+en[] = "JSTOR Arts & Sciences X Archive"
+en[] = "JSTOR Arts & Sciences XO Archive"
+en[] = "JSTOR Business & Economics"
+en[] = "JSTOR Business I Archive"
+en[] = "JSTOR Business II Archive"
+en[] = "JSTOR Business III Archive"
+en[] = "JSTOR Business IV Archive"
+en[] = "JSTOR Business V Archive"
+en[] = "JSTOR Life Sciences Archive"
+en[] = "JSTOR Music"
+en[] = "Kit"
+en[] = "Local"
+en[] = "Microform"
+en[] = "Music Online Reference"
+en[] = "NASA Technical Reports Server (NTRS)"
+en[] = "National Bureau of Economic Research"
+en[] = "Natural History Museum Library, London"
+en[] = "Notated Music"
+en[] = "not assigned"
+en[] = "No linguistic content"
+en[] = "Open Access"
+en[] = "Online"
+en[] = "Oxford University Research Archive (ORA)"
+en[] = "PANGAEA -  Data Publisher for Earth & Environmental Science (AWI Bremerhaven/MARUM Bremen)"
+en[] = "Proceeding"
+en[] = "Publication Server of Goethe University Frankfurt am Main"
+en[] = "Rumsey Collection"
+en[] = "Saskatchewan Natural History Society"
+en[] = "Sheet"
+en[] = "Smithsonian Institution Archives"
+en[] = "Smithsonian Libraries"
+en[] = "The Pennsylvania State University CiteSeerX Archives"
+en[] = "Thesis"
+en[] = "TwoDimensionalMovingImage"
+en[] = "United States Congress House"
+en[] = "United States Congress House Committee on Claims"
+en[] = "United States Congress House Committee on Invalid Pensions"
+en[] = "United States Congress Senate"
+en[] = "United States Congress Senate Committee on Pensions"
+en[] = "United States Congress House Committee on the Judiciary"
+en[] = "United States War Dept"
+en[] = "United States Dept. of the Treasury"
+en[] = "United States Congress Senate Committee on Claims"
+en[] = "United States Congress House Committee on Military Affairs"
+en[] = "United States Court of Claims (1855-1982)"
+en[] = "United States Congress Senate Committee on Military Affairs"
+en[] = "United States Army Corps of Engineers"
+en[] = "United States War Dept Engineer Dept"
+en[] = "United States War Dept Ordnance Dept"
+en[] = "United States Congress House Committee on War Claims"
+en[] = "United States Congress House Committee on Interstate and Foreign Commerce"
+en[] = "United States Congress Senate Committee on Commerce"
+en[] = "United States Congress House Committee on Rules"
+en[] = "United States Dept. of the Interior"
+en[] = "United States Congress House Committee on Public Lands"
+en[] = "United States Dept. of State"
+en[] = "United States Congress House Committee on Pensions"
+en[] = "United States Congress House Committee on the District of Columbia"
+en[] = "United States Congress Senate Committee on the District of Columbia"
+en[] = "United States Executive Office of the President Bureau of the Budget (1939-1970)"
+en[] = "University Library, University of Illinois Urbana Champaign"
+en[] = "University of California Libraries (archive.org)"
+en[] = "Visual Media"
+fr[] = "Persée"
+fr[] = "Répertoire International des Sources Musicales"
diff --git a/module/finc/config/module.config.php b/module/finc/config/module.config.php
index 319b82072a07f2dcb357d1db33b3f2192a2bca09..b0fa8ae795efd380c186b9d7e25e83b83ab7818f 100644
--- a/module/finc/config/module.config.php
+++ b/module/finc/config/module.config.php
@@ -50,7 +50,6 @@ $config = [
             'VuFind\Controller\MyResearchController' => 'finc\Controller\MyResearchController',
             'VuFind\Controller\RecordController' => 'finc\Controller\RecordController',
             'VuFind\Controller\RecordsController' => 'finc\Controller\RecordsController',
-            'VuFind\Controller\AjaxController' => 'finc\Controller\AjaxController',
         ],
     ],
     'controller_plugins' => [
diff --git a/module/finc/src/finc/Bootstrapper.php b/module/finc/src/finc/Bootstrapper.php
index 05b4796ae9b3eb8239812cfb2d2f8ea989c057cb..178435297e4ca91185668a0ba6af1a8a02416fc5 100644
--- a/module/finc/src/finc/Bootstrapper.php
+++ b/module/finc/src/finc/Bootstrapper.php
@@ -74,7 +74,11 @@ class Bootstrapper extends \VuFind\Bootstrapper
                 return;
             }
 
-            $exceptionArray = explode('\\', get_class($e->getParam('exception')));
+            if ($exception instanceof \VuFindSearch\Backend\Exception\BackendException && $exception->getPrevious()) {
+                $exception = $exception->getPrevious();
+            }
+
+            $exceptionArray = explode('\\', get_class($exception));
             $exceptionName = end(
                 $exceptionArray
             );
@@ -90,7 +94,7 @@ class Bootstrapper extends \VuFind\Bootstrapper
             $model = new \Zend\View\Model\ViewModel(
                 [
                 'display_exceptions' => APPLICATION_ENV == 'development',
-                'exception'          => $e->getParam('exception'),
+                'exception' => $e->getParam('exception'),
                 ]
             );
             $model->setTemplate($template);
diff --git a/module/finc/src/finc/Controller/AmslResourceController.php b/module/finc/src/finc/Controller/AmslResourceController.php
index af1e7d03d53b2fc9d84e89ed79afe50eea096e3e..278f3fd14af3da3584ccbb179ebb853cc92c43d1 100644
--- a/module/finc/src/finc/Controller/AmslResourceController.php
+++ b/module/finc/src/finc/Controller/AmslResourceController.php
@@ -205,7 +205,7 @@ class AmslResourceController extends AbstractBase
         }
 
         if (!empty($mapping->sortBySourceLabel)) {
-            ksort($out);
+            uksort($out,'strcasecmp');
         }
 
         return $out;
diff --git a/module/finc/src/finc/View/Helper/Root/SideFacet.php b/module/finc/src/finc/View/Helper/Root/SideFacet.php
index 528bd3b3c2d1c9c989df33c63b3f5ca36c5ca677..fefb2febee6eec8cb6e087a493bd12edd40a63e2 100644
--- a/module/finc/src/finc/View/Helper/Root/SideFacet.php
+++ b/module/finc/src/finc/View/Helper/Root/SideFacet.php
@@ -50,15 +50,25 @@ class SideFacet extends AbstractHelper
      */
     protected $config;
 
+    /**
+     * Language tags
+     *
+     * @var array
+     */
+    protected $languageTags = [];
+
     /**
      * Constructor
      *
      * @param \Zend\Config\Config $config VuFind configuration
-     * @access public
      */
     public function __construct($config = null)
     {
         $this->config = $config;
+
+        foreach ($this->config->LanguageTags ?? [] as $langOfTags => $tags) {
+            $this->languageTags[$langOfTags] = array_flip($tags->toArray());
+        }
     }
 
     /**
@@ -67,7 +77,6 @@ class SideFacet extends AbstractHelper
      * @param array $sideFacets List of side facets
      *
      * @return array            Filtered side facets
-     * @access public
      */
     public function displayAllowedFacetValues($sideFacets)
     {
@@ -93,25 +102,37 @@ class SideFacet extends AbstractHelper
     /**
      * Get term with corresponding language tag within html element
      *
-     * @param string $term     translation to decorate with language tag
-     * @param string $element  wrapping html element
-     * @param string $language current language
+     * @param string $term          translation to decorate with language tag
+     * @param string $element       wrapping html element
+     * @param string $curLang       current language
+     * @param array  $attributes    set additional attributes by key => value
      *
      * @return string
      *
      * @deprecated remove when there's a VuFind core solution
      */
-    public function getLanguageTag(string $term, string $element, string $language)
+    public function getLanguageTag(string $term, string $element, string $curLang, array $attributes = [])
     {
-        $retval = $term;
+        $attributesString = "";
+        foreach ($attributes as $attrKey => $attrVal) {
+            $attributesString .= "$attrKey=\"$attrVal\" ";
+        }
 
-        if (isset($this->config->LanguageTags[$term])
-            && $this->config->LanguageTags[$term] !== $language
-        ) {
-            $retval = "<$element " . 'lang="' . $this->config->LanguageTags[$term]
-                . '">' . "$term</$element>";
+        foreach ($this->languageTags as $langOfTags => $tags) {
+            if ($curLang === $langOfTags) {
+                // no tag needed for native terms
+                continue;
+            }
+            if (isset($tags["$term"])) {
+                $termLang = $langOfTags;
+                break;
+            }
         }
 
-        return $retval;
+        if (isset($termLang)) {
+            return "<$element lang=\"$termLang\" $attributesString>$term</$element>";
+        } else {
+            return "<$element $attributesString>$term</$element>";
+        }
     }
 }
diff --git a/module/finc/tests/fixtures/configs/yaml/searchspecs/result/local/alpha/searchspecs.yaml b/module/finc/tests/fixtures/configs/yaml/searchspecs/result/local/alpha/searchspecs.yaml
index 1e8bfdcad8d618d13d088011c0a10904df2be051..a83f224bf097e060f369fd988aaba22087c7a2e0 100644
--- a/module/finc/tests/fixtures/configs/yaml/searchspecs/result/local/alpha/searchspecs.yaml
+++ b/module/finc/tests/fixtures/configs/yaml/searchspecs/result/local/alpha/searchspecs.yaml
@@ -252,7 +252,7 @@ AllFields:
       - ord(publishDateSort)^10
     -
       - bf
-      - 'if(exists(query({!v=''facet_avail:Local*''})),10,1)^1000'
+      - 'if(exists(query({!v=''facet_avail:Local''})),10,1)^1000'
   DismaxFields:
     - title_short^1000
     - title_full_unstemmed^1000
diff --git a/module/finc/tests/fixtures/configs/yaml/searchspecs/result/local/searchspecs.yaml b/module/finc/tests/fixtures/configs/yaml/searchspecs/result/local/searchspecs.yaml
index 1e8bfdcad8d618d13d088011c0a10904df2be051..a83f224bf097e060f369fd988aaba22087c7a2e0 100644
--- a/module/finc/tests/fixtures/configs/yaml/searchspecs/result/local/searchspecs.yaml
+++ b/module/finc/tests/fixtures/configs/yaml/searchspecs/result/local/searchspecs.yaml
@@ -252,7 +252,7 @@ AllFields:
       - ord(publishDateSort)^10
     -
       - bf
-      - 'if(exists(query({!v=''facet_avail:Local*''})),10,1)^1000'
+      - 'if(exists(query({!v=''facet_avail:Local''})),10,1)^1000'
   DismaxFields:
     - title_short^1000
     - title_full_unstemmed^1000
diff --git a/themes/finc-accessibility/templates/RecordDriver/EDS/result-list.phtml b/themes/finc-accessibility/templates/RecordDriver/EDS/result-list.phtml
index a8ddccec426875e49ae2dc9914bcda25cc33a56d..ae136fa197ddb7af7a03746ba3ecb9ec2ce73423 100644
--- a/themes/finc-accessibility/templates/RecordDriver/EDS/result-list.phtml
+++ b/themes/finc-accessibility/templates/RecordDriver/EDS/result-list.phtml
@@ -37,7 +37,7 @@
             if (!empty($item)): ?>
               <div class="resultItemLine1">
                 <?php if('Ti' == $item['Group']): ?>
-                  <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull _record_link"  data-view="<?=$this->params->getOptions()->getListViewOption()?>">
+                  <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull _record_link"  data-view="<?=$this->params->getOptions()->getListViewOption()?>" lang="">
                   <?=$item['Data']?> </a>
                 <?php else:?>
                   <p>
diff --git a/themes/finc-accessibility/templates/RecordTab/toc.phtml b/themes/finc-accessibility/templates/RecordTab/toc.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..6e71822f85068fe2a473bbc3071afd496220f6f5
--- /dev/null
+++ b/themes/finc-accessibility/templates/RecordTab/toc.phtml
@@ -0,0 +1,35 @@
+<!-- finc-accessibility: RecordTab - toc -->
+<?php /**
+ *  copy of VuFind-version, adds empty lang-attribute to <li>s
+ */
+?>
+?>
+<?php
+    // Set page title.
+    $this->headTitle($this->translate('Table of Contents') . ': ' . $this->driver->getBreadcrumb());
+
+    $toc = $this->tab->getContent();
+    if (empty($toc)) {
+        $driverToc = $this->driver->getTOC();
+        if (!empty($driverToc)) {
+            $toc['RecordDriver'] = $driverToc;
+        }
+    }
+?>
+<?php if (!empty($toc)): ?>
+  <strong><?=$this->transEsc('Table of Contents')?>: </strong>
+  <?php foreach ($toc as $provider => $content): ?>
+    <?php if (!is_array($content)): // treat non-array content as raw HTML ?>
+      <?=$content?>
+    <?php else: ?>
+      <ul class="toc">
+      <?php foreach ($content as $line): ?>
+        <li lang=""><?=$this->escapeHtml($line)?></li>
+      <?php endforeach; ?>
+      </ul>
+    <?php endif; ?>
+  <?php endforeach; ?>
+<?php else: ?>
+  <?=$this->transEsc('Table of Contents unavailable')?>.
+<?php endif; ?>
+<!-- finc-accessibility: RecordTab - toc - END -->
\ No newline at end of file
diff --git a/themes/finc/scss/compiled.scss b/themes/finc/scss/compiled.scss
index a67f2e0335aa26a3e91f61ef08ce58191d777d4c..094ad9742b40178c42fa65fbb43ec01c672d515a 100644
--- a/themes/finc/scss/compiled.scss
+++ b/themes/finc/scss/compiled.scss
@@ -2911,6 +2911,11 @@ footer ul {
   }
 }
 
+// Favorites list description
+.list-desc {
+  margin-top: 1rem;
+}
+
 // Result List - END
 
 // Translate feature (Admin panel)
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/core.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/core.phtml
index 53e91883a964fd80e73fbdfe44a6adc239dba54e..abfa3146c70a0d5099f4fa7f24272815be64e954 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/core.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/core.phtml
@@ -46,8 +46,7 @@
        */
     ?>
       <?php /* finc: add schema tags for title #13850 - VE */ ?>
-    <h1
-      property="name"><?= $this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100))) ?></h1>
+    <h1 property="name" lang=""><?= $this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100))) ?></h1>
 
     <?php /* #18307 remove summary from core */ ?>
 
@@ -70,7 +69,7 @@
         <?php foreach ($coreFields as $current): ?>
           <tr>
             <th><?= $this->transEsc($current['label']) ?>:</th>
-            <td data-title="<?= $this->transEsc($current['label']) ?>:"><?= $current['value'] ?></td>
+            <td lang="" data-title="<?= $this->transEsc($current['label']) ?>:"><?= $current['value'] ?></td>
           </tr>
         <?php endforeach; ?>
       </table>
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/format-list.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/format-list.phtml
index 6ad5245ee5917c53d98f7e91df7b59607bc4716b..584cc603b7f6337fc11f4bad2d056d328c724d2a 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/format-list.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/format-list.phtml
@@ -1,8 +1,12 @@
 <?php $formats = $this->driver->getFormats();
 $translated_formats = [];
 foreach ($formats as $format): ?>
-  <?php $translated_formats[] = $translated_format = $this->transEsc($format); ?>
-  <span class="format <?=$this->record($this->driver)->getFormatClass($format)?>"><?=$translated_format?></span>
+  <?php
+    $translated_formats[] = $translated_format = $this->transEsc($format);
+    $formatClass = $this->record($this->driver)->getFormatClass($format);
+  ?>
+  <?php /* @deprecated: use SideFacets Helper to decorate language tags, remove when there's a VuFind core solution */ ?>
+  <?=$this->sideFacet()->getLanguageTag($translated_format, 'span', $this->layout()->userLang, ["class" => "format $formatClass"]);?>
 <?php endforeach; ?>
 <?php /* New genre string to display nxt to format in RESULT LIST and RECORD/Detail View, #11703, limit to SID 0 CK */ ?>
 <?php /* Removes (uncommented) new genre string to display with k10plus index in RESULT LIST and RECORD/Detail View, #14912 FM */ ?>
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/list-entry.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/list-entry.phtml
index 04e30ed779b6e49868cd3a8cc932f49b536accd8..3412cfef99ca6959911d15635e8671a04dcd5879 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/list-entry.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/list-entry.phtml
@@ -40,7 +40,7 @@ $thumbnailAlignment = $this->record($this->driver)->getThumbnailAlignment('list'
           <?php $missing = $this->driver instanceof \VuFind\RecordDriver\Missing; ?>
           <?php $describedById = $driver->getSourceIdentifier() . '|' . $driver->getUniqueId(); ?>
             <?php if ($missing && $this->driver->isCachedRecord()): ?>
-                <span id="<?=$describedById?>" class="title"><?=$this->record($this->driver)->getTitleHtml()?></span>
+                <span id="<?=$describedById?>" class="title" lang=""><?=$this->record($this->driver)->getTitleHtml()?></span>
                 <p class="alert alert-info">
                     <?= $this->translate('record_from_cache')?>
                     <?php if ($queryParams = $this->record($this->driver)->getAdvancedSearchQueryParams()): ?>
@@ -49,7 +49,7 @@ $thumbnailAlignment = $this->record($this->driver)->getThumbnailAlignment('list'
                 </p>
             <?php elseif (!$missing): ?>
                 <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="getFull" data-view="<?=$this->params->getOptions()->getListViewOption() ?>">
-                    <span id="<?=$describedById?>" class="title"><?=$this->record($this->driver)->getTitleHtml()?></span>
+                    <span id="<?=$describedById?>" class="title" lang=""><?=$this->record($this->driver)->getTitleHtml()?></span>
                 </a>
             <?php endif;?>
         </div>
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml
index 5be28ca9b03c5b5062c999a4e1214a44eebdde7d..384afa895b7bc80cd88d45471aa5b64ebcc199d9 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml
@@ -33,7 +33,7 @@ if ($cover):
   <div class="media-body">
     <div class="result-body">
       <div>
-        <a id="<?=$describedById?>" href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull" data-view="<?=$this->params->getOptions()->getListViewOption()?>">
+        <a id="<?=$describedById?>" href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull" data-view="<?=$this->params->getOptions()->getListViewOption()?>" lang="">
           <?=$this->record($this->driver)->getTitleHtml()?>
         </a>
       </div>
diff --git a/themes/finc/templates/RecordDriver/FincMissing/result-list.phtml b/themes/finc/templates/RecordDriver/FincMissing/result-list.phtml
index 4d6782043354e03aaba5a131f530df365700489c..aab0e1066fe754dc457492d881c3a0d6ab2abd0f 100644
--- a/themes/finc/templates/RecordDriver/FincMissing/result-list.phtml
+++ b/themes/finc/templates/RecordDriver/FincMissing/result-list.phtml
@@ -39,7 +39,7 @@ if ($cover):
     <div class="result-body">
       <div>
         <?php /* We don't use links for missing records as they would lead nowhere - CK */ ?>
-        <span href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull" data-view="<?=$this->params->getOptions()->getListViewOption()?>">
+        <span href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull" data-view="<?=$this->params->getOptions()->getListViewOption()?>" lang="">
           <?=$this->record($this->driver)->getTitleHtml()?>
         </span>
       </div>
diff --git a/themes/finc/templates/RecordDriver/SolrAI/core.phtml b/themes/finc/templates/RecordDriver/SolrAI/core.phtml
index 4408efacce9795b28a166f97b3f33cfbad1535af..0898ed1578e797ae1b186b1740baca75b825e075 100644
--- a/themes/finc/templates/RecordDriver/SolrAI/core.phtml
+++ b/themes/finc/templates/RecordDriver/SolrAI/core.phtml
@@ -46,8 +46,7 @@
        */
     ?>
       <?php /* finc: add schema tags for title #13850 - VE */ ?>
-    <h1
-      property="name"><?= $this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100))) ?></h1>
+    <h1 property="name" lang=""><?= $this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100))) ?></h1>
 
       <?php /* #18307 remove summary from core */ ?>
 
@@ -73,7 +72,7 @@
             <?php else: ?>
               <tr>
                 <th><?= $this->transEsc($current['label']) ?>:</th>
-                <td data-title="<?= $this->transEsc($current['label']) ?>:"><?= $current['value'] ?></td>
+                <td lang="" data-title="<?= $this->transEsc($current['label']) ?>:"><?= $current['value'] ?></td>
               </tr>
             <?php endif; ?>
           <?php endforeach; ?>
diff --git a/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml b/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml
index 05bca21a2d7a77170d85f64787339b63e77f71c0..0b8dc222334495369c4a119078df6840174a8a3f 100644
--- a/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml
+++ b/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml
@@ -31,7 +31,7 @@ if ($cover):
   <div class="media-body">
     <div class="result-body">
       <div>
-        <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull" data-view="<?=$this->params->getOptions()->getListViewOption()?>">
+        <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull" data-view="<?=$this->params->getOptions()->getListViewOption()?>" lang="">
           <?=$this->record($this->driver)->getTitleHtml()?>
         </a>
       </div>
diff --git a/themes/finc/templates/RecordDriver/SolrLido/core.phtml b/themes/finc/templates/RecordDriver/SolrLido/core.phtml
index 22041396bbf6639fc4e5803a47f737edebc48d6a..a2022ca6cc31d1e6a11def06b73f0bb14d496719 100644
--- a/themes/finc/templates/RecordDriver/SolrLido/core.phtml
+++ b/themes/finc/templates/RecordDriver/SolrLido/core.phtml
@@ -63,7 +63,7 @@
     <?php /* finc: We want to get rid of trailing special chars in the title and limit its length to 100 chars;
       in finc: keep schema name tag here!! #13861 CK
        */ ?>
-    <h1 property="name"><?=$this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100)))?></h1>
+    <h1 property="name" lang=""><?=$this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100)))?></h1>
 
     <?php $summary = $this->driver->getSummary();
     $summary = isset($summary[0]) ? $this->escapeHtml($summary[0]) : false; ?>
@@ -97,7 +97,7 @@
           <?php else: ?>
             <tr>
               <th><?=$this->transEsc($current['label'])?>:</th>
-              <td data-title="<?= $this->transEsc($current['label']) ?>:"><?=$current['value']?></td>
+              <td lang="" data-title="<?= $this->transEsc($current['label']) ?>:"><?=$current['value']?></td>
             </tr>
           <?php endif; ?>
         <?php endforeach; ?>
diff --git a/themes/finc/templates/RecordDriver/SolrMarc/core.phtml b/themes/finc/templates/RecordDriver/SolrMarc/core.phtml
index 66c9a108e801f5978cfd5c7019085a804ed3e0b0..d001340755986b1218c25edf9191fa3004e2a71c 100644
--- a/themes/finc/templates/RecordDriver/SolrMarc/core.phtml
+++ b/themes/finc/templates/RecordDriver/SolrMarc/core.phtml
@@ -46,8 +46,7 @@
        */
     ?>
       <?php /* finc: add schema tags for title #13850 - VE */ ?>
-    <h1
-      property="name"><?= $this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100))) ?></h1>
+    <h1 property="name" lang=""><?= $this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100))) ?></h1>
 
       <?php /* #18307 remove summary from core */ ?>
 
@@ -73,7 +72,7 @@
             <?php else: ?>
               <tr>
                 <th><?= $this->transEsc($current['label']) ?>:</th>
-                <td data-title="<?= $this->transEsc($current['label']) ?>:"><?= $current['value'] ?></td>
+                <td lang="" data-title="<?= $this->transEsc($current['label']) ?>:"><?= $current['value'] ?></td>
               </tr>
             <?php endif; ?>
           <?php endforeach; ?>
diff --git a/themes/finc/templates/RecordTab/description.phtml b/themes/finc/templates/RecordTab/description.phtml
index 98d59dfadd4b15dc09a30019bbd3990d0eaecdd4..48285ed3c4f6759364a15215453eb855c3b2b65c 100644
--- a/themes/finc/templates/RecordTab/description.phtml
+++ b/themes/finc/templates/RecordTab/description.phtml
@@ -16,9 +16,9 @@ $mainFields = $formatter->getData($driver, $formatter->getDefaults('description'
       <tr>
         <?php if (!empty($current['label'])): ?>
           <th><?=$this->transEsc($current['label'])?>:</th>
-          <td data-title="<?= $this->transEsc($current['label']) ?>:">
+          <td lang="" data-title="<?= $this->transEsc($current['label']) ?>:">
         <?php else: ?>
-          <td colspan="2">
+          <td lang="" colspan="2">
         <?php endif; ?>
         <?=$current['value']?></td>
       </tr>
diff --git a/themes/finc/templates/RecordTab/descriptionlido.phtml b/themes/finc/templates/RecordTab/descriptionlido.phtml
index b02580e4ccefc1f15d7b189f08bfaae9300b555f..2afd501a844b9f748c06657c879536e79a3a6a3e 100644
--- a/themes/finc/templates/RecordTab/descriptionlido.phtml
+++ b/themes/finc/templates/RecordTab/descriptionlido.phtml
@@ -14,7 +14,7 @@ $mainFields = $formatter->getData($driver, $formatter->getDefaults('description-
   <caption class="sr-only"><?= $this->transEsc('Description') ?></caption>
   <?php if (!empty($mainFields)): ?>
     <?php foreach ($mainFields as $current): ?>
-      <tr><th><?=$this->transEsc($current['label'])?>:</th><td data-title="<?= $this->transEsc($current['label']) ?>:"><?=$current['value']?></td></tr>
+      <tr><th><?=$this->transEsc($current['label'])?>:</th><td lang="" data-title="<?= $this->transEsc($current['label']) ?>:"><?=$current['value']?></td></tr>
     <?php endforeach; ?>
   <?php else: ?>
     <tr><td><?=$this->transEsc('no_description')?></td></tr>
diff --git a/themes/finc/templates/browse/home.phtml b/themes/finc/templates/browse/home.phtml
index 13445e78c6d1561295cea5999913b76b316ca8f0..d20402286c31d1e1cb1a62bc133202e76d32be3a 100644
--- a/themes/finc/templates/browse/home.phtml
+++ b/themes/finc/templates/browse/home.phtml
@@ -84,7 +84,7 @@
     </div>
   <?php elseif (isset($this->query)): ?>
     <div class="browse-list" id="list4">
-      <span class="browse-item"><?=$this->transEsc('nohit_heading') ?></span>
+      <span class="browse-item" lang=""><?=$this->transEsc('nohit_heading') ?></span>
     </div>
   <?php endif; ?>
 </div>
diff --git a/themes/finc/templates/cart/contents.phtml b/themes/finc/templates/cart/contents.phtml
index 1546577216b002f73c576f91678eea424fcd6b8a..1c9d62015243f20d3d9ba410f33c1b08575474a5 100644
--- a/themes/finc/templates/cart/contents.phtml
+++ b/themes/finc/templates/cart/contents.phtml
@@ -1,3 +1,4 @@
+<!-- finc: cart - contents -->
 <?php $records = $this->cart()->getRecordDetails();
 if (!empty($records)): ?>
   <hr/>
@@ -8,7 +9,7 @@ if (!empty($records)): ?>
           <label>
           <?=$this->record($record)->getCheckbox('cart')?>
           <?php $describedById = $record->getSourceIdentifier() . '|' . $record->getUniqueId(); ?>
-          <a id="<?=$describedById?>" title="<?=$this->transEsc('View Record')?>" href="<?=$this->recordLink()->getUrl($record)?>" data-lightbox-ignore><?=$this->escapeHtml($record->getBreadcrumb())?>
+          <a id="<?=$describedById?>" title="<?=$this->transEsc('View Record')?>" href="<?=$this->recordLink()->getUrl($record)?>" data-lightbox-ignore lang=""><?=$this->escapeHtml($record->getBreadcrumb())?>
             <?php
             // finc-specific: Collect citation data:
             $helper = $this->citation($record);
@@ -27,4 +28,5 @@ if (!empty($records)): ?>
   </ul>
 <?php else: ?>
   <p class="alert alert-info"><?=$this->transEsc('bookbag_is_empty')?>.</p>
-<?php endif; ?>
\ No newline at end of file
+<?php endif; ?>
+<!-- finc: cart - contents - END -->
diff --git a/themes/finc/templates/error/RuntimeException.phtml b/themes/finc/templates/error/RuntimeException.phtml
index 0e8933ecf5a1fd6c08db0c8152ad4ae3d42b05dc..949ab27f13ea71980dfb49962497f0c72683d996 100644
--- a/themes/finc/templates/error/RuntimeException.phtml
+++ b/themes/finc/templates/error/RuntimeException.phtml
@@ -14,7 +14,7 @@
     <?php else: ?>
       <p><?=$this->transEsc($this->message)?></p>
       <?=$this->transEsc('Please contact the Library Reference Department for assistance')?>
-      <?php $supportEmail = $this->escapeHtmlAttr($this->systememail()); ?>
+      <?php $supportEmail = $this->escapeHtmlAttr($this->systemEmail()); ?>
       <a href="mailto:<?=$supportEmail?>"><?=$supportEmail?></a>
     <?php endif; ?>
     <br/>
diff --git a/themes/finc/templates/error/TimeoutException.phtml b/themes/finc/templates/error/TimeoutException.phtml
index 825b115fa32be971509d5288848b43123d394367..70da72eacaf59df2a23c950fa8b096ea6f92a026 100644
--- a/themes/finc/templates/error/TimeoutException.phtml
+++ b/themes/finc/templates/error/TimeoutException.phtml
@@ -8,7 +8,7 @@
 ?>
 <div class="alert alert-danger">
   <p>
-    <?=sprintf($this->translate('error_timeout'), $this->systememail(), $this->systememail())?>
+    <?=sprintf($this->translate('error_timeout'), $this->systemEmail(), $this->systemEmail())?>
     <br/>
   </p>
 </div>
diff --git a/themes/finc/templates/myresearch/checkedout.phtml b/themes/finc/templates/myresearch/checkedout.phtml
index a0ae5b548244ab7d72d87af175ff79aedbb86724..a6b6773c1a96c29bef8e5892db1ffae744b4d08a 100644
--- a/themes/finc/templates/myresearch/checkedout.phtml
+++ b/themes/finc/templates/myresearch/checkedout.phtml
@@ -119,7 +119,7 @@
                 $title = $resource->getTitle();
                 $title = empty($title) ? $this->transEsc('Title not available') : $this->escapeHtml($title);
                 echo '<a id="' .  $describedById . '" href="' . $this->recordLink()->getUrl($resource) .
-                  '" class="title">' . $title . '</a>';
+                  '" class="title" lang="">' . $title . '</a>';
               } elseif (isset($ilsDetails['title']) && !empty($ilsDetails['title'])){
                 // If the record is not available in Solr, perhaps the ILS driver sent us a title we can show...
                 echo $this->escapeHtml($ilsDetails['title']);
diff --git a/themes/finc/templates/myresearch/fines.phtml b/themes/finc/templates/myresearch/fines.phtml
index 32080215e7fcfcda8546320329019bd96d9514d2..a77e2fdcc7e3cc103fb8599f93cd7fbf34bf63bb 100644
--- a/themes/finc/templates/myresearch/fines.phtml
+++ b/themes/finc/templates/myresearch/fines.phtml
@@ -77,7 +77,7 @@
       <?php for ($row = 0; $row < $rowCount; $row++): ?>
         <tr>
           <?php foreach ($columns as $column): ?>
-            <td data-title="<?=$this->transEsc($column)?>"><?=$tableData[$column][$row]?></td>
+            <td data-title="<?=$this->transEsc($column)?>" lang=""><?=$tableData[$column][$row]?></td>
           <?php endforeach; ?>
         </tr>
       <?php endfor; ?>
diff --git a/themes/finc/templates/myresearch/historicloans.phtml b/themes/finc/templates/myresearch/historicloans.phtml
index 2f73364f07ac9703c2240869447fb082bdf65d1d..a86d384a051a4aa0efe60ade2da0941780c0f627 100644
--- a/themes/finc/templates/myresearch/historicloans.phtml
+++ b/themes/finc/templates/myresearch/historicloans.phtml
@@ -68,7 +68,7 @@
                 $title = $resource->getTitle();
                 $title = empty($title) ? $this->transEsc('Title not available') : $this->escapeHtml($title);
                 echo '<a href="' . $this->recordLink()->getUrl($resource) .
-                  '" class="title">' . $title . '</a>';
+                  '" class="title" lang="">' . $title . '</a>';
               } elseif (isset($ilsDetails['title']) && !empty($ilsDetails['title'])){
                 // If the record is not available in Solr, perhaps the ILS driver sent us a title we can show...
                 echo $this->escapeHtml($ilsDetails['title']);
diff --git a/themes/finc/templates/myresearch/holds.phtml b/themes/finc/templates/myresearch/holds.phtml
index 67298804196e4d9e207e1ce0adfa587ddc096a96..6b584c7355cd127ed8e15dc3c689e737e098636d 100644
--- a/themes/finc/templates/myresearch/holds.phtml
+++ b/themes/finc/templates/myresearch/holds.phtml
@@ -82,10 +82,10 @@
                 $title = $resource->getTitle();
                 $title = empty($title) ? $this->transEsc('Title not available') : $this->escapeHtml($title);
                 echo '<a id="' . $describedById . '" href="' . $this->recordLink()->getUrl($resource)
-                  . '" class="title">' . $title . '</a>';
+                  . '" class="title" lang="">' . $title . '</a>';
               } elseif (isset($ilsDetails['title']) && !empty($ilsDetails['title'])){
                 // If the record is not available in Solr, perhaps the ILS driver sent us a title we can show...
-                echo '<span class="title" id="' . $describedById . '">' . $this->escapeHtml($ilsDetails['title']) . '</span>';
+                echo '<span class="title" id="' . $describedById . '" lang="">' . $this->escapeHtml($ilsDetails['title']) . '</span>';
               } else {
                 // Last resort -- indicate that no title could be found.
                 echo $this->transEsc('Title not available');
diff --git a/themes/finc/templates/myresearch/illrequests.phtml b/themes/finc/templates/myresearch/illrequests.phtml
index 086406fd81ddfa636e747aff995ef2e247820d06..32f59dd92179d0e9d71eb84692383d431cbdd252 100644
--- a/themes/finc/templates/myresearch/illrequests.phtml
+++ b/themes/finc/templates/myresearch/illrequests.phtml
@@ -83,7 +83,7 @@
                 $title = $resource->getTitle();
                 $title = empty($title) ? $this->transEsc('Title not available') : $this->escapeHtml($title);
                 echo '<a id="' . $describedById . '" href="' . $this->recordLink()->getUrl($resource)
-                  . '" class="title">' . $title . '</a>';
+                  . '" class="title" lang="">' . $title . '</a>';
               } elseif (isset($ilsDetails['title']) && !empty($ilsDetails['title'])){
                 // If the record is not available in Solr, perhaps the ILS driver sent us a title we can show...
                 echo $this->escapeHtml($ilsDetails['title']);
diff --git a/themes/finc/templates/myresearch/mylist.phtml b/themes/finc/templates/myresearch/mylist.phtml
index 95a00ff48f650d04520fec9938c064a6e59a9499..6354ae6aa1c7962981d456fc50ba0388082b6014 100644
--- a/themes/finc/templates/myresearch/mylist.phtml
+++ b/themes/finc/templates/myresearch/mylist.phtml
@@ -69,7 +69,7 @@ $user = $this->auth()->isLoggedIn();
     </div>
   </nav>
   <?php if ($list && !empty($list->description)): ?>
-    <p><?=$this->escapeHtml($list->description)?></p>
+    <p class="list-desc"><?=$this->escapeHtml($list->description)?></p>
   <?php endif; ?>
   <?php if ($recordTotal > 0): ?>
     <form class="form-inline" method="post" name="bulkActionForm" action="<?=$this->url('cart-myresearchbulk')?>" data-lightbox data-lightbox-onsubmit="bulkFormHandler">
diff --git a/themes/finc/templates/myresearch/storageretrievalrequests.phtml b/themes/finc/templates/myresearch/storageretrievalrequests.phtml
index 18bd7f3ca95305f8e741381b199fc031ffef1a69..a7ec9c253467e5a0395fceac4257cbfb79c20a62 100644
--- a/themes/finc/templates/myresearch/storageretrievalrequests.phtml
+++ b/themes/finc/templates/myresearch/storageretrievalrequests.phtml
@@ -82,7 +82,7 @@
                 $title = $resource->getTitle();
                 $title = empty($title) ? $this->transEsc('Title not available') : $this->escapeHtml($title);
                 echo '<a id="' . $describedById . '" href="' . $this->recordLink()->getUrl($resource)
-                  . '" class="title">' . $title . '</a>';
+                  . '" class="title" lang="">' . $title . '</a>';
               } elseif (isset($ilsDetails['title']) && !empty($ilsDetails['title'])){
                 // If the record is not available in Solr, perhaps the ILS driver sent us a title we can show...
                 echo $this->escapeHtml($ilsDetails['title']);
diff --git a/themes/finc/templates/search/history-table.phtml b/themes/finc/templates/search/history-table.phtml
index 57e38252ee5552e41c570bd68d39319af9a65105..ff9e0554e3200b859b4c7653449aedc013ad92c8 100644
--- a/themes/finc/templates/search/history-table.phtml
+++ b/themes/finc/templates/search/history-table.phtml
@@ -16,7 +16,7 @@
 
         <td data-title="<?= $this->transEsc('history_search') ?>:">
             <?= $this->historylabel($info->getParams()->getSearchClassId()) ?>
-          <a href="<?= $this->url($info->getOptions()->getSearchAction()) . $info->getUrlQuery()->getParams() ?>"><?php $desc = $info->getParams()->getDisplayQuery();
+          <a href="<?= $this->url($info->getOptions()->getSearchAction()) . $info->getUrlQuery()->getParams() ?>" lang=""><?php $desc = $info->getParams()->getDisplayQuery();
           echo empty($desc) ? $this->transEsc("history_empty_search") : $this->escapeHtml($desc);
           ?>
           </a>