diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
 # Aura Changelog
 
+## 2.2.0 (2020-02-25)
+
+- **New Feature:**: `--log-level` flag. Setting this to `debug` will give you
+  some verbose logging output. This is different from the usual `-x` behaviour.
+- **Bug Fix:** Users with many AUR packages installed will no longer see
+  mysterious AUR connection failures.
+  ([#528](https://github.com/fosskers/aura/issues/528))
+- Updated Italian translations. Grazie, Cristian Tentella!
+- Support for GHC 8.8.2.
+
 ## 2.1.0 (2020-02-17)
 
 - Reinstated `-Aw`, which downloads a snapshot tarball of an AUR package.
diff --git a/aura.cabal b/aura.cabal
--- a/aura.cabal
+++ b/aura.cabal
@@ -1,13 +1,11 @@
 cabal-version:      2.2
 name:               aura
-version:            2.1.0
-synopsis:
-  A secure package manager for Arch Linux and the AUR, written in Haskell.
-
+version:            2.2.0
+synopsis:           A secure package manager for Arch Linux and the AUR.
 description:
-  Aura is a package manager for Arch Linux written in Haskell. It connects to
-  both the official Arch repostitories and to the AUR, allowing easy control of
-  all packages on an Arch system. It allows /all/ pacman operations and provides
+  Aura is a package manager for Arch Linux. It connects to both the
+  official Arch repostitories and to the AUR, allowing easy control of all
+  packages on an Arch system. It allows /all/ pacman operations and provides
   /new/ custom ones for dealing with AUR packages. This differs from some other
   AUR package managers.
 
@@ -27,7 +25,14 @@
 
 common commons
   default-language:   Haskell2010
-  default-extensions: NoImplicitPrelude
+  default-extensions:
+    NoImplicitPrelude
+    BangPatterns
+    LambdaCase
+    OverloadedStrings
+    TupleSections
+    TypeApplications
+
   ghc-options:
     -Wall -Wincomplete-record-updates -Wincomplete-uni-patterns
     -Wredundant-constraints -Widentities -Wpartial-fields -Wcompat
@@ -94,17 +99,19 @@
     , filepath          ^>=1.4
     , generic-lens      >=1.1  && <1.3
     , http-types        >=0.9  && <0.13
-    , language-bash     ^>=0.8
+    , language-bash     >=0.8  && <0.10
     , megaparsec        >=7    && <9
     , microlens-ghc     ^>=0.4
     , mwc-random        ^>=0.14
     , network-uri       ^>=2.6
     , scheduler         >=1.1  && <1.5
     , semigroupoids     >=5.2  && <5.4
+    , servant-client-core >= 0.16 && < 0.18
     , stm               ^>=2.5
     , these             ^>=1.0
     , time              >=1.8  && <1.10
     , unliftio          ^>=0.2
+    , witherable-class  ^>=0
 
 executable aura
   import:         commons, libexec
diff --git a/doc/aura.8 b/doc/aura.8
--- a/doc/aura.8
+++ b/doc/aura.8
@@ -410,6 +410,8 @@
 .P
 (  Italian   ) Bob Valantin
 .P
+(  Italian   ) Cristian Tentella
+.P
 (  Serbian   ) Filip Brcic
 .P
 ( Norwegian  ) "chinatsun"
diff --git a/exec/Flags.hs b/exec/Flags.hs
--- a/exec/Flags.hs
+++ b/exec/Flags.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE OverloadedStrings #-}
-
 module Flags
   ( Program(..), opts
   , PacmanOp( Sync ), SyncOp( SyncUpgrade ), MiscOp
@@ -26,14 +24,17 @@
 
 -- | A description of a run of Aura to attempt.
 data Program = Program {
-  -- ^ Whether Aura handles everything, or the ops and input are just passed down to Pacman.
   _operation   :: Either (PacmanOp, Set MiscOp) AuraOp
-  -- ^ Settings common to both Aura and Pacman.
+  -- ^ Whether Aura handles everything, or the ops and input are just passed down to Pacman.
   , _commons   :: CommonConfig
-  -- ^ Settings specific to building packages.
+  -- ^ Settings common to both Aura and Pacman.
   , _buildConf :: BuildConfig
+  -- ^ Settings specific to building packages.
+  , _language  :: Maybe Language
   -- ^ The human language of text output.
-  , _language  :: Maybe Language } deriving (Show)
+  , _logLevel  :: LogLevel
+  -- ^ The default RIO logging level.
+  } deriving (Show)
 
 -- | Inherited operations that are fed down to Pacman.
 data PacmanOp = Database (Either DatabaseOp (NESet PkgName))
@@ -259,8 +260,10 @@
   <*> commonConfig
   <*> buildConfig
   <*> optional language
-  where aurOps = aursync <|> backups <|> cache <|> log <|> orphans <|> version' <|> languages <|> viewconf
-        pacOps = database <|> files <|> queries <|> remove <|> sync <|> testdeps <|> upgrades
+  <*> logLevel
+  where
+    aurOps = aursync <|> backups <|> cache <|> log <|> orphans <|> version' <|> languages <|> viewconf
+    pacOps = database <|> files <|> queries <|> remove <|> sync <|> testdeps <|> upgrades
 
 aursync :: Parser AuraOp
 aursync = bigA *>
@@ -518,3 +521,15 @@
                 , ( "indonesian", Indonesia )
                 , ( "chinese",    Chinese ),    ( "中文",       Chinese )
                 , ( "esperanto",  Esperanto ) ]
+
+logLevel :: Parser LogLevel
+logLevel = option (eitherReader l)
+  (long "log-level" <> metavar "debug|info|warn|error" <> value LevelInfo
+   <> help "The minimum level of log messages to display (default: info)")
+  where
+    l :: String -> Either String LogLevel
+    l "debug" = Right LevelDebug
+    l "info"  = Right LevelInfo
+    l "warn"  = Right LevelWarn
+    l "error" = Right LevelError
+    l _       = Left "Must be one of debug|info|warn|error"
diff --git a/exec/Settings.hs b/exec/Settings.hs
--- a/exec/Settings.hs
+++ b/exec/Settings.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE BangPatterns #-}
+
 {-
 
 Copyright 2012 - 2020 Colin Woodbury <colin@fosskers.ca>
@@ -19,15 +21,16 @@
 
 -}
 
-module Settings ( getSettings ) where
+module Settings ( withEnv ) where
 
+import           Aura.Core (Env(..))
 import           Aura.Languages
+import           Aura.Packages.AUR (aurRepo)
+import           Aura.Packages.Repository (pacmanRepo)
 import           Aura.Pacman
 import           Aura.Settings
 import           Aura.Types
 import           Aura.Utils
-import           Control.Error.Util (failWith)
-import           Control.Monad.Trans.Except
 import           Data.Bifunctor (Bifunctor(..))
 import qualified Data.Set.NonEmpty as NES
 import           Flags
@@ -42,29 +45,42 @@
 
 ---
 
-getSettings :: Program -> IO (Either Failure Settings)
-getSettings (Program op co bc lng) = runExceptT $ do
+-- | Bracket around the `Env` type to properly initialize the `Manager` and
+-- `RIO` logger function (among other things).
+--
+-- Throws in `IO` if there were any errors.
+withEnv :: Program -> (Env -> IO a) -> IO a
+withEnv (Program op co bc lng ll) f = do
   let ign = S.fromList $ op ^.. _Right . _AurSync . folded . _AurIgnore . folded
       igg = S.fromList $ op ^.. _Right . _AurSync . folded . _AurIgnoreGroup . folded
-  confFile    <- ExceptT (getPacmanConf . either id id $ configPathOf co)
-  environment <- lift (M.fromList . map (bimap T.pack T.pack) <$> getEnvironment)
-  manager     <- lift $ newManager tlsManagerSettings
-  isTerm      <- lift $ hIsTerminalDevice stdout
-  fromGroups  <- lift . maybe (pure S.empty) groupPackages . NES.nonEmptySet $ getIgnoredGroups confFile <> igg
+  confFile    <- getPacmanConf (either id id $ configPathOf co) >>= either throwM pure
+  environment <- M.fromList . map (bimap T.pack T.pack) <$> getEnvironment
+  manager     <- newManager tlsManagerSettings
+  isTerm      <- hIsTerminalDevice stdout
+  fromGroups  <- maybe (pure S.empty) groupPackages . NES.nonEmptySet
+    $ getIgnoredGroups confFile <> igg
   let language = checkLang lng environment
-  bu <- failWith (Failure whoIsBuildUser_1) $ buildUserOf bc <|> getTrueUser environment
-  pure Settings { managerOf      = manager
-                , envOf          = environment
-                , langOf         = language
-                , editorOf       = getEditor environment
-                , isTerminal     = isTerm
-                , ignoresOf      = getIgnoredPkgs confFile <> fromGroups <> ign
-                , commonConfigOf =
-                    -- | These maintain the precedence order: flags, config file entry, default
-                    co { cachePathOf = first (\x -> fromMaybe x $ getCachePath confFile) $ cachePathOf co
-                       , logPathOf   = first (\x -> fromMaybe x $ getLogFilePath confFile) $ logPathOf co }
-                , buildConfigOf = bc { buildUserOf = Just bu}
-                }
+  bu <- maybe (throwM $ Failure whoIsBuildUser_1) pure
+    $ buildUserOf bc <|> getTrueUser environment
+  repos <- (<>) <$> pacmanRepo <*> aurRepo
+  lopts <- setLogMinLevel ll . setLogUseLoc True <$> logOptionsHandle stderr True
+  withLogFunc lopts $ \logFunc -> do
+    let !ss = Settings
+          { managerOf      = manager
+          , envOf          = environment
+          , langOf         = language
+          , editorOf       = getEditor environment
+          , isTerminal     = isTerm
+          , ignoresOf      = getIgnoredPkgs confFile <> fromGroups <> ign
+          , commonConfigOf =
+              -- | These maintain the precedence order: flags, config file entry, default
+              co { cachePathOf =
+                     first (\x -> fromMaybe x $ getCachePath confFile) $ cachePathOf co
+                 , logPathOf   =
+                     first (\x -> fromMaybe x $ getLogFilePath confFile) $ logPathOf co }
+          , buildConfigOf = bc { buildUserOf = Just bu}
+          , logFuncOf = logFunc }
+    f (Env repos ss)
 
 checkLang :: Maybe Language -> Environment -> Language
 checkLang Nothing env   = langFromLocale $ getLocale env
diff --git a/exec/aura.hs b/exec/aura.hs
--- a/exec/aura.hs
+++ b/exec/aura.hs
@@ -1,9 +1,6 @@
-{-# LANGUAGE CPP               #-}
-{-# LANGUAGE DataKinds         #-}
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE MonoLocalBinds    #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeApplications  #-}
+{-# LANGUAGE CPP              #-}
+{-# LANGUAGE DataKinds        #-}
+{-# LANGUAGE FlexibleContexts #-}
 
 {-
 
@@ -47,8 +44,6 @@
 import           Aura.Core
 import           Aura.Languages
 import           Aura.Logo
-import           Aura.Packages.AUR (aurRepo)
-import           Aura.Packages.Repository (pacmanRepo)
 import           Aura.Pacman
 import           Aura.Settings
 import           Aura.Types
@@ -76,17 +71,18 @@
 
 main :: IO ()
 main = do
-  options   <- execParser opts
-  esettings <- getSettings options
-  repos     <- (<>) <$> pacmanRepo <*> aurRepo
-  case esettings of
-    Left err -> putTextLn . dtot . ($ English) $ failure err
-    Right ss -> execute ss repos options >>= exit ss
+  options <- execParser opts
+  res <- try $ withEnv options $ \env ->
+    execute env options >>= exit (settings env)
+  case res of
+    Left err -> putTextLn (dtot . ($ English) $ failure err) *> exitFailure
+    Right r  -> pure r
 
-execute :: Settings -> Repository -> Program -> IO (Either (Doc AnsiStyle) ())
-execute ss r p = first f <$> try (runRIO (Env r ss) . execOpts $ _operation p)
+-- | Won't throw due to the `try`.
+execute :: Env -> Program -> IO (Either (Doc AnsiStyle) ())
+execute env p = first f <$> try (runRIO env . execOpts $ _operation p)
   where
-    f (Failure fl) = fl $ langOf ss
+    f (Failure fl) = fl $ langOf (settings env)
 
 exit :: Settings -> Either (Doc AnsiStyle) () -> IO a
 exit ss (Left e)  = scold ss e *> exitFailure
@@ -94,6 +90,7 @@
 
 execOpts :: Either (PacmanOp, Set MiscOp) AuraOp -> RIO Env ()
 execOpts ops = do
+  logDebug "Interpreting CLI options."
   ss <- asks settings
   when (shared ss Debug) $ do
     liftIO . pPrintNoColor $ ops
@@ -107,7 +104,7 @@
   case ops of
     Left o@(Sync (Left sops) _, _)
       | any isUpgrade sops -> sudo (liftIO $ B.saveState ss) *> p o
-    Left o -> p o
+    Left o -> logDebug "Performing a pacman operation." >> p o
     Right (AurSync o _) ->
       case o of
         Right ps              -> bool (trueRoot . sudo) id (switch ss DryRun) $ A.install ps
diff --git a/lib/Aura/Build.hs b/lib/Aura/Build.hs
--- a/lib/Aura/Build.hs
+++ b/lib/Aura/Build.hs
@@ -1,8 +1,5 @@
-{-# LANGUAGE DataKinds         #-}
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE MonoLocalBinds    #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeApplications  #-}
+{-# LANGUAGE DataKinds        #-}
+{-# LANGUAGE FlexibleContexts #-}
 
 -- |
 -- Module    : Aura.Build
@@ -30,6 +27,7 @@
 import           Data.Semigroup.Foldable (fold1)
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
+import           Data.Witherable.Class (wither)
 import           RIO
 import           RIO.Directory (setCurrentDirectory)
 import qualified RIO.NonEmpty as NEL
@@ -57,7 +55,7 @@
 buildPackages :: NESet Buildable -> RIO Env (NESet PackagePath)
 buildPackages bs = do
   g <- liftIO createSystemRandom
-  traverseMaybe (build g) (toList bs) >>= maybe bad (pure . fold1) . NEL.nonEmpty
+  wither (build g) (toList bs) >>= maybe bad (pure . fold1) . NEL.nonEmpty
   where bad = throwM $ Failure buildFail_10
 
 -- | Handles the building of Packages. Fails nicely.
diff --git a/lib/Aura/Cache.hs b/lib/Aura/Cache.hs
--- a/lib/Aura/Cache.hs
+++ b/lib/Aura/Cache.hs
@@ -1,7 +1,4 @@
 {-# LANGUAGE DataKinds         #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TupleSections     #-}
-{-# LANGUAGE TypeApplications  #-}
 
 -- |
 -- Module    : Aura.Cache
diff --git a/lib/Aura/Commands/A.hs b/lib/Aura/Commands/A.hs
--- a/lib/Aura/Commands/A.hs
+++ b/lib/Aura/Commands/A.hs
@@ -1,11 +1,6 @@
-{-# LANGUAGE BangPatterns      #-}
 {-# LANGUAGE DataKinds         #-}
 {-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE LambdaCase        #-}
-{-# LANGUAGE MonoLocalBinds    #-}
 {-# LANGUAGE MultiWayIf        #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeApplications  #-}
 {-# LANGUAGE ViewPatterns      #-}
 
 -- |
@@ -67,7 +62,8 @@
 upgradeAURPkgs pkgs = do
   ss <- asks settings
   liftIO . notify ss . upgradeAURPkgs_1 $ langOf ss
-  liftIO (foreigns ss) >>= traverse_ (upgrade pkgs) . NES.nonEmptySet
+  fs <- liftIO (foreigns ss)
+  traverse_ (upgrade pkgs) $ NES.nonEmptySet fs
 
 -- | Foreign packages to consider for upgrading, after "ignored packages" have
 -- been taken into consideration.
@@ -77,10 +73,15 @@
 
 upgrade :: Set PkgName -> NESet SimplePkg -> RIO Env ()
 upgrade pkgs fs = do
+  logDebug $ "Considering " <> display (NES.size fs) <> " 'foreign' packages for upgrade."
+  unless (null pkgs)
+    $ logDebug $ "Also installing " <> display (S.size pkgs) <> " other packages."
   ss        <- asks settings
   toUpgrade <- possibleUpdates fs
+  logDebug $ "Potential upgrades: " <> display (length toUpgrade)
   let !names = map (PkgName . aurNameOf . fst) toUpgrade
   auraFirst <- auraCheck names
+  logDebug $ "Upgrade Aura first? ... " <> maybe "No." (const "Yes!") auraFirst
   case auraFirst of
     Just a  -> auraUpgrade a
     Nothing -> do
@@ -97,6 +98,7 @@
   aurInfos <- aurInfo $ fmap (^. field @"name") pkgs
   let !names  = map aurNameOf aurInfos
       aurPkgs = NEL.filter (\(SimplePkg (PkgName n) _) -> n `elem` names) pkgs
+  logDebug "Package lookup successful."
   pure . filter isntMostRecent . zip aurInfos $ aurPkgs ^.. each . field @"version"
 
 -- | Is there an update for Aura that we could apply first?
diff --git a/lib/Aura/Commands/B.hs b/lib/Aura/Commands/B.hs
--- a/lib/Aura/Commands/B.hs
+++ b/lib/Aura/Commands/B.hs
@@ -1,8 +1,5 @@
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE MonoLocalBinds   #-}
-{-# LANGUAGE MultiWayIf       #-}
-{-# LANGUAGE TupleSections    #-}
-{-# LANGUAGE ViewPatterns     #-}
+{-# LANGUAGE MultiWayIf    #-}
+{-# LANGUAGE ViewPatterns  #-}
 
 -- |
 -- Module    : Aura.Commands.B
diff --git a/lib/Aura/Commands/C.hs b/lib/Aura/Commands/C.hs
--- a/lib/Aura/Commands/C.hs
+++ b/lib/Aura/Commands/C.hs
@@ -1,10 +1,6 @@
-{-# LANGUAGE BangPatterns      #-}
-{-# LANGUAGE DataKinds         #-}
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE MonoLocalBinds    #-}
-{-# LANGUAGE MultiWayIf        #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeApplications  #-}
+{-# LANGUAGE DataKinds        #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MultiWayIf       #-}
 
 -- |
 -- Module    : Aura.Commands.C
diff --git a/lib/Aura/Commands/L.hs b/lib/Aura/Commands/L.hs
--- a/lib/Aura/Commands/L.hs
+++ b/lib/Aura/Commands/L.hs
@@ -1,9 +1,6 @@
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE DuplicateRecordFields #-}
 {-# LANGUAGE FlexibleContexts      #-}
-{-# LANGUAGE MonoLocalBinds        #-}
-{-# LANGUAGE OverloadedStrings     #-}
-{-# LANGUAGE TypeApplications      #-}
 
 -- |
 -- Module    : Aura.Commands.L
diff --git a/lib/Aura/Commands/O.hs b/lib/Aura/Commands/O.hs
--- a/lib/Aura/Commands/O.hs
+++ b/lib/Aura/Commands/O.hs
@@ -1,8 +1,4 @@
-{-# LANGUAGE DataKinds         #-}
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE MonoLocalBinds    #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeApplications  #-}
+{-# LANGUAGE DataKinds        #-}
 
 -- |
 -- Module    : Aura.Commands.O
diff --git a/lib/Aura/Core.hs b/lib/Aura/Core.hs
--- a/lib/Aura/Core.hs
+++ b/lib/Aura/Core.hs
@@ -1,10 +1,7 @@
-{-# LANGUAGE DataKinds           #-}
-{-# LANGUAGE FlexibleContexts    #-}
-{-# LANGUAGE MonoLocalBinds      #-}
-{-# LANGUAGE MultiWayIf          #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE TypeApplications    #-}
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE MultiWayIf         #-}
 
 -- |
 -- Module    : Aura.Core
@@ -41,7 +38,7 @@
 import           Aura.Utils
 import           Control.Monad.Trans.Maybe
 import           Data.Bifunctor (bimap)
-import           Data.Generics.Product (field)
+import           Data.Generics.Product (field, typed)
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
 import           Data.Text.Prettyprint.Doc
@@ -65,6 +62,10 @@
 -- instantiated in `IO`, while `Settings` is mostly static and derived from
 -- command-line arguments.
 data Env = Env { repository :: !Repository, settings :: !Settings }
+  deriving stock (Generic)
+
+instance HasLogFunc Env where
+  logFuncL = typed @Settings . typed @LogFunc
 
 -- | A `Repository` is a place where packages may be fetched from. Multiple
 -- repositories can be combined with the `Semigroup` instance. Checks packages
diff --git a/lib/Aura/Dependencies.hs b/lib/Aura/Dependencies.hs
--- a/lib/Aura/Dependencies.hs
+++ b/lib/Aura/Dependencies.hs
@@ -1,14 +1,7 @@
 {-# LANGUAGE DataKinds         #-}
 {-# LANGUAGE DeriveGeneric     #-}
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE LambdaCase        #-}
-{-# LANGUAGE MonoLocalBinds    #-}
 {-# LANGUAGE MultiWayIf        #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE PatternSynonyms   #-}
-{-# LANGUAGE RankNTypes        #-}
-{-# LANGUAGE TupleSections     #-}
-{-# LANGUAGE TypeApplications  #-}
 
 -- |
 -- Module    : Aura.Dependencies
diff --git a/lib/Aura/Install.hs b/lib/Aura/Install.hs
--- a/lib/Aura/Install.hs
+++ b/lib/Aura/Install.hs
@@ -1,11 +1,8 @@
-{-# LANGUAGE BangPatterns      #-}
-{-# LANGUAGE DataKinds         #-}
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE MonoLocalBinds    #-}
-{-# LANGUAGE MultiWayIf        #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeApplications  #-}
-{-# LANGUAGE ViewPatterns      #-}
+{-# LANGUAGE DataKinds        #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MonoLocalBinds   #-}
+{-# LANGUAGE MultiWayIf       #-}
+{-# LANGUAGE ViewPatterns     #-}
 
 -- |
 -- Module    : Aura.Install
diff --git a/lib/Aura/Languages.hs b/lib/Aura/Languages.hs
--- a/lib/Aura/Languages.hs
+++ b/lib/Aura/Languages.hs
@@ -1,13 +1,11 @@
 {-# LANGUAGE DataKinds         #-}
-{-# LANGUAGE LambdaCase        #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeApplications  #-}
 {-# LANGUAGE ViewPatterns      #-}
+
 {-# OPTIONS_HADDOCK prune #-}
 {-# OPTIONS_GHC -fno-warn-missing-export-lists #-}
 
 -- |
--- Module    : Aura.Languages.Fields
+-- Module    : Aura.Languages
 -- Copyright : (c) Colin Woodbury, 2012 - 2020
 -- License   : GPL3
 -- Maintainer: Colin Woodbury <colin@fosskers.ca>
@@ -24,7 +22,7 @@
 Henry Kupty / Thiago Perrotta / Wagner Amaral | Portuguese
 Ma Jiehong / Fabien Dubosson                  | French
 Kyrylo Silin                                  | Russian
-Bob Valantin                                  | Italian
+Bob Valantin / Cristian Tentella              | Italian
 Filip Brcic                                   | Serbian
 "chinatsun"                                   | Norwegian
 "pak tua Greg"                                | Indonesia
@@ -60,7 +58,7 @@
     , (Portuguese, "Henry Kupty / Thiago Perrotta / Wagner Amaral")
     , (French,     "Ma Jiehong / Fabien Dubosson")
     , (Russian,    "Kyrylo Silin / Alexey Kotlyarov")
-    , (Italian,    "Bob Valantin")
+    , (Italian,    "Bob Valantin / Cristian Tentella")
     , (Serbian,    "Filip Brcic")
     , (Norwegian,  "\"chinatsun\"")
     , (Indonesia,  "\"pak tua Greg\"")
@@ -81,7 +79,7 @@
     Portuguese -> [ "Japonês", "Polonês", "Croata", "Sueco", "Alemão", "Espanhol", "Português", "Francês", "Russo", "Italiano", "Sérvio", "Norueguês", "Indonésio", "Chinês", "Esperanto" ]
     French     -> [ "Japanese", "Polonais", "Croate", "Suédois", "Allemand", "Espagnol", "Portugais", "Français", "Russe", "Italien", "Serbe", "Norvégien", "Indonesian", "Chinese", "Esperanto" ]
     Russian    -> [ "Японский", "Польский", "Хорватский", "Шведский", "Немецкий", "Испанский", "Португальский", "Французский", "Русский", "Итальянский", "Сербский", "Норвежский", "Индонезийский", "Китайский", "Эсперанто" ]
-    Italian    -> [ "Giapponese", "Polacco", "Croato", "Svedese", "Tedesco", "Spagnolo", "Portoghese", "Francese", "Russo", "Italiano", "", "", "Indonesian", "Chinese", "Esperanto" ]
+    Italian    -> [ "Giapponese", "Polacco", "Croato", "Svedese", "Tedesco", "Spagnolo", "Portoghese", "Francese", "Russo", "Italiano", "", "", "Indonesiano", "Cinese", "Esperanto" ]
     Serbian    -> [ "Japanese", "Пољски", "Хрватски", "Шведски", "Немачки", "Шпански", "Португалски", "Француски", "Руски", "Италијански", "Српски", "", "Indonesian", "Chinese", "Esperanto" ]
     Norwegian  -> [ "Japanese", "Polsk", "Kroatisk", "Svensk", "Tysk", "Spansk", "Portugisisk", "Fransk", "Russisk", "Italiensk", "Serbisk", "Norsk", "Indonesian", "Chinese", "Esperanto" ]
     Indonesia  -> [ "Japanese", "Polandia", "Kroasia", "Swedia", "Jerman", "Spanyol", "Portugis", "Prancis", "Rusia", "Italia", "Serbia", "Norwegia", "Indonesian", "Chinese", "Esperanto" ]
@@ -159,6 +157,7 @@
     French     -> "La base de données des paquets est bloquée. Appuyez sur enter pour continuer."
     Portuguese -> "Banco de dados de pacote travado. Aperte 'enter' quando estiver destravado para poder continuar."
     Russian    -> "База данных пакетов заблокирована. Нажмите \"Ввод\", когда она разблокируется, чтобы продолжить."
+    Italian    -> "Il database dei pacchetti è bloccato. Premi invio quando sarà sbloccato per continuare."
     Chinese    -> "包数据库已锁定。请在解锁后按下回车以继续。"
     Swedish    -> "Paketdatabasen är låst. Klicka på enter när den är upplåst."
     Esperanto  -> "La datumbazo de pakaĵoj estas ŝlosita. Premu enen-klavo kiam la datumbazo estas malŝlosita por daŭrigi"
@@ -171,6 +170,7 @@
     Spanish    -> "Desde makepkg v4.2 no es posible compilar paquetes como root."
     Portuguese -> "A partir da versão v4.2 de makepkg, não é mais possível compilar como root."
     Russian    -> "С версии makepkg v4.2 сборка от имени root более невозможна."
+    Italian    -> "A partire da makepkg v4.2 non è più possibile compilare come utente root."
     Chinese    -> "自从 makepkg v4.2 以后，就不能以根用户身份构建软件了。"
     Swedish    -> "I makepkg v4.2 och uppåt är det inte tillåtet att bygga som root."
     Esperanto  -> "Depost makepkg v4.2, konstruanto ĉefuzante ne eblas."
@@ -265,6 +265,7 @@
     Portuguese -> "Falha ao obter scripts de compilação para " <> p <> "."
     Indonesia  -> "Gagal mendapatkan skrip untuk " <> p <> "."
     Russian    -> "Не удалось получить сценарии сборки для " <> p <> "."
+    Italian    -> "Non è stato possibile ottenere gli script di compilazione per " <> p <> "."
     Chinese    -> "无法获得 " <> p <> " 的构建脚本。"
     Swedish    -> "Kunde inte hämta byggskript för " <> p <> "."
     Esperanto  -> "Paneis akiri muntaj skriptoj de " <> p <> "."
@@ -276,18 +277,21 @@
     Spanish    -> "Ocurrió un error al ejecutar makepkg"
     Portuguese -> "Ocorreu um erro ao executar makepkg"
     Russian    -> "Произошла ошибка makepkg."
+    Italian    -> "C'è stato un errore nell'esecuzione di makepkg."
     Esperanto  -> "Paneo de makepkg okazis."
     _          -> "There was a makepkg failure."
 
 buildFail_9 :: Language -> Doc AnsiStyle
 buildFail_9 = \case
   Spanish   -> "Error al detectar todos los archivo de paquete (*.pkg.tar.xz)."
+  Italian   -> "Non è stato possibile trovare nessun pacchetto compilato (*.pkg.tar.xz)."
   Esperanto -> "Paneis detekti ĉiujn dosierojn de pakaĵoj (*.pkg.tar.xz)."
   _         -> "Failed to detect any built package files (*.pkg.tar.xz)."
 
 buildFail_10 :: Language -> Doc AnsiStyle
 buildFail_10 = \case
   Spanish   -> "Los paquetes no se pudieron construir."
+  Italian   -> "Non è stato possibile compilare i pacchetti."
   Esperanto -> "Ĉiuj pakaĵoj paneis munti."
   _         -> "Every package failed to build."
 
@@ -295,6 +299,7 @@
 buildFail_11 = \case
   Japanese   -> "作成は失敗しました。エラーを見ますか？"
   Spanish    -> "Construcción fallida. ¿Te gustaría ver el error?"
+  Italian    -> "La compilazione è fallita. Vuoi dare un'occhiata all'errore?"
   Esperanto  -> "Muntado paneis. Ĉu vi volas vidi la eraron?"
   _          -> "Building failed. Would you like to see the error?"
 
@@ -350,23 +355,27 @@
   Spanish    -> "La dependencia " <> bt s <> " no pudo ser encontrada."
   Portuguese -> "A dependência " <> bt s <> " não foi encontrada."
   Russian    -> "Зависимость " <> bt s <> " не найдена."
+  Italian    -> "La dipendenza " <> bt s <> "non è stata trovata."
   Esperanto  -> "La dependeco " <> bt s <> " ne povis troviĝi."
   _          -> "The dependency " <> bt s <> " couldn't be found."
 depError l (BrokenProvides (PkgName pkg) (Provides (PkgName pro)) (PkgName n)) = case l of
   Spanish    -> "El paquete " <> bt pkg <> " necesita " <> bt n <> " que proporciona " <> bt pro <> "."
   Russian    -> "Пакету " <> bt pkg <> " требуется " <> bt n <> ", предоставляющий " <> bt pro <> "."
   Esperanto  -> "La pakaĵo, " <> bt pkg <> " bezonas " <> bt n <> ", kiu donas " <> bt pro <> "."
+  Italian    -> "Il pacchetto " <> bt pkg <> " ha bisogno di " <> bt n <> ", che rende disponibile " <> bt pro <> "."
   _          -> "The package " <> bt pkg <> " needs " <> bt n <> ", which provides " <> bt pro <> "."
 
 missingPkg_3 :: Language -> Doc AnsiStyle
 missingPkg_3 = \case
   Spanish    -> "Se produjo un error al reorganizar el gráfico de dependencia. Si ves esto, algo está muy mal."
   Esperanto  -> "Eraro okazis kiam reorganizi la grafeo de dependeco. Io estas erarega."
+  Italian    -> "C'è stato un errore nella riorganizzazione dell'albero del grafico delle dipendenze. Se vedi questo messaggio, qualcosa è andato davvero storto."
   _          -> "There was an error reorganizing the dependency graph. If you see this, something is very wrong."
 
 missingPkg_4 :: [NonEmpty PkgName] -> Language -> Doc AnsiStyle
 missingPkg_4 pns = \case
   Spanish    -> vsep $ "Se detectaron los siguientes ciclos de dependencia:" : pns'
+  Italian    -> vsep $ "Sono stati individuati i seguenti cicli di dipendenza:" : pns'
   _ -> vsep $ "The following dependency cycles were detected:" : pns'
   where pns' = map (hsep . map pretty . L.intersperse "=>" . map (view (field @"name")) . toList) pns
 
@@ -411,6 +420,7 @@
     Portuguese -> "Uma atualização para Aura está disponível. Deseja atualizar antes?"
     French     -> "Une mise à jour d'Aura est disponible. Voulez-vous la mettre à jour en premier ?"
     Russian    -> "Доступно обновление Aura. Обновить сперва её?"
+    Italian    -> "Un aggiornamento per Aur è disponibile. Eseguirlo subito?"
     Indonesia  -> "Pemutakhiran aura tersedia. Mutakhirkan aura dulu?"
     Chinese    -> "Aura 可以升级。先升级 aura？"
     Swedish    -> "Det finns en uppdatering tillgänglig till Aura. Vill du uppdatera Aura först?"
@@ -501,6 +511,7 @@
     Spanish    -> p <> " está marcado como ignorado. ¿Deseas instalarlo de todas formas?"
     Portuguese -> p <> " está marcado como Ignorado. Deseja instalar mesmo assim?"
     Russian    -> p <> " отмечен как игнорируемый. Всё равно установить?"
+    Italian    -> p <> " è un pacchetto Ignorato. Installare comunque?"
     Chinese    -> p <> " 已被标记为忽略。仍然安装？"
     Swedish    -> p <> " är markerad som ignorerad. Vill du installera ändå?"
     Esperanto  -> p <> " estas markita kiel malatenta. Ĉu instali?"
@@ -518,7 +529,7 @@
     Portuguese -> "Os seguintes não são pacotes AUR:"
     French     -> "Les éléments suivants ne sont pas des paquets AUR :"
     Russian    -> "Ниже указано то, что не является пакетами AUR:"
-    Italian    -> "I seguenti pacchetti non sono presenti in AUR:"
+    Italian    -> "I seguenti pacchetti non sono presenti nella AUR:"
     Serbian    -> "Ово нису пакети:"
     Norwegian  -> "Det følgende er ikke AUR-pakker:"
     Indonesia  -> "Paket berikut ini bukan merupakan paket AUR:"
@@ -533,6 +544,7 @@
     Polish     -> "Następujące pakiety zostały już zainstalowane:"
     Portuguese -> "Os seguintes pacotes já estão instalados:"
     Russian    -> "Следующие пакеты уже установлены:"
+    Italian    -> "I seguenti pacchetti sono già presenti nel sistema."
     German     -> "Die folgenden Pakete sind bereits installiert:"
     Spanish    -> "Los siguientes paquetes ya están instalados:"
     Chinese    -> "以下包已被安装："
@@ -589,7 +601,7 @@
     Portuguese -> "Dependências no AUR:"
     French     -> "Dépendances AUR\xa0:"
     Russian    -> "Зависимости из AUR:"
-    Italian    -> "Dipendenze in AUR:"
+    Italian    -> "Dipendenze nella AUR:"
     Serbian    -> "Зависности из AUR-а:"
     Norwegian  -> "Avhengigheter fra AUR:"
     Esperanto  -> "Dependencoj de AUR:"
@@ -687,7 +699,7 @@
     Portuguese -> "Os seguintes pacotes não possuem versões no cache, logo não podem retornar a uma versão anterior:"
     French     -> "Aucune version des paquets suivants n'est présente dans le cache ; ils ne peuvent pas être mis à niveau à une version antérieure :"
     Russian    -> "Следующих пакетов нет в кэше. Следовательно, они не могут быть откачены к старой версии:"
-    Italian    -> "I seguenti pacchetti non hanno versioni in cache e non posso essere retrocessi:"
+    Italian    -> "I seguenti pacchetti non hanno versioni nella cache e non posso essere retrocessi:"
     Serbian    -> "Следећи пакети нису ни инсталирани, те се не могу вратити на старију верзију:"
     Norwegian  -> "Følgende pakker har ingen versjoner i cache, og kan derfor ikke bli nedgradert:"
     Indonesia  -> "Berikut ini tidak mempunyai versi pada cache, sehingga tidak akan diturunkan:"
@@ -698,6 +710,7 @@
 reportBadDowngradePkgs_2 :: PkgName -> Language -> Doc AnsiStyle
 reportBadDowngradePkgs_2 (PkgName p) = \case
   Spanish     -> pretty p <+> "no tiene una versión en la caché."
+  Italian     -> pretty p <+> "non ha alcuna versione nella cache."
   _ -> pretty p <+> "has no version in the cache."
 
 upgradeAURPkgs_1 :: Language -> Doc AnsiStyle
@@ -730,7 +743,7 @@
     Portuguese -> "Comparando versões dos pacotes..."
     French     -> "Comparaison des versions des paquets en cours…"
     Russian    -> "Сравнение версий пакетов..."
-    Italian    -> "Confronto le ersioni del pacchetto..."
+    Italian    -> "Confronto le versioni del pacchetto..."
     Serbian    -> "Упоређивање верзија пакета..."
     Norwegian  -> "Sammenligner pakkeversjoner..."
     Indonesia  -> "Membandingkan versi paket..."
@@ -749,7 +762,7 @@
     Portuguese -> "Nenhum pacote do AUR precisa de atualização."
     French     -> "Aucune mise à jour de paquet AUR n'est nécessaire."
     Russian    -> "Обновление пакетов из AUR не требуется."
-    Italian    -> "Non è necessario aggiornare pacchetti di AUR."
+    Italian    -> "Nessun pacchetto della AUR necessita di un aggiornamento."
     Serbian    -> "Ажурирање пакета из AUR-а није потребно."
     Norwegian  -> "Ingen pakkeoppgradering fra AUR nødvendig."
     Indonesia  -> "Tidak ada peningkatan AUR yang dibutuhkan."
@@ -809,7 +822,7 @@
     Spanish    -> "No se han eliminado estados de los paquetes."
     Serbian    -> "Ниједно стање пакета није уклоњено."
     Norwegian  -> "Ingen pakketilstander ble fjernet."
-    Italian    -> "Nessuno stato di pacchetto verrà rimosso."
+    Italian    -> "Nessuno stato di pacchetto è stato rimosso."
     Portuguese -> "Nenhum estado de pacote será removido."
     French     -> "Aucun état des paquets n'a été supprimé."
     Russian    -> "Состояния пакетов отались нетронутыми."
@@ -824,6 +837,7 @@
   Japanese  -> "現在のパッケージ状態記録：" <> pretty n <> "個。"
   Spanish   -> "Actualmente tiene " <+> pretty n <+> "estados de paquetes guardados."
   Russian   -> "У вас сейчас " <+> pretty n <+> pluralRussian " сохраненное состояние пакета" " сохраненных состояний пакета" " сохраненных состояний пакетов." n
+  Italian   -> "Al momento ci sono " <+> pretty n <+> " stati di pacchetti salvati."
   Esperanto -> "Vi havas " <+> pretty n <+> " konservajn statojn de pakaĵoj."
   _         -> "You currently have" <+> pretty n <+> "saved package states."
 
@@ -832,19 +846,22 @@
   Japanese  -> "一番最近に保存されたのは：" <> pretty t
   Spanish   -> "Guardado recientemente:" <+> pretty t
   Russian   -> "Последнее сохраненное:" <+> pretty t
+  Italian   -> "Salvato più recentemente:" <+> pretty t
   Esperanto -> "Lastaj konservaj:" <+> pretty t
   _         -> "Most recently saved:" <+> pretty t
 
 cleanStates_6 :: Int -> Language -> Doc AnsiStyle
 cleanStates_6 n = \case
   Spanish   -> pretty n <+> "de estos están anclados y no se eliminarán."
-  _ -> pretty n <+> "of these are pinned, and won't be removed."
+  Italian   -> pretty n <+> "di questi sono stati fissati e non saranno rimossi."
+  _         -> pretty n <+> "of these are pinned, and won't be removed."
 
 readState_1 :: Language -> Doc AnsiStyle
 readState_1 = \case
     Spanish    -> "Ese archivo de estado no se pudo analizar. ¿Es un archivo JSON válido?"
     Portuguese -> "O arquivo de estado não pôde ser interpretado. É um arquivo JSON válido?"
     Russian    -> "Это состояние не распознано. Это корректный JSON?"
+    Italian    -> "Non è stato possibile analizzare il file di stato. E' correttamente formattato in JSON?"
     Esperanto  -> "Tiu statdosiero paneis sintake analizi. Ĉu ĝi estas valida JSON?"
     _          -> "That state file failed to parse. Is it legal JSON?"
 
@@ -881,7 +898,7 @@
     Portuguese -> "Localização do backup não existe."
     French     -> "Le chemin des copies de sauvegarde spécifié n'existe pas."
     Russian    -> "Путь к бэкапу не существует."
-    Italian    -> "L'indirizzo del salvataggio non esiste."
+    Italian    -> "La locazione di backup non esiste."
     Serbian    -> "Путања ка бекапу не постоји."
     Norwegian  -> "Spesifisert backup-plass finnes ikke."
     Indonesia  -> "Lokasi `backup` tidak ada."
@@ -900,7 +917,7 @@
     Portuguese -> "Backup do cache sendo feito em " <> dir
     French     -> "Copie de sauvegarde dans " <> dir <> "."
     Russian    -> "Бэкап создается в директории " <> dir
-    Italian    -> "Salvataggio della chace in " <> dir
+    Italian    -> "Eseguo un backup della cache in " <> dir
     Serbian    -> "Бекапујем кеш у " <> dir
     Norwegian  -> "Tar backup på cache til " <> dir
     Indonesia  -> "Melakukan `backup` pada direktori " <> dir
@@ -976,7 +993,7 @@
     Portuguese -> "Efetuando backup. Isso pode levar alguns minutos..."
     French     -> "Copie de sauvegarde en cours. Ceci peut prendre quelques minutes…"
     Russian    -> "Создается бэкап. Это может занять пару минут..."
-    Italian    -> "Salvataggio. Questo potrebbe richiedere qualche minuto..."
+    Italian    -> "Sto eseguendo il backup. Potrebbe volerci qualche minuto..."
     Serbian    -> "Бекапујем. Ово може да потраје пар минута..."
     Norwegian  -> "Tar backup. Dette kan ta en stund..."
     Indonesia  -> "Melakukan `backup`. Proses ini akan berjalan untuk beberapa menit..."
@@ -1014,7 +1031,7 @@
     Portuguese -> "Isso removerá TODOS OS PACOTES do cache."
     French     -> "Ceci va supprimer la TOTALITÉ du cache des paquets."
     Russian    -> "Это действие ВСЕЦЕЛО уничтожит кэш пакетов."
-    Italian    -> "Questo cancellera l'INTERA cache dei pacchetti."
+    Italian    -> "Questo cancellerà l'INTERA cache dei pacchetti."
     Serbian    -> "Ово ће избрисати ЦЕО кеш пакета."
     Norwegian  -> "Dette vil slette HELE pakke-cachen."
     Indonesia  -> "Akan menghapus SEMUA `cache` paket"
@@ -1052,7 +1069,7 @@
     Portuguese -> "O resto será removido. OK?"
     French     -> "Le reste sera supprimé. Êtes-vous d'accord ?"
     Russian    -> "Всё остальное будет удалено. Годится?"
-    Italian    -> "Il resto verrà mantenuto. Continuare?"
+    Italian    -> "Il resto sarà rimosso. Continuare?"
     Serbian    -> "Остатак ће бити избрисан. Да ли је то у реду?"
     Norwegian  -> "Resten vil bli slettet. Er det OK?"
     Indonesia  -> "Selainnya akan dihapus. Ikhlas kan?"
@@ -1071,7 +1088,7 @@
     Portuguese -> "Limpeza do cache cancelada manualmente."
     French     -> "Le nettoyage du cache a été arrêté manuellement."
     Russian    -> "Очистка кэша прервана пользователем."
-    Italian    -> "Pulitura manuale della cache interrotta."
+    Italian    -> "Pulizia manuale della cache interrotta."
     Serbian    -> "Чишћење кеша је ручно прекинуто."
     Norwegian  -> "Cache-rensing ble avbrutt manuelt."
     Indonesia  -> "Pembersihan `cache` dibatalkan secara paksa."
@@ -1090,7 +1107,7 @@
     Portuguese -> "Limpando cache de pacotes..."
     French     -> "Nettoyage du cache des paquets…"
     Russian    -> "Очистка кэша пакета..."
-    Italian    -> "Ripulisco la cache..."
+    Italian    -> "Pulisco la cache dei pacchetti..."
     Serbian    -> "Чишћење кеша..."
     Norwegian  -> "Renser pakke-cache..."
     Indonesia  -> "Membersihkan `cache` paket..."
@@ -1168,12 +1185,21 @@
 -- Aura/AUR functions
 -------------------------------
 
--- https://github.com/aurapm/aura/issues/498
+-- https://github.com/fosskers/aura/issues/498
 connectionFailure_1 :: Language -> Doc AnsiStyle
 connectionFailure_1 = \case
-  Spanish   -> "No se pudo contactar con el AUR. ¿Tienes conexión a internet?"
-  _ -> "Failed to contact the AUR. Do you have an internet connection?"
+  Spanish -> "No se pudo contactar con el AUR. ¿Tienes conexión a internet?"
+  Italian -> "Non è stato possibile contattare la AUR. Il computer è connesso ad internet?"
+  _       -> "Failed to contact the AUR. Do you have an internet connection?"
 
+miscAURFailure_1 :: Language -> Doc AnsiStyle
+miscAURFailure_1 = \case
+  _ -> "Contacting the AUR failed in some unknown way."
+
+miscAURFailure_2 :: Language -> Doc AnsiStyle
+miscAURFailure_2 = \case
+  _ -> "The AUR server rejected the request."
+
 infoFields :: Language -> [Text]
 infoFields = sequence [ Fields.repository
                       , Fields.name
@@ -1201,7 +1227,7 @@
     Portuguese -> "Desatualizado!"
     French     -> "Périmé !"
     Russian    -> "Устарел!"
-    Italian    -> "Out of Date!"
+    Italian    -> "Non aggiornato!"
     Serbian    -> "Застарео!"
     Norwegian  -> "Utdatert!"
     Indonesia  -> "Ketinggalan Zaman!"
@@ -1239,6 +1265,7 @@
     Portuguese -> "Órfão!"
     French     -> "Abandonné !"
     Russian    -> "Осиротевший!"
+    Italian    -> "Orfano!"
     Indonesia  -> "Tak dipelihara!"
     Chinese    -> "孤包！"
     Swedish    -> "Föräldralös!"
@@ -1278,7 +1305,7 @@
     Spanish    -> "Versiones anteriores no disponibles para:"
     Serbian    -> "Захтеване старе верзије нису доступне за:"
     Norwegian  -> "De spesifiserte nedgraderingsversjonene er ikke tilgjengelig for:"
-    Italian    -> "Richiesta di retrocessione di versione non disponibile per:"
+    Italian    -> "Le richieste di retrocessione di versione non sono disponibili per:"
     Portuguese -> "Versões anteriores requisitadas não disponívels para:"
     French     -> "Version antérieure requise non disponible pour :"
     Russian    -> "Запрошенные версии для отката не доступны для:"
@@ -1294,6 +1321,7 @@
     Spanish    -> "No hay estados guardados para ser restaurados. (Utilice -B para guardar el estado actual)"
     Portuguese -> "Nenhum estado disponível para ser recuperado. (Utilize -B para salvar o estado atual)"
     Russian    -> "Нет сохраненных состояний для восстановления. (Используйте -B для сохранения текущего состояния)"
+    Italian    -> "Nessuno stato precedente da recuperare. (Usa -B per salvare lo stato attuale)"
     Chinese    -> "没有要恢复的已保存状态。（使用 -B 保存当前状态）"
     Swedish    -> "Inga sparade tillstånd att återhämta. (Använd -B för att spara det nuvarande tillståndet)"
     Esperanto  -> "Ne konservitaj statoj restaŭros. (Uzu -B konservi la aktualan staton)"
@@ -1327,6 +1355,7 @@
     Spanish    -> "No se puede determinar el usuario que ejecutará la compilación."
     Portuguese -> "Não foi possível determinal o usuário que executará a compilação."
     Russian    -> "Не удается определить, от имени какого пользователя производить сборку."
+    Italian    -> "Non è stato possibile determinare quale utente utilizzare per la compilazione."
     Esperanto  -> "Ne povas decidi, per kiu konto de uzanto munti."
     _          -> "Can't determine which user account to build with."
 
@@ -1358,12 +1387,14 @@
     Spanish    -> "No fue posible analizar su archivo pacman.conf."
     Portuguese -> "Não foi possível interpretar o arquivo pacman.conf ."
     Russian    -> "Не удается распознать формат вашего файла pacman.conf."
+    Italian    -> "Non è stato possibile analizzare il tuo pacman.conf."
     Esperanto  -> "Ne kapablas sintaske analizi vian dosieron, pacman.conf."
     _          -> "Unable to parse your pacman.conf file."
 
 provides_1 :: PkgName -> Language -> Doc AnsiStyle
 provides_1 (bt . view (field @"name") -> pro) = \case
     Spanish    -> pro <+> "se requiere como una dependencia, que es proporcionada por múltiples paquetes. Por favor, seleccione uno:"
+    Italian    -> pro <+> "è richiesto come dipendenza, che è disponibile in molteplici pacchetti. Per favore, scegline uno:"
     _          -> pro <+> "is required as a dependency, which is provided by multiple packages. Please select one:"
 
 ----------------------------------
@@ -1380,7 +1411,7 @@
     Portuguese -> "Deseja editar o PKGBUILD de " <> p <> "?"
     French     -> "Voulez-vous éditer le PKGBUILD de " <> p <> " ?"
     Russian    -> "Отредактировать PKGBUILD пакета " <> p <> "?"
-    Italian    -> "Volete modificare il PKGBUILD di " <> p <> "?"
+    Italian    -> "Vorresti modificare il PKGBUILD di " <> p <> "?"
     Serbian    -> "Желите ли да измените PKGBUILD за " <> p <> "?"
     Norwegian  -> "Vil du endre PKGBUILD for " <> p <> "?"
     Indonesia  -> "Apakah anda ingin menyunting PKGBUILD untuk paket " <> p <> "?"
@@ -1412,51 +1443,61 @@
 security_1 :: PkgName -> Language -> Doc AnsiStyle
 security_1 (PkgName p) = \case
   Spanish   -> "El PKGBUILD de" <+> bt p <+> "era demasiado complejo de analizar - puede estar ofuscando código malicioso."
+  Italian   -> "Il PKGBUILD di" <+> bt p <+> "è troppo complesso per essere analizzato - è possibile che stia offuscando codice malevolo."
   _ -> "The PKGBUILD of" <+> bt p <+> "was too complex to parse - it may be obfuscating malicious code."
 
 security_2 :: Text -> Language -> Doc AnsiStyle
 security_2 (bt -> t) = \case
   Spanish   -> t <+> "se puede usar para descargar scripts arbitrarios que este PKGBUILD no rastrea."
+  Italian   -> t <+> "può essere usato per scaricare scripts arbitrari non tracciati da questo PKGBUILD."
   _ -> t <+> "can be used to download arbitrary scripts that aren't tracked by this PKGBUILD."
 
 security_3 :: Text -> Language -> Doc AnsiStyle
 security_3 (bt -> t) = \case
   Spanish   -> t <+> "se puede usar para ejecutar código arbitrario que este PKGBUILD no rastrea."
+  Italian   -> t <+> "può essere usato per eseguire codice arbitrario non tracciato da questo PKGBUILD."
   _ -> t <+> "can be used to execute arbitrary code not tracked by this PKGBUILD."
 
 security_4 :: Text -> Language -> Doc AnsiStyle
 security_4 (bt -> t) = \case
   Spanish   -> t <+> "indica que alguien puede estar intentando obtener acceso de root a su máquina."
+  Italian   -> t <+> "indica che forse qualcuno sta cercando di ottenere accesso alla tua macchina come utente root."
   _ -> t <+> "indicates that someone may be trying to gain root access to your machine."
 
 security_5 :: PkgName -> Language -> Doc AnsiStyle
 security_5 (PkgName p) = \case
   Spanish   -> "ADVERTENCIA: El PKGBUILD de" <+> bt p <+> "contiene expresiones bash en la lista negra."
+  Italian   -> "ATTENZIONE: Il PKGBUILD di" <+> bt p <+> "contiene espressioni in bash che fanno parte della lista nera."
   _ -> "WARNING: The PKGBUILD of" <+> bt p <+> "contains blacklisted bash expressions."
 
 security_6 :: Language -> Doc AnsiStyle
 security_6 = \case
   Spanish   -> "¿Desea salir del proceso de compilación?"
+  Italian   -> "Terminare la compilazione"
   _ -> "Do you wish to quit the build process?"
 
 security_7 :: Language -> Doc AnsiStyle
 security_7 = \case
   Spanish   -> "Se canceló el procesamiento posterior para evitar el código bash potencialmente malicioso."
+  Italian   -> "Non saranno eseguite altre operazioni al fine di evitare codice bash malevolo."
   _ -> "Cancelled further processing to avoid potentially malicious bash code."
 
 security_8 :: Text -> Language -> Doc AnsiStyle
 security_8 (bt -> t) = \case
   Spanish   -> t <+> "es un comando bash integrado en los campos de la matriz del PKGBUILD."
+  Italian   -> t <+> "è un comando bash integrato nei campi array del tuo PKGBUILD."
   _ -> t <+> "is a bash command inlined in your PKGBUILD array fields."
 
 security_9 :: Text -> Language -> Doc AnsiStyle
 security_9 (bt -> t) = \case
   Spanish   -> t <+> "es algo extraño para tener en sus campos de matriz. ¿Es seguro?"
+  Italian   -> t <+> "è una cosa strana da trovare nei tuoi campi array. E' sicura?"
   _ -> t <+> "is a strange thing to have in your array fields. Is it safe?"
 
 security_10 :: Text -> Language -> Doc AnsiStyle
 security_10 (bt -> t) = \case
   Spanish   -> t <+> "implica que alguien estaba tratando de ser astuto con las variables para ocultar comandos maliciosos."
+  Italian   -> t <+> "implica che qualcuno stava provando a fare il sapientone con le variabili al fine di nascondere comandi malevoli."
   _ -> t <+> "implies that someone was trying to be clever with variables to hide malicious commands."
 
 -----------------------
diff --git a/lib/Aura/Languages/Fields.hs b/lib/Aura/Languages/Fields.hs
--- a/lib/Aura/Languages/Fields.hs
+++ b/lib/Aura/Languages/Fields.hs
@@ -1,7 +1,4 @@
-{-# LANGUAGE LambdaCase        #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# OPTIONS_HADDOCK prune #-}
-{-# OPTIONS_GHC -fno-warn-missing-export-lists #-}
 
 -- |
 -- Module    : Aura.Languages.Fields
diff --git a/lib/Aura/Logo.hs b/lib/Aura/Logo.hs
--- a/lib/Aura/Logo.hs
+++ b/lib/Aura/Logo.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE OverloadedStrings #-}
-
 -- |
 -- Module    : Aura.Logo
 -- Copyright : (c) Colin Woodbury, 2012 - 2020
diff --git a/lib/Aura/MakePkg.hs b/lib/Aura/MakePkg.hs
--- a/lib/Aura/MakePkg.hs
+++ b/lib/Aura/MakePkg.hs
@@ -1,6 +1,3 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TupleSections     #-}
-
 -- |
 -- Module    : Aura.State
 -- Copyright : (c) Colin Woodbury, 2012 - 2020
diff --git a/lib/Aura/Packages/AUR.hs b/lib/Aura/Packages/AUR.hs
--- a/lib/Aura/Packages/AUR.hs
+++ b/lib/Aura/Packages/AUR.hs
@@ -2,10 +2,6 @@
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE DuplicateRecordFields #-}
 {-# LANGUAGE FlexibleContexts      #-}
-{-# LANGUAGE MonoLocalBinds        #-}
-{-# LANGUAGE OverloadedStrings     #-}
-{-# LANGUAGE TypeApplications      #-}
-
 -- |
 -- Module    : Aura.Packages.AUR
 -- Copyright : (c) Colin Woodbury, 2012 - 2020
@@ -32,7 +28,7 @@
 import           Aura.Pkgbuild.Fetch
 import           Aura.Settings
 import           Aura.Types
-import           Aura.Utils (fmapEither)
+import           Aura.Utils (fmapEither, groupsOf)
 import           Control.Error.Util (hush, note)
 import           Control.Monad.Trans.Maybe
 import           Control.Scheduler (Comp(..), traverseConcurrently)
@@ -49,6 +45,7 @@
 import qualified RIO.NonEmpty as NEL
 import qualified RIO.Set as S
 import qualified RIO.Text as T
+import           Servant.Client.Core (responseBody)
 import           System.Path
 import           System.Path.IO (getCurrentDirectory)
 import           System.Process.Typed
@@ -152,6 +149,17 @@
 -- | Frontend to the `aur` library. For @-Ai@.
 aurInfo :: NonEmpty PkgName -> RIO Env [AurInfo]
 aurInfo pkgs = do
-  m   <- asks (managerOf . settings)
-  res <- liftMaybeM (Failure connectionFailure_1) . fmap hush . liftIO . info m . map (^. field @"name") $ toList pkgs
-  pure $ sortAurInfo (Just SortAlphabetically) res
+  logDebug $ "AUR: Looking up " <> display (length pkgs) <> " packages..."
+  m <- asks (managerOf . settings)
+  sortAurInfo (Just SortAlphabetically) . fold
+    <$> traverseConcurrently Par' (work m) (groupsOf 50 $ NEL.toList pkgs)
+  where
+    work :: Manager -> [PkgName] -> RIO Env [AurInfo]
+    work m ps = liftIO (info m $ map (^. field @"name") ps) >>= \case
+      Left (ConnectionError _) -> throwM (Failure connectionFailure_1)
+      Left (FailureResponse _ r) -> do
+        let !resp = display . decodeUtf8Lenient . toStrictBytes $ responseBody r
+        logDebug $ "Failed! Server said: " <> resp
+        throwM (Failure miscAURFailure_2)
+      Left _ -> throwM (Failure miscAURFailure_1)
+      Right res -> pure res
diff --git a/lib/Aura/Packages/Repository.hs b/lib/Aura/Packages/Repository.hs
--- a/lib/Aura/Packages/Repository.hs
+++ b/lib/Aura/Packages/Repository.hs
@@ -1,8 +1,5 @@
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE OverloadedStrings     #-}
-{-# LANGUAGE TupleSections         #-}
-{-# LANGUAGE TypeApplications      #-}
 
 -- |
 -- Module    : Aura.Packages.Repository
diff --git a/lib/Aura/Pacman.hs b/lib/Aura/Pacman.hs
--- a/lib/Aura/Pacman.hs
+++ b/lib/Aura/Pacman.hs
@@ -1,8 +1,4 @@
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE MonoLocalBinds    #-}
-{-# LANGUAGE MultiWayIf        #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ViewPatterns      #-}
+{-# LANGUAGE ViewPatterns #-}
 
 -- |
 -- Module    : Aura.Pacman
diff --git a/lib/Aura/Pkgbuild/Base.hs b/lib/Aura/Pkgbuild/Base.hs
--- a/lib/Aura/Pkgbuild/Base.hs
+++ b/lib/Aura/Pkgbuild/Base.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE OverloadedStrings #-}
-
 -- |
 -- Module    : Aura.Pkgbuild.Base
 -- Copyright : (c) Colin Woodbury, 2012 - 2020
diff --git a/lib/Aura/Pkgbuild/Editing.hs b/lib/Aura/Pkgbuild/Editing.hs
--- a/lib/Aura/Pkgbuild/Editing.hs
+++ b/lib/Aura/Pkgbuild/Editing.hs
@@ -1,6 +1,4 @@
-{-# LANGUAGE DataKinds         #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeApplications  #-}
+{-# LANGUAGE DataKinds #-}
 
 -- |
 -- Module    : Aura.Pkgbuild.Base
diff --git a/lib/Aura/Pkgbuild/Fetch.hs b/lib/Aura/Pkgbuild/Fetch.hs
--- a/lib/Aura/Pkgbuild/Fetch.hs
+++ b/lib/Aura/Pkgbuild/Fetch.hs
@@ -1,7 +1,5 @@
 {-# LANGUAGE DataKinds           #-}
-{-# LANGUAGE OverloadedStrings   #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE TypeApplications    #-}
 
 -- |
 -- Module    : Aura.State
diff --git a/lib/Aura/Pkgbuild/Records.hs b/lib/Aura/Pkgbuild/Records.hs
--- a/lib/Aura/Pkgbuild/Records.hs
+++ b/lib/Aura/Pkgbuild/Records.hs
@@ -1,5 +1,4 @@
-{-# LANGUAGE DataKinds        #-}
-{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE DataKinds #-}
 
 -- |
 -- Module    : Aura.Pkgbuild.Records
diff --git a/lib/Aura/Pkgbuild/Security.hs b/lib/Aura/Pkgbuild/Security.hs
--- a/lib/Aura/Pkgbuild/Security.hs
+++ b/lib/Aura/Pkgbuild/Security.hs
@@ -1,7 +1,4 @@
 {-# LANGUAGE DeriveGeneric     #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TupleSections     #-}
-{-# LANGUAGE TypeApplications  #-}
 
 -- |
 -- Module    : Aura.Pkgbuild.Security
diff --git a/lib/Aura/Settings.hs b/lib/Aura/Settings.hs
--- a/lib/Aura/Settings.hs
+++ b/lib/Aura/Settings.hs
@@ -1,5 +1,5 @@
-{-# LANGUAGE DeriveGeneric     #-}
-{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE DerivingStrategies #-}
 
 -- |
 -- Module    : Aura.Settings
@@ -118,7 +118,9 @@
   , isTerminal     :: !Bool
   , ignoresOf      :: !(Set PkgName)
   , commonConfigOf :: !CommonConfig
-  , buildConfigOf  :: !BuildConfig }
+  , buildConfigOf  :: !BuildConfig
+  , logFuncOf      :: !LogFunc }
+  deriving stock (Generic)
 
 -- | Unless otherwise specified, packages will be built within @/tmp@.
 defaultBuildDir :: Path Absolute
diff --git a/lib/Aura/State.hs b/lib/Aura/State.hs
--- a/lib/Aura/State.hs
+++ b/lib/Aura/State.hs
@@ -1,8 +1,4 @@
-{-# LANGUAGE DataKinds         #-}
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE MonoLocalBinds    #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeApplications  #-}
+{-# LANGUAGE DataKinds        #-}
 
 -- |
 -- Module    : Aura.State
diff --git a/lib/Aura/Types.hs b/lib/Aura/Types.hs
--- a/lib/Aura/Types.hs
+++ b/lib/Aura/Types.hs
@@ -4,10 +4,7 @@
 {-# LANGUAGE DuplicateRecordFields      #-}
 {-# LANGUAGE FlexibleInstances          #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE MultiParamTypeClasses      #-}
 {-# LANGUAGE MultiWayIf                 #-}
-{-# LANGUAGE OverloadedStrings          #-}
-{-# LANGUAGE TypeApplications           #-}
 
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
diff --git a/lib/Aura/Utils.hs b/lib/Aura/Utils.hs
--- a/lib/Aura/Utils.hs
+++ b/lib/Aura/Utils.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE OverloadedStrings #-}
-
 -- |
 -- Module    : Aura.Utils
 -- Copyright : (c) Colin Woodbury, 2012 - 2020
@@ -33,8 +31,8 @@
     -- * Misc.
   , maybe'
   , fmapEither
-  , traverseMaybe
   , traverseEither
+  , groupsOf
   ) where
 
 import           Aura.Colour
@@ -48,6 +46,7 @@
 import           RIO
 import qualified RIO.ByteString as B
 import qualified RIO.ByteString.Lazy as BL
+import qualified RIO.List as L
 import           RIO.List.Partial (maximum)
 import qualified RIO.Map as M
 import qualified RIO.Text as T
@@ -242,12 +241,17 @@
       Right c -> (bs, c:cs)
 
 -- | Borrowed from Compactable.
-traverseMaybe :: Applicative f => (a -> f (Maybe b)) -> [a] -> f [b]
-traverseMaybe f = go
-  where
-    go (x:xs) = maybe id (:) <$> f x <*> go xs
-    go []     = pure []
-
--- | Borrowed from Compactable.
 traverseEither :: Applicative f => (a -> f (Either b c)) -> [a] -> f ([b], [c])
 traverseEither f = fmap partitionEithers . traverse f
+
+-- | Break a list into groups of @n@ elements. The last item in the result is
+-- not guaranteed to have the same length as the others.
+groupsOf :: Int -> [a] -> [[a]]
+groupsOf n as
+  | n <= 0 = []
+  | otherwise = go as
+  where
+    go [] = []
+    go bs = xs : go rest
+      where
+        (xs, rest) = L.splitAt n bs
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE OverloadedStrings #-}
-
 module Main ( main ) where
 
 import           Aura.Languages
